代码审查是高质量软件工程的支柱。在这个过程中,开发人员相互检查工作,以发现错误、确保风格一致性,并验证代码是否真正实现了提交信息中所描述的功能。

然而,如果你曾在软件团队工作过,就会知道现实情况: 代码审查是一项劳动密集型、耗时且容易出现人为错误的工作。

自然地,研究人员转向大型语言模型 (LLM) 来实现自动化。但这里有个问题。大多数现有的 AI 工具将代码审查视为简单的“输入-输出”任务——输入代码,AI 吐出评论。这忽略了一个基本事实: 代码审查是一个交互式的协作过程。 它涉及理解上下文、根据旧文件检查格式以及确保安全性——这些任务通常需要不同的“思维模式”。

在本文中,我们将深入探讨 CodeAgent , 这是由卢森堡大学和其他机构的研究人员提出的新框架。CodeAgent 不仅仅是要求 LLM “审查这个”。相反,它生成了一个由自主智能体组成的数字团队——从 CEO 到专业的审查员——他们相互交谈以产生全面的审查结果。

我们将分解这个多智能体系统是如何工作的,使其保持正轨的数学“QA-Checker” (问答检查器) ,以及表明这可能是自动化软件维护未来的结果。

问题所在: 为什么单智能体举步维艰

在查看解决方案之前,我们需要了解为什么标准的 ChatGPT 或 CodeBERT 提示 (prompt) 在复杂的代码审查中经常失败。

  1. 角色专业化缺失: 单一模型试图一次完成所有工作——检查语法、逻辑、安全性和格式。
  2. 提示漂移 (Prompt Drifting) : 在多步推理 (思维链) 中,LLM 经常“偏离”原始问题。它们可能会开始讨论安全漏洞,结果却虚构了一个破坏代码风格的修复方案,忘记了最初的约束条件。
  3. 上下文隔离: 自动化工具通常孤立地看待代码更改,忽略了新代码是否与原始文件的风格匹配,或者提交信息是否准确反映了更改。

CodeAgent 登场: 一个多智能体框架

CodeAgent 模仿了现实世界的软件公司。框架不是让一个 AI 完成所有工作,而是将特定的“角色”分配给不同的智能体。这些智能体相互沟通,共享信息,并审查彼此的输出。

公司结构

如下图所示,该系统模拟了一个包含六个不同角色的层级结构。

图 1: CodeAgent 内模拟代码审查团队的角色数据卡及其对话示意图。

角色定义如下:

  • User (用户) : 提交拉取请求 (PR) 的人类。
  • CEO (首席执行官) : 处理高层决策和信息同步。
  • CTO (首席技术官) : 提供高层技术见解和模态分析 (例如,识别编程语言) 。
  • CPO (首席产品官) : 帮助将发现总结为最终报告。
  • Reviewer (审查员) : 主力军。该智能体寻找特定问题,如漏洞或格式错误。
  • Coder (程序员) : 负责实施建议的修订并协助审查员的技术专家。

流程管道

这些智能体如何协同工作?研究人员设计了一个四阶段的“瀑布 (Waterfall) ”管道。它确保在分析开始前收集信息,并在撰写文档前完成分析。

图 2: CodeAgent 在不同角色之间的代码审查过程中的完整对话管道/场景。

  1. 基本信息同步 (Basic Info Sync) : CEO、CTO 和程序员分析输入文件以确定语言 (例如 Python、Java) 和请求的性质。
  2. 代码审查 (Code Review) : 审查员和程序员进行反复对话以识别问题。这包括:
  • 一致性分析 (CA): 代码是否实现了提交信息所述的功能?
  • 漏洞分析 (VA): 是否存在安全风险?
  • 格式分析 (FA): 风格是否与原始文件一致?
  1. 代码对齐 (Code Alignment) : 根据审查结果,程序员建议修改以修复错误或对齐格式。
  2. 文档 (Document) : 最后,CPO 和 CEO 帮助将对话综合成一份人类用户可读的报告。

秘诀: QA-Checker (问答检查器)

CodeAgent 最具创新性的部分不仅仅是使用了多个智能体——而是它如何防止智能体胡言乱语。

在多智能体对话中,“提示漂移”是一个主要问题。智能体 A 问一个问题,智能体 B 的回答稍微偏离主题,智能体 A 回应这个偏离的部分,很快审查就变得毫无用处了。

为了解决这个问题,研究人员引入了 QA-Checker (问答检查器) 。 这是一个监控对话流的监督模块。

图 3: 我们设计的思维链 (CoT) 架构图: 问答检查器 (QA-Checker)。

QA-Checker 如何工作

QA-Checker 就像一个严格的版主。当智能体生成针对问题 (\(Q_0\)) 的回答 (\(A_0\)) 时,QA-Checker 会评估其质量。如果回答不相关或偏离了意图,QA-Checker 就会介入。

它生成一个附加指令 (\(aai\)) 并强制智能体重试。新问题变成了原始问题加上修正指令的组合。

数学基础

研究人员将这一机制建立在优化理论之上。他们将对话质量视为一个需要最大化的函数 \(\mathcal{Q}(Q, A)\)。

对话的更新规则模仿了 牛顿-拉夫森方法 (Newton-Raphson method) , 这是一种用于寻找函数根 (或在优化中寻找局部最大值/最小值) 的数学技术。

更新规则如下所示:

问题和答案更新规则方程

这里,\(\alpha\) 是学习率 (修正的幅度) 。涉及 \(H\) (海森矩阵) 和 \(\nabla\) (梯度) 的项表示将回答引导回相关性所需的“修正”的方向和幅度。

QA-Checker 基于三个指标评估回答的质量,这些指标合并为一个分数:

