← 返回 2026-10-27

重新思考 Agent Harness 中的验证机制 Rethinking Verification in Agent Harnesses

Zhengxin Zhang, Erkang Zhu, Yin Lin, Claire Cardie, Bolin Ding, Jingren Zhou 📅 2026-10-25 👍 8 2026-11-11 18:30
Agent Harness 实证研究 测试时扩展 编码智能体 验证与审查

系统比较17种验证设计,发现独立critic审查是性价比最高的test-time scaling轴

前置知识

Agent Harness(智能体执行框架)

包裹 LLM 的执行框架:向模型暴露工具(读写文件、运行命令)、接收观察结果、驱动 ReAct 式迭代循环,直到达成任务目标。除了工具接口,harness 还决定系统指令内容、外部消息的介入时机、以及何时接受 agent 的产出。Claude Code、Codex CLI、Gemini CLI 都是典型的 harness。

本文的全部自变量都是 harness 层的设计选择(何时插消息、谁来检查),而非模型本身;不懂 harness 就无法区分「模型能力」和「框架编排」两个来源的收益。

Test-time Scaling(测试时扩展)

不改动模型权重、只增加推理阶段的计算来换取更高性能的范式,典型手段包括多次采样后选优、树搜索、以及用额外算力做验证与修订。它和训练时扩展(更大模型、更多数据)互补,允许按任务难度弹性分配算力。

论文的核心主张是「独立审查应被视为一个实用的 test-time scaling 轴」,与增加采样数并列;理解这个框架才能评价其贡献是编排发现还是新能力。

Self-correction 与 Critic(自校正与批评者)

让模型对自己生成的内容产出自然语言批评并据此修订,代表工作有 Self-Refine、Reflexion。已有研究(如 Huang et al. 2023)指出 LLM 难以可靠地发现自己推理中的错误,自校正收益高度依赖反馈质量,因为模型倾向于重复自己的盲点。

L3 独立审查正是对「模型自我批评」范式的替代方案:把检查外包给一个没有执行历史包袱的独立上下文,理解自校正的局限才能看出这一设计动机。

Terminal-Bench 与 SWE-bench Verified

Terminal-Bench(TB)测 agent 在命令行环境完成真实任务的能力(2.1 版注册表 89 个任务,本文按难度分带选取 31 个);SWE-bench Verified(SWE)是经人工核验的 GitHub issue 修复基准(本文按人工修复时长分三档选取 30 个)。两者都提供自动 grader,指标准确率即任务解决率。

论文的主要量化结论(+3.3 到 +9.5 个百分点的增益、成本倍数)都来自这两个基准的子集实验,需知道其任务构成才能判断结论的外推范围。

Completion Gate(完成门控)

当 agent 产出一个不带工具调用的 turn(即试图结束)时,harness 拦截这次结束:或注入检查要求让 agent 自检,或直接拒绝完成要求继续工作。Claude Code 的 hooks 机制是其在产品中的工程实现。它是 L2 层所有设计的技术基础。

L2 是本文重点证伪的方向(收益有限但成本 1.5-1.8 倍),理解门控的触发与重开机制才能看懂其成本为何失控。

研究动机

编码 agent 的验证设计目前几乎完全依赖工程直觉和迭代经验:Claude Code 通过 hooks 提供完成检查点,Codex CLI 用自我审查加迭代,但业界缺少系统性证据回答「哪种验证设计在哪个模型、哪类任务上有效,收益是否配得上额外算力」。更根本的问题是 agent 自发验证严重不足:作者对 TB 基线运行的轨迹分析显示,只有 6.2–13.6% 的编辑 turn 之后跟有可识别的检查命令(Appendix Table 7),错误在编辑之间不断累积。同时自校正文献又表明模型难以可靠发现自己的错误。在 TB/SWE 这类长视界仓库级任务上,后果非常具体:一个 agent 可以跑通自己的测试、宣布完成,却因为没测「日期出现在 IP 地址之前」这种边界情况而最终被外部 grader 判负——这类缺陷靠「再让它自己多干一会儿」往往修不好。

本文的目标是把验证当作 test-time scaling 的一个独立轴来系统研究,而不是继续零散地发明机制。具体目标有三:第一,围绕三个问题组织设计空间——何时介入(when)、谁来检查(who)、检查发现如何导向修订(how),沿 agent 生命周期划分 L0 初始指令、L1 执行时提醒、L2 完成门控、L3 独立审查四层,共 17 种设计;第二,在 7 个前沿编码模型(Qwen3.7-Max、Qwen3.8-Max、GLM-5.2、DeepSeek V4-Pro/Flash、Kimi-K2.7-Code、MiniMax-M2.5)× TB 31 任务 + SWE 30 任务(各 3 次试验)上量化每种设计的准确率增益与成本倍数,另建 18 任务的 VisualBench 用人工盲评覆盖视觉/交互交付物;第三,回答验证强度能否扩展——增加审查轮数(depth)或并行 critic 数量(width)是否持续改善 accuracy-cost 权衡,最终给出可直接落地的工程建议。

