01 · 核心结论Li et al. · arXiv:2609.26760v2

把搜索、重试和结束等重复判断写进代码,供下一道任务复用

5 / 6六组任务集 × 模型设置中,五组平均成功率最高
76% 至 92%相对 Tool-Calling 基线,模型调用减少
44.7% 至 45.3%WebArena-Verified 上从 4B 到 120B 模型的成功率
9.6/10博客作者个人兴趣程度

这里的 harness 是调用模型和工具、保存中间结果、决定何时停止的程序。优化器根据失败任务的执行记录 trace 修改实际运行过的函数;若保留验证题上的成功率下降,就恢复上次通过检查的代码与训练进度。模型权重不变。

来源:Abstract、Sections 3 至 4、Table 101 / 18
02 · 两种可用资源单次输入是临时的;代码可留给后续任务

Context 是本次调用能读到的内容;harness code 是下一道任务还能执行的程序

每次放进 context

模型读问题、工具输出和此前的操作记录,重新决定是否搜索、换关键词、重试或提交答案。Context 指这次模型调用收到的上下文。

这类做法把很多控制判断交给模型;相似问题也要再调用模型做一遍。

跨任务写进 harness

把可直接检查的规则写成函数,例如过滤重复结果、解析工具返回值、处理错误和检查停止条件。需要理解当前证据时再调用模型。

论文称这种跨任务积累可执行函数的做法为 persistent program growth。

模型和工具接口固定,作者只修改控制程序。初始程序有入口和接口,但没有预先写好的完整解题策略。
来源:Introduction、Section 3.1、Related Work
03 · 研究问题同类任务反复到来

同类任务会反复出现,控制逻辑却被模型反复付费重建

01 · 读取反馈

读取页面、搜索结果或工具输出。

→
02 · 决定动作

是否换搜索词、过滤证据、重试、验证或结束。

→
03 · 记录增多

新提示、工具反馈和模型输出不断写入历史。

→
04 · 下一道题

下一条同类任务再次重建相似的控制判断。

作者的假设:跨任务重复且可直接检查的控制规则可以写进代码;依赖当前内容含义的判断,仍交给模型。

来源:Introduction
04 · 训练对象只更新执行程序 h

训练期间只改 harness;模型 M 和工具接口 T 都固定

固定:M

部署 LLM 不做权重更新。训练出的同一 benchmark harness 之后会在 4B、20B、120B 三种模型上评估。

固定:T

搜索或浏览器工具接口不变。候选代码必须保留函数签名与运行时接口约定。

学习:h

优化器可以改实际执行过的函数和入口 main,也能新增少量辅助函数;不能删除原函数或写入特定题目编号与答案。

# Figure 2 中的 strategy-free scaffold
def main(task: str, max_llm_calls: int) -> dict:
    return {"final_answer": ""}
来源:Section 3.1、3.4、Figure 2
05 · 相关工作积累什么,部署时保留什么

按训练后留下的产物,以及部署时的执行方式区分

路线持续积累的对象部署时仍要做什么与本文的边界
ReAct / Self-Ask / IRCoT固定循环或文本历史模型在线重做控制判断Growing Harness 把重复控制写进代码。
ExpeL / Agent Workflow Memory可检索经验或工作流模型检索并解释经验本文直接执行积累后的控制程序。
Voyager / LATM / CRAFT技能或工具库原 Agent 结构选择并调用技能本文增长的是共享 harness 本身。
AFlow / ADAS代码化工作流或 Agent 结构运行搜索得到的结构根据失败持续改进,且每次只改相关执行函数。
AutoHarness / Meta-Harness执行程序代码或配置运行优化后的 harness本文从无完整策略的初始框架起步,验证分下降就回滚整段改动与训练进度。
来源:Section 2
06 · 原论文 Figure 2训练流程与 Repair 31
Growing Harness 总流程与 Repair 31,已去除空白边
1. 空程序与 Task 819 · 原论文局部裁切
Figure 2 左侧:起始程序、问题、正确答案和原程序空答案
2. 找到证据丢失点 · 原论文局部裁切
Figure 2 中上:已找到正确答案,但提示组装时将其截掉
3. 局部修复 · 原论文局部裁切
Figure 2 中下:证据长度、分析轮次与最终调用预留的代码修改
4. 重跑与 gate · 原论文局部裁切
Figure 2 右侧:候选重跑失败题,并接受验证或回滚
原论文 Figure 2,CC BY 4.0;手机端按原图四个区域分段。图中的 Q 门槛与正文 §3.6 不一致,见第 7 页。
07 · 训练循环正文 §3.5-3.6 与 Table 5 的协议

先积累候选修复;累计修好 Q 道题后,才检查是否损害原有能力

1 · 填满窗口

当前程序跑尚未处理的训练题;只把失败题及执行记录 放入容量 K 的窗口。

→
2 · 修改函数

优化器同时看这些失败;只改执行过的函数和入口,改动或新增不超过 L 个函数。