质量评估函数方程

  1. 相关性 (Relevance) : 问题向量和回答向量之间的余弦相似度。
  2. 特异性 (Specificity) : 衡量回答的技术性和详细程度 (惩罚模糊的回答) 。
  3. 连贯性 (Coherence) : 回答在逻辑和语法上的流畅程度。

通过在对话的每一轮应用这种严格的检查,CodeAgent 确保“审查员”和“程序员”智能体不会分心,从而显著提高准确性。

实验结果

研究人员将 CodeAgent 与最先进的模型 (如 CodeBERT、GPT-3.5 和 GPT-4) 以及框架 (ReAct 和标准思维链) 进行了比较。他们在包括 Python、Java、Go 和 C++ 在内的九种编程语言上进行了测试。

1. 漏洞分析 (VA)

检测安全漏洞可能是最关键的任务。团队在超过 3,500 个真实世界的代码更改上运行了 CodeAgent。

表 2: CodeAgent 和其他方法发现的漏洞数量。

结果令人震惊。

  • 精度 (命中率) : 查看 Rate_cr (确认率) 这一行。CodeAgent 达到了 92.96% 的确认率。这意味着当 CodeAgent 说“这是一个漏洞”时,它几乎总是对的。
  • 对比: GPT-4 的确认率仅为 51.42%。CodeBERT 更低,约为 20%。
  • 不带 QA-Checker 的 CodeAgent: 最后一列显示了没有 QA-Checker 的系统。性能显著下降 (从 ~93% 降至 ~73%) ,证明监督智能体至关重要。

下面的维恩图显示了检测的重叠情况。CodeAgent 发现了 449 个已确认的漏洞,涵盖了其他模型发现的几乎所有问题,以及许多独特的问题。

图 4: CodeBERT、GPT-3.5、GPT-4.0 和 CodeAgent 的漏洞检测重叠情况。

2. 一致性分析 (CA)

一致性分析检查提交信息 (例如,“修复了登录中的错误”) 是否与代码更改实际匹配。如果信息说的是一回事,但代码做的是另一回事,那就是一个“负面”样本。

表 3: CodeAgent 与其他方法在 CA 任务上针对 9 种语言的合并及关闭提交的比较。

CodeAgent 的平均 召回率为 88.63% , F1 分数为 93.16% , 持续击败 GPT-4 和 ReAct 方法。这表明 CodeAgent 在“理解”自然语言描述与代码逻辑之间的语义联系方面要好得多。

3. 格式分析 (FA)

此任务检查新代码是否遵循现有文件的缩进和命名约定。

表 4: CodeAgent 与其他方法在 FA 任务上针对 9 种语言的合并及关闭提交的比较。

在这里,差距是巨大的。CodeAgent 将召回率比 GPT-4 提高了近 16 个百分点 。 标准的 LLM 经常忽略细微的格式差异,但在 QA-Checker 约束下的 CodeAgent 专用“审查员”角色会关注这些细节。

4. 代码修订 (CR)

最后,CodeAgent 真的能修复代码吗?研究人员测量了“编辑进度” (EP) ,该指标计算 AI 建议的修复方案与错误代码相比,在多大程度上接近正确解决方案。

表 5: CodeAgent 和最先进工作的代码修订 (CR 任务) 实验结果。

CodeAgent 在各种数据集上实现了最高的编辑进度 (31.6%)。值得注意的是,像 Trans-Review 这样的其他工具工具有时会导致进度 (使代码变得更糟) ,而 CodeAgent 保持了稳健性。

案例研究: 实战中的 CodeAgent

为了直观地了解其工作原理,让我们看看 CodeAgent 在一个 Python 项目上的实际输出。

图 13: Python 项目示例

在这个例子中:

  1. 变更: 开发人员将字典键从 user_id 更改为 user,将 client_id 更改为 client。但是,他们也删除了一行检查 auth.user_id 的代码。
  2. 语义一致性: CodeAgent 正确地标记了身份验证检查已被删除,这在提交信息 (“重命名 client_id…”) 中未提及。
  3. 安全分析: 它标记了关于输入验证的潜在风险。
  4. 格式分析: 它注意到了缩进问题。
  5. 建议: 它提供了可操作的建议来修复这些不一致之处。

这种分析深度——将代码中缺失的逻辑与提交信息联系起来——是单智能体系统难以可靠实现的。

成本与性能

多智能体系统的一个权衡是成本和时间。由于多个智能体在相互“交谈”,因此与单个 API 调用相比,它使用的 token 更多,耗时更长。

图 6: CodeAgent 在不同语言下的执行时间。

如上所示,每次审查的执行时间在 250 到 450 秒 (4 到 7 分钟) 之间。虽然比 10 秒的 GPT 响应要慢,但对于 CI/CD 管道来说,考虑到审查的深度,这个时间框架是可以接受的。

研究人员还指出,运行 CodeAgent-4 (基于 GPT-4) 的成本 (每次审查 0.122 美元) 明显高于 CodeAgent-3.5 (0.017 美元) ,尽管性能优势是巨大的。

结论

CodeAgent 代表了我们在软件工程中思考 AI 方式的转变。我们正在从“智能自动补全”工具转向自主数字员工

通过定义特定角色 (审查员、程序员、QA) 并通过数学化的 QA-Checker 强制执行严格的对话质量,CodeAgent 解决了困扰许多 LLM 应用的“漂移”问题。它证明了一个被正确监督的智能体团队,其作用大于各部分之和。

对于进入该领域的学生和研究人员来说,CodeAgent 强调了一个至关重要的教训: 架构与底层模型同样重要。 你并不总是需要更聪明的 LLM;有时,你只需要一种让你的智能体相互交流的更好方式。

参考文献