与已有工作不同的是,已有工作分散在三个方向:学习型 verifier 给候选解打分选优(Cobbe et al. 2021;Lightman et al. 2023)、自然语言批评驱动的自校正(Self-Refine、Reflexion)、以及把执行证据回喂给模型的工具辅助验证(Self-Debug、CRITIC、测试生成 agent)。这些都是在「机制层」做发明,但 harness 层面的比较研究几乎空白:消息角色(system vs user)、automated 标记的有无、触发时机(编辑后/停止时/停止前)、critic 的上下文构成(只给改动 vs 连轨迹一起给)——这些每个 harness 工程师都在拍脑袋决定的维度,从未被放进统一框架做控制变量消融。本文的独特切入正在于此:固定基线 harness,把验证从「模型能力问题」重新定义为「harness 编排问题」,并用统一的成本计量(含 critic 与修订的美元成本)来评判设计优劣,而不是只报准确率。

核心方法

直觉上,让作者检查自己的作业天然受限——他会带着同样的假设重读同样的代码;更有效的做法是引入一个没有历史包袱的独立审查者。技术路线沿 agent 生命周期铺开四个介入层:任务开始前的 L0 初始指令,把验证指引追加进 system 或 user prompt,要求 agent 通过预期接口运行交付物并修复缺陷;执行中的 L1 提醒,在工具结果之后、下一次模型调用之前注入消息,提示检查最近的改动,触发方式有周期性(Periodic)和编辑后(After-edit)两种,消息角色分 system/user 且 user 版本不带 automated 标记;agent 停止时的 L2 完成门控,做检查要求(Inspect changes / Run and check)或直接拒绝完成(Reject completion),并测试提前触发(early)变体;交付前的 L3 独立审查,由一个独立的 critic 模型(Qwen3.7-Plus)在全新上下文中拿到任务规范和只读的 live sandbox,自行运行检查后把 findings 返回给 agent 修订。四层内共 17 种设计,全部在 E2B 云 sandbox + Harbor 编排的统一环境中与无验证基线比较,成本按各模型 API 价格分别计费、包含 critic 审查和 agent 修订。

核心创新是把 verification 提升为 harness 设计的一等公民轴,并用大规模控制变量实验证明:检查权外包给 fresh-context 的独立 critic,是 accuracy-cost 最优的 test-time scaling 方式。这与已有方法的本质区别有三点。第一,与 Self-Refine/Reflexion 式的自我批评不同,L3 的 critic 从全新上下文启动,没有 agent 的执行历史和自我辩解,只拿到任务规范加交付物(Changes)或再加执行轨迹(Trajectory),因此能测出 agent 想不到的用例——cobol-modernization 任务中 agent 的实现对合法/非法交易都自测通过,critic 却测了一个算术下溢,发现 Python 写出负号而 COBOL 无符号字段省略了它、破坏记录格式。第二,与需要训练数据的学习型 verifier 不同,L3 直接用现成的廉价模型(critic 输出价 $1.194/M tokens,约为主力模型的四分之一)即插即用。第三,实验揭示了一个此前未被量化的规律:指令和提醒(L0/L1)平均增益小且模型间方差大;完成门控(L2)的拒绝式设计把增益推到 +6.0/+6.2 pp 但成本高达 1.60–1.76 倍;而 L3 以 1.13–1.25 倍成本稳定换得 TB +5.9~+9.5 pp、SWE +3.9~+6.6 pp,且是唯一在 VisualBench 上全部四个设计都为正(+13.2~+23.8 pp)的层。

方法步骤详情

