AI 数秒生成代码,团队却花数小时审查——这笔账根本不对
AI 编程工具的 ROI 宣传在纸面上看起来无懈可击:在受控实验中,开发者完成任务的速度提升了 55%,合并的 Pull Request 数量增加了 98%,每周据称节省 3.6 小时。但当组织审视真实的交付指标——Bug 率、发布周期、故障频率——时,数字几乎没有任何变化。某些东西吸走了所有增益的时间,而它并不难找。
AI 数秒生成代码。工程师的审查速度,却和以前一样慢。
AI 编程工具的 ROI 宣传在纸面上看起来无懈可击:在受控实验中,开发者完成任务的速度提升了 55%,合并的 Pull Request 数量增加了 98%,每周据称节省 3.6 小时。但当组织审视真实的交付指标——Bug 率、发布周期、故障频率——时,数字几乎没有任何变化。某些东西吸走了所有增益的时间,而它并不难找。
AI 数秒生成代码。工程师的审查速度,却和以前一样慢。
当生产环境出现 Bug 时,第一个仪式总是相同的:打开 git blame,找到写下那行代码的人,问他们为什么要这么写。这个仪式假设作者是有原因的——他们知道的某个限制、刻意处理的边缘情况,或者从三个季度的复盘报告中内化而来的业务规则。在软件史的大部分时间里,git blame 回答的是关于意图的问题。
现在,对于比例日益增长的提交,git blame 指向的是合并代码的人和生成代码的 AI。人类可能只花了 90 秒阅读 diff。而 AI 除了 prompt 之外没有任何上下文。那些让 git blame 变得有用的“为什么”——即组织知识——从未在任何地方被记录下来。
这就是代码所有权衰减。它不会自我宣告。没有哪一个单一的提交会破坏系统。相反,理解力会慢慢被掏空,直到团队到达一个决策点——一次重构、一次事故或一名新员工入职——才发现再也没有人能从内部解释这个系统了。
大多数部署 LLM 代码审查工具的团队都会在两周内发现同一种失败模式:模型为每个 PR 生成 10–20 条评论,其中 80% 都是噪音。在第三个 PR 中,如果开发者不看就关闭了所有评论,这个工具就名存实亡了 —— 通知被发送到无人查看的频道,而机器人仍然在每次推送时消耗算力。
问题不在于模型。而在于这些团队发布了一个评论生成器,却称之为审查工具。
基准测试数据讲述了一个奇怪的故事。在 SWE-bench Verified 上,多个运行相同底层模型(均为 Opus 4.5)的智能体产品——Auggie、Cursor、Claude Code——产出了截然不同的结果。尽管“大脑”完全相同,Auggie 在 731 个问题中比最接近的对手多解决了 17 个。差距在于“脚手架”(scaffolding):智能体是如何被提示的、被赋予了什么上下文、可以调用哪些工具,以及在困惑时测试框架(harness)做了什么。模型是商品,围绕它的脚手架才是产品。
这是成熟的工程团队在十年前对初级工程师达成的相同共识。一个聪明的毕业生能交付价值,并非仅仅因为模型优秀,而是因为 README 是最新的,测试套件运行迅速,代码审查标准每次都能捕捉到那六个同样的错误,并且有人编写了说明约束条件的 CONTRIBUTING.md。剥离这些脚手架,同一个人产出的代码可能局部连贯但全局错误,破坏了团队甚至没想到要写下来的生产环境不变量。
许多自称“有评估(evals)”的团队,其实际情况是:有一个仪表板,某人每周运行一次测试套件,然后将数据粘贴到没人看的 Slack 频道。评审人员批准提示词(prompt)更改时,甚至根本没看过它是否影响了测试套件,而回归问题(regression)两周后才在客户反馈单中显现。评估确实存在,但评估并未进入开发循环。
解决办法在于结构,而非意愿。只有当评估存在于变更发生的地方——即 Pull Request(PR)评论中,紧挨着代码差异(diff),并带有单个 PR 的增量变化和评审员无法忽视的回归提醒时,评估才能真正起到质量把关的作用。在其他任何地方,它们都只是表演性的产物:投入了大量精力构建,却什么也拦截不到。
浏览任何成熟工程团队的 PR 队列,你都会看到同样的现象:一个四行的 Bug 修复会引来三轮关于命名、错误处理和测试覆盖率缺失的评论;而对系统提示词(System Prompt)的四十行修改却能凭借一句 “LGTM, ship it” 轻松过关。作者对此不以为意,因为差异对比(diff)看起来就像文档;审查者也无所谓,因为他们对于那段英文块中什么是“好”没有心理模型。结果是,一个具有功能发布级别影响范围的提示词更改,却仅以修复拼写错误的门槛通过了审查。
这是每个在生产环境中使用 LLM 构建产品的团队所面临的隐秘质量危机。代码库拥有数十年积累的纪律——Linter、类型检查、代码所有者(Code Owners)、测试关卡、发布窗口。而真正引导模型的产物——系统提示词、评估准则(Eval Rubric)、工具描述、少样本示例(Few-shot Exemplars)——虽然存放在同一个仓库中,却通过为英文散文设计的审查流程进行发布。因此,提示词回归、评估准则漂移和工具模式(Schema)损坏,却能以团队永远不会接受的代码质量标准通过。
一位资深工程师打开了一个由 Agent 编写的 PR。Diff 非常整洁。测试通过了。命名规范一致。他们大致扫了一眼,点了个赞,然后合并。两个月后,另一位资深工程师正在重写那个模块,因为该模块引入的抽象在三个调用点悄悄泄露了状态,而测试套件从未发现这一点,因为它只断言了代码在做什么,而不是规范(Spec)的要求。
这种模式是 2026 年代码审查(Code Review)中占主导地位的失败模式。那些适用于人类编写 PR 的审查直觉——探究作者的意图、寻找他们没想到的 Bug、检查测试是否反映了设计——在 Agent PR 上失效了,因为 Bug 聚集在不同的地方,且审查者看到的产物不再是真正重要的产物。
数据支持这一直觉。CodeRabbit 在 2025 年 12 月对 470 个 GitHub PR 的分析发现,AI 协作编写的代码产生的问题大约是人类编写代码的 1.7 倍,其中逻辑和正确性错误是 1.75 倍,安全发现是 1.57 倍,算法和业务逻辑错误是人类的 2.25 倍。严重问题增加了 1.4 倍,重大问题增加了 1.7 倍。Diff 读起来很流畅,而这种流畅性恰恰就是问题所在。
当智能体(agent)在同一个 diff 中编写函数和注释时,该注释并不是文档。它是代码在编写时的转述,由同一个模型从同一个上下文中生成。当代码第一次发生变动时,它就会悄然出错。函数被重构,参数类型改变,或者添加了提前返回(early-return),但注释却保持不变。到下个季度,注释所编码的规范已不再与代码匹配,而下一位读者会因为注释更易读而选择相信它。
这是一个古老的失效模式 —— 人类修改代码,注释保持陈旧 —— 但智能体从三个维度同时加速了这一进程。注释量增加了,因为智能体无论是否需要,都会给每个函数添加文档块(doc block)。注释的语法非常完美,所以审阅者不会将其标记为低质量。而且,注释用与代码实际执行不同的术语来转述代码,因此它们看起来像文档,但实际上编码了第二套规范,这套规范独立于第一套规范而漂移。
如果代码审查流水线中的作者和审阅者都是在重叠语料库上训练的语言模型,那么它就不是一个质量关卡,而是一个信心放大器。作者编写的代码在 Transformer 看来是合理的,审阅者以同样的合理性视角阅读代码,双方最终达成“看起来没问题”的共识,于是代码变更带着一个绿色的勾合并了,而这对于变更是否真正正确毫无意义。最近的行业数据清楚地展示了这种不对称性:在同等规模下,与 AI 共同编写的 PR 产生的严重问题(critical issues)比人类编写的高出约 40%,重大问题(major issues)高出约 70%,其中逻辑和正确性错误占了差距的大部分。而为了捕捉这些错误而发布的审阅代理(reviewer agents),从构造上来说,恰恰是最不具备发现这些错误能力的。
那些从 AI 代码审阅中获得真实信号的团队已经不再将“审阅”视为“生成”的某种变体,而是开始将审阅设计为一种本质上不同的认知任务。生成式提示词(Generation prompting)要求模型产生连贯的内容。而审阅式提示词(Review prompting)则必须要求模型发现缺失的东西——去关注 Diff 中的负空间而不是正空间——这种反向思维比一行系统提示词所暗示的要难诱发得多。
一位资深工程师在四分钟内批准了一个 400 行的 PR。diff 很整洁。命名很合理。测试通过。两周后,值班工程师翻阅一个查询时发现,它返回的行形状是对的,但取错了列 —— 本该用 user.created_at 的地方用了 user.updated_at —— 队列分析仪表板已经对 CFO 撒了九天的谎。审查者很称职。代码结构良好。这个 bug 在 diff 中是不可见的,因为它不是语法异味,而是语义问题。审查者无从着力,因为没有人写下这个变更原本打算做什么。
一旦你代码库中的大部分 diff 都源自模型输出,这种失效模式就会出现。审查者不再问“这正确吗?”,而是开始问“这看起来像代码吗?”。答案几乎总是肯定的。AI 编写的代码在语法上极其流畅,这种流畅性绕过了工程师们花费十年时间在人类编写的烂代码上磨练出来的审查启发式规则。
一个来自 AI 编程智能体的 40 个文件的重构任务摆到了你的桌面。你打开 PR,滚动查看差异(diff),每一个代码块(hunk)看起来都没问题。命名重构很一致,导入很整洁,测试在隔离状态下也能编译。你合并了代码。40 分钟后,主分支的 CI 变红了,因为同级包(sibling package)中的两个调用点仍然向一个现在需要四个参数的函数传递三个参数,而原本能捕获这一错误的类型检查器从未包含在智能体的内环(inner loop)中。
这是当今智能体编写的重构中最常见的失败模式,而且它与单个修改的质量几乎无关。每一个文件单独审查时,看起来都像是一个细心的人类写的。Bug 存在于“接缝”处——即来自不同文件的修改必须保持一致的边界。文件级的审查隐藏了接缝级的正确性,而大多数审查工作流都是围绕文件设计的。
47% 的专业开发者现在使用 AI 代码审查工具——两年前这一比例仅为 22%。然而在同一时期,AI 协作编写的 PR 合并后产生的 Bug 数量是人工编写代码的 1.7 倍,整个行业的变更失败率上升了 30%。团队在部署这些工具时出了问题,而问题并非工具本身。
核心问题在于工程师在没有理解 AI 审查能力边界的情况下就将其引入工作流。这类系统在真实代码库上的效果上限为 50–60%,只擅长一小类表层问题,而恰恰在导致生产事故的错误上静默失败。将 AI 审查视为通用质量关卡的团队,得到的是虚假的信心,而非真正的覆盖。