← 所有文章

AI代码审查需要异议,而不是共识

adamsreview描述了一套由6条命令组成的代码审查流水线:并行审查视角、验证关口、人类走查、Codex同级审查,以及在提交前重新审查变更的修复循环。1

这一设计指向了AI代码审查真正的前沿。更好的审查不是又一串机器人评论。它来自相互独立的审查者:它们可以提出不同意见,保留分歧,验证主张,并在项目把某项发现视为阻塞问题前,把判断权交还给人类审查者。

摘要

AI代码审查应当优化的是有纪律的异议,而不是共识。有效的审查系统会分配独立视角、合并重复发现、验证每一项主张,区分已确认缺陷和需要人工判断的问题,并让人类审查者保留最终审查身份。共识可能掩盖少见但重要的发现。审查包应当保留少数派主张,直到证据推翻它们;随后继续跟踪修复与复审结果。

核心要点

面向工程负责人: - 将AI审查视为证据流水线,而不是投票系统。 - 即使代理发现了真实缺陷,也应让合并权限留在人类手中。

面向代理构建者: - 为独立审查视角分配不同职责:正确性、安全、测试、用户影响、可维护性、执行环境行为和发布风险。 - 在验证推翻少数派发现前,将其作为结构化主张保留下来。

面向代码审查者: - 要求提供证据、复现步骤、受影响文件、验证器结果、人类决策状态和修复验证。 - 拒绝那些把一致意见当作置信度、却没有证明底层主张的审查系统。

为什么AI代码审查需要异议?

当所有审查者都在寻找同一类缺陷时,代码审查会悄无声息地失效。

单代理审查只有一种失败形态。模型扫描差异,产出看似合理的评论,然后漏掉注意力之外的问题。多代理审查只有在代理保持独立时,才能改善这种局面。如果5个代理读取同一个提示,继承同一套优先级,最后收敛成同一份摘要,系统买到的只是重复。

异议会改变审查覆盖面。安全审查者可以反对一个正确性审查者接受的请求流程。测试审查者可以在产品审查者认可行为后,指出缺少回归覆盖。执行环境审查者可以否决一段代码层面看起来干净、却无法满足部署约束的实现。

少数派发现之所以重要,是因为严重缺陷常常始于孤立的反对意见。共识分数可能把这种反对埋掉。好的审查流水线会让反对意见存活足够久,直到主张被证实或证伪。

独立审查者应当检查什么?

独立审查者需要的是不同职责,而不是不同名字。

视角 核心问题 所需证据
正确性 代码是否实现了变更所声称的行为? 受影响路径、失败场景、预期行为
安全 用户、依赖或调用方能否滥用该变更? 威胁模型、可达输入、利用草图或阻断因素
测试 如果没有失败测试,这个缺陷是否会再次出现? 测试缺口、建议断言、夹具或路径
产品 该行为是否服务于用户? 用户路径、状态转换、文案或交互风险
可维护性 后续变更是否会破坏设计? 耦合、重复逻辑、所有权不清
执行环境 该变更能否经受真实部署? 配置、迁移、缓存、队列或性能证明
发布 团队能否回滚或审计结果? 提交边界、部署证明、监控、未解决缺口

视角清单应随代码库而变。支付系统需要欺诈和对账视角。编译器需要可靠性、诊断和性能视角。发布系统需要引用、SEO、翻译和缓存视角。

机制保持不变:每个视角产出的是主张,而不是裁决。

为什么共识不是可靠的审查信号?

共识回答的是错误问题。

多数投票问的是有多少审查者同意。代码审查真正需要知道的是:某项主张在面对代码、测试、执行环境和项目政策时,是否还能站得住。

一致可能说明发现显而易见。也可能说明每个审查者都有同样的盲点。分歧可能只是噪声。也可能说明某个审查者找到了真正的缺陷。

更好的指标是主张状态:

状态 含义 下一步
已提出 某个视角提出了可能缺陷 合并重复项并验证
已确认 证据支持该发现 修复或分配负责人
已证伪 验证推翻了该发现 记录原因并关闭
人工判断 结果取决于人类判断 转交审查者
仅报告 发现有价值但不应阻塞 保留在审查包中
已修复 变更尝试解决该发现 重新审查修复
已回归 修复引入了新问题 回滚或重新设计

这套状态机优于共识,因为它把分歧当作证据库存来处理。流水线可以关闭噪声发现而不抹去记录,也可以在验证证明缺陷时提升孤立发现的优先级。

强大的AI审查流水线会做什么?

强大的AI代码审查流水线按阶段运行。

  1. 独立检测。审查视角在看不到彼此结论的情况下检查差异。
  2. 合并重复主张。系统把等价发现归组,但不抹平不同证据。
  3. 低成本验证。快速检查可以拦截站不住的主张:文件是否存在、变更行是否可达、测试是否存在、类型错误,以及明显过期的上下文。
  4. 深度验证。高影响主张需要更慢的审查:复现、追踪阅读、聚焦测试、安全推理,或第二模型批判。
  5. 分类状态。流水线将每项发现标记为已确认、已证伪、人工判断、仅报告或低于关口。
  6. 带人类走过不确定性。审查者决定需要判断的问题,提升重要主张,并拒绝低价值工作。
  7. 按组修复。相关发现一起处理,避免系统应用相互冲突的补丁。
  8. 重新审查修复。流水线再次审查变更后的代码,并在提交前回滚回归。
  9. 写入审查包。最终产物记录发现、证据、决策、测试、提交和未解决缺口。