完整流程按介入时机展开。第一步,L0 初始指令:输入是任务 prompt,harness 将验证指令(附录 E.1 给出全文)追加到 system prompt(System 变体)或用户请求(User 变体),输出是带验证指引的初始上下文;指令要求通过预期接口运行交付物、检查输出、修复缺陷,视觉任务还要求渲染并操作核心交互。第二步,L1 执行时提醒:当检测到文件修改 turn(After-edit)或每隔数 turn(Periodic),在工具结果之后、下一次模型调用之前插入提醒消息;System 变体带 automated 自检标记,User 变体无标记;诊断显示 after-edit user 提醒覆盖 80–100% 的 run,58–72% 的提醒事件后两 turn 内出现检查或执行。第三步,L2 完成门控:当 agent 产生无工具调用的 turn(或提前触发),harness 注入 Inspect changes、Run and check(system/automated 两种角色)或 Reject completion(要求继续工作),也测了 Recheck before finishing 及其 early 变体;被拒后 agent 重开工作,中位数增加 12–19 步。第四步,L3 独立审查:agent 停止后,Qwen3.7-Plus critic 在 fresh context 中接收任务规范与只读 sandbox 权限,运行自己的检查并把 findings 返回给主 agent 修订;四个变体由两个维度组合——是否以 agent 的假设和声明为线索(Claim-guided vs Task-first)×上下文是否含执行轨迹(Changes vs Trajectory)。第五步,扩展验证强度:depth 方向串行增加审查轮数(1→4 轮),width 方向并行增加独立 critic 数(1→4 个),合并 findings 后统一修订。全部实验 TB/SWE 各 3 trials,VisualBench 2 trials。

技术新颖性

技术新颖性体现在四个层面。其一,框架层面的贡献:首个把验证按生命周期分四层(L0–L3)、并系统消融消息角色、触发时机、上下文内容、automated 标记等维度的 harness 级实证研究——此前这些选择散落在各家产品的工程经验里。其二,发现层面的贡献:Trajectory 上下文反而劣于 Changes(critic 成本高 29–43% 且准确率更低),user rejection 之后 86–96% 的 run 会继续改文件但收益不配成本,输出 token 与准确率可以同向优化(L1 在 TB 上 token 减少 14–25% 的同时平均 +3.5~+5.4 pp)。其三,协议层面的贡献:VisualBench 的盲评协议(条件隐藏、左右随机、win/tie/loss + net preference)为视觉/交互交付物的 agent 评估提供了可复用的模板,弥补自动 grader 的空白。其四,结论层面的贡献:明确支持 width(并行多 critic,4 个 critic 达 65.8%,比单 critic +3.1 pp,总成本仅 1.33 倍且比 4 轮串行便宜 19%)作为扩展方向,因为并行合并反馈能减少主 agent 的重复执行。

Framework overview
Figure 1: Framework overview

实验结果

七模型平均的核心数字如下。L0:system 角色验证指令在 TB 上平均 +3.3 pp、SWE 上 +3.9 pp,user 角色仅 +1.2/−1.1 pp,成本 0.90–1.08 倍基线;但模型间方差极大——MiniMax-M2.5 在 SWE 上 system/user 分别 +12.6/+8.0 pp,Qwen3.8-Max 却 −2.3/−2.3 pp,VisualBench 上 L0 平均 net preference 为 −3.2 pp。L1:after-edit user 提醒 TB 平均 +5.4 pp 但 SWE −0.3 pp;值得注意的是 TB 上三种 L1 设计的输出 token 减少 14–25%,Qwen3.7-Max 用少 28–33% 的 token 还分别 +7.1/+14.3 pp。L2:拒绝式设计(Reject completion automated)+4.0/+5.3 pp,最好的 user/early rejection 达 +6.0/+6.2 pp,但所有拒绝式设计成本 1.60–1.76 倍(TB)/1.48–1.56 倍(SWE),user rejection 后中位数 12–19 步额外步骤、86–96% 出现文件修改动作。L3 是全文亮点:四个设计 TB +5.9~+9.5 pp(最强 Task-first Trajectory 从 55.1% 到 64.6%)、SWE +3.9~+6.6 pp(Task-first Changes 从 70.9% 到 77.5%),成本仅 1.13–1.25 倍/1.00–1.04 倍;最强 L3 在 TB 上超过最强 L2(+9.5 vs +6.0 pp)且成本更低;Kimi-K2.7-Code 在 SWE 上受益最大(四个 L3 设计 +13.8~+20.7 pp),而其基线是七模型中最低的 50.6%,提示独立审查是对弱模型的能力补齐。VisualBench 上四个 L3 设计 net preference +13.2~+23.8 pp 全部为正且超过 L0(−3.2)/L1(−3.2)/L2(+2.7);Changes-based 审查优于 Trajectory-based(+21.2 vs +13.2;加必检视觉后 +23.8 vs +21.6),且 Changes-based 对全部 7 个模型为正。Scaling 实验:TB 上 1 轮 62.7%(38.2k critic tokens)→ 2 轮 65.6%(79.5k)→ 4 轮 66.1%;4 个并行 critic 65.8%(+3.1 pp vs 单 critic)@1.33 倍总成本,比 4 轮便宜 19%($0.62 vs $0.77 per trial),因为合并反馈减少了主 agent 的重复执行。案例研究点出了机制:regex-log 中 critic 测出日期在 IP 之前的边界用例,agent 修订后通过而基线失败;但 cancel-async-tasks 中修复未能在 45 分钟时限内完成。

