跳到正文
Meta / Llama · AI工程研究· 一手来源·· 3 小时前AI 评分20

Meta 发布 Catching JiTTests:利用 LLM 在代码上线前自动捕获 Bug

Catching Bugs Before They Land: JiTTesting’s Human-on-the-Loop Approach at Full Scale

正文 · AI 翻译
  • 在过去一年里,我们一直在分享利用大型语言模型即时捕获缺陷的工作——我们将这种新颖的方法称为即时测试捕获(Catching Just-in-Time Tests,JiTTests)。
  • 现在,我们正在分享将 Catching JiTTests 部署到生产环境后所看到的结果和积极影响。
  • 我们的论文《Meta 的即时捕获测试生成》详细说明了我们在 Catching JiTTests 方面的初始部署和测试结果。

每次代码更改都会提升我们的平台,但同时也引入了新的复杂性。在 Meta,数以亿计的代码行不断演进,传统测试已无法跟上节奏。在代码上线之前主动发现风险,使我们能够更早地识别风险、更有效地应对,并以规模化方式提供可靠的体验。

在过去一年里,我们分享了关于 应用大语言模型(LLM)生成软件测试的研究。更具体地说,我们分享了在 即时测试(Just-in-Time Tests,JiTTests)方面的工作,这是一种新颖的测试方法,我们利用 LLM 即时捕获缺陷,甚至是传统测试可能无法捕获的缺陷。

自我们首次公布这项成果以来的五个月里,我们部署了我们的Catching JiTTests方法,以确定其可扩展性以及对更广泛行业的适用性。如今,Catching JiTTests已不再是一个研究原型;它们已成为Meta基础设施的一部分,并帮助我们的工程师以更少的负载和更低的误报率发现更多错误。

Catching JiTTests的优势

大多数基于 AI 的代码缺陷预防方法使用 LLM 和/或智能体式 AI,依据以往经验审查代码并检测故障。它们按照与人类审查者相同的审查流程工作,只是速度更快。捕获 JiTTests 是一种根本不同的方法(表 1):它生成可执行的测试,以展示变更所引入的具体行为差异。虽然它需要更多计算步骤,但它能捕获基于 LLM 或智能体的代码审查可能无法捕获的各类缺陷。

表1. 传统基于LLM的代码审查与捕获JiTTests之间的关键区别。

我们在Meta实现捕获JiTTests的方式

JiTTests 是自动生成并设计为失败的测试,用于在代码变更(diff)进入生产环境之前暴露其中的缺陷。当它们被应用到像 Meta 这样庞大的代码库时,一个挑战就是区分强捕获(即揭示真实缺陷的真阳性失败)与弱捕获(即可能是假阳性的测试)。

归根结底是一个具体问题:对于每一个提议的 diff,我们如何自动生成测试,在造成严重问题之前发现最严重的缺陷,并且做到高真阳性率、不拖慢工程师的开发速度?

为解决这一问题,我们开发了两个串联工作流:

  • 一种“意图感知”工作流,它会推断代码变更的意图和风险,并将测试生成定向到可能的故障点。
  • A “可疑差异”(dodgy diff)工作流,它把每一处代码变更都当作变异体/缺陷来处理,并生成测试来暴露其行为差异,而不去推理其意图。它隐含地断言某个差异是有缺陷的(因此称为“可疑”)。
图1. 用于捕获JiTTests的可疑差异和意图感知工作流的架构。

为了过滤误报,我们采用了一种传统的基于规则的方法,并结合了一种我们称之为“LLM-as-Judge”的集成方法,该方法汇总了多个最先进(SOTA)LLM的判断,所有这些LLM的任务都是将弱捕获分类为可能的真阳性或假阳性。

我们还保留了人工审核,并着眼于减轻审核负担。我们的目标是保持人工标注的一致性,同时降低因捕获效果不佳而需要工程师介入审核的可能性。

工作原理

整个系统工作流程分为五个阶段:

阶段 1:定位与触发 

该系统在夜间利用空闲资源运行,并针对前一天提交的、通过类似于差异风险评分(DRS)的机制判定为“高风险”的差异进行优化。该机制基于先前的代码变更进行训练。这有助于确保测试生成聚焦于最可能包含严重回归问题的差异上。

