在 VibeCoding 场景中,大量用户无法有效落地自己的产品想法,核心问题并不在于 AI 能否写代码,而在于:
- 用户无法清晰描述需求
- 用户不知道哪些信息是“工程上必须的”
- 用户无法判断 AI 输出是否合理
- 需求在反复修改中不断失真
定型(Formative) 是一个位于「AI 写代码之前」的前置工具,用于帮助用户将模糊、白话式的想法,系统性地转化为 AI 可执行的开发方案。
MVP 阶段,定型只聚焦一个目标:
在一次对话流程中,引导用户完成需求澄清,并生成一份可直接交给 AI 开发的完整开发文档。
具体而言,MVP 必须做到:
- 引导用户补全关键信息(即使用户最初只有一句话)
- 控制提问节奏,避免无限追问
- 给出合理的技术方案建议(通俗可理解)
- 明确定义 MVP 边界
- 输出结构化、可复制的最终文档
以下内容明确不在 MVP 范围内:
- ❌ 用户注册 / 登录 / 账户体系
- ❌ 项目管理(多项目、历史列表等)
- ❌ 实时协作
- ❌ 可视化 Workflow 编辑器
- ❌ 自动生成代码
- ❌ 部署 / CI / 运行监控
- ❌ 商业化 / 计费
MVP 只支持一条强引导主路径:
- 用户进入页面,看到 Chat UI
- 用户输入一句自然语言需求
- 系统启动多 Agent 流程,引导用户补全信息
- Agent 1:确认需求是否完整
- Agent 2:询问用户是否有任何工程上的限制(如性能、成本等)
- Agent 3:根据用户输入,生成初步的技术方案建议
- 用户在关键节点做选择(选项而非自由输入)
- 例如:选择使用的 AI 模型、数据库类型等
- 系统根据用户选择,生成最终的《开发方案文档》
- 用户复制文档并离开
MVP 内部使用多 Agent,但对用户只暴露“阶段感”。
| 阶段 | 内部 Agent 职责 |
|---|---|
| 阶段 1 | 信息采集与需求澄清 |
| 阶段 2 | 风险识别与方案分歧 |
| 阶段 3 | 技术栈与架构建议 |
| 阶段 4 | MVP 边界确认 |
| 阶段 5 | 开发文档生成 |
- 多 Agent 编排:LangGraph (TypeScript SDK)
- 模型调用:DeepSeek / Qwen / Ollama(抽象封装)
- 运行形态:Node.js
- 前端:Web Chat UI(React / Next.js)
- 从用户输入中提取以下信息:
- 产品目标
- 目标用户
- 使用场景
- 核心功能
- 是否需要数据存储
- 是否需要多人使用
- 通过追问补全缺失项
- 不解释技术细节,只做澄清
- 维护一个「需求信息 Checklist」
- 计算当前完备度(0–100%)
- 判断是否可以进入下一阶段
- 产品目标明确
- 核心使用场景明确
- 是否需要登录
- 是否需要数据持久化
- MVP 功能范围明确
- 完备度 ≥ 80% → 自动进入下一阶段
- 用户可手动选择「信息已足够,继续」
- 指出潜在风险:
- 技术复杂度过高
- 需求不适合 MVP
- 第三方依赖风险
- 提供 2–3 种可选方案(降级 / 保守 / 激进)
- 使用通俗语言,不使用架构黑话
- 给出整体方案类型:
- 纯前端
- 前后端分离
- 前端 + BaaS(如 Supabase)
- 解释每种方案的:
- 适合人群
- 优缺点
- 后期演进成本
- 进一步确定:
- 前端框架(React / Vue)
- 后端语言(如需要)
- 运行环境版本
- 汇总所有已确认信息
- 生成结构化 Markdown 文档
- 不引入新假设
- 明确写出「本期不做什么」
| 类型 | 目标 | 存储内容 | 生命周期 | 备注 |
|---|---|---|---|---|
| 短期记忆 | 存过程 | 当前会话完整消息 | 会话期间 | 用于上下文回溯与调试 |
| 长期记忆 | 存结论 | 已确认的关键信息 | 可跨会话复用 | 不保存原始聊天记录,仅保留结构化结论 |
原则:聊天记录不进入长期记忆,避免噪音;Agent 仅依赖「阶段性总结」继续推进。
session:{sessionId}:messages # 当前会话消息 session:{sessionId}:state # Agent 状态 / 当前阶段 session:{sessionId}:summary # 已确认的稳定结论
每完成一个阶段,生成阶段性总结 总结写入 session:{id}:summary 后续 Agent 优先读取 summary,而非原始对话记录
| 原则 | 说明 |
|---|---|
| Chat-First | 所有交互以对话为核心,用户无需离开聊天即可完成全部操作。 |
| 零配置 | 不提供独立配置页,所有选择通过聊天内嵌选项完成。 |
| 阶段可视 | 用户随时知道自己“在哪一步、还剩几步”。 |
| 信息只读摘要 | 侧边栏仅展示已确认结论,不可编辑,避免信息污染。 |
| 移动端优先 | 默认布局以竖屏手机为基准,桌面端同比例放大。 |
| 模块 | 说明 | 交互细节 |
|---|---|---|
| 顶部阶段条 | 固定悬浮,格式:阶段 2/4 · 风险与方案 |
点击可展开“阶段路线图”弹层 |
| 消息列表 | 按“用户-系统”交替排列,系统消息可带内嵌选项 | 用户消息支持重新编辑(长按/右键) |
| 快速选项 | 单选/多选按钮水平排布,最多 3 行,超量折叠 | 选中后立即自动发送,无需二次确认 |
| 输入框 | 单行文本,回车发送;Shift+回车换行 | 右侧“灯泡”图标可触发“AI 提示” |
| 底部辅助栏 | 左侧“保存并离开”,右侧“复制最终文档” | 仅最终阶段出现 |
| 模块 | 内容 | 更新时机 |
|---|---|---|
| ① 阶段指示器 | 当前阶段高亮,已完成阶段可点击回溯 | 阶段推进时 |
| ② 关键信息摘要 | 以“标签+一句话”形式展示已确认项 | 每完成一个阶段刷新 |
| ③ 需求完备度 | 环形进度条 + 百分比数字 | 每轮 Agent 评估后刷新 |
| ④ 快捷导出 | “复制 Markdown”按钮 | 始终可见 |
摘要栏默认折叠于移动端底部,点击“📋”图标展开。
| 元素 | 规范 |
|---|---|
| 主色 | #0A7BFF(对话气泡)、#F5F7FA(背景) |
| 字体 | 14 px 基础字号,行高 1.5;代码块使用 SF Mono |
| 阶段提示文案 | 统一以“我们”开头,例如:“我们已了解你的目标用户,接下来一起看看潜在风险。” |
| 按钮文案 | 动词+名词,≤ 6 字,如“选 React”、“继续下一步” |
| 错误提示 | 使用“警告气泡”而非弹窗,可一键重试 |
- 用户完成阶段 2 最后一条选择;
- 顶部阶段条自动滑入“阶段 3/4 · 技术栈建议”;
- 右侧摘要栏新增“风险结论:建议保守方案”;
- 完备度由 65% → 82%,环形条动画 0.8 s;
- 系统发送技术方案卡片,内含 3 个横向选项按钮;
- 用户点击任一选项 → 按钮置灰并显示“已选” → 自动发送消息 → 进入阶段 4。
| 场景 | 处理方案 |
|---|---|
| 用户刷新页面 | 通过 sessionId 自动恢复聊天位置与摘要 |
| 网络断开 | 顶部出现“离线”红色条,消息进入待发送队列 |
| 长文本输入 | 输入框自动增高,最大 6 行,超出出现内部滚动 |
| 选项过多 | 横向滚动 + 左右箭头指示器,默认展示 3 项 |
| 回溯修改 | 允许点击已确认消息重新编辑,后续消息自动失效并重新评估 |
所有动画时长 ≤ 300 ms,优先使用 CSS
transition,避免阻塞渲染线程。
- 纯 Markdown,语法兼容 GitHub Flavored Markdown
- 单文件输出,无外部依赖
- 一键复制按钮:前端提供「复制全文」图标,点击后直接落盘剪贴板
每章标题层级为
#,顺序不可调换;无内容时写「暂无」占位,确保结构完整。
| 章节 | 说明 | 是否允许空 |
|---|---|---|
| 1. 项目概述 | 一句话电梯陈述 + 项目代号 | 必填 |
| 2. 产品目标 | 用「解决…实现…」句式,≤ 3 条 | 必填 |
| 3. 目标用户与使用场景 | 用户画像 + 痛点场景,各 1 句 | 必填 |
| 4. MVP 功能范围 | 用无序列表,≤ 5 条核心功能 | 必填 |
| 5. 非目标(本期不做) | 明确排除的功能或优化点 | 必填 |
| 6. 技术方案说明 | 纯前端 / 前后端 / BaaS 方案一句话 | 必填 |
| 7. 技术栈选择 | 用表格:类别 / 选型 / 理由,≤ 6 行 | 必填 |
| 8. 数据与接口设计 | ER 图文字描述 + 关键接口列表 | 可选,无数据写「不适用」 |
| 9. 开发步骤建议 | 按「Day1~Day7」拆任务,每天 1 行 | 必填 |
- 所有章节内容均来自「session:{id}:summary」中的已确认字段,禁止 LLM 二次发挥。
- 章节 8 若无数据存储需求,则整章输出:
## 8. 数据与接口设计 本期无持久化数据,接口暂不需要。 - 章节 9 必须包含可执行检查点,例如:
- Day1 初始化仓库 & 部署空页面
- Day2 完成登录页 UI 走查
…
确保开发者复制即可逐日对照。
flowchart TB
U[User] --> UI["Chat UI<br/>- chat bubble<br/>- options chips<br/>- side panel: profile & progress"]
UI --> API["App Server / API<br/>Next.js Route / Edge Function"]
API --> G["LangGraph Orchestrator<br/>(StateGraph TS)"]
subgraph Memory["Memory Layer"]
R[("Redis<br/>- short-term convo<br/>- long-term memory<br/>- summaries/profile")]
LS[("Local JSON<br/>MVP fallback cache")]
end
subgraph Prompts["Prompt Assets"]
P1[("extractor.system.md")]
P2[("planner.system.md")]
P3[("asker.system.md")]
P4[("risk.system.md")]
P5[("tech.system.md")]
P6[("spec.system.md")]
end
subgraph Agents["Agents / Nodes"]
N0["Router Node<br/>(domain detection)"]
N1["Extractor Node<br/>(deterministic + LLM open extraction)"]
N2["Planner Node<br/>(gap analysis + stop rules)"]
N3["Asker Node<br/>(render ask_plan to user)"]
N4["Risk Analyst Node<br/>(risks + mitigation + options)"]
N5["Tech Advisor Node<br/>(stack choices + explanation)"]
N6["Architect Node<br/>(DB/API/design drafts)"]
N7["Plan Node<br/>(MVP boundary + milestone plan)"]
N8["Spec Generator Node<br/>(final dev doc / Trae prompt)"]
end
API <--> R
API <--> LS
API --> Prompts
Prompts --> G
G --> N0 --> N1 --> N2
N2 -->|need more info| N3 --> UI
N2 -->|enough| N4 --> N5 --> N6 --> N7 --> N8 --> UI
%% Observability
subgraph Obs["Observability"]
LOG["Logs/Tracing<br/>- node outputs<br/>- token/latency<br/>- failures"]
EVAL["Evaluation<br/>- replay conversations<br/>- scoring: repetition/coverage"]
end
G --> LOG
G --> EVAL
%% Risk points
N2 -.-> W1["⚠️ Repetition Loop<br/>ask_plan not bound to answers"]
N0 -.-> W2["⚠️ Wrong Domain<br/>use ecommerce blueprint for community"]
N1 -.-> W3["⚠️ Field Drift<br/>non-canonical values / schema mismatch"]
W1 -.-> Obs
W2 -.-> Obs
W3 -.-> Obs
sequenceDiagram
participant User
participant UI as Chat UI
participant API as App Server
participant G as LangGraph
participant Redis as Redis Memory
participant Router as Router(domain)
participant Extractor as Extractor
participant Planner as Planner
participant Asker as Asker
participant LLM as LLM
User->>UI: 输入需求/回答选项
UI->>API: POST /chat {message, session_id}
API->>Redis: Load session state (profile/summary/history)
Redis-->>API: state
API->>G: invoke(state + new message)
G->>Router: detect domain (deterministic)
Router-->>G: domain=community_events/ecommerce/unknown
G->>Extractor: parse answer (regex bound to ask_plan) + open extraction
Extractor->>LLM: (optional) open extraction with prompt assets
LLM-->>Extractor: structured JSON
Extractor-->>G: updated profile (canonical values)
G->>Planner: gap analysis + ask_budget + stop rules
Planner-->>G: ask_plan OR stop=true
alt Need more info
G->>Asker: render ask_plan to natural language + options
Asker-->>G: question text + UI options
G-->>API: response
API->>Redis: save updated state
API-->>UI: show question + chips
else Enough info
G->>LLM: risk analysis / tech advice / architecture / spec generation (multi-step)
G-->>API: final spec + Trae prompt
API->>Redis: save final artifacts
API-->>UI: show spec + download/copy buttons
end
Note over Planner: ⚠️ 常见故障点:<br/>1) domain未切换→蓝图错<br/>2) answered字段没确认→重复问<br/>3) canonical不一致→字段漂移