Verification layers and their roles in the execution and revision process
Table 1: Verification layers and their roles in the execution and revision process
Accuracy changes (pp) on Terminal-Bench across verification methods and models
Table 2: Accuracy changes (pp) on Terminal-Bench across verification methods and models
Accuracy changes (pp) on SWE-bench Verified across verification methods and models
Table 3: Accuracy changes (pp) on SWE-bench Verified across verification methods and models
Editing turns with recognized checks in TB baseline runs (%)
Table 7: Editing turns with recognized checks in TB baseline runs (%)
VisualBench net preference (pp) across all evaluated designs and models
Table 12: VisualBench net preference (pp) across all evaluated designs and models
Mean accuracy versus mean cost relative to baseline (method IDs are in Tables 2 and 3)
Figure 2: Mean accuracy versus mean cost relative to baseline (method IDs are in Tables 2 and 3)
VisualBench win, tie, and loss results
Figure 3: VisualBench win, tie, and loss results
Scaling independent review on TB through additional review rounds (depth) and critics (width), showing accuracy versus mean critic token use
Figure 4: Scaling independent review on TB through additional review rounds (depth) and critics (width), showing accuracy versus mean critic token use
TB accuracy versus mean total cost as review depth and width increase
Figure 23: TB accuracy versus mean total cost as review depth and width increase
查看结构化数据
任务指标本文基线提升
Terminal-Bench(31任务子集,7模型平均) 准确率(任务解决率) L3 Task-first Trajectory review:64.6% 无验证基线:55.1% +9.5 pp,成本仅 1.13–1.25×
SWE-bench Verified(30任务子集,7模型平均) 准确率 L3 Task-first Changes review:77.5% 基线:70.9% +6.6 pp,成本 1.00–1.04×
Terminal-Bench(最强 L2 对比) 准确率 L2 Reject completion User/early:61.1% 基线:55.1% +6.0 pp,但成本 1.60–1.76×(性价比显著劣于 L3)
VisualBench(18个视觉/交互任务,人工盲评) Net preference(偏好净差,pp) L3 Changes + 视觉必检:+23.8 基线:0(参照);最优非 L3 设计(L2 early recheck)仅 +2.7 比最强 L0–L2 设计高出约 21 pp
Terminal-Bench(L0 初始指令) 准确率 Verification instruction (System):58.4% 基线:55.1% +3.3 pp,模型间方差大(−2.4 至 +8.0 pp)
Terminal-Bench(L1 执行时提醒) 准确率与输出 token After-edit reminder (User):60.4%,token 降至 0.75–0.86× 基线:55.1% +5.4 pp 且输出 token 减少 14–25%(仅 TB 有效,SWE 为 −0.3 pp)
Terminal-Bench(审查扩展 scaling) 准确率与总成本 4 个并行 critic:65.8%($0.62/trial);4 轮串行:66.1%($0.77/trial) 单 critic 单轮:62.7%($0.47/trial) +3.1 pp;width 比 depth 便宜 19%

局限与改进

作者承认的局限:结果基于任务子集(TB 31/89、SWE 30 个),选择程序虽按难度分带覆盖,但未必代表完整分布;平均增益掩盖了巨大的模型间方差,多个设计对个别模型是负增益(如 Kimi-K2.7-Code 在 L0/L1/L2 层大面积为负,DeepSeek V4-Flash 在 L2 Inspect changes 上 TB −8.3 pp);VisualBench 仅 18 个任务、由公司内部数据团队的 rater 盲评,规模和代表性有限;L3 的 cancel-async-tasks 案例显示修复可能耗尽 45 分钟时限。我自己的观察:第一,所有实验的 critic 都是 Qwen3.7-Plus,没有研究 critic 与主模型的能力配比——更强或更弱的 critic 是否改变结论未知,而实践中 critic 选择恰恰是最自由的变量;第二,TB 每任务仅 3 次试验、31 个任务,单任务的成败波动就是 ±1.1 pp 量级,许多相近设计间的排序差异可能落在噪声区间内,论文未报告置信区间或显著性检验;第三,成本按 API 标价计算,未考虑 prompt caching 等实际工程优化对 critic 重复读任务的折扣;第四,结论绑定在特定基线 harness 上,不同 scaffold 中消息插入位置的语义可能不同;第五,缺少对 critic findings 的错误类型学分析(逻辑缺陷/边界条件/格式约定),无法知道独立审查到底在系统性地修复哪类错误。

