这两年“VibeCoding”这个词快被说烂了。去年我在一次内部技术分享上说:所谓VibeCoding,本质就是“顺着感觉编程”——把需求往大模型对话框里一贴,复制粘贴返回的代码,能跑就行。当时底下有人笑,说这哪是编程,这是“分段复读”。笑归笑,但我见过太多团队和个人开发者就这么干,翻车的方式也惊人一致:生成的代码第一次能跑,第二次改需求就崩;本地能跑,部署到服务器就挂;代码写完了没人敢review,因为连提交的人自己都看不懂AI生成的逻辑。更麻烦的是,项目越用越“粪坑化”,一旦对话上下文失效,整个项目直接停摆。
所以这篇内容,我想认真聊一下VibeCoding的工程化——不是劝你别用AI写代码,而是说怎么把“裸奔式”的碰运气,转变成一套稳定、可复制、可审查、可持续的AI辅助开发流程。适合谁看?已经开始用Cursor、Copilot、Claude这类工具辅助写代码的开发者,以及想带着整个小组把AI编程“正规化”的团队技术负责人。这篇指南提供的是方法论加可直接抄作业的模板,不是某个工具的键位教程。
1. 先把“裸奔”这件事说破:VibeCoding为什么容易翻车
1.1 裸奔式AI编程的五种典型姿势
我见到的“裸奔”形态各不相同,但内核都差不多。第一类是“一次性生成全家桶”:把整个项目需求往对话框一丢,让AI一口气生成几十个文件,结果就是每个文件看起来都像那么回事,组合在一起根本跑不通。第二类是“病历本式对话”:一个会话窗口用到底,上午让它写登录模块,下午让它改报表接口,晚上还让它查数据库慢查询,上下文早就乱成一锅粥,AI后期基本在胡言乱语。第三类是“零审查直接合并”:AI给了代码,看都不看就git add、git commit,出了生产事故才回头去找AI要说法——问题是AI不会为线上事故背锅,最后背锅的还是你自己。第四类是“没有约定全靠现场发挥”:没有代码规范、没有目录约束、没有提示词模板,同一个项目里AI生成的部分风格一会儿Java一会儿Go,一会儿驼峰一会儿下划线。第五类是“把密钥当聊天素材”:直接把数据库连接串、云服务密钥贴进对话里,方便是方便,泄露也不知道。
这些姿势有一个共同点:把AI当作一个能凭空变出代码的魔法箱,而不是一个需要流程约束的协作者。魔术可以连看三场不重样,但工程项目不能靠变魔术来交付。
1.2 翻车的真正原因:不是模型不行,是过程缺失
很多人把代码质量差归咎于“大模型水平不行”,但我观察到的实际情况是:模型能力已经被拉得很高,真正拖后腿的是人这一侧的工作方式。裸奔式用法最少缺三样东西——上下文、边界和验证。
上下文缺失最明显。你让AI写一个接口,它不知道这个项目用的ORM是什么、异常处理规范是什么、日志格式要求是什么,它就只能按训练数据里的平均印象来写,产出一个“看起来正确但放在你项目里一定有违和感”的东西。边界缺失体现在任务漫无边际,AI一旦在某个小点被卡住,就会自行发挥去改目录结构、顺手“优化”掉其它模块的代码,这些未经确认的改动就像埋在地毯下面的钉子。验证缺失最致命,AI生成的代码有单测覆盖吗?跑过静态检查吗?过过代码审查吗?都没有,那就等于在悬崖边跳舞,不系安全绳。
所以翻车不是模型不行,是过程缺位。把这三样补上,VibeCoding才能从“碰运气”变成“稳定产出”。
1.3 工程化的本质:把“提问—生成”变成“协作—交付”
我经常跟团队说一句话:把AI想象成一个刚入职、学习能力极强但完全没有行业常识的实习生。你不会跟实习生说“去把电商系统写了”,你会给他讲清楚业务背景、告诉他代码规范、拆好任务、约定好验收标准,然后定期检查他的产出。VibeCoding的工程化,本质就是把这套带实习生的流程搬到AI协作上。
这套流程落到具体执行,就是几个固定动作:初始化上下文、拆解任务、逐块实现、人工审查、自动验证、回归记录。每一个动作都有对应的工具和产出物,不是靠临场感觉。接下来我把这套流程拆开,一步一步讲清楚怎么做。
2. 从项目初始化开始:搭好AI协作的“操作台”
2.1 用AGENTS.md给AI一本“项目操作手册”
工程化要做的第一件事,不是写业务代码,而是先给AI写一份“项目操作手册”。现在主流AI编程工具(不管是Cursor、Copilot还是Claude Code)都约定了一种叫AGENTS.md(或CLAUDE.md、.cursor/rules/等)的项目级指令文件,AI在读取代码之前会先读这个文件,相当于给它一本随身携带的说明书。
我自己的AGENTS.md通常长这样,你可以直接改改拿去用:
# 项目说明 这个仓库是一个面向XX场景的XX服务,技术栈为Python 3.11 + FastAPI + PostgreSQL。 代码库结构: - app/api/ 存放HTTP接口层 - app/services/ 存放业务逻辑层 - app/models/ 存放ORM模型定义 - tests/ 存放单元测试与集成测试 # 编码约定 - Python代码使用类型标注,所有函数必须写docstring - 数据库操作只允许通过app/services/内的仓库函数进行,禁止在接口层直接写SQL - 异常统一使用app/exceptions.py中定义的业务异常,禁止裸抛RuntimeError - 所有对外接口的出入参必须用Pydantic模型声明 # AI开发守则 - 当你修改某个模块时,先列出现有文件和关键函数,再做改动 - 生成新文件前,先阅读项目根目录下的README.md和现有代码风格 - 不要修改依赖版本文件,除非任务中明确要求 - 每个任务完成后,用一句话总结改动内容和影响范围这份文件解决的就是前面说的上下文缺失问题。它不需要写得多华丽,但一定要具体到你项目里真正会被触犯的规范。我见过很多团队把AGENTS.md写成“要写出高质量的代码”这种废话,AI读完了等于没读。好的规则一定是可以被自动检查的、边界清晰的约定,比如“接口层禁止写SQL”就比“注意分层清晰”有用得多。
2.2 角色、上下文与代码约定:让AI从“嘴替”变成“熟手”
有了AGENTS.md还不够,每次开启新任务时,我还会在对话里做一次“角色锚定”。这不是装样子,而是为了让AI的输出分布更贴近你的场景。比如我会在第一个消息里明确说:“你是一个熟悉FastAPI和SQLAlchemy的Python后端工程师,现在要在这个项目里新增一个XX功能,请先浏览项目结构,确认技术栈,再给出实现方案。”
这一步的作用,是让AI从“通用模型”切换到“项目专属模型”。虽然大模型本身的能力边界没变,但对输出风格的影响相当大。你在对话里点明技术栈和项目约束,它跑偏的概率会明显下降。
代码约定也是这个环节的必修课。除了AGENTS.md里写死的守则,我还习惯在项目里放一份CONTRIBUTING.md(或简化版的开发规范文档),供人工和AI同时参考。因为AI并不能100%执行AGENTS.md里的每一条规则,总会有漏网的时候,所以人工审查时手里要有一份“标准答案”。这份文档既是给AI的上下文,也是给团队评审的尺子。
2.3 工具选型:按你的工作形态挑AI编程助手
很多人在网上问“哪个AI编程工具最好用”,我的答案永远是:先看你的工作形态,再选工具,别反过来。
如果你日常工作是改bug、加小函数、写单元测试,那IDE内嵌的AI补全工具(比如Copilot这类)就够用,它在你写代码时给建议,侵入感低。如果你经常要在一个成规模的项目里做跨文件改动、重构、写新模块,那我推荐使用对话式AI编码工具(Cursor、Windsurf这类编辑器型),它能主动扫描项目结构、读取多个文件再决定改动方案,效率比逐行补全高很多。如果你是一个功能明确的任务,希望AI能自己跑命令、看报错、改完代码再跑测试,那就上CLI式Agent工具(Claude Code、Codex CLI这类),它能在一个闭环里完成“理解任务—改代码—执行测试—修正错误”的全流程,像远程外包工程师。
工具没有绝对的好坏,关键看匹配度。我的日常组合是一个对话式编辑器加一个CLI Agent:复杂架构调整用编辑器慢慢聊,小而明确的任务直接丢给CLI Agent去执行。两个配合,效率最高。
还有一个被很多人忽略的点:权限最小化。不管用哪个工具,都要在配置里限制它能访问的目录和能执行的命令。AI是工具,不是神,给它越权就等于把你的生产环境钥匙挂在门口,没必要。
3. 需求拆解与任务切片:把大目标切成AI能消化的粒度
3.1 拆任务的核心原则:输入、输出、约束缺一不可
工程化的第二个关键动作是任务切片。很多人直接对AI说“帮我把用户登录模块写了”,这就等于让一个外包工程师在没需求文档、没接口约定、没UI稿的情况下开工,他能给你写出来才怪。
我自己的习惯是,任何一个交给AI的任务,描述里必须包含三样东西:输入、输出、约束。输入指它需要依赖的现有代码、数据结构、外部接口;输出指这次改完应该交付什么(新增了哪些文件、修改了哪些函数);约束指哪些是不能碰的、哪些是必须遵守的。举个例子,如果我要实现一个“根据订单金额计算折扣”的功能,我不会只说“写个折扣计算”,我会说:“在app/services/promo.py中新增函数calculate_discount(order_amount: float, user_level: str) -> float,输入为订单金额与用户等级,输出为折扣后的金额,计算结果保留两位小数,user_level为'normal'时不打折,'vip'打95折,'svip'打9折,折扣规则读取config/promo.yaml,不允许在函数内硬编码。”
这样AI给出的代码基本上就是一次过。不是因为它变聪明了,而是因为你把模糊度降到了最低。工程上有个说法:需求的模糊率决定返工率,这句话放到AI协作里一样成立。
3.2 一套可直接复用的VibeCoding任务模板
为了让任务描述不靠灵感、可复制,我整理了一套固定的任务模板,团队里沿用下来效果不错:
## 任务目标 一句话说清楚要做什么。 ## 背景与上下文 - 涉及现有文件:xxx.py、yyy.py - 关键依赖:项目里已有的模块A,第三方库B - 相关数据:表结构、消息格式、配置文件等 ## 实现要求 - 输入与输出:明确函数签名、返回类型、边界行为 - 代码风格:遵循AGENTS.md里的约定 - 禁止事项:不要改动xxx,不要升级依赖版本,不要引入新依赖 ## 验收标准 - 单元测试:新增哪些测试用例 - 手动验证:跑什么命令、预期什么结果 - 交付物:新增/修改的文件清单你可能会觉得这样写很麻烦,但实际操作中,一份任务模板并不是每次都得从头写。80%的内容可以靠对话历史或项目文档复用,你只需要把每次任务的差异部分改掉就行。我用这套模板带过两个初级开发,他们上手AI协作的速度非常快,因为模板把思考过程固化了,不需要每次绞尽脑汁组织语言。
还有一个小技巧:任务模板里加一行“如果需要修改现有函数,请先列出该函数的当前实现,然后说明你的改动理由”。这行指令能有效防止AI无理由重写一个还能用的函数,减少review负担。
3.3 人工审查点必须留在流程里
切片之后,流程里一定要留人工审查点,这是工程化的底线。我见过有人想让AI全自动改代码、自动提交、自动部署,我坚决反对。至少在当前阶段,AI生成代码的质量波动仍然存在,而且它对自己的错误没有羞耻感——明明这行代码逻辑不对,它也会自信地解释成“为了特殊边界情况而设计”。所以,人工审查点是安全网,不是走流程。
审查点怎么设置?我建议至少三个:写方案后审查一次,确认技术路线没问题再让AI动手写代码;写完后审查一次diff,确认每处改动都在任务边界内;测试通过后审查一次测试覆盖,确认关键路径被覆盖到。三个点加起来损失不了多少时间,但能把90%的坑提前踩掉。
4. 全流程实操演示:带AI从零交付一个重复文件扫描器
4.1 场景与目标:先定边界再动手
前面讲了一堆理论,下面用一个完整的例子串一遍。我选了一个很常见的需求:写一个“磁盘重复文件扫描器”,给定一个目录,扫描出所有内容完全相同的重复文件,并分组输出。这个需求不大不小,刚好能演示工程化流程的每个环节。
一开始我会先跟AI对齐边界,而不是直接让它开写。我在对话里给的第一条消息是这样的:目标是开发一个命令行工具,输入一个目录,输出重复文件的分组列表;运行环境是Python 3.11,不引入任何第三方依赖。要求先浏览当前目录结构,如果还没有项目骨架,就提出一个文件规划方案,先别写代码。
这里的关键是“先别写代码”——很多AI一收到任务就急着生成代码,最后你辛辛苦苦review半天,发现方向根本不对。先让它出方案,把选择空间收窄,是工程化流程里低成本的试错方式。
4.2 阶段一:初始化上下文与方案设计
AI收到我的消息后,照例先读目录结构。因为是空项目,它很快给出了一个方案:用两个模块,file_scanner.py负责递归遍历目录、计算文件哈希,dedupe_report.py负责分组和生成报告;入口main.py接收命令行参数。同时还提出两个技术细节:文件哈希用分块计算避免大文件内存暴涨,先按文件大小粗筛、再对同大小的文件计算哈希,减少哈希计算量。这个方案基本合理,但我在审查时补了一个要求:对于无权限读取的文件和符号链接,必须显式处理,不能被当成异常让整个程序崩溃。
这一步充分体现了“人工审查点”的价值。AI的方案在常规路径下很完善,但边界情况往往是它的盲区。你自己不动脑、不补条件,AI写出来的东西就只覆盖了它想象中的世界,而不是真实世界。补上边界条件后,我让AI按方案先搭目录骨架和函数签名,这一小步做完,我就不用盯着它了。
4.3 阶段二:任务切片、分批实现
之后我把实现拆成了四个小任务,挨个发给AI,而不是一次让它全部写完。每个任务都用前面那套模板描述清楚:
第一个任务:实现file_scanner.py中的iter_files函数,递归遍历目录,返回所有文件的路径、大小、mtime,跳过符号链接,处理权限错误时打印警告而不是终止。
第二个任务:实现calculate_hash函数,用sha256分块读取文件,块大小设为1MB,支持传入起始偏移量以便对大文件做部分内容快速比对。分块读的细节是我主动加的,因为AI很可能会选一个最省事的方案——一次性读整个文件进内存,遇到几十GB的视频文件直接内存爆掉。
第三个任务:实现分组逻辑,使用“先按大小分组,再按哈希精确匹配”的两阶段策略。
第四个任务:实现CLI入口,支持参数dir、--hash-threshold(可选,用于控制大文件是否做全量哈希)、--format(text或json)。
每个任务完成后,我会让AI跑一遍模块级的简单示例,确认没有语法错误和明显逻辑问题。四块任务之间有依赖关系,但每一块的验收标准都是独立可检查的。
4.4 阶段三:代码审查、测试与收尾
四个任务全部完成后,我进入集中审查阶段。我会逐个看AI提交的diff,重点看几个方面:函数是否真的处理了权限错误和符号链接;哈希分块的偏移量计算是否正确,有没有可能漏掉文件末尾的数据;两阶段分组的逻辑里有没有把两个不同文件误判为相同(哈希碰撞的概率可以忽略,但代码逻辑本身可能漏判);CLI参数的默认值是否合理。这些审查项不是AI能替你想的,得靠你自己从业务角度出发来思考。
接下来是测试。我会让AI为工具编写测试用例,用临时目录构造一批伪文件,包括:完全相同的文件组、大小相同但内容不同的文件组、不同大小文件、无权限读取的文件。测试的目的是验证边界情况,而不只是让它“跑通一个正常路径”。AI写完测试后,实际跑一遍,如果测试报错,我要求它先解释根因、再说改法,不允许直接盲目改测试去迁就实现。
最后一步是收尾:补一个README,写清楚用法和注意事项;把AI在实现过程中的几个决策(比如为什么选择sha256而不是md5,为什么先按大小粗筛)记录到项目的docs/decisions.md里。这些决策记录看起来不起眼,但三个月后你再回来看这段代码,会发现它们比代码注释更有价值。
4.5 过程中踩坑与决策记录:项目维护的关键
这个演示项目虽然小,但它把工程化流程的几个核心动作都走了一遍:初始化上下文、对齐方案、切片实现、人工审查、测试验证、决策留痕。我在实操中带团队跑这个流程时,大家最大的感受是“节奏慢了”。没错,单次任务确实比裸奔式直接生成要慢,但总体的返工率、线上事故率和维护成本会大幅下降。这个账算下来,慢即是快。
5. 常见问题与排查技巧实录
5.1 高频问题速查表
这些是我在实际使用中遇到最多的坑,整理成一张速查表,希望对你有用。
| 问题 | 现象 | 排查思路与解决建议 |
|---|---|---|
| AI反复改不对 | 同一个bug修了三轮还在原地打转 | 在任务描述里附上完整报错栈和相关代码片段,并强制要求AI“先解释根因,再给代码”,防止它在表面打转 |
| 上下文失忆 | 聊到一半AI忘了最开始的需求 | 一个任务一个会话;关键决策和约束写进AGENTS.md或任务描述,不要只留在对话里 |
| 代码风格混乱 | 命名、缩进、模块边界没有一致性 | 在AGENTS.md里写死约定,并在review时逐条对照;AI生成代码后让先跑一遍格式化工具再提交 |
| 幻觉API | 代码引用了不存在的第三方函数 | 审查时关注import部分;要求AI在使用第三方API时先注明版本;运行前用静态检查工具扫一遍 |
| 越权改动 | 本来只让改一个函数,结果它重构了整个模块 | 任务模板里加“禁止事项”一栏;提交diff时用工具对照,超出任务范围的全部打回 |
| 安全泄露 | 密钥、连接串被写进代码或提交到仓库 | 项目中配置.gitignore拦截配置文件;review时扫一遍diff内容;禁止把敏感信息贴进AI对话 |
| 测试形同虚设 | 测试全绿但功能是坏的 | 检查测试有没有断言真实行为,而不是只验证“函数不报错”;让AI先写测试再写实现 |
5.2 四句实用话术,避免和AI反复拉扯
跟AI协作这几年,我总结了几句话术,关键时刻能省下大量时间。第一句:“在你动手前,先列出你打算阅读哪些文件,以及为什么需要读它们。”这句能让AI先理清上下文,而不是闷头乱翻。第二句:“如果这个方案存在边界情况,请先列出来,再告诉我你打算怎么处理。”这是逼它思考盲区,很多幻觉都是从这里暴露出来的。第三句:“请用一个具体例子走一遍你的逻辑,标注输入和每一步的输出。”这一句能有效验证算法逻辑,很多看似合理的实现一跑例子就露馅。第四句:“请不要修改以下内容:xxx。”这句话比“你不要乱改”有用得多,把明确的禁区和范围画出来,AI就会变得规矩很多。
5.3 长期运营VibeCoding流程的几条心得
最后说几条长期实践攒下来的心得。第一条,AI生成的代码要当“外包代码”来审,不要当“自己人”的代码来放松警惕。凡是进入主干分支的代码,都要过一遍审查,没有例外。第二条,AGENTS.md要持续迭代,每次发现AI反复犯同类错误,就把对应的规则写进去,让规则替你说话。第三条,不要过分追求“一条龙自动化”,AI编程的杠杆作用在于加速实现,而不是替代工程判断,把判断权交出去的那一刻,风险就开始累积了。
我个人在实际操作中的体会是:VibeCoding工程化最大的价值,不是让AI写出更高深的代码,而是让整个过程变得可控、可追踪、可复盘。你不再害怕AI给出一大坨看不懂的东西,因为每段代码都有它产生的上下文、任务边界和审查记录。AI做不到完美,但我们能用流程把“不完美”限制在可控范围内。真正成熟的姿态,是把它当成一个能力很强、偶尔会犯错、必须放在流程里使用的同事,而不是一个供在神坛上的万能程序员。