利用多智能体完成自动代码审查,关键不是让多个模型随意讨论,而是把一次审查拆成边界清楚、输入输出可验证的子任务,再设置一个独立的质量检查角色控制对话偏移。CodeAgent 的做法可以概括为:先同步变更背景,再分别检查提交说明、漏洞和格式一致性,然后形成修改建议,最后汇总成审查结论。这样的流水线让不同角色各自承担有限职责,也让失败能够定位到具体阶段。
真实代码审查不是简单地把补丁交给模型并询问“有没有问题”。审查者需要理解原文件、代码差异和提交信息之间的关系,还要区分功能缺陷、安全风险、风格偏差与可维护性问题。发现问题后,审查意见必须指向具体代码,并说明影响、证据和修改方向。单次输入输出容易把这些目标混在一起:模型可能给出很多泛泛建议,却遗漏题目真正要求检查的事项;也可能修改了代码,却没有解释修改是否符合提交意图。
多智能体的价值因此不在“数量”,而在职责分离。一个角色负责识别输入与语言,一个角色专注代码事实,一个角色从审查视角提出问题,另一个角色负责综合决策。每次交流只处理一个原子任务,产物再交给下一个阶段。只要角色之间拥有明确契约,就能减少同一提示中互相竞争的目标,并为每个判断保留可追踪的中间结果。
论文中的系统定义了 User、CEO、CPO、CTO、Reviewer 和 Coder 等角色,并把流程分为四个连续阶段。角色名称带有模拟团队的色彩,工程实现时不必照搬名称,更重要的是保留它们的职责和数据边界。
基础信息同步阶段接收提交信息、变更代码和原始文件,先识别材料类型、编程语言及审查目标。它解决的是“大家是否在看同一件事”。如果缺少原文件、补丁被截断,或提交说明与代码仓库不对应,应在这一阶段停止并请求补充,而不是让后续角色依据残缺上下文推测。
落地时可以将阶段输出固定成结构化对象,至少包含语言、变更文件、提交意图、可用上下文和待执行检查。这样 Reviewer 不需要重新猜测输入,调度器也能在字段缺失时直接拒绝进入下一阶段。
{
"language": "Python",
"intent": "修复用户输入校验",
"changed_files": ["service/input.py"],
"checks": ["message_consistency", "vulnerability", "format", "revision"],
"context_complete": true
}
代码审查阶段由 Coder 提供代码事实,Reviewer 按目标生成分析报告。论文把核心任务划分为四类:检查代码变更是否与提交信息一致,识别变更是否引入漏洞,判断新增代码的格式是否符合原文件,以及针对已确认的问题提出代码修订。分项处理很重要,因为每类任务需要的证据不同。
提交一致性需要对照自然语言意图与实际差异,不能只看代码能否运行。漏洞分析要指出输入、危险操作、信任边界和可能后果,避免仅凭关键词报风险。格式检查应以目标文件现有风格或项目规则为基准,不能把模型偏好当成规范。修订建议则必须建立在前面已经确认的问题上,不能为了展示能力而重写无关代码。
工程上应要求每个发现包含文件位置、问题类型、证据、影响、置信度和建议动作。若无法从补丁与上下文证明,就标为“需要人工确认”,而不是写成确定结论。不同检查器可以并行运行,但合并结果时要按文件位置和根因去重,防止同一个问题以安全、质量和风格三种表述重复出现。
代码对齐阶段让 Coder 根据分析报告提出修改,Reviewer 再检查修改是否真正消除了问题。这里需要把“发现问题”和“自动改代码”分开授权。低风险且可机械验证的修改,例如明显的格式问题,可以自动生成补丁;涉及业务语义、权限模型或数据迁移的修改,应只提供建议并等待维护者确认。
修订结果至少要经过三项约束:只改变与问题相关的最小范围,不破坏提交原本意图,并能通过现有测试或静态检查。模型生成的代码不应因语言通顺就被接受。系统必须保留原补丁、审查发现、建议补丁和验证结果,使人类审查者可以重放决策链。
最终阶段不是拼接所有代理的长篇输出,而是压缩成可执行的审查意见。建议按阻断问题、重要建议和非阻断改进分级,每条意见都回指具体证据。若没有足够证据,应明确说明未能验证的部分。维护者真正需要的是决定是否合并、需要改哪里以及怎样复验,而不是代理之间的完整对话。
多智能体增加了视角,也放大了上下文漂移。前一个角色的一句猜测可能被后续角色当成事实,讨论轮次越多,最终输出越容易偏离最初问题。CodeAgent 为每段双角色对话加入 QA-Checker,检查回答是否仍然对应原始任务。若回答不合适,检查器会在原问题上附加更具体的指令,再要求角色重新生成;回答满足要求或达到最大轮数时结束。论文实验把最大对话轮数设为十轮,这也说明纠偏必须有停止条件。
在生产系统中,QA-Checker 不应只返回“通过”或“不通过”,而应按清单验证:是否回答当前子任务,是否引用输入中的代码事实,是否遗漏必需字段,是否出现无法证实的结论,以及建议是否越过自动修改权限。纠偏指令要针对失败项,例如“请指出危险输入到文件写入函数的数据流”,而不是笼统地要求“重新思考”。
def run_review_step(question, context, max_rounds=10):
current = question
for _ in range(max_rounds):
answer = reviewer(current, context)
verdict = qa_checker(question, answer, context)
if verdict["accepted"]:
return answer
current = question + "n补充约束:" + verdict["instruction"]
return {"status": "needs_human_review", "reason": "未在轮次上限内满足质量门槛"}
这段伪代码体现了三个必要条件:检查器始终拿到原始问题,补充指令不能替换原目标,达到轮次上限后必须交给人工处理。否则系统可能陷入无休止的自我修订,既增加成本,也未必提升结论质量。
将代码差异、提交说明、相关原文件、项目规则和测试命令作为一次审查的显式输入。对超长变更先按文件或依赖关系切片,但应保留跨文件调用摘要。对生成文件、依赖锁文件和二进制内容设置单独策略,避免它们占满上下文。所有角色使用同一提交快照,不能在审查过程中读取不断变化的分支。
每个角色只产生机器可校验的结构化结果。Reviewer 输出发现列表,Coder 输出候选补丁,QA-Checker 输出验收状态与纠偏指令,汇总角色输出最终评论。调度器负责状态流转,不让代理自行决定下一位参与者。这样即使更换底层模型,流程语义和审计记录仍然稳定。
语言模型适合解释语义与提出假设,但编译器、测试框架、格式化工具和静态分析器更适合确认事实。候选补丁应在隔离环境执行最小测试集,并记录退出码和关键诊断。安全发现可以交给规则扫描或数据流分析做交叉验证。工具没有运行,就不能声称代码已经通过测试;工具运行失败,也要区分环境问题与代码问题。
自动审查的输出不应拥有无限权限。可以规定高置信度的确定性失败阻止合并,中等置信度问题请求人工复核,纯风格建议不阻断。任何自动修订都要以新补丁形式提交,并重新运行测试与审查。涉及凭据、访问控制、支付、数据删除等敏感路径时,即使多个代理意见一致,也应保留人工批准。
不能用“评论更长”或“角色更多”衡量效果。论文在九种编程语言上考察了提交信息一致性、漏洞、格式一致性和代码修订,并使用召回率、F1、漏洞确认比例与 Edit Progress 等指标。其新数据包含 3545 个提交、2933 个拉取请求,覆盖超过 180 个项目。实验中,完整 CodeAgent 的漏洞发现确认比例高于去掉 QA-Checker 的版本,消融结果支持监督纠偏角色的贡献。
团队自己的评估仍应基于本地历史变更建立回放集。至少统计有效问题召回率、误报率、重复评论比例、人工接受率、平均处理时间和单次审查成本。还要单独观察严重漏洞,因为总体准确率可能被大量容易判断的格式问题掩盖。上线前可以影子运行:系统生成评论但不发送,通过维护者盲评比较单代理、多代理和人工基线。
论文报告的结果来自特定数据集和实验配置,不能直接等同于任意仓库的线上收益。论文也明确指出,跨开发环境和行业的泛化能力仍需验证,现有基线可能不足以覆盖边缘与复杂场景。附录中的平均查询时间和成本还显示,更强模型的多智能体审查会带来更高延迟与费用。因此生产环境应先按风险选择性触发,而不是对每个微小提交运行完整流程。
第一类失败是所有角色说法相似。这通常意味着角色卡只有名称不同,任务输入和验收标准却完全一致。应重新划分子任务,让安全检查、提交一致性和修订分别拥有专属证据要求。
第二类失败是对话越来越长但结论没有变化。检查 QA-Checker 是否给出了具体纠偏原因,并确认轮次上限会触发人工接管。对同一失败反复生成近似答案时,应停止重试并记录未解决项。
第三类失败是误报过多。先检查上下文是否包含原文件、调用方和项目规则,再分析模型是否把可能性写成了事实。要求发现包含可复现路径,并用静态分析或测试交叉验证,通常比继续增加代理更有效。
第四类失败是生成的补丁修复了局部问题,却改变了业务行为。此时要收紧修订角色的权限,执行差异范围检查,并把提交意图作为 QA-Checker 的固定输入。测试覆盖不足时,自动补丁只能作为候选,不能直接进入主分支。
多智能体自动代码审查的核心是一条受控的证据流水线:明确输入,拆分任务,限定角色,监督偏移,用确定性工具验证,再由人类掌握高风险决策。CodeAgent 展示了这种结构如何覆盖多类审查任务,也通过 QA-Checker 的消融实验说明了质量监督的重要性。真正落地时,应从一个高价值场景开始,例如提交说明一致性或安全变更复核,用本地数据测量误报、漏报、延迟和成本,再逐步扩展,而不是先复制一整套角色名称。