独立分析的弱点

弱点一:模型间方差不可预测。Kimi-K2.7-Code 在 L0 user 指令下 TB −8.3 pp,在 L3 下却 +8.3 pp;同一个设计对不同模型可能方向相反,意味着照抄论文的配置有踩坑风险。改进方向:把「选验证设计」本身建模为 meta-policy,用少量探针任务在线评估后自适应选择,或按模型族给出预设配方。弱点二:L2 成本失控且可能破坏有效状态。user rejection 后 86–96% 的 run 继续改文件(中位数 12–19 步),git-multibranch 案例中 agent 为做部署测试把测试内容 push 到了服务分支、留下无效最终状态而判负。改进方向:给门控加步数/预算上限,让拒绝消息携带具体检查清单而非泛泛的「继续工作」,并在重开前后做状态快照以便回滚。弱点三:critic 上下文设计只有全有/全无两档。完整 Trajectory 让 critic 更贵(高 29–43%)且更差,但未测试中间形态。改进方向:把轨迹压缩为 diff 加关键假设声明,或做成 agentic critic 让其按需查询轨迹。弱点四:VisualBench 的人工盲评(18 任务 × 2 trials)昂贵且不可重复,外部团队难以跟进。改进方向:探索可执行的自动代理指标(游戏可玩性检查、渲染 diff)或校准过的 VLM judge。弱点五:论文从不报告 critic 的 precision/recall——findings 里多少是真 bug、多少是误报诱导了无效修订,这个关键数字缺失。改进方向:建立 findings 的标注协议,并研究异构多 critic 的互补性与投票机制。

未来方向

作者方向上:把验证强度做成用户可配置的参数,按任务风险等级分配算力(论文明确支持独立审查作为实用的 test-time scaling 轴,且发现 width 优于 depth——4 个并行 critic 以便宜 19% 的成本逼近 4 轮串行的准确率,这提示多 critic 并行加结论合并的编排策略值得深挖);第二个自然延伸是审查触发的动态化——用不确定性估计或自检信号决定何时启动 critic,而非每次运行都审查,把省下的算力给真正需要的任务。基于成果可延伸:其一,用 RL 训练专门的 critic 模型,训练目标对准本文发现的最优上下文形态(Changes + 任务要求 + claim 线索);其二,把 critic findings 作为过程奖励信号回灌给主模型的训练,让「被审查修复的经历」变成模型能力;其三,研究验证收益与模型能力的关系——数据显示基线最弱的 Kimi(50.6%)受益最大(SWE +13.8~+20.7 pp),而接近饱和的 Qwen3.8-Max(89.7%)收益小,这提示独立审查可能是弱模型时代的性价比工具,值得系统刻画这条「基线水平—验证收益」曲线;其四,扩展到非编码领域(数据分析、报告写作、CAD 建模)检验 L3 范式的普适性;其五,探索 critic 与主模型能力配比的最优点,包括用更强模型做 critic 的边际收益。

复现评估

开源情况:论文未提及发布代码仓库;基线 harness 是内部实现,但编排用的 Harbor 框架和 E2B sandbox 都是公开的,全部 17 种设计的 prompt 全文在附录 E(E.1–E.4)给出,任务选择程序(A.1)、API 价格(Table 4)、诊断指标定义都有记录,材料透明度较高。算力与费用:不需要训练,纯推理实验;按论文数字,TB 上单 trial 基线约 $0.4 量级,L3 scaling 实验中 4 轮审查 $0.77/trial,完整复现 17 designs × 7 模型 × 61 任务 × 3 trials 的矩阵估计需要数千美元 API 费用和数周编排工程;VisualBench 需要内部 rater 团队做盲评,外部几乎无法复现,只能用代理指标替代。复现难度评估:对个人开发者或小团队,只复现核心结论(L3 优于 L0–L2、width 优于 depth)是可行的——挑 1–2 个开源可调的模型、用公开的 TB/SWE 全集或子集、按附录 prompt 搭一个最小 harness,预算约几十到几百美元;但七模型全面矩阵和人工盲评部分建议视为企业级实验,直接引用论文结论即可。总体判断:方法本身(插消息、跑 critic、合并 findings)工程上不复杂,真正的工作量在成本计量、诊断统计和公平对照上。

相似论文推荐