Vibe Coding 核心方法论 --- 深度研究报告
2025年,AI大神 Andrej Karpathy 造了个新词------Vibe Coding。翻译过来就是"跟着感觉编程"。你描述需求,AI 补代码,你只管点头说"行"或者摇头说"不行"。
一、什么是 Vibe Coding
一句话:编程从「写代码」变成了「验收代码」。
传统开发是你告诉电脑怎么 做。Vibe Coding 是你告诉电脑做什么,电脑写代码,你确认没问题就收工。
| 维度 | 传统开发 | Vibe Coding |
|---|---|---|
| 核心动作 | 手写代码 | 跟AI对话 |
| 思维负担 | 语法+逻辑+架构全包 | 只管要什么、对不对 |
| 错误处理 | 自己找bug自己修 | AI修,你检查 |
| 学习曲线 | 得会编程语言 | 会说大白话就行 |
| 产出速度 | 看你打字多快 | 看你读代码多快 |
说白了,传统开发是"自己动手干活",Vibe Coding 是"当产品经理加测试"------你从生产者变成了验收者。
场景对比:
场景:你要给内部管理系统加一个"通知公告"功能。
传统做法:
- 打开 IDE,新建 controller/service/model 三个文件
- 手写 CRUD,调式接口,联调数据库
- 写前端页面,调样式,修 bug
- 一下午过去了
Vibe Coding 做法:
- 打开 Cursor,敲提示词:"给后台管理系统加一个通知公告模块,支持增删改查,用 React + TypeScript,后端用 Express + Prisma,数据库用 SQLite"
- AI 生成后端代码 + 前端组件,跑一遍确认能跑通
- 微调几个样式细节
- 半小时搞定
二、核心工作流程
#mermaid-svg-1RJqI9oMbjZzzG14{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1RJqI9oMbjZzzG14 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1RJqI9oMbjZzzG14 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1RJqI9oMbjZzzG14 .error-icon{fill:#552222;}#mermaid-svg-1RJqI9oMbjZzzG14 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1RJqI9oMbjZzzG14 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1RJqI9oMbjZzzG14 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1RJqI9oMbjZzzG14 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1RJqI9oMbjZzzG14 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1RJqI9oMbjZzzG14 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1RJqI9oMbjZzzG14 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1RJqI9oMbjZzzG14 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1RJqI9oMbjZzzG14 .marker.cross{stroke:#333333;}#mermaid-svg-1RJqI9oMbjZzzG14 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1RJqI9oMbjZzzG14 p{margin:0;}#mermaid-svg-1RJqI9oMbjZzzG14 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1RJqI9oMbjZzzG14 .cluster-label text{fill:#333;}#mermaid-svg-1RJqI9oMbjZzzG14 .cluster-label span{color:#333;}#mermaid-svg-1RJqI9oMbjZzzG14 .cluster-label span p{background-color:transparent;}#mermaid-svg-1RJqI9oMbjZzzG14 .label text,#mermaid-svg-1RJqI9oMbjZzzG14 span{fill:#333;color:#333;}#mermaid-svg-1RJqI9oMbjZzzG14 .node rect,#mermaid-svg-1RJqI9oMbjZzzG14 .node circle,#mermaid-svg-1RJqI9oMbjZzzG14 .node ellipse,#mermaid-svg-1RJqI9oMbjZzzG14 .node polygon,#mermaid-svg-1RJqI9oMbjZzzG14 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1RJqI9oMbjZzzG14 .rough-node .label text,#mermaid-svg-1RJqI9oMbjZzzG14 .node .label text,#mermaid-svg-1RJqI9oMbjZzzG14 .image-shape .label,#mermaid-svg-1RJqI9oMbjZzzG14 .icon-shape .label{text-anchor:middle;}#mermaid-svg-1RJqI9oMbjZzzG14 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1RJqI9oMbjZzzG14 .rough-node .label,#mermaid-svg-1RJqI9oMbjZzzG14 .node .label,#mermaid-svg-1RJqI9oMbjZzzG14 .image-shape .label,#mermaid-svg-1RJqI9oMbjZzzG14 .icon-shape .label{text-align:center;}#mermaid-svg-1RJqI9oMbjZzzG14 .node.clickable{cursor:pointer;}#mermaid-svg-1RJqI9oMbjZzzG14 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1RJqI9oMbjZzzG14 .arrowheadPath{fill:#333333;}#mermaid-svg-1RJqI9oMbjZzzG14 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1RJqI9oMbjZzzG14 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1RJqI9oMbjZzzG14 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1RJqI9oMbjZzzG14 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1RJqI9oMbjZzzG14 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1RJqI9oMbjZzzG14 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1RJqI9oMbjZzzG14 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1RJqI9oMbjZzzG14 .cluster text{fill:#333;}#mermaid-svg-1RJqI9oMbjZzzG14 .cluster span{color:#333;}#mermaid-svg-1RJqI9oMbjZzzG14 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1RJqI9oMbjZzzG14 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1RJqI9oMbjZzzG14 rect.text{fill:none;stroke-width:0;}#mermaid-svg-1RJqI9oMbjZzzG14 .icon-shape,#mermaid-svg-1RJqI9oMbjZzzG14 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1RJqI9oMbjZzzG14 .icon-shape p,#mermaid-svg-1RJqI9oMbjZzzG14 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1RJqI9oMbjZzzG14 .icon-shape .label rect,#mermaid-svg-1RJqI9oMbjZzzG14 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1RJqI9oMbjZzzG14 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1RJqI9oMbjZzzG14 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1RJqI9oMbjZzzG14 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Vibe Coding 核心循环
通过
不通过
定义意图
构造提示词
AI生成代码
执行测试
验证结果
集成到项目
分析错误
一步步拆解:
① 定义意图 --- 想清楚你到底要什么。不是"帮我写个登录",而是"用户微信扫码后,后端验证 code 然后返回 JWT"。
② 构造提示词 --- 把想法写成 AI 能看懂的话。技巧:给够背景、说清限制、举个例子。
③ AI 生成代码 --- 大模型吐出代码片段或者完整文件。这一步你等着就行。
④ 执行测试 --- 跑单元测试、编译检查、lint。每次生成都必须验证,这没得商量。
⑤ 验证结果 --- 通过了就集成到项目。没通过就分析错误、改提示词、再来一轮。
做这件事不是为了偷懒,是把精力从"语法怎么拼"挪到"什么才是对的"上面。
完整示例------给博客加一个"标签云"功能:
来一个完整的例子:给博客加一个"标签云"功能。
第一步------想清楚要什么:
"每篇文章可以打多个标签,首页展示标签云,点击标签可以筛选出所有带这个标签的文章。标签展示文章数量。"
第二步------给 AI 下指令(提示词):
"我的博客项目用 Next.js + Prisma + PostgreSQL。请在现有 Article 模型上加 Tag 模型(多对多关系),然后在首页加标签云组件,点击标签跳到 /tags/slug 页面展示该标签下的文章列表。"
第三步------AI 生成代码:
AI 生成了 Prisma schema 迁移文件、标签云组件、标签页面路由。你躺着等。
第四步------执行测试:
跑 prisma migrate,启动开发服务器,检查标签云是否渲染,点击标签页面是否正常。
第五步------验证结果:
发现标签云里没有显示文章数量 → 告诉 AI "标签旁边显示文章数量" → AI 修改查询 → 再跑 → 通过。集成到项目。
三、Vibe Coding vs 传统开发
#mermaid-svg-cpXJwvEAvuAWo3w0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cpXJwvEAvuAWo3w0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cpXJwvEAvuAWo3w0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cpXJwvEAvuAWo3w0 .error-icon{fill:#552222;}#mermaid-svg-cpXJwvEAvuAWo3w0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cpXJwvEAvuAWo3w0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cpXJwvEAvuAWo3w0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cpXJwvEAvuAWo3w0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cpXJwvEAvuAWo3w0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cpXJwvEAvuAWo3w0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cpXJwvEAvuAWo3w0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cpXJwvEAvuAWo3w0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cpXJwvEAvuAWo3w0 .marker.cross{stroke:#333333;}#mermaid-svg-cpXJwvEAvuAWo3w0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cpXJwvEAvuAWo3w0 p{margin:0;}#mermaid-svg-cpXJwvEAvuAWo3w0 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-cpXJwvEAvuAWo3w0 .cluster-label text{fill:#333;}#mermaid-svg-cpXJwvEAvuAWo3w0 .cluster-label span{color:#333;}#mermaid-svg-cpXJwvEAvuAWo3w0 .cluster-label span p{background-color:transparent;}#mermaid-svg-cpXJwvEAvuAWo3w0 .label text,#mermaid-svg-cpXJwvEAvuAWo3w0 span{fill:#333;color:#333;}#mermaid-svg-cpXJwvEAvuAWo3w0 .node rect,#mermaid-svg-cpXJwvEAvuAWo3w0 .node circle,#mermaid-svg-cpXJwvEAvuAWo3w0 .node ellipse,#mermaid-svg-cpXJwvEAvuAWo3w0 .node polygon,#mermaid-svg-cpXJwvEAvuAWo3w0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cpXJwvEAvuAWo3w0 .rough-node .label text,#mermaid-svg-cpXJwvEAvuAWo3w0 .node .label text,#mermaid-svg-cpXJwvEAvuAWo3w0 .image-shape .label,#mermaid-svg-cpXJwvEAvuAWo3w0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-cpXJwvEAvuAWo3w0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-cpXJwvEAvuAWo3w0 .rough-node .label,#mermaid-svg-cpXJwvEAvuAWo3w0 .node .label,#mermaid-svg-cpXJwvEAvuAWo3w0 .image-shape .label,#mermaid-svg-cpXJwvEAvuAWo3w0 .icon-shape .label{text-align:center;}#mermaid-svg-cpXJwvEAvuAWo3w0 .node.clickable{cursor:pointer;}#mermaid-svg-cpXJwvEAvuAWo3w0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-cpXJwvEAvuAWo3w0 .arrowheadPath{fill:#333333;}#mermaid-svg-cpXJwvEAvuAWo3w0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cpXJwvEAvuAWo3w0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cpXJwvEAvuAWo3w0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cpXJwvEAvuAWo3w0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-cpXJwvEAvuAWo3w0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cpXJwvEAvuAWo3w0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-cpXJwvEAvuAWo3w0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cpXJwvEAvuAWo3w0 .cluster text{fill:#333;}#mermaid-svg-cpXJwvEAvuAWo3w0 .cluster span{color:#333;}#mermaid-svg-cpXJwvEAvuAWo3w0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cpXJwvEAvuAWo3w0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-cpXJwvEAvuAWo3w0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-cpXJwvEAvuAWo3w0 .icon-shape,#mermaid-svg-cpXJwvEAvuAWo3w0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cpXJwvEAvuAWo3w0 .icon-shape p,#mermaid-svg-cpXJwvEAvuAWo3w0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-cpXJwvEAvuAWo3w0 .icon-shape .label rect,#mermaid-svg-cpXJwvEAvuAWo3w0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cpXJwvEAvuAWo3w0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-cpXJwvEAvuAWo3w0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-cpXJwvEAvuAWo3w0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Vibe模式
不通过
通过
需求分析
写提示词
AI生成
验证结果
审查+集成
部署上线
传统模式
需求分析
架构设计
手写代码
调试排错
代码审查
部署上线
传统模式:每个环节都要人肉操作,花时间最多的是手写代码。
Vibe 模式 :人的精力集中在"想清楚需求"和"确认结果对不对"上,写代码交给 AI。迭代速度快了很多,但对验证能力的要求也更高。
Vibe Coding 不是什么万能药。架构设计还是得人来拿主意。AI 擅长的是执行,不是决策。
四、五种开发模式
根据论文和社区里的实践,Vibe Coding 慢慢演化出了五种常见玩法:
模式1:无约束自动化模式
#mermaid-svg-PmsPukTaGd9k40aD{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PmsPukTaGd9k40aD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PmsPukTaGd9k40aD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PmsPukTaGd9k40aD .error-icon{fill:#552222;}#mermaid-svg-PmsPukTaGd9k40aD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PmsPukTaGd9k40aD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PmsPukTaGd9k40aD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PmsPukTaGd9k40aD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PmsPukTaGd9k40aD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PmsPukTaGd9k40aD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PmsPukTaGd9k40aD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PmsPukTaGd9k40aD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PmsPukTaGd9k40aD .marker.cross{stroke:#333333;}#mermaid-svg-PmsPukTaGd9k40aD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PmsPukTaGd9k40aD p{margin:0;}#mermaid-svg-PmsPukTaGd9k40aD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PmsPukTaGd9k40aD .cluster-label text{fill:#333;}#mermaid-svg-PmsPukTaGd9k40aD .cluster-label span{color:#333;}#mermaid-svg-PmsPukTaGd9k40aD .cluster-label span p{background-color:transparent;}#mermaid-svg-PmsPukTaGd9k40aD .label text,#mermaid-svg-PmsPukTaGd9k40aD span{fill:#333;color:#333;}#mermaid-svg-PmsPukTaGd9k40aD .node rect,#mermaid-svg-PmsPukTaGd9k40aD .node circle,#mermaid-svg-PmsPukTaGd9k40aD .node ellipse,#mermaid-svg-PmsPukTaGd9k40aD .node polygon,#mermaid-svg-PmsPukTaGd9k40aD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PmsPukTaGd9k40aD .rough-node .label text,#mermaid-svg-PmsPukTaGd9k40aD .node .label text,#mermaid-svg-PmsPukTaGd9k40aD .image-shape .label,#mermaid-svg-PmsPukTaGd9k40aD .icon-shape .label{text-anchor:middle;}#mermaid-svg-PmsPukTaGd9k40aD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PmsPukTaGd9k40aD .rough-node .label,#mermaid-svg-PmsPukTaGd9k40aD .node .label,#mermaid-svg-PmsPukTaGd9k40aD .image-shape .label,#mermaid-svg-PmsPukTaGd9k40aD .icon-shape .label{text-align:center;}#mermaid-svg-PmsPukTaGd9k40aD .node.clickable{cursor:pointer;}#mermaid-svg-PmsPukTaGd9k40aD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PmsPukTaGd9k40aD .arrowheadPath{fill:#333333;}#mermaid-svg-PmsPukTaGd9k40aD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PmsPukTaGd9k40aD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PmsPukTaGd9k40aD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PmsPukTaGd9k40aD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PmsPukTaGd9k40aD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PmsPukTaGd9k40aD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PmsPukTaGd9k40aD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PmsPukTaGd9k40aD .cluster text{fill:#333;}#mermaid-svg-PmsPukTaGd9k40aD .cluster span{color:#333;}#mermaid-svg-PmsPukTaGd9k40aD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PmsPukTaGd9k40aD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PmsPukTaGd9k40aD rect.text{fill:none;stroke-width:0;}#mermaid-svg-PmsPukTaGd9k40aD .icon-shape,#mermaid-svg-PmsPukTaGd9k40aD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PmsPukTaGd9k40aD .icon-shape p,#mermaid-svg-PmsPukTaGd9k40aD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PmsPukTaGd9k40aD .icon-shape .label rect,#mermaid-svg-PmsPukTaGd9k40aD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PmsPukTaGd9k40aD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PmsPukTaGd9k40aD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PmsPukTaGd9k40aD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 一句话需求
AI自由发挥
生成完整功能
一次验收
特点: 给 AI 极大的自由度,适合快速验证想法。但小心------代码质量不可控,容易翻车。
适用场景: 快速原型、一次性脚本、个人小工具。
【示例】 你想快速验证一个想法:用 Python 把文件夹里的图片批量改成 800x600 尺寸。敲一句:"写个 Python 脚本,把当前目录下所有 jpg/png 批量缩放到 800x600,保持比例,不够的补白。" AI 五秒出代码,跑一下完事。质量不用太讲究,用完就扔。
模式2:迭代对话协作模式
#mermaid-svg-0idohgqglYB3FzqX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0idohgqglYB3FzqX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0idohgqglYB3FzqX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0idohgqglYB3FzqX .error-icon{fill:#552222;}#mermaid-svg-0idohgqglYB3FzqX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0idohgqglYB3FzqX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0idohgqglYB3FzqX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0idohgqglYB3FzqX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0idohgqglYB3FzqX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0idohgqglYB3FzqX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0idohgqglYB3FzqX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0idohgqglYB3FzqX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0idohgqglYB3FzqX .marker.cross{stroke:#333333;}#mermaid-svg-0idohgqglYB3FzqX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0idohgqglYB3FzqX p{margin:0;}#mermaid-svg-0idohgqglYB3FzqX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0idohgqglYB3FzqX .cluster-label text{fill:#333;}#mermaid-svg-0idohgqglYB3FzqX .cluster-label span{color:#333;}#mermaid-svg-0idohgqglYB3FzqX .cluster-label span p{background-color:transparent;}#mermaid-svg-0idohgqglYB3FzqX .label text,#mermaid-svg-0idohgqglYB3FzqX span{fill:#333;color:#333;}#mermaid-svg-0idohgqglYB3FzqX .node rect,#mermaid-svg-0idohgqglYB3FzqX .node circle,#mermaid-svg-0idohgqglYB3FzqX .node ellipse,#mermaid-svg-0idohgqglYB3FzqX .node polygon,#mermaid-svg-0idohgqglYB3FzqX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0idohgqglYB3FzqX .rough-node .label text,#mermaid-svg-0idohgqglYB3FzqX .node .label text,#mermaid-svg-0idohgqglYB3FzqX .image-shape .label,#mermaid-svg-0idohgqglYB3FzqX .icon-shape .label{text-anchor:middle;}#mermaid-svg-0idohgqglYB3FzqX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0idohgqglYB3FzqX .rough-node .label,#mermaid-svg-0idohgqglYB3FzqX .node .label,#mermaid-svg-0idohgqglYB3FzqX .image-shape .label,#mermaid-svg-0idohgqglYB3FzqX .icon-shape .label{text-align:center;}#mermaid-svg-0idohgqglYB3FzqX .node.clickable{cursor:pointer;}#mermaid-svg-0idohgqglYB3FzqX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0idohgqglYB3FzqX .arrowheadPath{fill:#333333;}#mermaid-svg-0idohgqglYB3FzqX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0idohgqglYB3FzqX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0idohgqglYB3FzqX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0idohgqglYB3FzqX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0idohgqglYB3FzqX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0idohgqglYB3FzqX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0idohgqglYB3FzqX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0idohgqglYB3FzqX .cluster text{fill:#333;}#mermaid-svg-0idohgqglYB3FzqX .cluster span{color:#333;}#mermaid-svg-0idohgqglYB3FzqX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0idohgqglYB3FzqX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0idohgqglYB3FzqX rect.text{fill:none;stroke-width:0;}#mermaid-svg-0idohgqglYB3FzqX .icon-shape,#mermaid-svg-0idohgqglYB3FzqX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0idohgqglYB3FzqX .icon-shape p,#mermaid-svg-0idohgqglYB3FzqX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0idohgqglYB3FzqX .icon-shape .label rect,#mermaid-svg-0idohgqglYB3FzqX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0idohgqglYB3FzqX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0idohgqglYB3FzqX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0idohgqglYB3FzqX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 不行,这里改一下
行
初始需求
AI生成初版
你觉得行吗?
补充反馈
完成
特点: 像跟一个会写代码的同事结对编程,你指哪他打哪。这是用得最多的模式。
适用场景: 日常开发、功能迭代、修 bug。
【示例】 你在写一个 React 表格组件,让 AI 先出一个基础版。看了之后说:"第一列加一个复选框,表头加全选功能。" AI 改了。你又觉得:"行高太挤了,再加一个行点击展开详情。" 几个来回,组件就差不多了。就像你在跟一个实习生说"这里改改,那里调调"。
模式3:计划驱动模式
#mermaid-svg-0EO0nwovKyQhDrR0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0EO0nwovKyQhDrR0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0EO0nwovKyQhDrR0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0EO0nwovKyQhDrR0 .error-icon{fill:#552222;}#mermaid-svg-0EO0nwovKyQhDrR0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0EO0nwovKyQhDrR0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0EO0nwovKyQhDrR0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0EO0nwovKyQhDrR0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0EO0nwovKyQhDrR0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0EO0nwovKyQhDrR0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0EO0nwovKyQhDrR0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0EO0nwovKyQhDrR0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0EO0nwovKyQhDrR0 .marker.cross{stroke:#333333;}#mermaid-svg-0EO0nwovKyQhDrR0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0EO0nwovKyQhDrR0 p{margin:0;}#mermaid-svg-0EO0nwovKyQhDrR0 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0EO0nwovKyQhDrR0 .cluster-label text{fill:#333;}#mermaid-svg-0EO0nwovKyQhDrR0 .cluster-label span{color:#333;}#mermaid-svg-0EO0nwovKyQhDrR0 .cluster-label span p{background-color:transparent;}#mermaid-svg-0EO0nwovKyQhDrR0 .label text,#mermaid-svg-0EO0nwovKyQhDrR0 span{fill:#333;color:#333;}#mermaid-svg-0EO0nwovKyQhDrR0 .node rect,#mermaid-svg-0EO0nwovKyQhDrR0 .node circle,#mermaid-svg-0EO0nwovKyQhDrR0 .node ellipse,#mermaid-svg-0EO0nwovKyQhDrR0 .node polygon,#mermaid-svg-0EO0nwovKyQhDrR0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0EO0nwovKyQhDrR0 .rough-node .label text,#mermaid-svg-0EO0nwovKyQhDrR0 .node .label text,#mermaid-svg-0EO0nwovKyQhDrR0 .image-shape .label,#mermaid-svg-0EO0nwovKyQhDrR0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-0EO0nwovKyQhDrR0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0EO0nwovKyQhDrR0 .rough-node .label,#mermaid-svg-0EO0nwovKyQhDrR0 .node .label,#mermaid-svg-0EO0nwovKyQhDrR0 .image-shape .label,#mermaid-svg-0EO0nwovKyQhDrR0 .icon-shape .label{text-align:center;}#mermaid-svg-0EO0nwovKyQhDrR0 .node.clickable{cursor:pointer;}#mermaid-svg-0EO0nwovKyQhDrR0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0EO0nwovKyQhDrR0 .arrowheadPath{fill:#333333;}#mermaid-svg-0EO0nwovKyQhDrR0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0EO0nwovKyQhDrR0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0EO0nwovKyQhDrR0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0EO0nwovKyQhDrR0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0EO0nwovKyQhDrR0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0EO0nwovKyQhDrR0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0EO0nwovKyQhDrR0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0EO0nwovKyQhDrR0 .cluster text{fill:#333;}#mermaid-svg-0EO0nwovKyQhDrR0 .cluster span{color:#333;}#mermaid-svg-0EO0nwovKyQhDrR0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0EO0nwovKyQhDrR0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0EO0nwovKyQhDrR0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-0EO0nwovKyQhDrR0 .icon-shape,#mermaid-svg-0EO0nwovKyQhDrR0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0EO0nwovKyQhDrR0 .icon-shape p,#mermaid-svg-0EO0nwovKyQhDrR0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0EO0nwovKyQhDrR0 .icon-shape .label rect,#mermaid-svg-0EO0nwovKyQhDrR0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0EO0nwovKyQhDrR0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0EO0nwovKyQhDrR0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0EO0nwovKyQhDrR0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 需求文档
AI生成实现计划
计划走查与调整
分步骤生成代码
逐模块验证
特点: 先出计划再写代码。适合复杂功能,有时候 AI 能整出比你预期还好的架构。
适用场景: 复杂业务逻辑、多模块协同、新项目启动。
【示例】 要做一个支付订单管理模块。先让 AI 出计划:数据库设计 → API 路由 → 后台页面 → 权限控制。看完计划觉得"退款流程漏了",让 AI 补上。确认计划没问题了,再让 AI 按步骤生成代码。每一步生成的代码都跑测试验证,确保不跑偏。
模式4:测试驱动模式
#mermaid-svg-CmzcspwzcD2V6xv9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CmzcspwzcD2V6xv9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CmzcspwzcD2V6xv9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CmzcspwzcD2V6xv9 .error-icon{fill:#552222;}#mermaid-svg-CmzcspwzcD2V6xv9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CmzcspwzcD2V6xv9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CmzcspwzcD2V6xv9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CmzcspwzcD2V6xv9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CmzcspwzcD2V6xv9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CmzcspwzcD2V6xv9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CmzcspwzcD2V6xv9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CmzcspwzcD2V6xv9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CmzcspwzcD2V6xv9 .marker.cross{stroke:#333333;}#mermaid-svg-CmzcspwzcD2V6xv9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CmzcspwzcD2V6xv9 p{margin:0;}#mermaid-svg-CmzcspwzcD2V6xv9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CmzcspwzcD2V6xv9 .cluster-label text{fill:#333;}#mermaid-svg-CmzcspwzcD2V6xv9 .cluster-label span{color:#333;}#mermaid-svg-CmzcspwzcD2V6xv9 .cluster-label span p{background-color:transparent;}#mermaid-svg-CmzcspwzcD2V6xv9 .label text,#mermaid-svg-CmzcspwzcD2V6xv9 span{fill:#333;color:#333;}#mermaid-svg-CmzcspwzcD2V6xv9 .node rect,#mermaid-svg-CmzcspwzcD2V6xv9 .node circle,#mermaid-svg-CmzcspwzcD2V6xv9 .node ellipse,#mermaid-svg-CmzcspwzcD2V6xv9 .node polygon,#mermaid-svg-CmzcspwzcD2V6xv9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CmzcspwzcD2V6xv9 .rough-node .label text,#mermaid-svg-CmzcspwzcD2V6xv9 .node .label text,#mermaid-svg-CmzcspwzcD2V6xv9 .image-shape .label,#mermaid-svg-CmzcspwzcD2V6xv9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-CmzcspwzcD2V6xv9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CmzcspwzcD2V6xv9 .rough-node .label,#mermaid-svg-CmzcspwzcD2V6xv9 .node .label,#mermaid-svg-CmzcspwzcD2V6xv9 .image-shape .label,#mermaid-svg-CmzcspwzcD2V6xv9 .icon-shape .label{text-align:center;}#mermaid-svg-CmzcspwzcD2V6xv9 .node.clickable{cursor:pointer;}#mermaid-svg-CmzcspwzcD2V6xv9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CmzcspwzcD2V6xv9 .arrowheadPath{fill:#333333;}#mermaid-svg-CmzcspwzcD2V6xv9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CmzcspwzcD2V6xv9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CmzcspwzcD2V6xv9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CmzcspwzcD2V6xv9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CmzcspwzcD2V6xv9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CmzcspwzcD2V6xv9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CmzcspwzcD2V6xv9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CmzcspwzcD2V6xv9 .cluster text{fill:#333;}#mermaid-svg-CmzcspwzcD2V6xv9 .cluster span{color:#333;}#mermaid-svg-CmzcspwzcD2V6xv9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CmzcspwzcD2V6xv9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CmzcspwzcD2V6xv9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-CmzcspwzcD2V6xv9 .icon-shape,#mermaid-svg-CmzcspwzcD2V6xv9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CmzcspwzcD2V6xv9 .icon-shape p,#mermaid-svg-CmzcspwzcD2V6xv9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CmzcspwzcD2V6xv9 .icon-shape .label rect,#mermaid-svg-CmzcspwzcD2V6xv9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CmzcspwzcD2V6xv9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CmzcspwzcD2V6xv9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CmzcspwzcD2V6xv9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 失败
全部通过
写测试用例
AI生成通过测试的代码
运行测试
代码审查
特点: TDD 的 AI 版本。你写测试,AI 负责让测试变绿。质量最有保障的模式。
适用场景: 核心模块、安全敏感代码、需要严格回归覆盖的项目。
【示例】 要写一个"计算订单总价"的函数,需要考虑满减、优惠券、会员折扣。你先写好测试用例:
- 普通订单:3件商品共 100 元 → 预期 100
- 满 200 减 50:订单 220 元 → 预期 170
- 会员 8 折 + 满减:订单 300 元 → 预期 190
然后让 AI 写出通过这些测试的代码。测试全绿,收工。
模式5:上下文增强模式
#mermaid-svg-0gGQkILKUa3cdCMv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0gGQkILKUa3cdCMv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0gGQkILKUa3cdCMv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0gGQkILKUa3cdCMv .error-icon{fill:#552222;}#mermaid-svg-0gGQkILKUa3cdCMv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0gGQkILKUa3cdCMv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0gGQkILKUa3cdCMv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0gGQkILKUa3cdCMv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0gGQkILKUa3cdCMv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0gGQkILKUa3cdCMv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0gGQkILKUa3cdCMv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0gGQkILKUa3cdCMv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0gGQkILKUa3cdCMv .marker.cross{stroke:#333333;}#mermaid-svg-0gGQkILKUa3cdCMv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0gGQkILKUa3cdCMv p{margin:0;}#mermaid-svg-0gGQkILKUa3cdCMv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0gGQkILKUa3cdCMv .cluster-label text{fill:#333;}#mermaid-svg-0gGQkILKUa3cdCMv .cluster-label span{color:#333;}#mermaid-svg-0gGQkILKUa3cdCMv .cluster-label span p{background-color:transparent;}#mermaid-svg-0gGQkILKUa3cdCMv .label text,#mermaid-svg-0gGQkILKUa3cdCMv span{fill:#333;color:#333;}#mermaid-svg-0gGQkILKUa3cdCMv .node rect,#mermaid-svg-0gGQkILKUa3cdCMv .node circle,#mermaid-svg-0gGQkILKUa3cdCMv .node ellipse,#mermaid-svg-0gGQkILKUa3cdCMv .node polygon,#mermaid-svg-0gGQkILKUa3cdCMv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0gGQkILKUa3cdCMv .rough-node .label text,#mermaid-svg-0gGQkILKUa3cdCMv .node .label text,#mermaid-svg-0gGQkILKUa3cdCMv .image-shape .label,#mermaid-svg-0gGQkILKUa3cdCMv .icon-shape .label{text-anchor:middle;}#mermaid-svg-0gGQkILKUa3cdCMv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0gGQkILKUa3cdCMv .rough-node .label,#mermaid-svg-0gGQkILKUa3cdCMv .node .label,#mermaid-svg-0gGQkILKUa3cdCMv .image-shape .label,#mermaid-svg-0gGQkILKUa3cdCMv .icon-shape .label{text-align:center;}#mermaid-svg-0gGQkILKUa3cdCMv .node.clickable{cursor:pointer;}#mermaid-svg-0gGQkILKUa3cdCMv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0gGQkILKUa3cdCMv .arrowheadPath{fill:#333333;}#mermaid-svg-0gGQkILKUa3cdCMv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0gGQkILKUa3cdCMv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0gGQkILKUa3cdCMv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0gGQkILKUa3cdCMv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0gGQkILKUa3cdCMv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0gGQkILKUa3cdCMv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0gGQkILKUa3cdCMv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0gGQkILKUa3cdCMv .cluster text{fill:#333;}#mermaid-svg-0gGQkILKUa3cdCMv .cluster span{color:#333;}#mermaid-svg-0gGQkILKUa3cdCMv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0gGQkILKUa3cdCMv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0gGQkILKUa3cdCMv rect.text{fill:none;stroke-width:0;}#mermaid-svg-0gGQkILKUa3cdCMv .icon-shape,#mermaid-svg-0gGQkILKUa3cdCMv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0gGQkILKUa3cdCMv .icon-shape p,#mermaid-svg-0gGQkILKUa3cdCMv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0gGQkILKUa3cdCMv .icon-shape .label rect,#mermaid-svg-0gGQkILKUa3cdCMv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0gGQkILKUa3cdCMv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0gGQkILKUa3cdCMv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0gGQkILKUa3cdCMv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 不合
合
项目代码库
提取相关上下文
构造增强提示词
AI生成
检查是否符合现有架构
集成
特点: 把整个项目的背景信息喂给 AI,生成的代码更贴合现有架构。效果最好,但也是最烧 token 的。
适用场景: 大型项目、遗留系统维护、重构。
【示例】 公司有一个 5 年历史的 Spring Boot 项目,要在订单列表页加一个"导出 Excel"按钮。你把项目中已有的 FileController.java、OrderService.java 和相关的数据库表结构扔给 AI,告诉它:"按照项目现有的导出模式,加一个订单 Excel 导出功能。" AI 参考了项目中已有的 CSV 导出代码,写出来的 Excel 导出跟项目风格完全一致。
五、智能体架构图
#mermaid-svg-w1ljeTQ6QaIlrCVr{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-w1ljeTQ6QaIlrCVr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-w1ljeTQ6QaIlrCVr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-w1ljeTQ6QaIlrCVr .error-icon{fill:#552222;}#mermaid-svg-w1ljeTQ6QaIlrCVr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-w1ljeTQ6QaIlrCVr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-w1ljeTQ6QaIlrCVr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-w1ljeTQ6QaIlrCVr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-w1ljeTQ6QaIlrCVr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-w1ljeTQ6QaIlrCVr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-w1ljeTQ6QaIlrCVr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-w1ljeTQ6QaIlrCVr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-w1ljeTQ6QaIlrCVr .marker.cross{stroke:#333333;}#mermaid-svg-w1ljeTQ6QaIlrCVr svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-w1ljeTQ6QaIlrCVr p{margin:0;}#mermaid-svg-w1ljeTQ6QaIlrCVr .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-w1ljeTQ6QaIlrCVr .cluster-label text{fill:#333;}#mermaid-svg-w1ljeTQ6QaIlrCVr .cluster-label span{color:#333;}#mermaid-svg-w1ljeTQ6QaIlrCVr .cluster-label span p{background-color:transparent;}#mermaid-svg-w1ljeTQ6QaIlrCVr .label text,#mermaid-svg-w1ljeTQ6QaIlrCVr span{fill:#333;color:#333;}#mermaid-svg-w1ljeTQ6QaIlrCVr .node rect,#mermaid-svg-w1ljeTQ6QaIlrCVr .node circle,#mermaid-svg-w1ljeTQ6QaIlrCVr .node ellipse,#mermaid-svg-w1ljeTQ6QaIlrCVr .node polygon,#mermaid-svg-w1ljeTQ6QaIlrCVr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-w1ljeTQ6QaIlrCVr .rough-node .label text,#mermaid-svg-w1ljeTQ6QaIlrCVr .node .label text,#mermaid-svg-w1ljeTQ6QaIlrCVr .image-shape .label,#mermaid-svg-w1ljeTQ6QaIlrCVr .icon-shape .label{text-anchor:middle;}#mermaid-svg-w1ljeTQ6QaIlrCVr .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-w1ljeTQ6QaIlrCVr .rough-node .label,#mermaid-svg-w1ljeTQ6QaIlrCVr .node .label,#mermaid-svg-w1ljeTQ6QaIlrCVr .image-shape .label,#mermaid-svg-w1ljeTQ6QaIlrCVr .icon-shape .label{text-align:center;}#mermaid-svg-w1ljeTQ6QaIlrCVr .node.clickable{cursor:pointer;}#mermaid-svg-w1ljeTQ6QaIlrCVr .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-w1ljeTQ6QaIlrCVr .arrowheadPath{fill:#333333;}#mermaid-svg-w1ljeTQ6QaIlrCVr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-w1ljeTQ6QaIlrCVr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-w1ljeTQ6QaIlrCVr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-w1ljeTQ6QaIlrCVr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-w1ljeTQ6QaIlrCVr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-w1ljeTQ6QaIlrCVr .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-w1ljeTQ6QaIlrCVr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-w1ljeTQ6QaIlrCVr .cluster text{fill:#333;}#mermaid-svg-w1ljeTQ6QaIlrCVr .cluster span{color:#333;}#mermaid-svg-w1ljeTQ6QaIlrCVr div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-w1ljeTQ6QaIlrCVr .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-w1ljeTQ6QaIlrCVr rect.text{fill:none;stroke-width:0;}#mermaid-svg-w1ljeTQ6QaIlrCVr .icon-shape,#mermaid-svg-w1ljeTQ6QaIlrCVr .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-w1ljeTQ6QaIlrCVr .icon-shape p,#mermaid-svg-w1ljeTQ6QaIlrCVr .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-w1ljeTQ6QaIlrCVr .icon-shape .label rect,#mermaid-svg-w1ljeTQ6QaIlrCVr .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-w1ljeTQ6QaIlrCVr .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-w1ljeTQ6QaIlrCVr .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-w1ljeTQ6QaIlrCVr :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 项目层
基础设施层
智能体层
用户层
开发者
IDE / 聊天界面
编排智能体
代码生成智能体
代码审查智能体
测试智能体
大语言模型
RAG向量库
Git仓库
部署环境
用户通过 IDE 或聊天界面发指令 → 编排智能体拆解意图、调度子智能体 → 代码生成、审查、测试各干各的 → 结果落到 Git 仓库并部署。所有智能体背后都是大语言模型和 RAG 向量库在撑着。
六、数据流图
#mermaid-svg-jigpPoVuCcNo6R4n{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jigpPoVuCcNo6R4n .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jigpPoVuCcNo6R4n .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jigpPoVuCcNo6R4n .error-icon{fill:#552222;}#mermaid-svg-jigpPoVuCcNo6R4n .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jigpPoVuCcNo6R4n .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jigpPoVuCcNo6R4n .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jigpPoVuCcNo6R4n .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jigpPoVuCcNo6R4n .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jigpPoVuCcNo6R4n .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jigpPoVuCcNo6R4n .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jigpPoVuCcNo6R4n .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jigpPoVuCcNo6R4n .marker.cross{stroke:#333333;}#mermaid-svg-jigpPoVuCcNo6R4n svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jigpPoVuCcNo6R4n p{margin:0;}#mermaid-svg-jigpPoVuCcNo6R4n .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jigpPoVuCcNo6R4n .cluster-label text{fill:#333;}#mermaid-svg-jigpPoVuCcNo6R4n .cluster-label span{color:#333;}#mermaid-svg-jigpPoVuCcNo6R4n .cluster-label span p{background-color:transparent;}#mermaid-svg-jigpPoVuCcNo6R4n .label text,#mermaid-svg-jigpPoVuCcNo6R4n span{fill:#333;color:#333;}#mermaid-svg-jigpPoVuCcNo6R4n .node rect,#mermaid-svg-jigpPoVuCcNo6R4n .node circle,#mermaid-svg-jigpPoVuCcNo6R4n .node ellipse,#mermaid-svg-jigpPoVuCcNo6R4n .node polygon,#mermaid-svg-jigpPoVuCcNo6R4n .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jigpPoVuCcNo6R4n .rough-node .label text,#mermaid-svg-jigpPoVuCcNo6R4n .node .label text,#mermaid-svg-jigpPoVuCcNo6R4n .image-shape .label,#mermaid-svg-jigpPoVuCcNo6R4n .icon-shape .label{text-anchor:middle;}#mermaid-svg-jigpPoVuCcNo6R4n .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jigpPoVuCcNo6R4n .rough-node .label,#mermaid-svg-jigpPoVuCcNo6R4n .node .label,#mermaid-svg-jigpPoVuCcNo6R4n .image-shape .label,#mermaid-svg-jigpPoVuCcNo6R4n .icon-shape .label{text-align:center;}#mermaid-svg-jigpPoVuCcNo6R4n .node.clickable{cursor:pointer;}#mermaid-svg-jigpPoVuCcNo6R4n .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jigpPoVuCcNo6R4n .arrowheadPath{fill:#333333;}#mermaid-svg-jigpPoVuCcNo6R4n .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jigpPoVuCcNo6R4n .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jigpPoVuCcNo6R4n .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jigpPoVuCcNo6R4n .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jigpPoVuCcNo6R4n .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jigpPoVuCcNo6R4n .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jigpPoVuCcNo6R4n .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jigpPoVuCcNo6R4n .cluster text{fill:#333;}#mermaid-svg-jigpPoVuCcNo6R4n .cluster span{color:#333;}#mermaid-svg-jigpPoVuCcNo6R4n div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jigpPoVuCcNo6R4n .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jigpPoVuCcNo6R4n rect.text{fill:none;stroke-width:0;}#mermaid-svg-jigpPoVuCcNo6R4n .icon-shape,#mermaid-svg-jigpPoVuCcNo6R4n .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jigpPoVuCcNo6R4n .icon-shape p,#mermaid-svg-jigpPoVuCcNo6R4n .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jigpPoVuCcNo6R4n .icon-shape .label rect,#mermaid-svg-jigpPoVuCcNo6R4n .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jigpPoVuCcNo6R4n .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jigpPoVuCcNo6R4n .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jigpPoVuCcNo6R4n :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输出
反馈
验证
处理
输入
失败
通过
自然语言需求
上下文数据
代码库快照
提示词组装
LLM推理生成
代码提取与格式化
语法检查
类型检查
单元测试
集成检查
错误信息结构化
构造修复提示
差异对比
人工确认
代码提交
整个流程是这样的:提示词带着需求和上下文进 LLM → 生成的代码一层层过语法检查、类型检查、测试 → 没过就反馈回提示词层再来一遍 → 过了就进入 diff 对比,等人确认,最后落地。
七、实战示例
示例 1:用 Vibe Coding 构建 REST API
需求: 一个用户注册/登录的 Express API,MongoDB 存储,JWT 鉴权。
提示词:
用 Node.js + Express + TypeScript 写一个 REST API,包含:
- POST /api/register --- 注册(用户名、密码、邮箱),密码 bcrypt 加密
- POST /api/login --- 登录,返回 JWT
- GET /api/profile --- 需要 Bearer token 鉴权
用 MongoDB(mongoose),错误处理用 express-async-errors。
先写 package.json 和 tsconfig.json,再写入口文件和路由。
AI 生成(关键片段):
typescript
import express from 'express';
import jwt from 'jsonwebtoken';
import bcrypt from 'bcrypt';
import { User } from './models/User';
const app = express();
app.use(express.json());
app.post('/api/register', async (req, res) => {
const { username, password, email } = req.body;
const hash = await bcrypt.hash(password, 12);
const user = await User.create({ username, email, password: hash });
res.status(201).json({ id: user._id, username: user.username });
});
验证过程:
npm install→ 装依赖 ✅npx tsc --noEmit→ 类型检查 ✅npm test→ 写 3 个测试用例(注册/登录/鉴权)→ 全部通过 ✅
示例 2:用 Vibe Coding 调试 Bug
需求: React 组件里的 useEffect 死循环了,组件无限 re-render。
提示词:
我有一段 React 代码,useEffect 造成了无限循环。帮我分析为什么,并修复。
tsxconst [user, setUser] = useState(null); useEffect(() => { fetchUser().then(setUser); }, [user]);给出修复后的代码,并解释根因。
AI 分析:
问题:
user在依赖数组里,fetchUser 完了又 setUser → user 变了 → 再次触发 effect,死循环就来了。修复:去掉
user依赖,加上|| !user的初始守卫。
tsx
const [user, setUser] = useState(null);
useEffect(() => {
if (!user) fetchUser().then(setUser);
}, []); // 只在挂载时执行一次
验证过程: 用 React DevTools 看 re-render 次数,从 ∞ 降到了 2 ✅
示例 3:用 Vibe Coding 重构遗留代码
需求: 把 500 行的 jQuery 面条代码重构为 React 组件。
提示词:
以下是一个管理后台的 jQuery 代码,负责增删改表格数据。请重构为 React + TypeScript 组件化代码。
约束:
- 拆分为至少 3 个组件:Table、TableRow、TableToolbar
- 用 axios 替代 $.ajax
- 保持原有功能不变
- 给出每个组件的 Props 类型定义
javascript// 500行 jQuery 代码略...
AI 生成的组件结构:
components/
DataTable/
index.tsx --- 主组件,管 state 和 API 调用
TableRow.tsx --- 单行渲染,编辑/删除按钮
TableToolbar.tsx --- 搜索、批量操作、新增按钮
types.ts --- 接口定义
验证过程:
- 对比功能列表:新增行 ✅ / 编辑行 ✅ / 删除行 ✅ / 搜索 ✅ / 分页 ✅
- React DevTools 检查组件树 → 结构清晰 ✅
npm run build→ 零错误 ✅
八、最佳实践清单
1. 规范驱动开发
别让 AI 放飞自我。先定规矩再写代码:
- 用
.cursorrules或CLAUDE.md定好技术栈和编码风格 - 提示词里写清楚"用 TypeScript,函数式组件,别用 class"
- 提前说好命名规范和文件夹结构
【提示词对比:好的跟不好的】
❌ 不好的提示词:
"帮我写个登录页面"
✅ 好的提示词:
"在 React + TypeScript 项目里加一个登录页面。已有 UserContext(见 @/contexts/UserContext),后端 POST /api/auth/login 接受 {email, password} 返回 {token, user}。页面要:邮箱输入框 + 密码输入框 + 登录按钮 + 表单验证 + 错误提示。用 Ant Design 组件。登录成功后存 token 到 localStorage,跳转到 /dashboard。参考现有 pages/Register.tsx 的风格写。"
差别在哪?不好的提示词 AI 只能猜,出来的东西大概率跟你的项目对不上。好的提示词把背景、约束、参考都说清楚了,AI 一次就能交出能用的东西。
2. 上下文管理
AI 记不住太多东西。每次对话都要带上足够的背景信息:
- 当前文件用到的接口定义
- 项目里已有的类似代码当参考
- 数据库结构或 API 文档片段
3. 代码审查
AI 写的代码跟人写的一样,都得审。重点关注:
- 安全漏洞(SQL 注入、XSS、密钥写死在代码里)
- 性能问题(N+1 查询、内存泄漏)
- 边界情况(空值、超大数值、并发)
【真实案例】 有开发者让 AI 写了一个文件上传功能,AI 生成的代码直接用了文件名作为存储路径------没有做任何安全过滤。结果用户上传了一个文件名带 .../.../.../etc/passwd 的文件,直接把系统关键文件覆盖了。这就是 AI 写代码不安全的典型例子------AI 不会主动考虑安全问题,你得在提示词里明确要求。比如在提示词里加一句:"注意安全防护,防止路径穿越攻击、限制文件类型和大小。"
4. 版本控制
AI 生成代码后,立刻 commit。理由很简单:
- 对比 diff 更容易发现问题
- 随时能回滚到某次生成
- commit message 里标上"AI 生成的",方便以后追踪
5. 安全审查
永远别 blindly 相信 AI 写的代码。 特别留神:
eval()和动态执行- 密钥、密码硬编码
- 权限校验漏了
- 依赖版本太老
九、常见陷阱与应对
末日循环(Doom Loop)
症状: AI 修了一个 bug → 带进来两个新 bug → 修新 bug 又带进来三个 → 无限循环,代码越来越烂。
应对:
- 设个上限(最多 5 轮,过了就重开对话)
- 每轮只让 AI 改一个文件
- 卡住了就退回上一个验证过的版本重新来
【真实对话还原------末日循环】
你:"给这个按钮加一个 loading 状态"
AI:加了 loading,但把按钮的 onClick 事件搞丢了
你:"onClick 没了,加上"
AI:加回 onClick,但样式错乱了,按钮变成了蓝色方形
你:"样式不对,改回圆角带阴影的"
AI:修好了样式,但 loading 动画用了新依赖包,跟项目现有的动画库冲突了
你:"不要新增依赖,用项目里自带的动画库"
AI:换了动画实现,但 loading 时长的计算逻辑写错了,一直在转不停
......这时候你已经跟 AI 来回拉扯了 8 轮,代码比最初还烂,你心态也崩了。
正确的做法:第 3 轮还没搞定 → git checkout -- 回滚到改之前 → 重新写一条更清楚的提示词,一次性把所有需求说全。
上下文崩溃
症状: 对话长了以后 AI 开始"失忆",忘了之前聊了什么,生成的代码前后矛盾。
应对:
- 每次发提示词都带上关键的背景摘要
- 重要决定记到 CHANGELOG 或 AGENTS.md 里
- 适时开新对话,别让一条对话扯太长
提示债务
症状: 提示词越来越长、越来越绕,跟祖传代码一样没人敢碰。
应对:
- 提示词也要写注释
- 把常用的提示词做成模板
- 定期清理、重构你的提示词库
技术债务加速
症状: AI 倾向"能用就行",不管长远架构,技术债务比手写代码攒得还快。
应对:
- 每周安排"清理日",专门还 AI 欠下的技术债
- 严格守住架构规范,别给 AI 走捷径的机会
- 代码审查标准不因为"是 AI 写的"就放水
十、工具生态全景图
#mermaid-svg-xuel2GMxWklpYpr4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xuel2GMxWklpYpr4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xuel2GMxWklpYpr4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xuel2GMxWklpYpr4 .error-icon{fill:#552222;}#mermaid-svg-xuel2GMxWklpYpr4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xuel2GMxWklpYpr4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xuel2GMxWklpYpr4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xuel2GMxWklpYpr4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xuel2GMxWklpYpr4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xuel2GMxWklpYpr4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xuel2GMxWklpYpr4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xuel2GMxWklpYpr4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xuel2GMxWklpYpr4 .marker.cross{stroke:#333333;}#mermaid-svg-xuel2GMxWklpYpr4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xuel2GMxWklpYpr4 p{margin:0;}#mermaid-svg-xuel2GMxWklpYpr4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xuel2GMxWklpYpr4 .cluster-label text{fill:#333;}#mermaid-svg-xuel2GMxWklpYpr4 .cluster-label span{color:#333;}#mermaid-svg-xuel2GMxWklpYpr4 .cluster-label span p{background-color:transparent;}#mermaid-svg-xuel2GMxWklpYpr4 .label text,#mermaid-svg-xuel2GMxWklpYpr4 span{fill:#333;color:#333;}#mermaid-svg-xuel2GMxWklpYpr4 .node rect,#mermaid-svg-xuel2GMxWklpYpr4 .node circle,#mermaid-svg-xuel2GMxWklpYpr4 .node ellipse,#mermaid-svg-xuel2GMxWklpYpr4 .node polygon,#mermaid-svg-xuel2GMxWklpYpr4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xuel2GMxWklpYpr4 .rough-node .label text,#mermaid-svg-xuel2GMxWklpYpr4 .node .label text,#mermaid-svg-xuel2GMxWklpYpr4 .image-shape .label,#mermaid-svg-xuel2GMxWklpYpr4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-xuel2GMxWklpYpr4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xuel2GMxWklpYpr4 .rough-node .label,#mermaid-svg-xuel2GMxWklpYpr4 .node .label,#mermaid-svg-xuel2GMxWklpYpr4 .image-shape .label,#mermaid-svg-xuel2GMxWklpYpr4 .icon-shape .label{text-align:center;}#mermaid-svg-xuel2GMxWklpYpr4 .node.clickable{cursor:pointer;}#mermaid-svg-xuel2GMxWklpYpr4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xuel2GMxWklpYpr4 .arrowheadPath{fill:#333333;}#mermaid-svg-xuel2GMxWklpYpr4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xuel2GMxWklpYpr4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xuel2GMxWklpYpr4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xuel2GMxWklpYpr4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xuel2GMxWklpYpr4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xuel2GMxWklpYpr4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xuel2GMxWklpYpr4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xuel2GMxWklpYpr4 .cluster text{fill:#333;}#mermaid-svg-xuel2GMxWklpYpr4 .cluster span{color:#333;}#mermaid-svg-xuel2GMxWklpYpr4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xuel2GMxWklpYpr4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xuel2GMxWklpYpr4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-xuel2GMxWklpYpr4 .icon-shape,#mermaid-svg-xuel2GMxWklpYpr4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xuel2GMxWklpYpr4 .icon-shape p,#mermaid-svg-xuel2GMxWklpYpr4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xuel2GMxWklpYpr4 .icon-shape .label rect,#mermaid-svg-xuel2GMxWklpYpr4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xuel2GMxWklpYpr4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xuel2GMxWklpYpr4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xuel2GMxWklpYpr4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 辅助设施
AI模型
GPT-4o / o1
Claude 3.5/4
DeepSeek-Coder
CLI工具
Claude Code
Aider
OpenCode
IDE集成
👉 Cursor
👉 GitHub Copilot
👉 Windsurf
👉 Continue.dev
向量数据库
语言服务器
静态检查
| 工具 | 类型 | 特点 |
|---|---|---|
| Cursor | IDE | Vibe Coding 体验最好,深度上下文感知 |
| Copilot | IDE 插件 | 微软出品,GitHub 生态打通 |
| Windsurf | IDE | 新秀,天然支持多文件编辑 |
| Continue.dev | IDE 插件 | 开源,可以自己托管模型 |
| Claude Code | CLI | Anthropic 官方,强项是长上下文 |
| Aider | CLI | 开源,支持 git 自动 commit |
| OpenCode | CLI | 阿里系,中文场景表现好 |
写在最后: Vibe Coding 不是说你就完全不用写代码了,而是让你把精力从"怎么写"挪到"写什么"上。它降低的是编程的门槛,不是思考的门槛。用得好的,往往是那些架构能力强的工程师,而不是提示词写得花里胡哨的人。
工具一直在变,但基本功不变:理解需求、设计架构、验证质量------这三件事,AI 暂时还替代不了你。