→
3 · 重跑窗口

候选成为临时版本。移出已修题,更新未修题的执行记录与尝试数;继续累计修复数。

→
4 · 累计到 Q 再 gate

在保留验证题上重测。成功率不下降就保存完整状态;下降则恢复上次通过的状态。

BrowseComp-Plus

K=8,Q=1,Rmax=5,L=10;训练题超时 900 s。

WebArena-Verified

K=4,Q=8,Rmax=5,L=10;训练题超时 1,800 s。

Q 的含义

自上次 gate 起累计修好的题数,不是一次窗口必须修好的数量。最终测试 50 题不参与训练。

原文冲突:Algorithm 1 把 Q 写成单窗口门槛,并立即 gate;按它执行,K=4 的窗口不可能修好 Q=8 题。正文与 Table 5 则把 Q 定义为累计 gate 间隔。没有公开代码可裁决,不能据此声称已精确复现。
来源:Algorithm 1、Sections 3.3 至 3.6、Table 5;原始伪代码在正文保留并标出冲突
08 · 函数级修改只改失败记录中运行过的函数

最终 0/1 分只说明成败;执行记录还指出这次实际运行了哪些函数

trace τᵢ = (
  task xᵢ,        # 题目
  execution DAG Gᵢ,
  output yᵢ,     # 最终输出
  verdict oᵢ,    # 测试程序给出的 0/1
  usage uᵢ       # token、费用、耗时
)

editable Aₜ = {main}
  ∪ 窗口中失败任务实际调用过的函数

Execution DAG

把函数、模型和工具调用记为节点;边表示谁调用了谁。每个节点记录输入、输出或错误、父节点和耗时。

允许修改

入口 main、失败记录中实际运行过的函数,以及少量新增辅助函数。

禁止修改

没有执行过的已有函数;不能删除函数、改接口,或写入题目 ID 和预期答案。

限制搜索范围

即使程序越来越大,每轮也只让优化器修改与这批失败有关的部分。

来源:Sections 3.2、3.4,Equations 1 至 6;代码注释为本文解释
09 · 共同修复一份修改重跑多条失败

把多个失败放在同一个窗口,让优化器寻找可复用的修复

新题进入

当前 harness 直接答对的新题离开;失败题才进入 Wt。

→
失败窗口

窗口最多 K 道失败题。每题保留最新执行记录 trace 和已尝试修复的次数。

→
重跑后更新

已修题离开;未修题带着新 trace 留下,尝试数达到 Rmax 后退出。再用新失败题补满窗口。

完整状态包括代码、题目读取位置、窗口和计数。正文 §3.3 另设窗口前检查点:如果整窗任务都耗尽预算仍没有修好一题,就恢复该状态。
来源:Sections 3.3、3.5;Algorithm 1 的 Q 冲突见第 7 页
10 · 回归验收费用更低不能抵消成功率下降

Gate 只看保留验证题的成功率;下降就撤销这一段修复和训练进度

接受这一段更新

自上次 gate 起累计修好 Q 题后,若 SRG(current) ≥ SRG(hgate),就保存当前代码、题目读取位置、窗口、计数和训练记录。hgate 是上次通过检查的版本。

恢复上次通过的状态

若成功率下降,撤销从 hgate 之后积累的整段修复。题目读取位置、窗口、计数和记录也恢复;不只是撤销最后一处代码改动。

训练结束时,尚未检查的改动还要做一次最终 gate。论文把这称为 success-first:运行费用更低,不能补偿验证成功率下降。

来源:Section 3.6;采用正文累计 gate 协议,非 Algorithm 1 单候选门槛
11 · 论文案例 Task 819检索成功,组装提示却截掉答案

搜索已找到正确原句,但组装最终提示时截掉了答案

可见问题

找出 2013 年访谈中用来形容一种声音的五个词。

→
已找到的证据

搜索返回正确原句;保存搜索结果的函数里仍有答案。

→
证据被截断

_evidence_for_prompt 每篇只保留 2,600 字符,答案没有进入最终模型调用,最终返回空字符串。

论文展示的 Repair 31

摘要上限改为 9,000 字符;分析最多四轮;预留最后一次模型调用;补充针对关键词的搜索,以及判断引用原句是否回答问题的检查。

判定与公开边界

正确答案是 “Energetic; melodic; banging; clubby; bacon.” 候选先重跑窗口,在累计 gate 后才可能成为保留版本。论文未公开这道题逐次重跑或对应 gate 的完整记录。

来源:Figure 2,Repair 31 / Task 819;gate 协议见 Section 3.6
12 · 原论文 Figure 6作者事后归纳的代码结构
BrowseComp-Plus 与 WebArena-Verified 最终 harness 结构
BrowseComp · 原论文局部裁切
Figure 6 左侧:检索与证据验证程序
WebArena · 原论文局部裁切
Figure 6 右侧:规则解析、站点例程、浏览器后备与完成检查
原论文 Figure 6,CC BY 4.0;训练后的代码结构归纳。手机端分别显示两个原图局部。
13 · 评测设置分母、预算与不确定性

