前阵子整理工作台,翻出自己年初写的一份AI编程流程笔记,上面密密麻麻全是批注。那时候刚接触AI辅助开发,觉得“让AI写代码”这事挺玄乎,实测下来发现,真正难的不是工具本身,而是怎么把一个大需求拆成AI能理解的指令,再把AI产出的代码安全地合进项目里。折腾了大半年,跑了几个真实项目之后,我把自己那套流程彻底重构了一遍,也就是现在这套“AI编程完整工作流程v2.0”。
这套流程不是某个工具的广告,也不是一堆提示词模板的堆砌,它是一套从需求到上线的完整闭环,解决的核心问题是:怎么让AI帮我写好代码,同时不把项目搞乱。它覆盖了工具选型、任务拆解、提示词写作、代码审查、测试联调、版本管理这些环节,适合那些已经在用AI编程、但觉得产出不稳定、经常改来改去、甚至被AI代码坑过的人。如果你正准备从零开始尝试AI编程,这套流程也能帮你少走不少弯路,我尽量用说人话的方式,把每个环节的逻辑和实操都讲清楚。
1. 完整工作流全景:从需求到落地的七个环节
很多文章讲AI编程,上来就是“给你看我的提示词”,实际上提示词只是冰山一角。AI编程要稳定落地,靠的是整套流程,而不是某一句咒语。我这套v2.0流程,核心是七个环节,环环相扣。
1.1 v1.0踩过的坑,逼我重构了流程
先说说v1.0为什么不行。我第一版流程特别简单粗暴:接到需求,打开AI对话框,把需求原封不动粘进去,复制代码,粘贴到项目里,完事。这套流程在前几个小工具项目里还算顺利,但到了稍微复杂一点的业务需求就彻底翻车。有一次我让AI写一个带权限校验的文件上传模块,它一口气生成了600多行代码,看着结构清晰,注释也全,结果一跑,依赖冲突、路径写死、没有处理文件名注入,一堆问题。当时的AI编程完全没有安全感,每次合并代码都像在拆弹。
v2.0我做了三个核心调整:第一,把“需求澄清”和“方案设计”提到编码前面,让AI先动脑再动手;第二,把“代码审查”从可有可无变成硬性环节,而且是人机双重审查;第三,把“版本管理”前置,所有AI生成的代码先进分支,验证通过再合入主线,不给它任何直接污染主代码的机会。这三个调整直接解决了v1.0最痛的两个问题:AI理解偏差和不可控修改。
1.2 七个环节分别做什么、产出什么
这套v2.0流程,本质上就是把AI当成一个能力很强但需要管理的新人同事,你有完整的工作流程来管理它,而不是让它自由发挥。七个环节分别是:
- 需求澄清:把模糊的想法变成明确的、可验收的需求描述。这个环节的产出是一个“需求规格说明”,哪怕只有几行字,也必须有明确的输入、输出和边界条件。
- 方案设计:要求AI先给出实现方案,包括技术路线、文件结构、数据结构设计,这个环节的产出是一份技术设计摘要,人必须亲自审核。
- 工程准备:建立独立分支、准备测试环境、确认依赖管理方式。产出是一个干净的、可回滚的开发环境。
- 任务拆解:把大功能拆成小任务,每个任务控制在AI能独立完成的粒度。产出是一份任务清单,每个任务包含独立的验收标准。
- 编码实现:针对每个任务,使用规范的提示词模板生成代码,产出是符合项目风格、可运行的代码片段。
- 联调测试:把AI生成的代码放进真实项目里运行,喂真实数据,观察真实行为。产出是测试报告。
- 代码审查与提交:人工逐行审查、修正问题、合并分支。产出是稳定可交付的代码。
这套流程和传统开发流程最大的区别在于,每个环节都针对“AI的不可靠性”做了防御性设计。需求澄清防的是理解偏差,方案设计防的是技术路线选错,任务拆解防的是AI在超大上下文中迷失,编码实现防的是风格混乱,联调测试防的是“看着对实际错”,代码审查防的是AI幻觉。每一步都是血的教训换来的。
1.3 为什么顺序不能乱
这个流程的顺序,我是严格有讲究的,因为每一步都是为了消解下一步的风险。比如需求澄清不做好,直接让AI出方案,它大概率会按照训练数据里最常见的模式来设计,根本不会考虑你项目的实际情况。方案设计不做完,直接进入编码,AI生成的代码可能技术上没毛病,但架构上跟你的项目是两张皮。任务拆解做得太粗糙,一次性给AI一个大任务,它生成的代码几乎必然会有上下文丢失的问题,前面写的变量后面就忘了用。
还有一种常见问题是,很多人觉得“AI快,所以可以边做边改”,但实践证明边做边改的效率极低。AI每次修改都是一次重新生成,它不会像人一样记住上一次的意图,你没有明确指出的问题,它下轮大概率还会犯。与其来回拉扯,不如在每个环节多花几分钟把要求写清楚,后面的返工量能少80%。我实测下来,按这套流程执行,一个中等复杂度的功能模块,从需求到合入主线,总耗时往往比传统方式少一半以上,而且是稳定可控的。
2. 工具链选型:核心引擎、辅助插件与Agent工具怎么搭配
工具选型是很多人纠结的问题,实际上AI编程工具已经形成了明确的分层结构。我现在的工作流里,工具分三类:核心对话引擎、IDE辅助插件、Agent自动化工具。每一类都有自己不可替代的位置,也有自己的使用边界。
2.1 核心引擎怎么选:别只看跑分和广告
核心对话引擎是整套流程的大脑,目前主流的选择包括几个方向。一类是国际头部大厂的产品,综合能力确实能打;另一类是国内优秀产品,在中文理解和本地化场景上很有优势;还有开源方案,适合对数据隐私有要求的团队自己部署。选型的逻辑不是看谁的演示视频炫酷,而是看你项目的实际需求。
跑分只能反映平均水平,无法反映你具体场景下的表现。我建议做一次“最小验证”:拿你项目里最典型的一个模块,分别让几个候选引擎生成代码,看看谁生成的代码最符合你项目的命名规范、依赖习惯和复杂程度,这个比看任何榜单都靠谱。以我的实测经验,复杂业务逻辑上,通用能力强的引擎优势明显;用中文写注释和沟通时,国内产品更顺滑;有数据合规要求的场景,开源方案是唯一选择。
热词里提到“deepseek的api和C知道哪个好用”,这个我确实都测过。deepseek的API接入到自己项目里很灵活,而且性价比高,适合处理大量代码生成请求;C知道的优势是集成度好,界面简单,适合不想折腾环境的人。我的建议是不要把两者对立,我的实际用法是:深度的架构设计和疑难问题用综合推理能力更强的模型,日常的样板代码和简单CRUD用更快的轻量引擎,两者可以共用一套提示词规范。核心原则是,工具为流程服务,不要让工具决定了流程。
2.2 IDE辅助插件:真正的效率放大器
辅助插件解决的是“对话窗口和项目文件割裂”的问题。以前我在网页对话框里让AI生成一段代码,生成之后要手动复制粘贴到文件里,如果文件很大,还得找到正确的插入点,来回切换窗口非常消耗专注力。现在主流的辅助插件都能做到在编辑器里直接对话,AI生成的代码可以直接预览、应用、对比,甚至多文件同时修改时还能逐个文件确认变更。
我的实际体验是,这类插件选一个主流产品用熟就够了,不需要装一堆。装上之后要做的第一件事不是急着生成代码,而是配置项目上下文——告诉AI这个项目用什么语言、什么框架、什么代码风格、哪些目录是核心源码、哪些是依赖目录。很多人在这个环节偷懒,结果AI生成的代码经常把 dependencies 目录当源码目录来引用,原因就是上下文没配好。
另外一个实用技巧是,让辅助插件帮你做“跨文件修改”。传统对话引擎生成代码往往只给你一个文件的内容,但真实项目里加一个功能往往要动三四个文件,比如新加一个接口,要动路由、控制器、服务层,可能还要改数据库映射。辅助插件好一点的能识别你的项目结构,一次性生成多个文件的改动方案,你逐个确认后批量应用。这个能力省的时间远比自动补全多。
2.3 Agent工具的边界:不是所有事都该交给Agent
Agent是今年很火的方向,热词里也提到了不少Agent工具。这类工具的特点是不仅生成代码,还能自己执行、自己测试、自己修bug,像一个真正的小助手。听起来很美好,但我的经验是,Agent工具的使用边界一定要划清楚。
我目前最常用的Agent场景有两类:第一类是批量机械性任务,比如给一整个目录的代码统一调整错误处理结构、给所有接口补充参数校验;第二类是跨文件重构,比如把一个类从一个包移到另一个包,顺带把所有引用的地方都改掉,这类任务人工改容易漏,Agent反而不容易漏。但我不建议把Agent用在核心业务逻辑的初始设计上——Agent的动手能力很强,但它对业务的理解仍然有限,复杂业务一旦Agent走了错误的方向,它会在错误的方向上快速改来改去,浪费的时间比人工还多。
有个安全原则需要时刻记住:Agent能够自主执行,但它的操作必须有边界限制。我的做法是,给Agent配置的权限只限定在同一分支内,所有Agent产生的提交都推送到特定分支,并且消息里加了可追溯标记,一旦出问题可以批量识别、批量回退。给了Agent越大的权限,对它的监督成本就应该越高。
2.4 v2.0保留和砍掉的工具
重构流程时我认真梳理过手上的工具,把不该用的都砍了。保留的有:一个综合能力最强的核心引擎处理复杂任务,一个响应快的轻量引擎处理简单任务,一个IDE辅助插件做日常开发,一个Agent工具处理批量重构。砍掉的有:各种“一键生成完整项目”的脚手架类工具,因为它们生成的项目往往带着一堆我用不到的代码,维护成本远超从零写;还有过度定制的垂直领域工具,它们在小场景里很顺,一旦需求超出预设范围就完全抓瞎,学习成本还不低。
工具链的核心逻辑,永远是“让AI适配项目和场景,而不是让项目和场景去适配某个AI”。保持工具链的最小化,意味着从源头降低系统复杂度和维护成本。
3. 提示词工程:把AI从“灵感型选手”变成“稳定型选手”
提示词是整个流程里最容易被高估也最容易被低估的部分。说被高估,是因为网上很多人把提示词说得像魔法咒语,好像一句话说得漂亮就能解决所有问题;说被低估,是因为很多人以为提示词就是描述一下需求,AI就能写出完美代码,实际上没有经过结构化设计的提示词,永远是半随机输出。
3.1 写提示词之前,先把需求翻译成规格
我在v2.0流程里加了一个强制步骤:写提示词之前,先把需求翻译成规格。这一步的目的,是把模糊的人类语言翻译成AI更擅长的、带有明确约束的技术语言。比如“给用户上传头像的功能加上尺寸限制”,这不是一个好的需求描述,它没有说清楚限制是多少,超限怎么办,什么格式允许,什么格式不允许。
翻译成规格之后应该是这样的:“在用户头像上传接口中增加图片尺寸校验:最大宽度2048px,最大高度2048px,最大文件大小5MB,支持格式仅限JPG/PNG/WebP,超限时返回HTTP 400和错误码AVATAR_SIZE_EXCEEDED,校验逻辑放在service层,实现方式参考项目中现有的FileValidator类。”这个规格里每个信息都有明确的执行路径,AI不需要猜测,生成的代码自然就更准确。
不管是什么样的工作流,这个步骤都不能省。有时候你可能会觉得,花时间写规格还不如直接写代码,但如果AI因为需求模糊而写出了偏离方向的东西,来回沟通修改的时间,往往比你写规格的时间多得多。把需求翻译成规格,本质上是把人的判断成本前置。
3.2 一套可以照抄的提示词结构
经过大量测试,我总结了一套在大多数场景下都好用的提示词结构,一共五个部分。每个部分职责清晰,并且都是为了让AI减少猜测。
- 角色与任务:告诉AI,你是一个资深后端工程师,请实现一个XX功能。
- 技术上下文:列出项目语言、框架、关键依赖、代码风格约定。
- 详细需求条目:分点列出所有功能要求,每一点都是一个不可妥协的验收条件。
- 约束与边界:明确不做什么,比如“不要修改现有函数”“不要引入新的第三方库”“不要改变接口签名”。
- 输出格式:要求“只输出代码,不要解释”“在代码中添加必要的注释”“先输出实现方案,等我确认后再输出代码”。
第五点值得单独说一下。很多人忽略了输出格式的控制,导致AI每次生成一大篇说明文,夹杂代码片段,还得自己手动整理。你直接要求它“只输出代码”,它就只给你代码;你要求它“先给方案,确认后给代码”,它就严格分两步走,沟通效率和生成质量都会明显提升。把提示词想象成给实习生的任务单:你写得越细,他做得越对。
3.3 不同任务的提示词侧重点不同
编码实现里,不同任务的提示词侧重点完全不一样。写新功能时,重点是上下文清晰度和约束明确度,要把相关文件的代码片段贴给AI当参考;修bug时,重点是错误信息的完整度,光说“这个功能有问题”AI是懵的,你把报错堆栈、期望行为、实际行为一起贴给它,它才能准确定位;重构代码时,重点是原有行为的不变性,你要反复强调“逻辑不能变,只调整结构”,否则AI极有可能顺手帮你“优化”出新的bug;写测试时,重点是把测试场景列到极致,让AI覆盖正常路径、边界值、异常参数。
单独拎出贴代码这个操作说一下。很多人不贴代码,就在对话框里说“我有一个函数有问题”,AI就算再强,也等于蒙着眼睛猜。正确的做法是把相关文件、相关函数、相关调用的代码直接贴进对话框,然后再描述你的问题。代码上下文给得越足,输出质量就越是呈指数级提高。这一条千万不要图省事。
3.4 提示词的迭代:追问、纠偏、补约束
提示词不是一次写好的,更多时候是快速迭代出来的。我的常规做法是“三部曲”。第一轮,让AI给出整体思路和方案,我不急着要代码,先看它的方向对不对;第二轮,确认方案后,让它按照方案生成具体代码,如果生成结果有偏差,我直接指出偏差,让它修正,并且每次都强调“基于你刚才的方案继续修改,不要推倒重来”;第三轮,针对生成的代码做审查,发现问题继续补充约束条件。
纠偏的时候有个关键技巧:不要只说“这个不对”“这里有问题”,AI分不清你指的是哪里。要明确指出“第X步的方案有问题,因为依赖关系没有考虑清楚”“生成代码的第Y行调用了一个不存在的函数”,指出得越具体,AI的修正就越精准。这套提示词迭代方式,让AI从“灵感型选手”变成了“稳定型选手”,它能稳定地输出符合预期的结果,偶尔出现偏差,你也有明确的方法把它拉回来。
4. 实操演示:一个功能从零到上线的完整记录
理论讲了一堆,来一次完整的实操记录。这里以一个实际做过的功能为例:给一个内部数据平台,新增一个“批量导入用户数据,并自动去重”的后端接口。这个功能看着简单,实际容易翻车,正好能把整套流程走一遍。
4.1 需求澄清:从一句话到可验收清单
最开始拿到的需求就是一句话:“加一个批量导入用户的功能,重复的不要导进去。”这句话能干活吗?不能,因为“重复”的定义不明确,是邮箱重复、手机号重复、还是用户名重复?“不要导进去”是完全跳过,还是给出提示让用户自己选?导入失败的数据怎么处理?有没有条数上限?
需求澄清之后,我把需求翻译成了这样的规格:1. 接口接收一个CSV文件,文件编码UTF-8,单次最多10万条记录;2. 数据去重规则:主键是用户邮箱,如果CSV内部或数据库已存在相同邮箱,则该条记录标记为失败,不影响其他记录导入;3. 导入结果返回三类统计:成功数、失败数、失败原因列表;4. 导入操作记录审计日志,写入导入时间、操作人、文件名。这一步做完,AI就不需要猜了,它的任务清晰得就像一道考试题。
4.2 方案设计:让AI先出方案,别急着出代码
需求规格确认后,我没有立刻让AI写代码,而是先要求它输出实现方案。这个环节的关键词是“复用优先”,我会在提示词里加上一句“优先复用项目现有工具类和数据库访问层,不要重复造轮子”。AI给出的方案是:使用现有CSV工具类解析文件,使用数据库层的批量插入接口,使用事务包裹整个导入逻辑,先校验全部数据再写库,失败信息用内存中的列表暂存,处理完统一返回。这个方案合理,我确认后,才进入编码环节。
方案设计这一环最大的价值,是提前发现AI可能走错的方向。有一次AI在设计阶段提出要给数据库加一个临时表来存储导入数据,我直接否掉了这个方案——数据量并不大,事务内处理完全够用,加临时表反而增加复杂度。如果跳过方案设计直接让AI写代码,这段带临时表的代码就会直接生成出来,事后再改,浪费的成本就不小了。
4.3 编码实现:拆解成小任务,每个任务独立验收
编码阶段我不会一股脑让AI写整个功能,而是按之前规划的职责拆成三个小任务,分别生成、分别验证。这样做的好处很明显:每个任务占用的上下文窗口小,AI不会“忘了前面写了什么”;每个任务可以独立测试,不会因为一个大文件里有一处报错,就导致整个功能无法验证。
第一个任务是CSV解析与校验模块,要求“输入CSV文件路径,输出用户列表和错误列表,空行自动跳过,非法邮箱直接标记失败”;第二个任务是数据库去重查询逻辑,要求“输入用户邮箱列表,查询已存在的邮箱集合,接口设计为批量查询一次返回所有结果”;第三个任务是导入主逻辑与结果组装,要求“事务内先校验再去重再批量写入,返回成功列表和失败原因列表”。每个任务都用前面说的提示词结构来写,AI生成的代码基本一次成型,偶尔有小问题,指出来之后修改也很快。
4.4 联调测试:喂真实数据,观察真实行为
代码生成完,最重要的环节是联调测试。我把AI生成的代码合并到分支里,跑了一个真实的CSV文件,里面准备了故意构造的数据:两行完全相同的记录,一行邮箱格式非法,一行是数据库里已存在的用户,还有几行正常数据。第一次跑,结果并不完美,非法邮箱那行被正确拦截了,但重复的邮箱只被去重了一部分,原因是AI在去重逻辑里用的是第一次出现的下标,和CSV内部去重的预期行为不一致。
这个bug在纯代码审查阶段不容易发现,因为代码逻辑看着是自洽的,只有用真实数据一跑,行为的偏差才暴露出来。我把实际的测试结果反馈给AI,描述了期望行为和实际行为的差异,AI很快就定位并修正了问题。这一步验证了一个重要结论:AI生成的代码,逻辑正确不代表行为正确,一定要用真实输入验证真实输出。
4.5 代码审查与提交:人必须做的那几件事
测试通过之后,还有一道最后的安全网:代码审查。我逐行过了一遍AI生成的代码,重点看了几个AI经常翻车的点:有没有硬编码路径和密钥、有没有处理异常的catch块里只打了日志没有实际兜底、有没有资源泄漏(比如文件流没有关闭)、有没有sql注入风险(虽然AI大概率不会犯,但表结构相关的操作必须确认)。检查下来整体质量不错,只发现一处小问题:CSV文件流在解析异常时没有关闭,存在文件句柄泄漏风险。修正后,才把代码合并到主线分支。
另外一个容易忽略的是提交信息。AI生成的代码不完善,开发者必须确保提交信息是有意义的。AI编程并不意味着可以不动脑,越是用AI提速,越要保住代码质量这条底线。人可以不用敲每一行代码,但必须理解每一段代码在做什么、为什么这样做,否则等于主动放弃了代码的可维护性。
5. 常见翻车现场:AI编程的典型问题排查与预防
再顺的流程也会遇到问题,尤其是AI编程这种新玩法。我特意整理了这段时间遇到频率最高的几类问题,每条都是踩过的坑,直接给排查思路和预防手段。
5.1 上下文丢失:AI写到后面忘了前面
作为最常见的问题,上下文丢失在长对话里几乎100%会发生。典型表现是:对话开始不久给它定义了角色和项目背景,写到后面,AI开始用错误的框架、错误的命名风格,甚至直接生成了不存在的接口和变量。这是因为大模型注意力机制本质上就是一个有记忆衰减的过程。
排查思路很简单:一旦发现AI的输出和前面约定不一致,立刻停止当前对话,新开一个对话窗口,把核心约束重新粘贴进去,并把后半部分要做的任务描述得更简练且完整。不要指望在超长上下文里靠“记得我之前说过xxx”来对齐,模型不是真人,这种提醒作用极其有限。预防手段是“长任务切短对话”:每个对话窗口只负责一个小任务,一旦完成就清场重开,不要想着在同一个对话里干活到底。
5.2 幻觉API:看着像真的,一跑就报错
AI生成的代码最让人头疼的,是调用了现实中不存在的库或接口。有一次,让AI生成一个读取excel文件的代码,它直接引用了一个不存在的库包,看着还挺合理,一跑就报“module not found”。这类问题的难点在于,AI会一本正经地用不存在的依赖,而且它不觉得这有问题。
预防手段有两种:一种是在提示词里加约束“只允许使用以下依赖:XX、XX、XX”,提前把项目依赖清单贴给AI,直接掐断它引入新依赖的冲动;另一种是在代码审查环节加入“依赖扫描”,检查生成代码里的import语句是否都在项目依赖配置里。从根因上讲,AI的知识截止日期决定了它大概率“知道”一些比你项目更新的库,但这些库你的环境里根本装不上,所以明确约束依赖范围,是这个问题的唯一解。
5.3 过度修改:让AI改个bug,它顺手毁了三个功能
AI在修bug时容易出现“越修越多错”。最典型的一次是让AI修复一个日期格式化的问题,它直接把整个日期工具类重写了,用了新的API,结果调用旧API的其余五个模块全部编译报错。原因是AI发现原代码风格“不够优雅”,顺手做了“优化”,但这完全超出了任务范围。
这类问题的医治重点在提示词和分支规范。提示词里必须加上“禁止修改与本次任务无关的代码”“只做最小必要修改”“修改后列出所有被修改的文件及修改原因”这样的硬性约束。同时一定要强调,让AI的修改始终在独立分支上进行,避免它误伤主分支代码。审查阶段还要留意AI有没有“顺手优化”的倾向,发现有超范围改动,直接回退相关文件。
5.4 版本失控:AI产生的垃圾提交淹没了主分支
如果不对AI的提交做隔离管理,它的输出就会像一匹野马,把项目的git历史搅得一团糟,各种无意义提交比比皆是。我的办法很简单,先建独立分支,然后要求AI的提交都推到这个独立分支上。这里想到热词里有人提到的git worktree,确实是好工具。
git worktree允许同一个仓库检出多个工作目录,每个目录各自对应一个分支。我可以给AI开一个专门的worktree目录,让Agent在这个隔离环境里随意折腾,我自己在主工作区该干嘛干嘛,两个工作区互不阻塞。等AI在隔离分支上跑完,我再过去审查代码,确认没问题之后合并;有问题就整个分支丢弃,主分支历史干干净净。这套隔离策略,让AI的试错成本降到了几乎为零。
5.5 高频问题排查速查表
整理一个速查表,遇到问题可以先对着看一眼:
| 症状 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| AI生成代码频繁报错 | 上下文不足或依赖混乱 | 查看报错堆栈,检查import语句 | 补充相关文件代码、明确依赖清单 |
| AI答非所问,反复出现同样错误 | 需求描述模糊,约束遗漏 | 复盘提示词,看哪些信息没定义 | 按5段式提示词结构补齐缺失部分 |
| 代码能跑但行为不符合预期 | 输入输出规格不明确 | 用测试数据验证实际行为 | 把验收标准变成明确的分点列表 |
| AI修改引发了新bug | 宏大的“顺手优化” | 审查git diff,找出超范围改动 | 回退无关文件,约束只做最小修改 |
| 分支被大量垃圾提交淹没 | Agent权限过大,缺少隔离 | 查看提交日志和分支图 | 用git worktree隔离,不合并不通过的分支 |
速查表只能解决大概方向的问题,因为AI编程的bug形态千变万化,记住一条就行了:AI的输出永远是“需要验证的候选品”,而不是“可以直接上线的成品”。保持这个心态,遇到任何问题都不慌,按顺序排查上下文、依赖、规格、边界,大部分问题都能在几分钟内定位。
目前这套v2.0流程,我已经跑了好几个从零到上线的实际项目,整体用下来最大的感受是:AI编程真正提升的不是“写代码的速度”,而是“把想法变成可运行代码”的速度。但前提是,你得有意识地管理AI的每一步行为,别让它在自由发挥中跑偏。最后聊一点小技巧——每完成一个大功能,花几十秒把用过的优质提示词单独存一个文件,备注好解决的是什么问题、踩过什么坑,下次遇到同类场景直接改改就能复用,别每次都从空白开始憋提示词。这算是我这段时间攒下的非常实用的一个习惯了。