AI 做 Code Review 总说没问题,因为它在偷懒
最近写了一个 Skill:让 Codex 帮我做 code review,审 Claude 写的代码。我以为这是个不错的机制,两个模型分工,一个写一个审,互相不偏袒。
上个月让它跑一段几百行的 patch。Codex 不打数字分,按梯度走:Blocker / Major / Minor / Nit。这次它没标 Blocker,没标 Major,标了两个 Minor,加一段表扬:代码结构清晰、命名一致、错误处理完整。
我自己又翻一遍。一个竞态条件,是 Blocker;一个差一错误,至少 Major;三处命名不一致,Minor。
回头把这些指给 Codex 看。它说:对,这些确实是问题,我之前没看到。
那两个 Minor 是过家家。
我以为我写的这个 Skill 能避开偷懒。做了几个月才发现:换谁审都一样。评判机制本身就有问题,换模型救不了,写 Skill 也救不了。
AI 给的结论从来不是真的。先逼它给证据,结论才有用。
跨模型救不了,因为问题不在偏袒
工程师的直觉:让一个模型 review 自己写的代码,它会包庇自己。换一个模型来审,应该就没了。
实际上换模型也不行。
AI 审代码时偷懒,跟保护谁无关。它想让自己的 review 过关。给一份看起来认真审过、结论是 LGTM 的输出,比给一份找了五个 Blocker、每个都要追溯到具体行的输出消耗低得多。
AI 默认给安全结论
让 AI 看几百行代码,跑十次有八次结论是小问题、建议优化。Codex 体系里就是 Minor 和 Nit。
它选小结论是因为安全。
下重结论风险高。你 push back 它就尴尬。 下轻结论风险低。你说太轻了,它说我以为你想知道。
AI 选的是最不容易被反驳的结论。真实的严重度,它不那么关心。
让它一次审十个维度,每个都只扫六成
几百行 patch。Codex 同时要看逻辑正确性、错误处理、并发安全、性能、命名风格、注释完整度、测试覆盖。
每个维度都扫一眼,每个都只扫到六成。
竞态条件藏在并发分支里。一次 PR review 同时看十个维度,分到并发安全的注意力少,漏了。
你让它一次干太多。
我猜的,没去拆 attention 看真扫了几成。但行为像。
下重结论比下轻结论贵
模型那边的成本不是 token,是责任。
LGTM 加表扬最不累。模型不需要 cite 任何行号,不需要追溯任何 bug,不需要预判你会不会反驳。
Blocker 加具体行号加改法建议最累。模型需要做实际分析,承担说错被打脸的风险。
模型默认走轻松那条路。
我现在让 AI review 时做三件事
先挑三处可能 Blocker 的位置。 不让它先给整体评判。注意力不被风格、测试、命名几个维度分掉,全给了潜在 bug。
强制 cite 行号引文。 任何意见都要写「L{n}: ‘{quote}‘,这里 X 可能导致 Y」。不引用就当没说。
Major 以上必须给 3 处证据。 1 处可能是巧合,2 处可能是模式重复,3 处才能说明严重度成立。Codex 说这是 Blocker,必须 cite 三个代码片段。否则降级到 Minor。
这三步我写进了 Skill。之前 Skill 里写的是按 Blocker / Major / Minor / Nit 输出。没用。Codex 还是给两个 Minor 和一段表扬。
Skill 该写的是判断的过程。光列输出模板没用。
才写进 Skill 两周,下周回头再看跑得怎么样。Claude 自审我看过几次,症状一样,但没真比过。
你要 AI 帮你审,还是要它给你一个看起来审过的输出?
要它帮你审的,把先要证据写进 Skill。
要它给你看起来审过的,那继续写输出模板。