阶段2:两种感知差异的测试生成工作流

可疑差异工作流将每个差异视为一个变异体,并使用基于变异引导的 LLM 测试生成来生成测试,以区分该差异与其父版本的行为。此处的目标是最大化弱捕获池,并借此提高在其中找到强捕获的机会。

同时,意图感知工作流使用大语言模型(LLM)通过代码变更、diff 标题和摘要来推断 diff 的意图。随后,LLM 会描述“风险”——即尝试实现该意图时可能产生错误的方式。接着,它利用这些风险描述来构建变异体(mutants)——每个变异体代表在实现推断意图过程中可能引入的一个 bug。

生成测试用例以杀死每个变异体(即区分变异体行为与父级行为)。

随后将这些测试用例在实际的 diff 上运行。任何失败的测试都会被收集为弱捕获(weak catches)。

阶段 3:LLM 作为裁判的集成(自动化评估)

一旦生成弱捕获结果,系统必须判断每个结果是假阳性还是真正的强捕获(真阳性)。

“LLM作为裁判”集成由一组审查以下内容的LLM组成:

  • The 弱捕获测试用例代码。
  • The 测试执行结果(失败代码、消息、执行轨迹)。
  • 父级与子级之间的代码变更(即差异)。
  • 推断出的差异意图。

阶段 4:基于规则的评估器(RubFake)

我们采用一种更传统的、基于规则的方法——基于规则的假阳性消除环境(Rule-Based False-Positive Killing Environment,简称 RubFake),来补充“大语言模型作为裁判”(LLM-as-Judge)。

LLM-as-Judge 具有丰富的语义,但其判断是非确定性的,且难以验证。相比之下,RubFake 提供经过验证的、确定性的判断。RubFake 与 LLM-as-Judge 协同工作,对弱捕获候选者给出总体排名,其中排名足够高的候选者值得进一步考虑。

阶段 5:人在回路中(工程师联络)

系统根据“大语言模型作为裁判”和 RubFake 生成的排名,决定是否需要联系人类工程师。

我们并未采用需要人类工程师逐一审查每项输出的“人在回路”方法,而是通过“人在环上”方法减少了摩擦,在此方法中,人类工程师设定标准并在汇总层面审查结果,而非对每项输出进行监督。on

表2. “人在回路”与“人在环上”方法的运营差异。

Catching JiTTests 在 Meta 的影响

随着测试系统的部署,我们的目标是让工程师参与其结果的互动。

截至撰写本文时,Meta 的589名工程师(占我们 outreach 对象的64%)已参与了 Catching JiTTests。这些工程师报告称,Catching JiTTests 揭示了真正可操作的发现,其中真阳性率为60%。

在2026年上半年,Catching JiTTests 在差异阶段捕获了74个严重(SEV)级别的隐私漏洞,防止它们流入生产环境,并使该时间段内隐私SEV的整体发生率降低了20%。

图2. Catching JiTTests 在Meta于2026年上半年的影响。

为何重要

代理式软件开发正在帮助全行业的工程师和开发人员比以往更快地编写、审查和发布代码。但更快的部署也意味着需要更快的测试。在代码进入生产环境之前捕获的每个错误,都是终端用户无需面对的问题。我们已经证明,大语言模型可以提供额外的安全层,能够捕获传统测试可能遗漏的问题,表明AI生成的测试可以规模化扩展,从而降低组织风险。

捕获 JiTTests 是一种在技术上和社会上都具有可扩展性的解决方案。将这些测试与 human-on-the-loop 方法相结合,有助于确保工程师很少需要阅读测试代码,只需确认观察到的行为变化是否是预期内的。

这种方法具有可推广性:工程师尽早定义成功标准,让 AI 执行测试,在总体层面监控结果,并在策略层面而非逐项进行干预。

阅读论文

我们的论文《在 Meta 进行即时测试生成捕获》在 FSE 2026 上发表,并入选了 规模化产品,详细介绍了我们在 Meta 基础设施中部署和测试 Catching JiTTests 的初期工作。

在错误落地前捕获:JiTTesting 的全规模人工监督方法一文首发于 Meta 工程。

来源:Meta / Llama · AI工程研究 · engineering.fb.com