从 PRD 到前端页面:一次 AI 出码的完整探索

有一天我在想一个问题:能不能把产品需求文档直接丢给大模型,让它输出一整个可以跑起来的前端页面?

不是那种"帮我写个按钮"级别的问答,而是给它一份完整的 PRD,让它理解页面结构、数据模型、交互逻辑,然后按照项目已有的代码风格,输出可以直接放进仓库的代码。

听起来很激进,但我就是想试试。

整体设计:两个大流程

想清楚之后,我把这件事拆成两条线:

  1. 出码——从需求到代码
  2. 验证——确认生成的代码是否能用

当前阶段只追求"力大飞砖"——先把从 PRD 到页面这一步跑通,不考虑性能、token 成本这些优化问题。粗犷归粗犷,但整体流程是清晰的。

出码:从需求到代码的拆解

第一步:让 AI 理解需求

最朴素的想法是先把 PRD 结构化。不是给 AI 一份自由文本让它自由发挥,而是让它先做几件事:

  • 数据建模:用 TypeScript 接口把需求里的数据结构抽出来
  • 页面拆解:识别涉及哪些页面——是新增、修改还是删除?是列表、详情还是表单?
  • 功能归类:按页面维度重新整理需求,每个页面要完成什么、涉及哪些组件
  • 权限和埋点:单独列出,包括"可能遗漏的部分"

这一步的 prompt 大概长这样:

# 角色
你是一名前端产品经理,你需要将需求进行结构化,以方便开发将需求转变为页面。

# 任务
## 对需求内容进行数据建模
以 TypeScript 的方式对数据进行建模

## 拆解页面
分析需求涉及哪些页面,描述:
1. 页面是新增、删除还是修改
2. 页面属于列表、详情、表单还是其他类型
3. 页面包含哪些组件
4. 每个页面关联的数据模型

## 以页面维度重新整理需求
针对每个页面详细描述需要完成的功能点,
并对每个功能点需要开发的前端内容进行规划。

我故意让 AI 在结构化阶段就把权限和埋点列出来,包括"分析需求文档中可能遗漏的部分"。这不是为了让它当产品经理,而是为了在出码阶段减少遗漏。

第二步:任务拆解与代码输出

结构化之后,下一步是把页面级的需求拆成可执行的任务。规则也很简单:

  • 有几个页面就有几个任务
  • 每个任务先确认是否使用已有的页面模板
  • 如果用,用哪一个;不用,从零开始

代码输出阶段,我尝试了两条路线。

两条实施路线

路线一:按文件依赖顺序逐个处理

整体思路是把需求信息按文件的依赖关系倒序处理——先处理基础文件,每个文件的输出会作为下一个文件的上下文输入。

优势

  • 极大控制了 AI 的创造性,输出结果(尤其是样式)更可预期
  • 生成的代码一次性跑起来的概率比较高
  • 实现相对简单

不足

  • 需要事先对模板文件做功能描述,不然 AI 不知道该文件是干什么的
  • 输出的功能可能比较单薄,后续改动量仍然不小
  • 输出的 token 多,冗余内容也多

路线二:全量代码 + 需求一起喂给大模型

把需求文档和项目所有代码打包喂进去,让大模型自己做任务拆分——列出要改哪些文件、每个文件具体怎么改。

优势

  • 输出内容更符合需求(大模型有完整上下文)
  • 每个文件的任务更清晰
  • 增量处理,单次输出的 token 少
  • 可以根据需要做创造性的扩展

劣势

  • 每次都带全量上下文,输入 token 巨大,速度慢
  • 创造性内容可能引入新的依赖问题,出现不可控的输出

两条路线不是互斥的。我后来的想法是让大模型根据需求类型自己选择执行哪条路线,甚至并行执行后比较结果。

模型选型:现实比理想骨感得多

因为是代码生成场景,输入的内容(完整 PRD + 项目代码)通常超出大多数模型的上下文窗口。当时(2024 年底)符合条件的选择不多:

