TestJack: 你 该 相信 编码 基准 里 的 结果 吗?
Columbia、Berkeley 与 George Mason 用 TestJack 审计五个编码基准上 4,487 次已通过试验,1,545 次(34.4%)违反任务要求,全体解决率从 50.6% 降到 33.2%。轻量审计用大约 15.4% 的成本找回 72.4% 的反驳。

本文目录
TestJack:你该相信编码基准里的结果吗?经由评分器演化审计智能体编码基准
Shuangjie Yao,Hao Wang,Koushik Sen,Simin Chen,Baishakhi Ray,Dawn Song
Columbia University;University of California, Berkeley;George Mason University
大语言模型(LLM)智能体正在迅速重塑软件工程,与此同时新的代码基准也在爆发。然而几乎所有现有基准仍依赖同一条有几十年历史的判据:一个解只要通过一组固定的单元测试就算正确。这类测试常常不够:它们只检查任务所要求内容的一部分,于是智能体可以对其做奖励黑客,或在静默漏掉必要行为的同时仍然通过每一项测试。结果是,更高的基准分数可能部分反映的是对评分器的更好适应,而不是更好的解题。已有工作聚焦静态测试增强:它们在看到任何一次试验之前,就把每个任务的测试加强一次,因而忽略真实试验实际上是怎样失败的。我们提出 TestJack,一个在固定测试之外评测补丁的可扩展框架。对每一次试验,TestJack 生成针对该补丁可能违反的提示要求的测试,只保留真值补丁能够通过的测试,并重新检查任何试验失败。每一个被确认的失败因此都有一个可重放的测试支撑。为降低评测成本,我们还提出一个轻量变体:对试验的随机样本做深入审计,并把由此得到的测试复用到同一任务的全部试验上。在 6 个前沿模型后端和 5 个基准(例如 DeepSWE 与 SWE-Marathon)上,我们发现目前被判为正确的模型试验中约有 34.4% 违反了任务要求,使整体解决率从 50.6% 降到 33.2%。我们的结果揭示当前编码智能体评测的一个根本局限:当大语言模型越来越善于针对固定评分器做优化时,这些评分器本身必须变得更有适应性。
1Columbia University 2University of California, Berkeley 3George Mason University
1 引言
大语言模型(LLM)智能体正在重塑软件工程。现代智能体浏览仓库、编辑多个文件、运行开发工具,并迭代地改进自己的输出;Claude Code、Codex 和 Copilot 这类系统已经成为研究与生产中不可缺少的部分,使对它们的严格评测越来越重要。代码基准已经成为比较这些智能体的标准尺子,从 HumanEval [7] 与 MBPP [3] 中的函数级合成,到 SWE-bench [18] 中的仓库级 issue。它们的数量还在增长:2024 年引入了 210 个,2025 年引入了 316 个 [5],分数的提高也经常被引用为进步的证据。
图 1:前沿基准 DeepSWE [17] 中的两类基准缺陷,用通过了基准的试验来说明。测试不足:测试检查的内容少于提示所要求的。提示欠指定(右):某项行为只被提示所暗示,因此它是否必须被实现是含糊的;真值实现了它,但没有任何测试检查它。
社区在这些基准上投入很大:任务从真实仓库中整理而来,或由工程师撰写,测试则由人工审查,例如 93 名专业开发者筛选 SWE-bench 以构建 SWE-bench Verified [10]。然而它们几乎全都共享同一种评测模式:提交一旦通过基准发布时就固定下来的测试套件,该任务就算被解决。我们认为,这种模式从根本上与智能体不匹配:
静态测试无法评判动态智能体。一套固定的测试套件只检查其作者预先想到的行为,而智能体观察执行反馈、适应这些反馈,并且可以在没有完全满足任务的情况下通过每一项测试。
图 1 说明了这一缺口背后的两类基准缺陷。在测试不足时,测试检查的内容少于提示所要求的,于是漏掉某个必要情形或钻测试空子的试验仍然通过。在提示欠指定时,某项行为只被提示所暗示,因此它是否必须被实现是含糊的;真值实现了它,但没有任何测试检查它。只有前者才是试验本身的缺陷:TestJack 因测试不足而反驳试验,而把后者归因于提示,并作为提示缺陷报告,而不反驳该试验(§3.2)。由此造成的高估可以相当大:通过人工检查,SWE-Bench+ [2] 表明,排除那些仅仅因为测试薄弱或解答泄漏才通过的补丁之后,某一个 SWE-bench 智能体的解决率从 12.47% 降到 3.97%。
弥合这一缺口的现有努力,要么牺牲可扩展性,要么牺牲保真度。SWE-Bench+ 这类人工审计能可靠地揭出这类失败,但它们不可扩展:对每一个智能体、每一个模型版本和每一次运行,专家审查都必须重做。ABA [32] 这类自动化基准审计者询问一个任务是否公平,并移除有缺陷的任务;这纠正了被不公平地判失败的试验,却把被错误地判通过的试验留在原处。UTBoost [37] 和 SWE-ABS [36] 这类测试增强方法能产生可执行的证据,但仍然是静态的:它们在观察到任何提交之前,就把每个任务的套件加强一次,因此只能抓住预先料到的失败,够不到现代大语言模型的奖励黑客。PatchDiff [33] 动态地检查提交,但仍然依靠人力来决定哪些分歧是真正的缺陷。所需要的,是一个动态评分器:它像人工审计者那样,对照任务所要求的内容来评判每一次试验,并且像自动化测试那样,在规模上用可执行证据支持每一个裁决。
本文提出 TestJack,一个自动化框架,它通过演化评分器而不是信任其固定测试,来审计编码基准所报告的成功。
译注:HTML 转写把脚注标记展成了 “TestJack11 1”。原文脚注为:Our artifact is available at https://anonymous.4open.science/r/testjack-C1A7。
我们的关键洞察,是把“一项测试应该检查什么”和“它的期望是否正确”分开:一次试验应当对照任务提示中陈述的要求来评判,而基准已经拥有的真值解可以充当可执行的预言机,在新测试被用来评判试验之前先认证它。基于这一洞察,TestJack 用立足于提示的差分测试来审计每一次通过基准的试验:一个大语言模型智能体对照提示的要求审查该试验,编写针对它所怀疑的缺口的测试,在真值上验证每一项测试,在试验上运行它,并重新判断任何失败,以确认对提示的真实违反,因此每一次反驳都有一个可重放的见证测试支撑。因为审计每一次试验都很贵,TestJack 还提供一条轻量途径:先为每个任务留下未检查的要求补充经预言机验证的测试,然后审计随机抽样的试验,并把每一个被确认的见证共享给该任务其余的全部试验。由于同一任务的试验常常共享失败模式,每一次昂贵的审计都可以用廉价的测试执行来反驳许多试验。
我们在五个近期的智能体编码基准上评测 TestJack:DeepSWE [17]、SkillsBench [21]、SWE-Marathon [12]、SWE-bench Verified [10] 和 SWE-bench Pro [11],其中前三个正是为了避免薄弱测试而专门构建的。在来自前沿模型(包括 Claude Opus、GPT-5.5/5.6 和 Gemini 3.1 Pro)的 4,487 次通过基准的试验中,TestJack 反驳了 1,545 次(34.4%):大约每三个被报告的成功里就有一个违反了其任务的某项要求,而全部 8,862 次试验上的解决率从 50.6% 降到 33.2%。总之,我们做出如下贡献:
- 问题。我们揭示静态的、基于测试的编码智能体评测的一个根本局限,并提出动态的评分器演化:生成新测试,对照任务要求探测每一次试验。
- 技术。我们设计立足于提示的差分测试:从任务要求写出测试,对照真值认证它们,并重新判断每一次失败;以及一个轻量变体,它把任务分析与随机化审计、跨试验的见证共享结合起来。
- 实证研究。我们发现,前沿智能体在五个基准上通过基准的试验中,有 34.4% 违反任务要求。轻量变体在五个基准中的三个上,以 15.4% 的成本找回这些反驳中的 72.4%。我们的审计结果可以作为未来基准设计的参照。
2 相关工作
图 2:按评分器类型(静态任务审计相对动态试验审计)和自动化程度划分的基准审计途径。
编码基准。MMLU [16]、BIG-bench [30]、HELM [22] 和 Humanity’s Last Exam [6] 这类基准把人工智能的进展组织起来,然而它们的可靠性正越来越受到质疑:测试集含有标签错误 [27],公开基准泄漏进预训练语料 [34],排行榜做法会扭曲排名 [29],智能体任务设置或奖励设计中的缺陷可以把性能误估多达 100% [40];动态基准评测 [20, 9, 8] 的回应是持续收集新的对抗样本。编码基准已经从函数级合成 [7, 3] 演进到 SWE-bench [18] 及其后继中的仓库级 issue 解决;这些后继加入了人工验证 [10]、语言 [38]、模态 [35]、限制污染的刷新 [39, 4],以及企业级改动 [11]。另一条线从零撰写任务,从命令行工作 [24] 和技能增强的工作流 [21],到长程工程项目 [17, 12]。这些基准几乎全都共享同一种静态规程:提交若通过基准发布时就固定下来的测试套件,就算正确。
基准审计与测试加固。关于基准可靠性的先前工作可以沿两条轴来组织(图 2):评分器是静态的(在观察到任何提交之前分析任务),还是动态的(审计智能体实际产生的试验);以及它的裁决是依靠人工检查,还是依靠自动化审计。人工审计揭出分数所掩盖的失败 [2],但对每一个新智能体和每一次运行都必须重做。ABA [32] 和 BenchGuard [31] 这类自动化审计者使用大语言模型智能体,标记那些规格、环境或评分器已经损坏的任务 [25];它们审计的是基准而不是单次试验,其裁决依靠大语言模型的判断。另一条线加固基准测试,从放大 HumanEval 的测试 [23],到为 SWE-bench 生成额外的或对抗性的测试,如 UTBoost [37] 和 SWE-ABS [36],以及复现 issue 的测试 [26, 1]。这些方法是静态的:它们在观察到任何提交之前为每个任务构建一套套件,因此其测试必须预先料到智能体会在哪里失败,并且可能编码金补丁的附带细节。PatchDiff [33] 是动态的,把智能体补丁与金补丁做差分测试,但它所审查的分歧补丁中只有 28.6% 能被确认为不正确,大多数则无法做出任一方向的判断,因此决定哪些分歧足以指控一次试验,仍然需要人工检查。就我们所知,TestJack 是第一个自动化的动态评分器,并占据图 2 中自动化、动态的那个象限:它审计的是单次试验而不是任务,测试派生自任务提示而不是金补丁,真值只用来验证其期望,并且每一次裁决都由可执行的见证测试支撑,而不是由大语言模型或人的判断支撑。
3 方法
我们先形式化问题(§3.1),然后给出逐试验审计(§3.2)及其轻量变体(§3.3);图 3 给出二者的总览。
3.1 问题形式化
一个基准实例由自然语言任务规格 $P$(例如一条 GitHub issue)、仓库快照 $R$、真值实现 $G$(例如施加到 $R$ 上的、开发者撰写的参考补丁),以及基准用来给提交打分的静态测试套件 $T_{0}$ 组成。在该实例上运行一个智能体产生一次试验:施加到 $R$ 上的候选补丁 $s$,得到提交 $R[s]$。若 $R[s]$ 通过 $T_{0}$ 中的每一项测试,则该试验为通过。TestJack 以跨智能体收集到的通过试验集合 $S=\{s_{1},\dots,s_{n}\}$ 为输入,并对每一次试验询问:它的通过裁决是否应当被信任。
要求与行为空间。令 $\mathcal{Q}(P)=\mathcal{Q}_{e}(P)\cup\mathcal{Q}_{i}(P)$ 表示该任务的要求,其中 $\mathcal{Q}_{e}(P)$ 包含 $P$ 明确陈述的要求,$\mathcal{Q}_{i}(P)$ 包含由 $P$ 连同仓库已文档化的行为所隐含推出的要求。对一个产物 $X$,令 $\mathcal{B}(X)$ 表示它所钉死的行为:$\mathcal{B}(T_{0})$ 是基准测试所断言的行为,$\mathcal{B}(P)$ 是 $\mathcal{Q}(P)$ 所要求的行为,$\mathcal{B}(G)$ 是真值所展现的行为。我们假设每个任务是良构的(附录 A.1),因此这些空间是嵌套的:$\mathcal{B}(T_{0})\subseteq\mathcal{B}(P)\subseteq\mathcal{B}(G).$ (1)第一个包含反映的是:测试只检查提示所要求内容的一部分。第二个包含反映的是:真值作为正确解,实现了每一项必要行为,同时也带有 $P$ 留下开放或含糊的附带选择。一次通过的试验只保证在 $\mathcal{B}(T_{0})$ 上与任务一致,因此它可能的缺陷位于缺口 $\mathcal{B}(P)\setminus\mathcal{B}(T_{0})$ 之中。
见证测试。审计一次试验 $s$,因此相当于在这个缺口里搜索一个见证测试 $t$,满足 $t\text{ checks some }q\in\mathcal{Q}(P)\quad\wedge\quad t(R[G])=\textsf{pass}\quad\wedge\quad t(R[s])=\textsf{fail}.$ (2)一个见证是具体的、可重放的演示:该试验违反了任务的某项要求,尽管它通过了整个基准套件 $T_{0}$。
图 3:TestJack 总览。左:经由立足于提示的差分测试做逐试验审计,使用审计智能体与审查智能体(§3.2)。右:带有随机化试验审计循环的轻量途径(§3.3)。
3.2 经由立足于提示的差分测试做逐试验审计
搜索见证测试有两条显而易见的路,而每一条都在式(1)的不同方向上失败。(i)只从 $P$ 写测试,停留在 $\mathcal{B}(P)$ 之内,但引出经典的测试预言机问题:大语言模型写出的测试可能编码错误的期望,没有任何东西认证一次失败的试验确实有过错。(ii)只从 $G$ 写测试,也就是普通的差分测试,接受任何把 $R[G]$ 与 $R[s]$ 分开的测试。这类测试遍及整个 $\mathcal{B}(G)$,包括 $\mathcal{B}(G)\setminus\mathcal{B}(P)$ 中的附带选择,于是它们过拟合到真值,并因试验没有复现参考补丁而惩罚它,而不是因它没有完成任务。TestJack 把二者的长处结合起来:它从 $P$ 写测试,这由式(2)的第一个条件强制;并用 $G$ 作为可执行预言机,这由第二个条件强制,从而一项新测试只有在真值通过它时才被信任。于是提示决定测什么,试验决定到哪里去找违反,真值确认测试的期望是正确的。
然而 $\mathcal{B}(P)$ 的边界并不总是清晰的。$\mathcal{Q}_{i}(P)$ 中的隐含要求依赖提示并未陈述的背景知识;当提示欠指定时,针对这类要求的见证可能反映的是提示的缺陷,而不是试验的缺陷。TestJack 按照附录 A.2 所描述的经验规则,把一些见证报告为提示缺陷,而不是由测试不足引起的试验缺陷。
审计过程。TestJack 用两个大语言模型智能体实现审计:审计智能体和审查智能体(图 3,左)。二者都在基准自己的执行环境里运行,并且都不把基准的通过裁决当作正确性的证据。审计智能体按五步进行。
- 执行世界。智能体在官方评分器下构建仓库的三份副本:模型世界 $R[s]$、参考世界 $R[G]$,以及不带任何补丁的空世界 $R$。空世界揭示哪些基准测试在没有修复时就已经通过,因而对这次试验什么也没有验证。
- 要求清单。智能体把 $P$ 分解成原子的、可测试的条款,这些条款实例化 $\mathcal{Q}(P)$,并对每一条款记录 $T_{0}$ 是否覆盖它、以及该试验是否实现了它。
- 证据收集。智能体然后沿三条轴检查试验的 diff:(i)幽灵分支,即 diff 中 $T_{0}$ 从未执行的代码路径,用分支覆盖来识别,并按 $P$ 是否要求它们所实现的行为来分类;(ii)奖励黑客,用显式检测器检查硬编码的期望值、对受测输入的特例处理、探测测试环境、篡改测试用具,以及藏在一层受测外表后面的桩;(iii)一般缺陷,包括规格违反、稳健性和安全问题,并由变异测试排定优先级,变异测试暴露 $T_{0}$ 没有钉死的行为。
- 演示问题的测试。对每一个被怀疑的问题,智能体用仓库原生的框架写一项测试,断言被违反的条款所要求的行为。该测试必须在模型世界中失败,并在作为预言机的参考世界中通过。
- 审计报告。智能体给该试验指定一个裁决,例如健全、虽通过但不正确,或奖励黑客。对每一个问题,它解释缺陷是什么、为什么发生、$P$ 的哪一条款要求正确行为,以及为什么 $T_{0}$ 没能抓住它。
审查智能体然后重新判断这些测试,把 $P$ 当作关于必要行为的唯一权威,并有意地不用 $G$ 来推断要求。它把每一项测试标为有效、存疑或无效,拒绝那些断言提示并未请求之行为的测试,因为它们过拟合到某一个特定解。只要至少有一项有效测试在该试验上失败,试验即被反驳;这样一项测试就是式(2)意义上的见证。
性质。每一个裁决都是可执行的:与把大语言模型当作裁判的做法不同,一次反驳由针对两种实现运行的测试来支撑。裁决立足于提示:清单和审查者把试验约束到任务所要求的内容上。审计对失败模式是不可知的,用同一机制抓住奖励黑客补丁,而不需要预先定义的利用手法分类;并且由于完全自动,它可以在新的智能体和试验出现时重复进行。
3.3 轻量途径:带见证共享的随机化审计
逐试验审计精确但昂贵:每一次审计都是一次多步的智能体会话,伴随反复的构建和测试执行,而试验数量随着在一个基准上评测的智能体数、模型数和重复次数成倍增长。独立地审计每一次试验也是浪费。同一任务的试验常常因同样的原因失败,例如许多智能体漏掉同一个边界情形,于是独立审计不断重新发现同样的缺陷。TestJack 用两个想法降低这一成本:把一部分审计从单次试验移到任务本身,并把每一个经过验证的见证共享给该任务的全部试验(附录 A.3 的算法 1)。
智能体式任务分析。一个任务的许多弱点在检查任何试验之前就可见:把 $P$ 与 $T_{0}$ 相比较,常常会揭示提示提到但没有任何测试演练的输入、从未被触发的错误条件,或这次改动可能破坏的邻近行为。因此 TestJack 从一次任务级分析开始:一个智能体阅读 $P$、$T_{0}$ 和 $G$,识别 $T_{0}$ 没有充分覆盖的 $\mathcal{Q}(P)$ 要求,并编写针对它们的新测试。以 $G$ 为预言机,在 $R[G]$ 上失败的测试会利用执行反馈被细化,直到通过,或在细化预算耗尽后被丢弃。结果是增强套件 $T_{1}=T_{0}\cup T_{\text{task}}$,每个任务只构建一次,与该任务有多少次试验无关。
带跨试验见证共享的随机化审计。任务分析无法预先料到试验可能出错的每一种方式,因此 TestJack 用对随机抽样试验的逐试验审计来补充它,这些见证被共享给该任务的每一次其他试验,利用的是试验共享失败模式这一事实。令 $T$ 表示当前测试套件,初始化为 $T_{1}$。任何在 $T$ 中某项测试上失败的试验都被反驳,其余试验构成活动集 $A$。循环然后按轮进行:(i)从 $A$ 中均匀随机抽取一次试验 $s$;(ii)在 $s$ 上运行 §3.2 的逐试验审计;(iii)若审计确认了见证 $W$,把 $W$ 加入 $T$,通过在 $A$ 中每一次试验上执行 $W$ 来共享它,并反驳所有失败的试验;(iv)否则,把 $s$ 标为已审计且干净,并从 $A$ 中移除。当 $A$ 为空或工作预算耗尽时,循环终止。共享是可靠的,因为见证属于任务,而不属于发现它的那一次试验。式(2)的前两个条件,即 $t$ 检查 $\mathcal{Q}(P)$ 中的一项要求并且在 $R[G]$ 上通过,完全不涉及 $s$,审查智能体对照 $P$ 而不是对照试验来判断它们。因此,一旦一个见证被接受,决定它是否反驳另一次试验就归结为第三个条件。
这一方案是经济的,因为生成并验证测试很贵,而在另一次试验上重放一项测试只花费一次执行。每一轮审计只支付一次生成成本,其见证却被共享给整个活动集,因此当试验共享失败模式时,昂贵审计的次数趋近于互异缺陷的数目,而不是有缺陷试验的数目。代价是覆盖:共享的见证不会对它所反驳的每一次试验重新判断,在有限预算下,从未被抽样的试验所独有的缺陷可能被漏掉(§4.3)。
4 评测
我们沿四个研究问题评测 TestJack:
- RQ1(前沿基准上的逐试验审计):当把 §3.2 的逐试验审计应用到每一次通过基准的试验时,它反驳多少次成功,这些反驳把所报告的解决率降低多少?
- RQ2(轻量随机化途径):§3.3 的轻量途径找回逐试验审计的反驳中的多少,节省多少成本,又在哪里不足?
- RQ3(与现有基准增强的比较):在检测有缺陷的试验上,TestJack 与最先进的编码基准增强方法 SWE-ABS 相比如何?
- RQ4(消融研究):基于提示的任务分析和随机化试验审计,各自对轻量途径贡献多少?
4.1 评测设置
基准。我们审计五个近期的智能体编码基准,汇总于表 1:SWE-bench Verified [10]、SWE-bench Pro [11]、DeepSWE [17]、SkillsBench [21] 和 SWE-Marathon [12]。它们覆盖构建静态验证器 $T_{0}$ 的两种方式:从解决该问题的拉取请求继承的测试(SWE-bench Verified 与 Pro),以及从零撰写的验证器(DeepSWE、SkillsBench 和 SWE-Marathon),后者是专门为避免薄弱的继承测试而设计的。五个基准都提供任务规格 $P$、可执行环境 $R$ 和参考解 $G$。对基于容器的基准(SkillsBench 和 SWE-Marathon),$G$ 是任务的预言机解,试验 $s$ 是智能体最终的容器状态,隐藏验证器扮演 $T_{0}$ 的角色。我们审计 SWE-bench Verified 的每一个任务、DeepSWE、SWE-bench Pro 的公开划分、SkillsBench 的编码任务,以及不需要 GPU 且不是超长程的 SWE-Marathon 任务(附录 B.1)。
表 1:TestJack 所审计的基准。#Tasks 计我们所审计的任务数;#Passing 计审计语料中通过基准的试验数。†仅公开划分。∗不需要 GPU 的软件工程任务。‡排除 GPU 任务和超长程项目(例如构建一个 C 编译器)。
| 基准 | 任务数 | 语言 | 任务来源 | 参考解 $G$ | 静态验证器 $T_{0}$ | 通过数 |
|---|---|---|---|---|---|---|
| DeepSWE | 113 | TS, Go, Python, JS, Rust | 从零撰写 | 撰写的解 | 手写的功能测试 | 2,848 |
| SkillsBench∗ | 13 | 多种 | 社区撰写 | 预言机解 | 确定性的 pytest 验证器 | 55 |
| SWE-Marathon‡ | 2 | 多种 | 专家撰写 | 预言机解 | 多层隐藏验证器 | 28 |
| SWE-bench Verified | 500 | Python | 挖掘的拉取请求 | 已合并补丁 | 拉取请求测试 | 805 |
| SWE-bench Pro† | 731 | Python, Go, JS, TS | 挖掘的提交 | 已合并补丁 | 人工审查的提交测试 | 751 |
| 合计 | 1,359 | 4,487 |
智能体与试验。我们审计前沿模型的试验,当前关于进步的主张正是由它们的分数推动的:Claude Opus 4.6/4.7/4.8、GPT 5.5/5.6 和 Gemini 3.1 Pro,不论智能体用具如何。对 DeepSWE、SkillsBench 和 SWE-Marathon,我们使用基准作者发布的轨迹,覆盖厂商智能体(例如 Claude Code、Codex CLI、Gemini CLI)和开放脚手架(例如 mini-swe-agent)。对 SWE-bench Verified 和 Pro,这些模型的开放轨迹很少,我们在 mini-swe-agent 下以中等思考力度运行 GPT-5.6-sol,每个任务两次试验。这一范围内的 8,862 次试验中,有 4,487 次通过基准自己的验证器 $T_{0}$,并构成审计语料(表 1);其余试验只充当解决率的分母。
实现与配置。TestJack 对逐试验审计和基于提示的任务分析都使用高推理力度的 GPT-5.5。二者都作为 Codex 智能体在任务的执行环境内运行,在那里它可以阅读 $P$、$G$、已有测试、仓库,以及(对逐试验审计而言)试验 $s$,并在 $R[G]$ 与 $R[s]$ 上执行候选测试。我们把搜索上限设为每次试验 $k=3$ 轮生成并验证的迭代。
4.2 RQ1:前沿基准上的逐试验审计
我们在每一次通过基准的试验上运行 §3.2 的逐试验审计(表 2)。TestJack 反驳 4,487 次试验中的 1,545 次(34.4%),把范围内全部 8,862 次试验上的解决率从 50.6% 降到 33.2%;每一次反驳都由一项见证测试支撑,该测试检查提示的一项要求,在真值上通过,在试验上失败,并经受住重新判断。因此大约每三个成功里就有一个尽管通过了基准自己的验证器,却违反了任务要求。反驳率从 SWE-bench Verified 上的 7.6% 到 SWE-Marathon 上的 53.6% 不等,而仔细设计验证器并不能消除这个问题:DeepSWE 和 SWE-Marathon 那些从零撰写的验证器给出了两个最高的比率(43.5% 和 53.6%)。附录 C 给出有代表性的被反驳试验。
表 2:TestJack 的逐试验审计结果,按基准汇总。#All 计范围内的全部试验,#Passing 计通过基准的试验,#Refuted 计被一项已确认见证测试所反驳的试验。反驳率(%)相对于 #Passing;校正后比率给出审计前的解决率,即 #Passing / #All,以及审计后的(#Passing $-$ #Refuted)/ #All。
| 基准 | 全部试验 | 通过数 | 反驳数 | 反驳率(%) | 校正后比率 |
|---|---|---|---|---|---|
| DeepSWE | 6,236 | 2,848 | 1,240 | 43.5 | 45.7% $\rightarrow$ 25.8% |
| SkillsBench | 85 | 55 | 10 | 18.2 | 64.7% $\rightarrow$ 52.9% |
| SWE-Marathon | 79 | 28 | 15 | 53.6 | 35.4% $\rightarrow$ 16.5% |
| SWE-bench Verified | 1,000 | 805 | 61 | 7.6 | 80.5% $\rightarrow$ 74.4% |
| SWE-bench Pro | 1,462 | 751 | 219 | 29.2 | 51.4% $\rightarrow$ 36.4% |
| 合计 | 8,862 | 4,487 | 1,545 | 34.4 | 50.6% $\rightarrow$ 33.2% |
4.3 RQ2:轻量随机化途径
我们在 DeepSWE、SkillsBench 和 SWE-Marathon 上运行 §3.3 的轻量途径,每个任务的预算为三轮审计,并在同样的试验上与逐试验审计比较;SWE-bench Verified 和 Pro 每个任务的试验太少,不适合随机化审计。如表 3 所示,它找回逐试验反驳中的 72.4%,同时把 API 成本降低 84.6%,合计为 4,037 美元,召回率从 SWE-Marathon 上的 40.0% 到 SkillsBench 上的 80.0% 不等。见证共享使这一交换有利:在一次被抽样的试验上找到的见证只验证一次,然后在每一次剩余试验上重放,因此昂贵的搜索是每个任务运行几次,而不是每次试验一次。与逐试验审计的分歧主要反映欠指定的提示,而不是不正确的测试(附录 B.2)。其精度不高的原因是:逐试验审计把每一项发现附着在一次试验上,更聚焦试验本身,而轻量途径把一次试验的发现变成一道可执行的门,并在所有试验上重放。因此,轻量途径容易把欠指定提示这类小缺陷扩散开去。此外,轻量途径的设计还带来另外两个局限。第一,共享的见证在同一种失败模式之内转移得很好,但很少跨模式转移,因此被反驳试验跨越若干互异缺陷的任务,在有限预算下覆盖得很慢,我们预期这解释了所漏掉的 27.6% 中的很大一部分。第二,均匀抽样把轮次花在干净试验上,当很少的试验来分摊一轮时伤害最大:SWE-Marathon 只有 28 次通过的试验,同时表现出最低的召回(40.0%)和最小的成本降幅(53.7%)。
表 3:轻量途径在每个任务 3 轮审计预算下的表现。#Per-trial 与 #Lightweight 分别计被逐试验审计(RQ1)和被轻量途径所反驳的试验。召回率是轻量途径同样反驳了的逐试验反驳所占的比例。精度是逐试验审计同样反驳了的轻量方法反驳所占的比例。成本是 GPT 的 API 成本,成本降幅与逐试验审计相比。†:精度受第 B.2 节所述欠指定提示的影响。‡:成本按词元成本与 API 定价估算。
| 基准 | 逐试验反驳数 | 轻量反驳数 | 召回率(%) | 精度(%) | 成本(美元)‡ | 成本降幅(%) |
|---|---|---|---|---|---|---|
| DeepSWE | 1,240 | 1,822 | 72.7 | 49.5 | 3,904 | 84.9% |
| SkillsBench | 10 | 31 | 80.0 | 25.8 | 85 | 78.6% |
| SWE-Marathon | 15 | 10 | 40.0 | 60.0 | 48 | 53.7% |
| 合计 | 1,265 | 1,863 | 72.4 | 49.2† | 4,037 | 84.6% |
4.4 RQ3:与现有基准增强的比较
我们把 TestJack 与 SWE-ABS [36] 比较。SWE-ABS 在观察到任何提交之前加强每个任务的套件,把覆盖驱动的测试生成与拒绝金补丁之变异体的对抗测试结合起来。我们在 DeepSWE、SkillsBench 和 SWE-Marathon 上运行 SWE-ABS(不设成本预算),模型与 TestJack 相同,把它的套件在 RQ1 语料上重放,若一次试验在任何新增测试上失败,就计为被反驳。如表 4 所示,SWE-ABS 反驳 248 次试验(通过基准的试验中的 8.5%),并找回逐试验审计反驳中的 9.9%;轻量途径则是 1863 次试验(63.6%)和 72.4% 的召回:召回相差 7.3$\times$,精度相当(50.4% 对 49.2%)。任务越复杂,差距越大;在 SWE-Marathon 上,SWE-ABS 一次试验也没有反驳,而轻量途径反驳了 28 次中的 10 次。两个设计差异解释了这一差距。第一,SWE-ABS 从不观察提交,因此它的测试必须预先料到智能体会在哪里出错,而 TestJack 针对的是依赖于某一次特定试验如何实现的缺陷。第二,SWE-ABS 从金补丁而不是从提示派生期望,因此它的测试可能惩罚提示留下开放的实现选择(例如精确的错误信息),而 TestJack 把每一项测试都扎根于提示,并重新判断失败。静态测试增强因此是不够的,要触及依赖于实现的缺陷,动态的试验审计是必要的。
表 4:与 SWE-ABS 的比较,以及轻量途径的消融。TestJack-Task Analysis 只使用任务分析所产生的增强套件,而 TestJack-Lightweight 额外使用带见证共享的随机化审计(§3.3)。反驳率(%)是被反驳的、通过基准的试验所占的比例;召回率是该方法同样反驳了的逐试验审计反驳(RQ1)所占的比例;精度是逐试验审计同样反驳了的该方法反驳所占的比例。
| 基准 | 方法 | 反驳数 | 反驳率(%) | 召回率(%) | 精度(%) |
|---|---|---|---|---|---|
| DeepSWE | SWE-ABS | 246 | 8.6 | 10.0 | 50.4 |
| TestJack-Task Analysis | 344 | 12.1 | 13.6 | 49.1 | |
| TestJack-Lightweight | 1,822 | 64.0 | 72.7 | 49.5 | |
| SkillsBench∗ | SWE-ABS | 2 | 3.6 | 10.0 | 50.0 |
| TestJack-Task Analysis | 0 | 0.0 | 0.0 | – | |
| TestJack-Lightweight | 31 | 56.4 | 80.0 | 25.8 | |
| SWE-Marathon‡ | SWE-ABS | 0 | 0.0 | 0.0 | – |
| TestJack-Task Analysis | 1 | 3.6 | 6.7 | 100.0 | |
| TestJack-Lightweight | 10 | 35.7 | 40.0 | 60.0 | |
| 合计 | SWE-ABS | 248 | 8.5 | 9.9 | 50.4 |
| TestJack-Task Analysis | 345 | 11.8 | 13.4 | 49.3 | |
| TestJack-Lightweight | 1,863 | 63.6 | 72.4 | 49.2 |
4.5 RQ4:消融研究
我们把只用任务分析(仅用增强套件 $T_{1}$ 来反驳试验)与 RQ2 预算下的完整轻量途径相比较(表 4)。单独的任务分析反驳 345 次试验,并找回逐试验反驳中的 13.4%:$T_{0}$ 中的一些缺口在检查任何提交之前就可见,而这套与试验无关的套件每个任务只构建一次。加入带见证共享的随机化审计后,召回升到 72.4%,增加 5.4$\times$,精度基本不变(49.3% 对 49.2%),并且这一模式在每一个基准上都成立。因此这些阶段在覆盖上是互补的:大多数反驳需要来自一次具体提交的证据,第二阶段提供这种证据,同时并不降低与逐试验审计的一致性。
5 结论
我们提出 TestJack,一个自动化框架,它通过演化评分器而不是信任随基准附带的固定测试,来审计编码基准所报告的成功。TestJack 用立足于提示的差分测试审计每一次通过基准的试验:它为任务提示的要求编写测试,对照真值解认证每一项测试,并对照提示重新判断每一次失败,从而使每一次反驳都有一个可重放的见证测试支撑。它的轻量变体把基于提示的任务分析与随机化试验审计结合起来,并把经过验证的测试复用到一个任务的全部试验上。在五个基准上前沿智能体的 4,487 次通过基准的试验中,TestJack 反驳了其中的 34.4%,包括在 DeepSWE 上的 43.5%——其验证器正是专门为避免薄弱测试而撰写的——并把整体解决率从 50.6% 降到 33.2%。轻量变体以 15.4% 的成本找回这些反驳中的 72.4%,召回是基准增强方法 SWE-ABS 的 7.3$\times$。这些结果表明,固定测试套件实质性地夸大了前沿编码智能体的能力,而评分器应当随着它们所评判的提交一起演化。
译注:参考文献与附录 A 至 E 是同一篇论文的全文余下部分。因站点正文长度上限,它们拆到后续两篇,不在这里删节。
觉得有用,转给同事
微信扫码
用微信扫一扫,在手机上打开后即可转发。