Rootly 都废止"小 PR 规则"了:AI 时代,代码评审流程该整个重写
【免费下载链接】open-code-reviewSecure, fast, efficient, battle-tested at Alibaba's scale. Hybrid architecture code review tool: deterministic pipelines + LLM Agent, precise line-level comments, built-in multi-language ruleset (NPE, thread-safety, XSS, SQL injection), OpenAI & Anthropic compatible.项目地址: https://gitcode.com/GitHub_Trending/op/open-code-review
"一个 PR 不要超过 200 行""一个 PR 只做一件事""PR 越小越好,review 越快越好"——这些被写进无数团队 Code Review 规范里的"小 PR 规则",正在被 AI 时代的第一批实践者亲手推翻。知名事件响应平台 Rootly 宣布废止其内部坚持多年的小 PR 规则,理由是:当 AI 智能体接管了大部分评审劳动之后,强行切分 PR 带来的收益已经低于它付出的成本。这一信号连同 LinkedIn 的多智能体代码审查、Cloudflare 的大规模 AI 评审编排、GitHub 发布的 ReviewBench 开放基准一起,指向同一个结论:代码评审流程的经济学正在被 AI 重写,而大多数团队还在用 2015 年的方法论评审 2026 年的代码。
本文将以阿里巴巴开源的 Open Code Review(内部代号 OCR)为解剖样本——它在阿里内部服务数万名开发者、识别数百万缺陷后开源——结合其"确定性工程 × LLM Agent"的混合架构源码,拆解小 PR 规则为何曾经成立、AI 如何改变 PR 粒度的收益模型、以及重写评审流程到底需要哪些工程前提。
小 PR 规则为什么曾经成立
小 PR 规则从来不是审美偏好,它是对"人类评审者"这一稀缺资源的经济学妥协。在纯人工评审时代,一次 code review 的完整成本可以拆成四笔:
- 上下文重建成本:reviewer 要理解这个 PR 在做什么,必须回忆相关模块的前世今生,改动越大,需要加载的上下文越多;
- 注意力衰减成本:人的工作记忆容量有限,一个 2000 行的 diff 读到后面,前面已经忘了一半,评审质量随 diff 长度急剧下滑;
- 往返沟通成本:comment 发出去、作者改、reviewer 再确认,每一轮往返都消耗日历时间,PR 越大,迭代轮数越多、合并越慢;
- 机会成本:资深工程师的时间是团队最贵的资源,把一小时花在一个 2000 行的 PR 上,意味着另一个 200 行的 PR 在队列里多等一小时。
小 PR 规则正是针对这四笔成本设计的:把改动切小,上下文重建变便宜,注意力不会耗尽,往返更快,资深工程师可以把时间切碎后均匀分配给更多 PR。Google、Meta、GitHub 内部无数团队据此把"小 PR"写进规范,Google 甚至把"CL 只做一件事、不超过一定行数"上升为工程文化的核心信条。
这套规则在纯人工时代是自洽的——因为评审成本由人的认知带宽决定,而人的认知带宽是 PR 粒度的线性函数。粒度越小,单位认知成本越低。
AI 评审如何改写 PR 粒度经济学
AI 评审从根本上改变了上述成本模型:评审的主要成本从"人的认知带宽"转移到了"token 消耗、上下文窗口与错误率"。而这三者的性质与人脑完全不同,小 PR 规则赖以成立的前提被一一拆掉。
上下文不再稀缺:Agent 可以"看到"整个代码库
小 PR 规则的一个隐性假设是:改动越小,reviewer 需要了解的上下文越少。但 AI 评审 Agent 打破了这条。Open Code Review 的评审单元不是"单个文件"而是"文件组",其核心数据结构FileGroup直接把语义相关的改动打包成一个组交给一个 sub-agent 评审,见 internal/agent/grouping.go。它的分组提示词(grouping_task_system.md)明确要求把"同一模块/同一特性""生产者-消费者关系(如接口与实现)""同一资源的多语言配置变体(如message_en.properties与message_zh.properties)"归为一组:
Files in the same group typically: Belong to the same module/feature; Have producer/consumer relationships; Are i18n/config variants of the same resource.
在纯人工评审里,把一个功能点的接口改动和实现改动拆成两个 PR 是为了降低 reviewer 负担;但在 AI 评审里,把它们拆开反而丢失了语义上下文——接口签名改了而实现没跟上,只有放在同一组里一起看才能发现。AI 的上下文窗口按 token 计价而非按"脑容量"计价,把 20 个相关文件塞进一个上下文里评审,边际成本远低于让一个人硬扛 20 个文件的认知负荷。
分组不是无脑捆绑,而是由工程逻辑决定何时值得调用 LLM 分组、何时直接打包。GroupingPlan(template.go)用两个阈值协作决策:文件数低于GROUPING_MIN_FILES(默认 4)时直接整体打包不调用 LLM;高于阈值才做语义分组;而GROUPING_BUNDLE_LINE_THRESHOLD(默认 200 行)决定改动量超过多少行时不再捆绑、改为每文件独立子任务,避免单个评审轮的注意力被摊薄。此外maxFilesPerGroup = 10的硬上限保证任何分组都不会超出单次评审的合理范围。这套机制直接回应了"大 PR 评审不完"的经典质疑——不是评审不完,而是过去没有把大 PR 拆成若干个上下文隔离、可并发执行的评审单元的工程手段。
评审吞吐从"人的注意力"变成"可并行的计算"
人工评审里,一个 1000 行的 PR 无论如何也要消耗一个 reviewer 的完整注意力。而 Open Code Review 把每个文件组作为一个独立 sub-agent 运行,组与组之间上下文隔离、天然支持并发评审(MaxConcurrency默认 8)。这意味着 PR 粒度变大带来的评审延迟增量,从"线性占用人的时间"变成"近乎不变的计算时间"——只要并发度足够,2000 行的 PR 和 200 行的 PR 在墙钟时间上可以没有本质区别。
Open Code Review 的基准测试数据印证了这一点。README 中公布的 AACR-Bench 基于 50 个热门开源仓库、200 个真实 PR、10 种编程语言构建,由 80+ 位资深工程师交叉验证出 1505 个标注问题。与通用 Agent(Claude Code)对比,同一底层模型下 OCR 的Precision 和 F1 显著更高,而 token 消耗只有约 1/9,评审耗时也更短——其 Recall 低于通用 Agent 是有意为之的取舍,宁可少报不可误报:
这个数据的关键不在于"谁更准",而在于它证明了 AI 评审可以做到"大 PR 不贵":token 消耗只与真正需要深入分析的内容相关,而通用 Agent 在超大变更集上会"偷工减料"、选择性漏看文件、行号漂移——这些都是小 PR 规则试图用"规模控制"掩盖的结构性问题。
质量保障从"评审者的经验"变成"内建规则 + 独立校验模块"
小 PR 规则的另一个隐性前提是:评审质量依赖 reviewer 的领域经验,所以把 PR 切小可以让资深工程师覆盖更多关键改动。而 Open Code Review 把"资深经验"产品化成了两层确定性机制。
第一层是内建规则集。system_rules.json 用路径 glob 把 50+ 种语言/文件类型映射到专门的评审规则文档(**/*.java→ java.md、**/*.go→ go.md、**/*.py→ python.md、**/pom.xml→ pom_xml.md……),规则覆盖 NPE、线程安全、XSS、SQL 注入等高频缺陷类别。规则匹配由模板引擎而非 LLM 决定,稳定可预测,且能在信息源头就滤掉噪声。甚至对扩展名歧义这种边界情况都做了工程化处理:sniffer.go 会嗅探.m文件的首行,区分它是 MATLAB 还是 Objective-C,从而选对评审规则——这类确定性判断如果交给 LLM 的"自然语言理解",正是位置漂移和质量不稳定的来源。
第二层是独立校验模块。评审 Agent 产出的每条 comment 都要经过两道后处理闸门:RE_LOCATION_TASK(re_location_task_system.md)是专职的"位置校正器",从 diff 中精确提取 comment 所指的代码片段,解决通用 Agent 行号漂移的痼疾;REVIEW_FILTER_TASK(review_filter_task_system.md)是"事实核查器",只删除 diff 能证明为错误的 comment,并明确写出两类错误的非对称代价——删掉一个正确 comment 会无声地摧毁一个真实发现,比保留一个错误 comment 严重得多。这两个模块与主评审任务职责分离,正是"确定性工程保证不能出错的部分、Agent 负责动态决策"这一混合架构的体现。
评审的"上下文完整性"优先于"粒度最小化"
综合以上三点,AI 时代 PR 粒度收益模型的核心变化是:评审质量的首要变量不再是 PR 大小,而是评审单元内上下文的完整性。一个跨 30 个文件的重构,如果 AI 能在同一组上下文里同时看到接口、实现、调用方和配置变体,它发现的跨文件问题(签名不匹配、配置不同步、行为分叉)远多于拆成 30 个小 PR 后的总和。这正是社区实践中反复出现的主题:跨模型同行评审、规则引擎与大模型协同、华为云码道检视智能体宣称 91.3% 召回率——业界已经从"AI 会不会评"快速演进到"AI 怎么评才不漏、不漂、不吵"。
评审流程重写的前置条件
Rootly 废止小 PR 规则、业界拥抱大 PR 评审,并不等于"回到大 PR 时代"这么简单。AI 评审要承接更大的变更集,需要满足一系列工程前提,缺一不可。
前提一:确定性工程必须兜底,不能把一切交给 LLM。文件选择、删除/二进制/超大文件过滤、规则匹配、分组阈值这些"必须不出错"的环节,必须由工程逻辑保证。Open Code Review 的selectFiles(internal/agent/selection.go)是"评审前唯一的确定性预分发选择":先过静态路径/扩展名闸门,再查删除文件,最后按 token 上限过滤超大 diff,纯函数、无副作用——--preview和真实运行共享同一份决策。它的注释里甚至记录了教训:预览和实跑曾因各自推导选择逻辑而漂移(issue #782),统一入口后彻底修复。反例是社区情报中反复出现的通用 Agent 通病:大变更集上选择性漏看文件、位置漂移、质量随提示词微调剧烈波动——根源就是纯语言驱动的架构对评审过程缺少硬约束。
前提二:上下文管理必须可扩展、可隔离、可并发。大 PR 评审的本质是"大任务切分为上下文隔离的小任务"。文件组(FileGroup)就是这种切分单元,每组一个 sub-agent、独立上下文、并发执行、共享预算。配套的还有MEMORY_COMPRESSION_TASK(多轮评审中压缩已消费上下文)、PLAN_TASK(改动超阈值时的预规划)以及 MAX_TOKENS/MAX_COMPLETION_TOKENS 预算控制。没有这套机制,大 PR 只会让单个 LLM 调用直接撞上上下文窗口天花板。
前提三:质量必须可度量、可回放。放弃小 PR 规则的前提是你能证明大 PR 的评审没有变差。AACR-Bench 这类可复现基准、ocr session list/--resume的会话续跑能力、retry 报告、以及 session viewer 中逐条 comment 的回放与"已修复/已忽略"标记,共同构成了质量闭环。社区情报中 GitHub 发布 ReviewBench 开放基准、华为云用 91.3% 召回率做宣传,都说明度量正在成为 AI 评审的标配。
前提四:人在环中的角色重新定义。这不是要取消人类评审,而是把人的精力从"逐行通读"挪到"审核 AI 的发现"和"做 AI 不会做的判断"上。Open Code Review 的REVIEW_FILTER_TASK默认行为是"证据不足即放行",宁可让 reviewer 花几秒扫掉一个误报,也不让一个真缺陷被静默吞掉——这恰恰把人类从"通读者"解放成了"仲裁者"。
结语
小 PR 规则是一套针对人类认知局限的优化策略,它解决的问题在 AI 评审时代依然存在,但解法已经变了。当评审的瓶颈从"人的注意力"迁移到"上下文窗口与 token 预算",PR 粒度就不再是质量的第一杠杆,上下文完整性才是。Rootly 废止小 PR 规则不是激进,而是第一个算出新账的团队。对绝大多数团队而言,真正的分水岭不是"要不要大 PR",而是:你的评审流水线里,有没有一套确定性工程去兜底、一组上下文隔离的评审单元去并发、一套可度量的基准去证明质量没有滑坡。如果没有,那先别急着废止小 PR 规则——先把评审流程本身重写一遍。
【免费下载链接】open-code-reviewSecure, fast, efficient, battle-tested at Alibaba's scale. Hybrid architecture code review tool: deterministic pipelines + LLM Agent, precise line-level comments, built-in multi-language ruleset (NPE, thread-safety, XSS, SQL injection), OpenAI & Anthropic compatible.项目地址: https://gitcode.com/GitHub_Trending/op/open-code-review
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考