
看到每月交付2000个PR这个数字时我先做了一次小规模的计算按一个自然月22个工作日算平均每天要合入90个PR哪怕10分钟一个也要不吃不喝连轴转15个小时。可如果你把这个数字放进GrokBot团队的工程文化里再看Lauren Tan的分享就会明白她根本不是在拼手速而是把AI嵌入了一条高度工程化的流水线。这篇文章我想把人AI交付PR这件事拆开讲怎么拆需求、怎么生成diff、怎么让CI兜底、以及我在实际项目里踩过的各种坑。不管你是独立开发者、想提速的团队技术负责人还是刚开始接触AI编程的新人都能从这里拿走一些可以直接复用的做法。过去一年我在一个中等规模的项目上尝试把这些方法落地单人PR合入速度提高了接近四倍这让我确信这条路径完全可以复制。1. 先把2000个PR这个数字讲透1.1 2000个PR不是产出量而是颗粒度决策我最初也以为月交付2000个PR意味着某种极端的自动驾驶AI写代码、自动提交、自动合入人坐在旁边看就行。实际去了解了Lauren Tan相关的分享后会发现这个数字背后是一套几乎完全相反的理念——把工程任务切成极小的、可以独立合入的单元。一个PR只重命名一个字段只加一条日志只补一个边界条件的判断只升级一个依赖的小版本。每一块都很小但堆起来就是极其可观的数量。为什么颗粒度小反而能支撑高速度我总结下来有四个原因。第一AI在大上下文里的可靠性会明显下降但小上下文恰恰是它的舒适区——你给它只改这个函数别碰其他部分这种百来行的任务输出稳定得多。第二小PR的review成本极低同事看一眼就能合入不用开会讨论、不用长时间占用别人注意力。第三小PR回滚成本几乎为零线上出了问题直接revert就行不用处理复杂的冲突。第四每个小PR都是一个明确的进度节点协作时别人不会干等一个大功能合入而是持续拿到能用的代码这对团队节奏感有巨大帮助。这里分享一个我调试出来的经验值在AI辅助开发跑了半年之后我倾向于把单个PR控制在120到250行的diff之间。低于50行的改动多半琐碎到不值得单独提PR高于500行的大改动AI参与的可靠性会明显下降人工review成本也跟着涨。这个数字不是教条每个项目可以自己试出来但小PR优先这个大方向基本不会错。1.2 AI在流水线里的真实位置副驾不是司机很多团队把AI编程理解成让AI把整个模块一口气写出来这是最大的误区。2500行新代码直接生成出来看着很爽可接下来你根本不知道哪里是AI根据统计概率编出来的接口哪里是正确的业务逻辑哪里可能藏着一颗逻辑诡雷。更理性的做法是把它当成执行力极强的副驾驾驶路线和最终决定权始终掌握在你手里AI负责把踩油门、打方向盘这种执行动作做到位。这个类比换成考驾照也很好理解AI是协同驾驶系统你盯着路况随时准备接管。每一次AI生成一段代码你都要做一次快速验收——这份改动是否匹配需求边界情况有没有覆盖测试能不能证明行为没有倒退我个人的节奏是AI生成一次代码通常不超过10秒但我至少花20秒读一遍关键路径再给一条精确的修改指令。这种10秒生成、20秒验收的循环是整个工作流里最核心的节拍。不少人会在这步偷懒觉得既然AI写的都差不多那我省点事。结果是合入一时爽合后火葬场等线上出问题再回头追查成本已经放大了几十倍。记住一个原则PR越小验收成本越低人机信任度越高长期来看这才是唯一能支撑月交付千级PR且不让系统崩掉的做法。这也是Lauren的分享里我一直印象最深的部分——她反复强调的从来不是让AI替我写而是我如何更快地验收和决策。2. 完整复刻一套人AI生成PR的工作流2.1 从模糊需求到第一版可提交diff需求在大多数时候只是一句含糊的话比如订单列表页支持按日期筛选或者接口时间格式改成ISO8601。如果你直接把这句话扔给AI它不知道项目的表结构、不知道命名习惯、不知道异常处理策略只能从统计概率里捞一个看似合理的答案。而且这种模糊输入会让它生成一大坨无关的东西最后你还要花更多时间删改。所以第一步不是写代码而是表达意图把模糊描述压缩成机器能执行的指令。我习惯用一个需求三层模板来固定表达第一层一句话目标说清楚做什么第二层涉及的文件清单哪怕只记得大概路径也可以第三层验收标准越具体越好比如工作日可以选周末禁用或默认排序改为最近更新。把这三层写在一个短小的注释或临时文档里再让AI在这个边界内生成第一版。这个模板最直接的收益是AI生成的第一版代码就接近可用而不是一份需要反复纠正的草稿。另一个能大幅提升效率的小技巧是不给AI展示整个项目的裸上下文而是让它在动手前先复述你的约束条件。我会在提示词末尾追加在开始编码前先用三句话列出你的实现计划和测试范围等我确认后你再动代码。这一步看着多花十几秒但它逼着AI把隐含假设摊开。你会发现很多写歪了的情况其实在看它输出计划的时候就能拦住根本不用等它写完代码再来返工。下面是适合放进PR模板的提示词示例直接粘到IDE助手里就能用。任务实现/修复[一句话目标] 涉及文件[文件路径列表] 验收标准 1. [具体行为] 2. [具体行为] 约束不要改变公共接口不要新增依赖错误处理沿用项目现状。 开始前先输出实现计划3句话以内和测试范围。等我确认后再生成diff。这个模板我用了一年多效果最明显的就是开始前先输出计划这一句。以前我默认让AI直接生成经常遇到方向跑偏的情况加了这句话之后无效生成的占比直接降了一个档次。本质原因是它把人做验收AI做执行这个分工从流程层面固定了下来而不是依赖你每次手工控制节奏。2.2 把review和CI阶段做成AI的质检员AI生成的PR和人写的PR相比最大的特点是格式端正但不代表逻辑正确。所以我不建议靠肉眼一遍遍扫diff。更实际的做法是把自动化门禁当作第一轮review让人力的注意力集中在业务语义上。你的仓库至少要跑三样基础检查lint和格式化、类型检查、单测。这三关过了AI生成代码的表面质量就算靠谱了。再往上一级可以让AI对当前的diff做一次自我推演让它逐行解释这段代码在异常路径下会发生什么。这种让AI解释自己的动作经常能暴露它刚编出来的错误逻辑。举个例子我遇到好几次AI生成先插数据库再返回资源的代码看起来没毛病但你让它解释如果事务中途抛异常怎么办它往往自己就能发现问题所在。因为它在解释过程中必须把没想清楚的细节补上错误分支就会显形。PR描述也可以交给AI但必须有格式约束。我习惯把git diff和原始需求说明一起作为输入要求它按改动目的、影响范围、自测结论、风险点四段结构生成。这样合入记录既不空洞又方便检索。如果团队条件允许还可以在PR页面挂一个bot评论每次有变更时自动让AI做一轮安全审查重点检查是否有硬编码密钥、危险权限或对全局状态的直接修改。这些手段不复杂但能实打实地减少review消耗把宝贵的人脑留到真正需要判断的地方。2.3 批量改动是AI效率的隐藏主力如果说单点需求是AI能力的前台那批量重复性改动就是后台的印钞机。日常项目里最消耗人力的往往不是新功能而是这些机械但范围大的改动全局变量重命名、SDK方法调用方式升级、所有旧接口的响应格式统一、导入路径的一轮梳理。手动改是体力活还特别容易漏改AI处理这类操作几乎是天生匹配——它本来就擅长从大量样本中找到规律并保持一致。具体执行方法是先把现状的样子和目标的样子各给AI一个例子让它找出所有相似位置并统一修改。比如某个项目里fetchUser(id)正在迁移为fetchUser({ id, includeProfile: false })让AI提取所有调用点、统一转换再对特殊对象单独补充处理即可。处理这类批量任务有一条铁律先全量搜索统计所有位置再让AI修改改完必须有编译和单测兜底没有兜底就不要做批量改动这是多少血泪教训换来的结论。我之前接手过一个老项目的路径规范迁移涉及三十多个文件、两百多处引用。用传统做法至少要一个人干两天还要承受漏改的风险。我用AI分批处理把文件按依赖关系分成五批每批生成一次diff合并前人工抽查10%的改动点。最终一天内完成而且那一个星期项目里再没出现漏改导致的死链事故。这件事让我意识到AI真正有优势的地方不只是单独的生成能力而是它能在一段很长的上下文里保持高度一致性这正是批量逻辑所需要的核心能力。3. 工具选型与配置的实操经验3.1 三种AI形态怎么搭配补全、对话、Agent现在市面上的AI编程工具大致可以分成三类很多人选型时容易搞混。第一类是代码补全型也就是Tab补全、行级或块级预测。它的特点是延迟低、侵入感小适合在你已经确定思路、只是需要被接着写的时候用缺点是跨文件理解弱遇到重构类任务基本帮不上忙。我把它定位成打字加速器而不是决策工具每天用得最频繁但关注度最低。第二类是对话型集成在IDE侧边栏或者内联面板里。它适合做解释、生成测试、回答这段代码在干什么这类问题优点是能结合当前打开的文件作为上下文缺点是改动落地经常要手动点应用。这类工具是我日常的主力特别是在生成小函数、补测试、翻译代码逻辑的时候。第三类是Agent型能自主读取整个仓库、编辑多个文件、执行命令甚至跑测试。它的能力上限最高但也最危险只要你在提示词里给了一个模糊目标它就可能替你决定一堆你根本不想改的东西。类型优点缺点使用场景补全型延迟低、侵入感小跨文件理解弱日常打字加速对话型结合当前文件上下文改动落地要手动应用小函数、测试、解释Agent型自主改多文件、跑命令边界控制难、容易过度发挥明确目标且可回滚的大任务我的建议是三类都装但各司其职。补全型永远开着对话型用于小范围生成Agent型只在目标非常明确、验收标准可以被计算机判断时才使用并且要给它预设干净的revert方案单独开一个git分支或者限定它只能修改特定目录。最关键的是把分工写清楚——AI负责执行你负责验收这个顺序绝对不能颠倒。我自己见过不止一次因为Agent过度发挥导致全仓库格式化变更的惨案所以现在对Agent的使用非常保守但它的确也解决了很多手工操作完全做不过来的大工程。3.2 把AI塞进Git工作流diff、commit与PR描述真正让PR数量涨上去的往往是集成到git命令中的AI而不是你偶尔在IDE里聊两句。这里分享三个我用得最稳的模式。第一个是diff即上下文。无论是生成PR摘要还是做审查第一原料永远是diff本身。我习惯把暂存区的改动直接通过管道交给模型让它按固定格式输出PR描述大概是这样git diff --staged | ai-cli prompt --template 帮我按改动目的、影响范围、自测结论、风险点四段生成PR描述这里的ai-cli只是占位符具体实现取决于你的模型接口不少AI平台都有命令行客户端也可以自己写一个十行左右的脚本调API。形式上不重要重要的是拿真实diff喂模型这个思路它能保证PR描述和实际改动严格对应而不是模型凭记忆瞎编。第二个是commit信息生成器。改动比较碎时让AI根据diff生成符合Conventional Commits规范的提交信息能让团队日志保持整洁本质也是把diff作为上下文。第三个是提交前自检。我在pre-commit钩子里跑一个脚本把暂存区代码快速过一遍AI重点询问是否包含调试残留、是否包含明显可被外部滥用的危险操作。这个检查虽然不如人工review彻底但它能把一批低质量提交挡在CI之前。有了这三个抓手AI就不只是编辑器里的小窗口而是整条交付流水线上的正式协作节点PR的吞吐量自然会被拉高。3.3 容易被忽略的软配置规则文件、上下文裁剪、模板很多人抱怨AI生成的代码风格跟项目不一致问题多半不是AI笨而是你没有把项目规范传递给它。我实际用下来最有效的软配置有三样。第一是项目级规则文件把编码约定、命名习惯、禁止使用的反模式写进一个文档让AI每次生成前默认读取。我在团队里维护了一份docs/ai-rules.md内容包含变量命名必须见名知义、禁止用any类型跳过检查、所有分支都要有默认返回值、新增依赖必须单独说明理由、对外接口必须写注释。效果非常直接diff的可读性会上一个台阶。第二是上下文裁剪。很多人的第一反应是把整个项目塞进模型窗口它不就能理解了但实际这么做往往适得其反。我通常只提供三类内容涉及的文件路径、与本次需求相关的几个函数或类型定义、一条明确的验收标准。上下文越聚焦模型理解越准确生成成功率越高。第三是固定的PR模板也就是前面提到的改动目的、影响范围、自测结论、风险点四段式结构可以把模板写进规则文件让AI自动遵守。规则文件管风格上下文裁剪管正确性PR模板管可读性这三样合在一起基本上AI的输出就能达到可以快速review的状态而不是看完想重写的状态。4. 实测中踩过的坑与排查技巧4.1 幻觉依赖AI用不存在的包和旧版APIAI翻车最典型的场景是生成看起来合理但根本不存在的代码。我遇到最多的两类引用项目里没有的第三方包或者调用旧版本SDK里不存在的方法。为什么它会这么做因为模型是根据海量代码统计出的可能性来生成它觉得这个位置大概率应该有个工具函数于是自信地给你编了一个。这算不上模型的深度恶意而是训练方式带来的天然倾向但只要项目编译不过你就知道被坑了。排查靠的不是逐行读而是直接跑编译和单测。我之前遇到过一个典型case让AI生成一段时间格式化工具它引用了项目里根本没安装的dayjs因为训练数据里见过太多dayjs调用它下意识就给写进来了最后是靠模块解析把这些假依赖挡在CI外。由此我养成了一个习惯在生成提示词里固定加上一句只使用项目现有依赖禁止新增import如必须新增请单独注明理由和官方文档链接。这句话能消灭掉大部分幻觉依赖非常值得写进规则文件。另外一个隐藏得更深的点是旧版API幻觉。AI看过很多版本的SDK文档但它并不知道你当前锁定的是哪个版本于是可能生成一个在新版本里很好用、在你当前版本里并不存在的方法。解决办法同样朴素在规则文件里写明你当前使用的主要依赖版本或者干脆让AI先读取package.json、go.mod这类依赖清单文件再动手。4.2 上下文太长导致模型频繁失忆另一个高频问题是你越想让AI全面处理它越容易在处理到一半时遗忘早前提到的约束。原因在于大模型注意力机制的天然瓶颈——它能同时记住的内容有限超出之后质量就开始打折扣。所以当你喂了一整个模块几千行代码还附加了历史对话记录它看起来态度很好实际已经在用剩下的那点注意力硬撑后半段的输出自然容易跑偏。我自己的应对办法是给AI做上下文断食每次交互只保留与当前单点任务最相关的文件片段并明确告诉它不相关的代码不要动。一次对话只解决一个PR不要尝试在一个会话里同时处理三件事。如果是Agent型工具就让它分步骤执行每一步输出一个小片段由你确认后再继续下一步。这个办法治好了我80%以上的AI中途变傻问题。很多时候问题的根源不是模型能力不够而是你给它的盘子太大了学会把大任务切成小任务和前面说的颗粒度决策是同一个道理。4.3 AI写的测试容易测了个寂寞AI生成测试的能力确实很强但也很容易测了个寂寞。最典型的问题是只覆盖happy path并且只是把实现逻辑复制了一遍。举个例子你写了一个排序函数AI生成的测试大概率是输入一组已知序列断言排序结果看起来很合理可它根本不会测空数组、全部相同的值、包含null元素、超大数组的性能退化。更隐蔽的是如果实现本身有bugAI生成的测试甚至会顺着这个bug写断言等于把错误行为当正确行为固定下来测试全绿但保护能力为零。我改进的方法是先在需求里明确规定测试范围必须包含成功路径、失败路径、边界值三组场景并且测试必须断言对外行为而不能断言实现细节。另一个很实用的动作是先让AI列出一份测试用例清单由你来勾选或补充再让它按清单生成具体代码。把设计测试这种事留在人这边把批量生成用例的工作交给AI这才是高效且可信的分工。另外还有一个项目级小坑AI生成的测试经常写死当前时间、随机值或本地路径。我建议在规则文件里明确时间相关测试必须注入时间源所有IO路径使用临时目录否则测试换个环境就会挂CI里全是黄色警告。4.4 关于PR数量本身的祛魅回到最初那个数字。很多人看到2000个PR时的第一反应是这得配几个程序员才能review得过来或者这代码质量真的能看吗。但以我自己的实践来看只要保持小颗粒度并善用AI合入PR的绝对数量快速增长是自然发生的附带结果它本身不是目标。真正重要的是你要警惕的只有两件事仓库的质量门禁还在不在以及每次合入是不是都被认真验收过。学到这里如果你只记住了要快那AI给你的未来大概率是质量流血不止如果你记住的是把任务拆小、把上下文聚焦、把验收自动化那AI才会成为真正帮你提效的长期工具。我个人这一年多最深的体会是AI辅助开发最大的敌人不是模型不够聪明而是你的工程习惯还不够好。颗粒度拆得足够细、上下文给得足够准、验收做得足够快这套基本功在任何没有AI的时代都适用而AI只是让它们产生了前所未有的杠杆。如果你也想试试这条路不必一步到位可以先从一件很小的事开始挑一个你已经完全理解的重复性小改动让AI帮你写然后认真review它。等你习惯了这种节奏再慢慢扩大范围。把方法嚼碎了再吃才不会噎着。