AI Code Review 上线四个月:我们干掉了 37% 的评论,却提升了代码质量
AI 代码评审最大的风险不是漏审,而是噪声淹没一切。本文记录一次真实上线:如何用分类分流、按仓库定制规则、以及一条「评论必须可执行」的铁律,把评审采纳率从 21% 提到 68%。
我们团队在去年底接入了 AI 代码评审。第一个月的情况可以用一个字形容:惨。AI 在 200 个 PR 上留了 1400 条评论,开发者采纳了 287 条,采纳率 21%。更糟的是,大家开始习惯性无视 AI 的评论,包括那些真正重要的。
四个月后,AI 每天的评论数降到了最初的三分之一,但采纳率是 68%,而且线上事故里因为代码问题导致的下降了 40%。
这篇文章讲我们做了什么。
一、第一原则:评论必须可执行
AI 评审最常见的产出是这类评论:
「这段代码可能有性能问题,建议优化。」 「建议增加错误处理。」 「这个变量名可以更清晰。」
这类评论为什么没用?因为它把思考成本留给了开发者。开发者已经写了 300 行代码、脑子很累,看到这种模糊建议的第一反应是「你自己来改」。
我们定的铁律是:每条评论必须包含具体的修改建议,或者至少指出具体的行和具体的后果。
不好:「建议处理 null 的情况。」
好:「第 42 行 user.profile.name 如果 profile 为 null 会抛 TypeError,建议改为 user.profile?.name ?? '未设置'。」
这条规则一上,评论量直接掉了一半,但采纳率翻倍。因为剩下的都是能直接动手的。
二、分类分流:不是所有问题都值得说
我们把 AI 评审的输出强制分成四类,只有两类会进入人工视野:
必修(Must Fix):会导致运行时错误、安全漏洞、数据丢失。比如 SQL 拼接、未捕获的 Promise rejection、竞态条件。这类直接阻塞合并。
建议(Should Fix):明显的逻辑缺陷、可读性问题、重复代码。进入评论,但不阻塞。
风格(Style):命名、格式、注释。不进评论,直接交给 linter 和 formatter 自动修。AI 不该干这事。
看法(Opinion):架构偏好、要不要加抽象层。不进评论。这类问题 AI 没有足够的项目上下文,说了也是错。
关键动作是给每类配不同的处理路径,并且在 prompt 里明确禁止 AI 输出「看法」类内容。这一步降低的噪声最多。
三、按仓库定制规则
通用规则会制造大量误报。我们有个仓库是老旧的 Python 2.7 遗留系统,AI 一直在建议用 f-string;另一个仓库因为性能要求允许存在提前 return 的写法,AI 一直在说「建议统一风格」。
做法:每个仓库配置一个 .ai-review.yml:
rules:
ignore:
- "python-version" # 关掉版本相关建议
allow:
- "early-return" # 允许提前返回
focus:
- "security"
- "error-handling"
severity_override:
"naming": "ignore"
仓库级规则的最佳来源是误报反馈。我们做了一个「这条评论没用」的按钮,点击率最高的几类规则,直接加到 ignore 列表。
四、上下文工程:让 AI 看到该看的
AI 评审质量差,一半原因是它只看到了 diff,没看到上下文。
我们做了三件事:
- 带上完整的函数体,而不只是改动的那几行。很多问题只有看到整个函数才能发现。
- 带上相关的调用方。改了函数签名,AI 需要知道谁在调用、怎么调用。
- 带上项目约定文档。把「我们的错误处理规范」「日志规范」抽成一份 500 字的 Markdown,每次都放进上下文。
第三项效果意外地好。之前 AI 不断建议「加 try-catch」,看过规范后知道我们用的是统一装饰器,就不再多嘴了。
五、别让它当唯一的守门人
AI 评审不能替代人工评审,我们把它定位成过滤器:
- 过滤掉 70% 的机械问题(拼写、明显的空指针、遗漏的边界)
- 让人工评审专心看设计、权衡和业务逻辑
这个定位让评审效率提升而不是下降。之前人工评审要花 40 分钟,其中 25 分钟在找「这段循环边界是不是写错了」。现在人工评审还是 40 分钟,但讨论的都是值钱的东西。
六、四个月的数据
| 指标 | 第一月 | 第四月 |
|---|---|---|
| 平均每 PR 评论数 | 7.0 | 2.3 |
| 采纳率 | 21% | 68% |
| AI 拦截的必修问题 | 34 | 89 |
| PR 平均评审时长 | 51 分钟 | 38 分钟 |
| 因代码问题导致的线上事故 | 5 起 | 3 起 |
AI 拦截的必修问题数量上升了,因为优化后它能更准确地定位真正的问题,而不是被噪声耽误。
七、三条给准备上车的团队的建议
从必修类开始。先只开「会导致运行时错误和安全漏洞」的检查,跑一个月,建立信任,再逐步扩展。一次性全开的团队,基本都在两周内关掉了这个功能。
把采纳率当核心指标。它比「评论数」和「问题发现数」更能反映真实价值。采纳率低于 40%,说明你在制造噪声。
留一条人工反馈回路。每一类规则都要能一键标记「无效」,并按月复盘。AI 评审是个需要持续调优的产品,不是设完就忘的开关。