adamsreview提供了这种形态的具体示例。其README描述了最多7个并行子代理视角、去重、先低成本后深度的验证、可选整体审查、Codex同级审查、外部发现注入、针对不确定发现的走查,以及一个在提交前重新审查并回滚回归的修复循环。1该README还把性能主张标为轶事性证据,这一点很重要。应将该项目视为有用的设计证据,而不是基准测试。

AI代码审查发现应当长什么样?

一项有用的发现需要足够结构化,方便另一位审查者、代理或CI任务稍后检查。

id: SEC-003
lens: security
claim: "The new webhook endpoint accepts unsigned retry requests."
severity: high
affected_files:
  - app/routes/webhooks.py
evidence:
  - "Handler reads JSON before signature validation."
  - "Test suite covers valid signatures but not missing signatures."
validator:
  cheap_check: pass
  deep_check: manual
  reason: "Reachable path confirmed; exploit impact needs owner judgment."
human_decision:
  status: promoted
  reviewer: "reviewer of record"
fix_group: webhook-auth
post_fix_review:
  status: pending
remaining_gap: "Need replay test against malformed retry payload."

具体字段可以变化。纪律不应变化。发现应命名主张、证据、验证器结果、人类决策、修复分组、修复后状态和剩余缺口。只写“检查webhook auth”的评论,无法支撑负责任的合并决策。结构化发现可以。

为什么人类必须保留正式审查者身份?

GitHub的审查模型为审查者提供了3种高级结果:评论、批准,或在合并前请求变更。2AI审查可以为这些结果提供信息,但不应悄然取代它们。

Rust的LLM政策草案清晰划出了这条边界。截至2026年5月18日,该政策仍是一个开放的pull request,并非已采纳的Rust政策。3草案允许私下使用LLM审查,但禁止将LLM审查视为足以合并或拒绝变更的依据。草案还说明,审查机器人必须保持顾问性质,机器人评论本身不能构成阻塞,人类审查者必须明确认可他们希望处理的评论。4

这条边界保护的是问责。机器人可以发现真实缺陷。机器人也可能产出过期评论、肤浅的风格异议,或自信的误报。正式审查者负责决定是阻塞、合并、请求变更,还是忽略该主张。

人类角色应体现在产物中:

字段 重要性
审查者决策 区分机器主张与人类判断
已提升发现 记录人类提升了哪些不确定主张
已拒绝发现 防止后续运行反复产生机器人噪声
政策边界 表明某项主张是阻塞合并,还是仅供审查参考
剩余缺口 让摘要之后仍未验证的工作保持可见

当AI审查让人类审查更敏锐时,它会赢得信任。当它把权限藏进机器人裁决时,它会失去信任。

审查包应包含什么?

审查包会把一次审查运行变成持久的决策对象。

最低字段:

审查包字段 内容
范围 PR、分支、基础提交、头部提交、已审查文件
视角 审查职责、模型或工具身份、独立性说明
发现 ID、主张、严重性、文件、行号、证据、受影响路径
验证 低成本检查结果、深度检查结果、状态原因
人类决策 已提升、已跳过、已接受、已拒绝、需要负责人
修复分组 已分组发现、补丁摘要、提交边界
复审 修复后结果、发现的回归、回滚
发布证明 测试、CI,以及相关时的部署或执行环境检查
缺口 未验证主张、人工跟进、原生领域审查

审查包不应像一份逐字记录。逐字记录展示发生过的一切。审查包展示的是负责任的审查者做决定所需的信息。

审查包还会保留组织记忆。当同一个误报下周再次出现时,团队可以看到它为什么失败。当少数派发现变成生产缺陷时,团队可以检查该主张在系统中如何流转。

关于代理式PR失败,研究怎么说?

这种失败模式不只存在于审查机器人。

一篇MSR 2026论文分析了GitHub上33000个由代理编写的pull request,发现文档、CI和构建更新任务的合并成功率最高,而性能和缺陷修复任务表现最差。5作者还发现,未合并PR往往触及更多文件、改动更大,并且CI失败。他们的定性分析识别出一些被拒绝模式,例如审查者参与不足、重复PR、不受欢迎的实现,以及代理与维护者目标不一致。5

这些发现支持一条实用规则:AI代码审查不应只问差异里有没有缺陷。它还应追问代理工作流是否给维护者提供了可审查的对象。大型、错位、审查薄弱的PR需要更好的审查包、更窄的提交边界,以及更强的人类决策点。

团队应如何开始?