每个任务集分为 200 训练题、50 gate 题、50 最终题;最终题独立跑三轮

BrowseComp-Plus

固定、人工核验的检索语料;模型 judge 判断生成答案与参考答案是否等价。

WebArena-Verified

只取 shopping、reddit、map 三类;浏览工具只返回文字;由任务基准自带程序判定。

最终评测共同限制

采样温度 1.0、推理强度 Medium、每题最多 50 次模型调用、每次最多 8,192 输出 tokens、超时 1,800 s;每轮每题一次尝试。

95% 置信区间按题目成组重采样:重复 10,000 次、随机种子 42,同一题三次尝试一起抽取。表中 ± 是重采样标准误乘 1.96,不是标准差。训练超时另见 Table 5:BrowseComp 900 s、WebArena 1,800 s。
来源:Section 4.1、Appendix A.1 至 A.3、Tables 3、5
14 · 原论文 Table 1成功率、调用次数与部署费用

五组平均成功率较高;BrowseComp + GPT-OSS-20B 低 0.7 个百分点

任务基准/模型Tool-Calling 成功率本文成功率模型调用在线费用
BrowseComp / 120B40.0±11.649.3±11.732.7 → 6.0$6.70 → $0.87
BrowseComp / 20B40.0±11.739.3±12.624.8 → 6.0$2.03 → $0.52
BrowseComp / 4B12.0±7.129.3±11.829.6 → 5.5$8.33 → $0.81
WebArena / 120B30.0±11.445.3±13.426.3 → 3.8$2.72 → $0.10
WebArena / 20B12.7±7.344.7±13.422.3 → 1.8$0.39 → $0.03
WebArena / 4B6.7±4.945.3±13.437.8 → 5.4$7.26 → $0.10
来源:Table 1。± 为 95% 置信区间半宽;均值排名不证明显著差异。费用按 50 题一轮计算,不含评分和训练。
15 · 原论文 Figure 1三个独立运行的平均
两个 benchmark 上成功率与部署成本的权衡
原论文 Figure 1,CC BY 4.0。横轴为一轮 50 题的执行模型费用;95% 置信区间见 Table 1。
16 · 原论文 Figure 5部署费用不含训练费用
逐任务 LLM 调用、context、成本与 token 散点图
最大输入上下文 · 原论文局部裁切
Figure 5 左列:两项基准的最大输入上下文
单题费用 · 原论文局部裁切
Figure 5 中列:两项基准的单题费用
单题 token · 原论文局部裁切
Figure 5 右列:两项基准的单题 token

“更便宜”只指部署阶段

Total Online Cost 只统计执行任务的模型调用,排除评分与离线修改程序的费用。缓存读取按同题请求的共同前缀估算,不是实测账单;论文没有给出训练总投入。

相对 Tool-Calling,六组设置减少 76.0% 至 91.8% 的调用、74.4% 至 98.6% 的部署费用。Tool-Calling 使用 Qwen 4B 时反而可能更贵,因为其很长的执行历史产生大量输入 token。

原论文 Figure 5,CC BY 4.0;橙点为本文方法、灰点为 Tool-Calling。Section 4.1、4.2
17 · 原论文 Figures 3 至 4每种消融只优化一次

三个部件去掉后都降分,但各只跑一次,尚不能确认降幅稳定

两个 benchmark 的 gate success 训练曲线
BrowseComp-Plus 消融训练曲线
36%最终测试:完整方法
28%最终测试:单题窗口
22%最终测试:无 gate
18%最终测试:无函数指引
30→16%gate 曲线:无 gate
1 次每种消融只优化一次
来源:Figures 3 至 4、Table 2,CC BY 4.0。去掉函数指引同时去掉执行记录、修改范围和 L 预算,不能单独归因于定位。
18 · 结论与限制对 coding harness 的启发

可借鉴如何积累修复和回滚;论文尚未公开学到的 harness

可以借鉴

  • 把可直接检查的重复规则写成代码,理解当前证据时再调用模型。
  • 用失败任务的执行记录,限制这轮可以修改哪些函数。
  • 累计修好 Q 题再 gate;保留最近通过的完整状态,失败时整段恢复。
  • 同一任务集的 harness 换用 4B 至 120B 模型后仍可使用。

仍缺少的证据

  • 未公开代码、学到的程序、任务划分和逐任务记录。
  • Algorithm 1 的单窗口 Q 门槛与正文累计间隔冲突。
  • 未报告离线优化器和评测器成本,无法算训练多久回本。
  • 只训练两类专用 harness;消融每组一次,最终 50 题的置信区间较宽。
博客作者兴趣度 9.6 / 10。与 Meta-Harness、Harness-of-Harness 对照时,重点看修复怎样积累、何时重新验证、失败后具体恢复哪些状态。
来源:Conclusion、Section 3.6、Section 4、Appendices A 至 B