把搜索、重试和结束等重复判断写进代码,供下一道任务复用
这里的 harness 是调用模型和工具、保存中间结果、决定何时停止的程序。优化器根据失败任务的执行记录 trace 修改实际运行过的函数;若保留验证题上的成功率下降,就恢复上次通过检查的代码与训练进度。模型权重不变。
Context 是本次调用能读到的内容;harness code 是下一道任务还能执行的程序
每次放进 context
模型读问题、工具输出和此前的操作记录,重新决定是否搜索、换关键词、重试或提交答案。Context 指这次模型调用收到的上下文。
这类做法把很多控制判断交给模型;相似问题也要再调用模型做一遍。
跨任务写进 harness
把可直接检查的规则写成函数,例如过滤重复结果、解析工具返回值、处理错误和检查停止条件。需要理解当前证据时再调用模型。
论文称这种跨任务积累可执行函数的做法为 persistent program growth。
同类任务会反复出现,控制逻辑却被模型反复付费重建
读取页面、搜索结果或工具输出。
是否换搜索词、过滤证据、重试、验证或结束。
新提示、工具反馈和模型输出不断写入历史。
下一条同类任务再次重建相似的控制判断。
作者的假设:跨任务重复且可直接检查的控制规则可以写进代码;依赖当前内容含义的判断,仍交给模型。
训练期间只改 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": ""}按训练后留下的产物,以及部署时的执行方式区分
| 路线 | 持续积累的对象 | 部署时仍要做什么 | 与本文的边界 |
|---|---|---|---|
| ReAct / Self-Ask / IRCoT | 固定循环或文本历史 | 模型在线重做控制判断 | Growing Harness 把重复控制写进代码。 |
| ExpeL / Agent Workflow Memory | 可检索经验或工作流 | 模型检索并解释经验 | 本文直接执行积累后的控制程序。 |
| Voyager / LATM / CRAFT | 技能或工具库 | 原 Agent 结构选择并调用技能 | 本文增长的是共享 harness 本身。 |
| AFlow / ADAS | 代码化工作流或 Agent 结构 | 运行搜索得到的结构 | 根据失败持续改进,且每次只改相关执行函数。 |
| AutoHarness / Meta-Harness | 执行程序代码或配置 | 运行优化后的 harness | 本文从无完整策略的初始框架起步,验证分下降就回滚整段改动与训练进度。 |





先积累候选修复;累计修好 Q 道题后,才检查是否损害原有能力
当前程序跑尚未处理的训练题;只把失败题及执行记录 放入容量 K 的窗口。
优化器同时看这些失败;只改执行过的函数和入口,改动或新增不超过 L 个函数。
候选成为临时版本。移出已修题,更新未修题的执行记录与尝试数;继续累计修复数。
在保留验证题上重测。成功率不下降就保存完整状态;下降则恢复上次通过的状态。
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 题不参与训练。
最终 0/1 分只说明成败;执行记录还指出这次实际运行了哪些函数
trace τᵢ = (
task xᵢ, # 题目
execution DAG Gᵢ,
output yᵢ, # 最终输出
verdict oᵢ, # 测试程序给出的 0/1
usage uᵢ # token、费用、耗时
)
editable Aₜ = {main}
∪ 窗口中失败任务实际调用过的函数Execution DAG
把函数、模型和工具调用记为节点;边表示谁调用了谁。每个节点记录输入、输出或错误、父节点和耗时。
允许修改
入口 main、失败记录中实际运行过的函数,以及少量新增辅助函数。
禁止修改
没有执行过的已有函数;不能删除函数、改接口,或写入题目 ID 和预期答案。
限制搜索范围
即使程序越来越大,每轮也只让优化器修改与这批失败有关的部分。
把多个失败放在同一个窗口,让优化器寻找可复用的修复
当前 harness 直接答对的新题离开;失败题才进入 Wt。
窗口最多 K 道失败题。每题保留最新执行记录 trace 和已尝试修复的次数。
已修题离开;未修题带着新 trace 留下,尝试数达到 Rmax 后退出。再用新失败题补满窗口。
Gate 只看保留验证题的成功率;下降就撤销这一段修复和训练进度
接受这一段更新
自上次 gate 起累计修好 Q 题后,若 SRG(current) ≥ SRG(hgate),就保存当前代码、题目读取位置、窗口、计数和训练记录。hgate 是上次通过检查的版本。
恢复上次通过的状态
若成功率下降,撤销从 hgate 之后积累的整段修复。题目读取位置、窗口、计数和记录也恢复;不只是撤销最后一处代码改动。
训练结束时,尚未检查的改动还要做一次最终 gate。论文把这称为 success-first:运行费用更低,不能补偿验证成功率下降。
搜索已找到正确原句,但组装最终提示时截掉了答案
找出 2013 年访谈中用来形容一种声音的五个词。
搜索返回正确原句;保存搜索结果的函数里仍有答案。
_evidence_for_prompt 每篇只保留 2,600 字符,答案没有进入最终模型调用,最终返回空字符串。
论文展示的 Repair 31
摘要上限改为 9,000 字符;分析最多四轮;预留最后一次模型调用;补充针对关键词的搜索,以及判断引用原句是否回答问题的检查。
判定与公开边界
正确答案是 “Energetic; melodic; banging; clubby; bacon.” 候选先重跑窗口,在累计 gate 后才可能成为保留版本。论文未公开这道题逐次重跑或对应 gate 的完整记录。



