VerifierBench: Benchmarking the Generation of Executable Verifiers for LLM Agents
Jianing Yin, Ziyi Chen, Hao Wang, Yiyou Sun, Zijian Jin, Dawn Song, Daoan Zhang
cs.SE, cs.AI
2026-10-20
222题、4993条隐藏用例测可执行验证器生成。19个模型归一化平衡准确率10.6到62.1,拒错稳于收对,误拒大多来自一条解都不放过的全拒验证器。
解题 agent 交出一条能跑的答案就够。验证器要收下每一种合法做法,同时挡住错误、取巧和攻击。在数据向的递归改进里,agent 给自己造训练数据,验证器决定哪条轨迹拿奖励、哪条进训练集,写错就会反复奖励违规。
Agent 任务的对错还取决于工具调用、环境终态和代码改动,只拿一份标准答案对不上。验证器若把任务允许的另一种做法判死,合法策略会从训练数据里消失。
VerifierBench 从六个开源基准抽任务。初稿 267 题,六道审计 V4V 去掉 45 题,留下 222 题、4993 条隐藏用例。工具调用 95 题(BFCL v4、ACEBench),状态 80 题(τ2-bench、AppWorld、AgentDojo),代码 47 题(SWE-bench Verified)。Terminal-Bench 37 题全部退出,其中 35 题是解析器把跳过的测试算成通过。
用例四组。参考解 222 条和合法变体 1344 条标通过,变体里换表述 840 条、换实现或路径 504 条。普通错误 2629 条、攻击 798 条标失败。正例一共 1566 条,占 31.4%。
模型只拿到解题用的指令和环境。参考验证器和隐藏用例不给。它只能自己编答案做自测。交卷后验证器被固定,再跑完全部用例。状态题和代码题可以用 runpublic 重放或跑测试,生成和评分的预算分开。
主指标 BAnorm 等于 TPR 加 TNR 减 100。TPR、TNR 分别是正例接受率、负例拒绝率,都先按题计算再对题平均。恒定的合法判定得 0,与参考标签完全一致得 100。没交、超时、崩溃留在分母。攻击误接受率 FPRh 另报。
V4V 六项是回放、可重复、出处、同输入同标签、平凡基线可被揭穿、变异可被测出。平凡基线指永远接受、永远拒绝、只认参考解。1410 个变异配置全部被测出。冲突时按任务要求改标签。留下的 222 题六项全过,参考标签就是源验证器的判定。
19 个模型放进同一框架 Pi,每题 5400 秒、单次回复最多 32768 token,222 题全部计分。
| 模型 | BAnorm | TPR | TNR | 攻击误接受 |
| GPT-6-astra | 62.1 | 67.4 | 94.6 | 7.4 |
| Claude Opus 4.8 | 54.0 | 67.7 | 86.3 | 13.5 |
| Kimi K3 | 53.4 | 70.2 | 83.2 | 13.4 |
| GPT-5.6-sol | 52.9 | 56.8 | 96.0 | 0.8 |
| Doubao Seed 2.0 Mini | 10.6 | 21.1 | 89.5 | 3.7 |
全距 10.6 到 62.1。每个模型的 TPR 都低于 TNR:前者 21.1% 到 70.2%,后者 79.2% 到 96.3%。没通过的正例里,57.1% 到 100% 是明确的 FAIL,模型在主动拒绝合法解。
按模型平均,TPR 在工具调用上 79.2%,状态题 27.7%,代码题 40.2%。状态题上没有模型的 TPR 过半。分榜第一也换人:工具调用是 GPT-5.6-sol 的 85.2,状态是 Claude Opus 4.8 的 34.6,代码是 Kimi K3 的 76.9。攻击接住率低说明不了可靠。状态题上 GPT-5.6-sol 的攻击误接受为 0.0%,正例只收下 23.0%,BAnorm 16.1。代码题有 17 个模型的攻击误接受在报告精度下为 0.0%,BAnorm 仍从 -25.9 排到 76.9。
全拒验证器把一题的每条用例都判 FAIL,对该题 BAnorm 贡献是 0,却占归档记录中 87.9% 到 96.0% 的正例误拒。
换框架会改名次。36 组最高 66.2,是 Claude Opus 4.8 配 Claude Code,比 Pi 上的 54.0 高 12.2。Gemini CLI 把 3.5 Flash 抬高 15.0,把 2.5 Pro 拉低 9.2。Codex 把四款 GPT 拉低 4.1 到 26.6,GPT-5.6-sol 从 52.9 掉到 26.2。没有框架对所有模型都加分。GPT-6-astra 在 Pi 上从低力度换到高力度,BAnorm 只加 0.5,代码题升、状态题降。同一模型提高力度后,127 道状态和代码题里每题 20 次 runpublic 被打满的次数,Pi 从 4 增到 77,Claude Code 从 21 增到 98。
抽查 16 个验证器、12 道题,119 次正例 FAIL 覆盖 90 个不同用例。银行任务 044 的白名单漏了允许的只读查询,9 条正例未执行就被拒,自测也没覆盖这次查询。Django 一题拒改 init.py,四条正例都改这个文件,自测却只改 query.py 并通过。
筛训练数据时,过严比漏检更安静。全拒验证器可以把攻击接住率做成 0,看起来很严,整题做法却都被丢掉。BAnorm 罚这种恒定输出,只看 FPRh 看不出来。
确认式自测的例子都落在多余检查允许的范围里,同位置再测也不会暴露。负例被正确拒绝也洗不白这条检查,非法补丁可以同时踩中真要求和多余规则。另一类跑完自测也没有一次完整的正例通过,验证器照样交卷。其中 8 个自测从未完整通过的验证器,评分时拒绝了全部 72 条正例,且没有执行环境。
补法是每条检查都对得上任务要求,并用合法变体去撞它。有效性没有测。
状态题离能当奖励还远。最好的 TPR 仍低于 50%,BAnorm 34.6。
分数是跟参考验证器在有限构造集上的一致率。去掉 45 题之后,标签和参考判定一致,仍不能证明每条标签语义上都对。排名是单次点估计,没有重复生成,也没有显著性检验。框架比较绑着提示、工具和推理设置,拆不出单个组件。
误拒集中度只用了 9 个模型的归档逐题记录,再加 GPT-6-astra 的轨迹批,不是 19 个模型的最终逐题结果。代码和轨迹是挑来解释已有失败的,多数来自这一个模型,靠读代码归因,没有干预实验,也没有还原每次自测时的程序版本。机制清楚,占比不清楚。
正例只占 31.4%,流程违规只有 2 条。代码题上攻击误接受大面积为零,既可能是攻击不够狠,也可能是全拒顺手把攻击一起拒了。全拒把单题 TNR 撑满之后,「更会拒错」这个印象里有一块是计分方式抬上去的。