从一个小型审查系统开始,目标是产出更好的决策,而不是更多评论。

  1. 为风险最高的代码路径选择2到3个视角。
  2. 要求每项发现都包含主张、证据、受影响文件和验证结果。
  3. 在验证器证伪前保留少数派发现。
  4. 将需要人工判断的主张转交给人类审查者,而不是藏在分数之下。
  5. 跟踪误报,让系统学会团队会拒绝什么。
  6. 在提交前重新审查修复。
  7. 将审查包附到PR上。

不要从自动打补丁开始。先从可信的审查产物开始。当发现流水线赢得信任后,才可以增加狭窄的自动修复通道:机械性测试、明显的null检查、错别字级修正,或人类在走查中提升的修复。

目标不是让代码审查显得自治。目标是让人类审查更不容易被误导。

简要总结

AI代码审查需要独立异议,因为仅凭一致意见无法证明某项发现。强大的系统会按职责拆分审查者,保留少数派主张,验证证据,将不确定性转交给人类,并在提交前重新审查修复。GitHub的审查契约最终仍落在人类审查状态上。2Rust政策草案要求LLM审查保持顾问性质,直到人类认可该主张。4adamsreview展示了当前一种包含视角、关口、走查和修复复审的流水线形态。1

胜出的产物不是机器人评论。胜出的产物是能让人类负责任地做决定的审查包。

FAQ

什么是AI代码审查?

AI代码审查使用语言模型或代理检查代码变更、识别可能缺陷、解释风险、建议修复,或为人类准备审查产物。严肃的系统应为每项发现提供证据和状态,而不是只发布评论。

AI代码审查应使用多个代理吗?

当每个代理都有独立职责,并且流水线会保留分歧时,多个代理是有帮助的。如果每个代理看到同一个提示,产出同一份摘要,并收敛成一个共识分数,那么多代理价值有限。

为什么在AI代码审查中,异议比共识更好?

异议会让少见发现保持可见,直到证据证明或推翻它们。当多数审查者都漏掉同一个边界情况时,共识可能隐藏严重的少数派发现。代码审查需要经过验证的主张,而不只是意见一致。

AI审查者可以阻塞pull request吗?

团队应让阻塞权限留在人类手中。Rust的LLM政策草案规定,LLM审查必须保持顾问性质,审查者必须明确认可LLM评论后,才能用其阻塞PR。4这条规则符合更广泛的问责原则:合并决策由人类审查者负责。

AI审查包应包含什么?

AI审查包应包含范围、视角、发现、证据、验证结果、人类决策、修复分组、复审结果、相关时的发布证明,以及未解决缺口。审查包应让审查决策可审计,而不迫使读者通读完整记录。

团队什么时候应允许自动修复?

团队应在发现流水线赢得信任后,才允许自动修复。从机械性、低风险修复开始,或从人类在审查中提升的发现开始。每一次自动修复都需要修复后审查和回滚路径。


参考资料


  1. Adam Miller,adamsreview,GitHub仓库README。2026年5月18日的当前会话验证发现,该README描述了一套多阶段代码审查流水线,包括并行子代理检测、验证过程、持久化JSON状态、Codex同级审查、走查、外部发现注入,以及一个自动化修复循环;该循环会在提交前重新审查并回滚回归。 

  2. GitHub Docs,“About pull request reviews,”GitHub的pull request审查模型来源,包括评论、批准、请求变更、行评论、建议变更和审查请求。 

  3. jyn514,“Add an LLM policy for rust-lang/rust,”rust-lang/rust-forge pull request #1040。2026年5月18日的当前会话GitHubAPI验证发现:state=openmerged=falsemerged_at=null、65条issue评论、284条审查评论,且updated_at=2026-05-17T20:33:12Z。 

  4. jyn514分支提案,“LLM Usage Policy,”为rust-lang/rust-forge pull request #1040提出的src/policies/llm-usage.md。该来源说明了草案规则:允许私下使用LLM审查,要求审查机器人保持顾问性质,要求人类认可后LLM评论才能阻塞PR,并将贡献者视为其自身工作的责任人。 

  5. Ramtin Ehsani、Sakshi Pathak、Shriya Rawal、Abdullah Al Mujahid、Mia Mohammad Imran和Preetha Chatterjee,“Where Do AI Coding Agents Fail? An Empirical Study of Failed Agentic Pull Requests in GitHub,”arXiv:2601.15195,2026年1月21日提交,MSR 2026接收。该来源用于33000个代理编写PR的研究、合并成功模式、CI与变更规模观察,以及拒绝模式。 

相关文章

Protege模式

具有稀疏专家访问的7B模型匹配50倍大小的代理。将日常工作路由到小模型,将判断调用路由到前沿模型。

2 分钟阅读

AI编码代理需要更小的审查界面

AI编码代理会用巨大的差异集压垮审查者。更小的审查界面能让工程师在合并前保持参与、聚焦验证并承担责任。

2 分钟阅读

多智能体协商:当共识本身就是缺陷

多智能体协商能捕获单智能体系统遗漏的失败。这里记录了架构设计、走过的弯路,以及真正值得构建的部分。

4 分钟阅读