每个任务集分为 200 训练题、50 gate 题、50 最终题;最终题独立跑三轮
BrowseComp-Plus
固定、人工核验的检索语料;模型 judge 判断生成答案与参考答案是否等价。
WebArena-Verified
只取 shopping、reddit、map 三类;浏览工具只返回文字;由任务基准自带程序判定。
最终评测共同限制
采样温度 1.0、推理强度 Medium、每题最多 50 次模型调用、每次最多 8,192 输出 tokens、超时 1,800 s;每轮每题一次尝试。
五组平均成功率较高;BrowseComp + GPT-OSS-20B 低 0.7 个百分点
| 任务基准/模型 | Tool-Calling 成功率 | 本文成功率 | 模型调用 | 在线费用 |
|---|---|---|---|---|
| BrowseComp / 120B | 40.0±11.6 | 49.3±11.7 | 32.7 → 6.0 | $6.70 → $0.87 |
| BrowseComp / 20B | 40.0±11.7 | 39.3±12.6 | 24.8 → 6.0 | $2.03 → $0.52 |
| BrowseComp / 4B | 12.0±7.1 | 29.3±11.8 | 29.6 → 5.5 | $8.33 → $0.81 |
| WebArena / 120B | 30.0±11.4 | 45.3±13.4 | 26.3 → 3.8 | $2.72 → $0.10 |
| WebArena / 20B | 12.7±7.3 | 44.7±13.4 | 22.3 → 1.8 | $0.39 → $0.03 |
| WebArena / 4B | 6.7±4.9 | 45.3±13.4 | 37.8 → 5.4 | $7.26 → $0.10 |





“更便宜”只指部署阶段
Total Online Cost 只统计执行任务的模型调用,排除评分与离线修改程序的费用。缓存读取按同题请求的共同前缀估算,不是实测账单;论文没有给出训练总投入。
相对 Tool-Calling,六组设置减少 76.0% 至 91.8% 的调用、74.4% 至 98.6% 的部署费用。Tool-Calling 使用 Qwen 4B 时反而可能更贵,因为其很长的执行历史产生大量输入 token。
三个部件去掉后都降分,但各只跑一次,尚不能确认降幅稳定


可借鉴如何积累修复和回滚;论文尚未公开学到的 harness
可以借鉴
- 把可直接检查的重复规则写成代码,理解当前证据时再调用模型。
- 用失败任务的执行记录,限制这轮可以修改哪些函数。
- 累计修好 Q 题再 gate;保留最近通过的完整状态,失败时整段恢复。
- 同一任务集的 harness 换用 4B 至 120B 模型后仍可使用。
仍缺少的证据
- 未公开代码、学到的程序、任务划分和逐任务记录。
- Algorithm 1 的单窗口 Q 门槛与正文累计间隔冲突。
- 未报告离线优化器和评测器成本,无法算训练多久回本。
- 只训练两类专用 harness;消融每组一次,最终 50 题的置信区间较宽。