模型输入上限输出上限
qwen-long10M8K
qwen-plus128K8K
deepseek-r164K8K
deepseek-v364K8K

8K token 的输出大约对应 800 行代码。也就是说,超过 800 行的文件可能输出不完整。以此推算,64K 的输入大约能容纳 8 个 800 行左右的文件。

这个限制直接决定了方案的天花板。

输入太长怎么拆?输出截断了怎么接?

这是我花了很多时间没有找到完美答案的问题。

输入拆分的难点

  • 不知道从哪里切割效果最好
  • 还没有稳妥的方案把一次完整的问题拆成多轮提问,同时保证最终答案符合预期

我尝试的方案是按 token 上限做字符数切割,分次输入。每次输入结尾加一句"我还没问完,请先不要回答",直到最后一段加上"以上是全部内容,请开始回答"。粗糙但能用。

输出拆分更难

  • 不知道 AI 会在哪个节点截断
  • 不知道截断位置,就不知道怎么拼接

另一个思路是:让 AI 只输出代码的变更部分(diff),然后通过脚本把变更逐条应用到原文件上。这样单次输出的 token 少,也更可控。但实现复杂度不低。

跑通之后:诚实的阶段总结

第一个里程碑是 2025 年 2 月底跑通基本流程——命令行输入一个需求文档地址,输出一份基于模板的完整代码。

结果是任务规划有参考价值,但输出的代码效果不理想

相对满意的部分

  • 生成的执行规划确实有参考价值
  • 推荐的页面模板虽然不完全匹配需求,但也能用
  • 部分代码改造是合理的

不满意的部分

  • 代码总体完成度不高,尝试约 10 次,符合需求的部分不足 20%
  • 任务规划的输出不太稳定,切割失败时会导致整个流程中断
  • 输出代码有冗余建议和意外内容,需要手动修改

已经解决的问题

  • 任务切割不稳定 → 通过标签形式将返回结构化,降低了拆解难度
  • 输出包含冗余内容 → 同样用标签形式结构化,排除掉建议文本

还没解决的问题

  • 缺少把代码写回原项目原文件的流程(代码质量还不够好,暂时没想好怎么做)
  • 缺少创建和删除文件的场景支持
  • 缺少项目整体代码的统筹能力(当前更像是需求摘要)
  • 需要让用户在每个环节可以介入和 debug

意外发现:一个有用的仓库序列化工具

在做这个项目的过程中,我发现了一个叫 yek 的工具——用 Rust 写的,专门把仓库代码序列化成 LLM 友好的格式。它的一些思路给了我启发:

  • .gitignore 规则过滤不需要的文件
  • 用 Git 历史推断哪些文件更重要(最近修改的排在后面,LLM 更关注末尾内容)
  • 支持通配符模式和 yek.yaml 配置文件

对"如何高效地把项目代码喂给大模型"这个问题,yek 提供了一个比我手动拼接优雅得多的解决方案。

下一步想做的事

  • 尝试更多模型(随着上下文窗口越来越大,很多当时的限制可能已经不存在了)
  • 探索:如果要操作的不是模板项目而是业务仓库,能否自动推荐要改造的目标文件
  • 让用户可以对中间产物做 debug——不只是看最终输出,而是在任务规划、代码生成每个环节都能介入
  • 把中间产物存档复用(比如项目的结构化分析,可以用在其他场景——做项目介绍、写技术文档等)

这个项目目前仍然处于"能跑但还不够好"的阶段。20% 的需求匹配率说明离实用还有距离。但换个角度看,它至少证明了一件事:让 AI 从需求到代码的全链路是可以跑通的,只是每个环节的质量都还需要打磨

随着模型能力的提升——尤其是上下文窗口和代码理解能力的进步——我相信这条路最终会走通。当前的探索,更多是在为那个时刻做准备。

Comments