Paper Report

AutoHarness: improving LLM agents by automatically synthesizing a code harness 论文汇报

让 LLM 自动合成代码 harness,用可执行程序补齐 agent 在动作合法性与环境接口上的短板。

核心机制Tree search + Thompson sampling + LLM code refinement。
合法性结果145 个 TextArena 游戏 learned harness 均达到 100% legal action rate。
1P/2P 表现1P 平均 reward 0.745;2P 对 Gemini-2.5-Pro 总体 win rate 56.3%。
Policy 版本Harness-as-Policy 平均 reward 0.870,测试时几乎不调用 LLM。

1. 论文基本信息

  • 论文标题:AutoHarness: improving LLM agents by automatically synthesizing a code harness
  • 作者:Xinghua Lou, Miguel Lázaro-Gredilla, Antoine Dedieu, Carter Wendelken, Wolfgang Lehrach, Kevin P. Murphy
  • 机构:Google DeepMind
  • 版本:arXiv:2603.03329v1
  • 时间:2026 年 3 月 5 日
  • 汇报人:待填写

本文提出 AutoHarness,核心思想是让 LLM 自动为自己合成一个代码 harness,用外部可执行程序约束 agent 的动作合法性,而不是完全依赖模型内部的规则理解。论文在 TextArena 的 145 个 1-player / 2-player 文本游戏上测试,合成出的 harness 在所有游戏上都达到 100% legal action success rate。进一步地,作者让模型直接合成整套 code policy,在 16 个 1-player 游戏上取得 0.870 平均 reward,高于 Gemini-2.5-Pro 和 GPT-5.2-High。

2. 提纲 / 背景

2.1 背景:LLM agent 会犯“非法动作”错误

LLM 在代码生成和数学推理上进步明显,但作为 agent 进入外部环境时,常常会做出环境规则禁止的动作。论文举的动机例子是 Kaggle GameArena chess competition 中,Gemini-2.5-Flash 的失败有 78% 来自 illegal moves,而不是战略错误。

这类问题说明模型可能“看起来理解规则”,但在实际状态下不一定能稳定判断哪些动作可执行。AI planning 中这类问题被称为 action applicability:在给定状态下,某个动作是否可用。

2.2 传统解决方式的局限

常见修复方式有两种。

第一种是微调模型,让模型从轨迹中学习规则和策略。但大模型微调成本高,也可能损害通用 instruction following 能力。

第二种是人工编写 harness,例如动作合法性检查器、格式约束器、环境包装器。这种方法有效,但每个新环境都要手写,扩展性弱。

本文的判断是:既然 LLM 已经很擅长写代码,就可以让 LLM 自动写出这个 harness。模型不只是输出动作,而是先为任务生成一段外部程序,用程序补齐自己在规则遵守上的短板。

2.3 本文定位

AutoHarness 不直接训练 LLM,也不只是在 prompt 里要求“不要犯错”。它把 agent 的改进问题转化为程序搜索问题:

在代码空间中搜索一个 harness,使它能在环境反馈下持续修复非法动作,并最终稳定过滤或生成合法动作。

这个视角和普通 prompt refinement 不同。prompt refinement 改的是自然语言上下文;AutoHarness 改的是可执行代码。

3. 研究问题与目标

3.1 研究问题

本文要解决的问题是:

如何让一个相对小的 LLM 自动合成任务特定的代码 harness,从而减少或消除 agent 与环境交互时的非法动作,并提升实际游戏表现?

这个问题可以拆成三层。

  • 合法性层:代码能否稳定判断或生成 legal action?
  • 性能层:过滤非法动作之后,agent 的 reward / win rate 是否提升?
  • 成本层:小模型自动合成 harness 是否比直接使用更大模型更划算?

3.2 工作目标

论文的目标包括:

用 Gemini-2.5-Flash 自动合成 action verifier / action proposer。

在 145 个 TextArena 游戏中验证合成 harness 能否避免非法动作。

在 16 个 1P 和 16 个 2P 游戏中测试 end-to-end 游戏表现。

探索极限设定 harness-as-policy:不再让 LLM 在测试时决策,而是让代码直接产生动作。

4. 核心方法 / 模型

4.1 方法总览:code as harness

AutoHarness 把 agent 看成两部分:

Agent = LLM + Harness

其中 LLM 负责理解环境和生成候选动作,harness 负责把模型输出连接到环境,并检查、修复或替代不合法动作。本文的关键变化是:这个 harness 不再由人手写,而是由 LLM 在环境反馈下自动合成。

Figure 1
Figure 1: Code-as-harness learning process
Figure 1 展示了 AutoHarness 的搜索过程。系统维护多份旧代码候选,选择一个节点进行 refinement;Refiner 根据环境反馈修改代码;Evaluator 在环境中 rollout,Critic 汇总错误和 reward;新的 heuristic value 再写回搜索树。该图说明 AutoHarness 的核心不是一次性生成代码,而是“代码候选 -> 环境执行 -> 错误反馈 -> 代码修复”的闭环。

4.2 两个核心函数

论文主要使用两个函数签名:

def propose_action(board: str) -> str:
    \"\"\"给定文本形式的游戏状态,提出一个动作。\"\"\"

def is_legal_action(board: str, action: str) -> bool:
    \"\"\"判断某个动作在当前游戏状态下是否合法。\"\"\"

这两个函数分别负责“提出动作”和“判定动作”。在 harness-as-action-verifier 设置下,LLM 先提出动作,代码用 is_legal_action() 检查;如果非法,就带着 illegal action warning 重新提示 LLM,再尝试生成新动作。

4.3 三种 harness 形态

形态动作来源LLM 是否参与测试时决策主要作用
harness-as-action-filter代码生成一组 legal moves,LLM 排序让代码负责合法性,LLM 负责策略选择
harness-as-action-verifierLLM 先生成动作,代码验证并拒绝非法动作本文主要实验设置,像 rejection sampler
harness-as-policy代码直接选择动作测试时不再调用 LLM,成本几乎为零

这三种形态代表不同的代码介入程度。action-verifier 是较保守的版本,只拦截非法动作;harness-as-policy 是最激进的版本,整个策略都由代码实现。

4.4 搜索算法:tree search + Thompson sampling

AutoHarness 把代码合成视为搜索问题。每个节点是一份代码候选,节点的 heuristic value 是平均 legal move accuracy。系统用 Thompson sampling 选择下一个要 refine 的节点,从而在探索新代码结构和利用已有好代码之间平衡。

初始化若干代码候选
while 没有达到 100% legal action rate 且未超时:
    用 Thompson sampling 选择一个代码节点
    在多个环境中 rollout
    收集非法动作、执行错误、reward 等反馈
    Critic 汇总失败案例
    Refiner 调用 Gemini-2.5-Flash 修改代码
    Evaluator 评估新代码
    把新代码和 heuristic value 加入搜索树

和简单 iterative prompting 相比,这里不是只维护一条代码轨迹,而是维护多条候选分支。这样可以避免某一次错误修改把整个优化过程带偏。

4.5 反馈如何驱动代码修复

论文提到一个关键规则:

  • 如果 is_legal_action() 返回 True,但环境判定该动作 invalid,说明 verifier 放过了非法动作,需要同时修复 is_legal_action()propose_action()
  • 如果 is_legal_action() 返回 False,而且动作确实 invalid,说明 verifier 工作正常,主要需要修复 propose_action(),让它更可能提出合法动作。

这体现了 AutoHarness 的一个重要机制:环境不是只给 reward,而是提供“动作是否合法、代码是否执行失败”的结构化反馈。LLM 的任务不是盲目重写,而是根据失败类型定位该改 verifier 还是 proposer。

4.6 训练配置

在 harness-as-action-verifier 实验中,每次迭代使用 10 个并行环境,最多 rollout 1000 步,环境会自动 reset。一旦代码产生 illegal move 或代码执行失败,当前 rollout 终止。最多采样 5 个失败步骤给 Critic,Critic 合并错误信息,再交给 Refiner 修改代码。

训练停止条件是 heuristic value,也就是 legal action success rate,达到 1.0,或者超时。训练模型使用 Gemini-2.5-Flash。

论文报告平均训练 14.5 次 tree search iteration 即可结束,32 个 end-to-end 评估游戏中有 19 个在 10 次以内完成。较难学习的游戏包括 GermanWhist-v0、Cryptarithm-v0、Othello-v0 和 Chess-v0。

Figure 2
Figure 2: Fraction of legal moves vs number of code refinements
Figure 2 展示了 6 个游戏的 legal move fraction 随 synthesis iteration 提升的曲线。多数游戏很快接近 1.0,但 Chess、Othello、GermanWhist 等更复杂游戏需要更多 refinement。该图证明的是:AutoHarness 的代码不是一次生成即成功,而是通过少量迭代逐步修复合法性。

4.7 Harness-as-policy 的目标函数

当系统直接学习 code policy 时,legal action 只是最低要求,还要考虑 reward。论文把 heuristic value 改成:

如果采取非法动作:H = 0
否则:H = 0.5 + 0.5r

其中 r ∈ [0, 1] 是 episode 结束时的 sparse reward。这个设计让非法动作直接归零,合法但低收益的动作得分中等,高 reward 的代码策略得分更高。

4.8 Mermaid 方法流程

旧代码候选多份 harness/code policy 候选
节点选择Thompson sampling
环境执行rollout 并捕获失败
Critic汇总非法动作、错误和 reward
RefinerLLM 修改代码
Evaluator重新评估 heuristic
搜索树更新继续探索或收敛
Mermaid 源码
flowchart LR
    A["旧代码候选"] --> B["Thompson sampling 选择节点"]
    B --> C["环境 rollout"]
    C --> D["收集非法动作 / 执行错误 / reward"]
    D --> E["Critic 汇总失败案例"]
    E --> F["Refiner 调用 LLM 修改代码"]
    F --> G["Evaluator 评估新代码"]
    G --> H["更新搜索树与 heuristic value"]
    H --> B

4.9 附录代码示例说明

附录给了 Minesweeper 和 Chess 的代码片段。Minesweeper 的 propose_action() 会先解析棋盘,判断是否是首步;然后根据数字格周围约束推断安全格和地雷;没有确定安全格时,再用概率风险估计选择低风险动作。Chess 示例则包含 UCI 坐标转换、王的位置查找、攻击格判断等基础规则逻辑。

这些示例说明 AutoHarness 合成出的不是简单格式检查,而是可以包含任务特定的状态解析、规则推理和启发式策略。

5. 实验结果与分析

5.1 数据集和任务设置

实验使用 TextArena 中的 1-player 和 2-player 文本游戏。作者排除了 9 个动作空间是自由文本或对话的游戏,保留 145 个游戏,包括 Chess、Checkers、Blackjack、Sudoku 以及许多变体。

为了提高难度,作者还手动移除了部分游戏 observation 中的 Available Moves 提示。这样 harness 不能简单复制合法动作列表,而必须从棋盘状态和环境反馈中推断动作合法性。

5.2 合法动作率:145 个游戏全部达到 100%

附录 Table 1 列出 145 个 TextArena 游戏。所有游戏的 learned harness 在测试 rollout 上都达到 1.0 legal action rate。这个结果支撑了论文最直接的 claim:自动合成的代码 harness 可以系统性消除非法动作。

但这个结果主要证明的是合法性,不等价于策略最优。一个 harness 可以完全避免非法动作,但仍然可能选择很差的合法动作。因此论文进一步做了实际游戏表现评估。

5.3 2-player 游戏表现

Figure 3
Figure 3: Win/lose/draw rate vs Gemini-2.5-Pro
Figure 3 展示了 16 个 2P 游戏中 Gemini-2.5-Flash+Harness 对 Gemini-2.5-Pro 的胜/平/负比例。作者报告,小模型加 harness 在 9/16 个游戏中获胜,整体 win rate 为 56.3%;Gemini-2.5-Pro 的整体 win rate 为 38.2%。对 vanilla Gemini-2.5-Flash 时,AutoHarness 赢 12/16 个游戏,整体 win rate 达到 64.8%。

这个结果说明 harness 不只是让模型“少犯规”,在一些对抗游戏中也能转化为胜率收益。不过 2P 结果仍受对手策略、随机种子和游戏类型影响,不能直接推出代码 harness 已经学会复杂战略。

5.4 1-player 游戏表现

Figure 4
Figure 4: Average reward on 16 one-player games
Figure 4 展示了 16 个 1P 游戏中 Gemini-2.5-Flash+Harness 与 Gemini-2.5-Pro 的平均 reward。AutoHarness 在 8/16 个游戏中高于 Gemini-2.5-Pro,在 5/16 个游戏中打平。平均 reward 为 0.745,高于 Gemini-2.5-Pro 的 0.707 和 Gemini-2.5-Flash 的 0.673。

这个结果说明较小模型加 task-specific harness 可以超过更大模型。但提升幅度不是每个游戏都显著,有些游戏本身已经接近满分,harness 的边际收益有限。

5.5 Harness-as-policy 结果

Figure 5
Figure 5: Average reward of different agents
Figure 5 比较了多种 agent 在 16 个 1P 游戏上的平均 reward。Harness-as-Policy 达到 0.870,高于 GPT-5.2-High 的 0.844、Gemini-2.5-Pro 的 0.707 和 GPT-5.2 的 0.635。作者还报告 GPT-5.2 / GPT-5.2-High 实验成本约为 640 美元,而 Harness-as-Policy 测试时因为只运行 Python 代码,成本接近零。

这一结果是论文最强的效率论点:如果任务足够规则化,先用 LLM 搜索/合成策略代码,再在测试时运行代码,可能比每一步调用大模型更便宜、更稳定。

5.6 附录 per-game 结果

Figure 6
Figure 6: TextArena 1P per-game reward
Figure 6 给出 16 个 1P 游戏的 per-game reward。可以看到 Harness-as-Policy 在 2048、FifteenPuzzle、PegJump 等游戏上提升明显,但在一些已经饱和的游戏上只是打平。
Figure 7
Figure 7: TextArena 1P per-game legal action success rate
Figure 7 展示 1P 游戏的 legal action success rate。Harness-as-Policy 多数情况下达到 100%,Gemini-2.5-Flash+Harness 也显著提高合法动作率。这个图补充说明 reward 提升的基础之一是合法性提升,但 reward 还取决于策略质量。

5.7 关键实验结论

问题实验证据结论
harness 能否消除非法动作145 个 TextArena 游戏 legal action rate 都为 1.0合法性约束非常有效
小模型 + harness 能否超过大模型2P 对 Gemini-2.5-Pro 9/16 胜,整体 win rate 56.3%在部分游戏上成立
1P reward 是否提升0.745 vs Gemini-2.5-Pro 0.707 vs Flash 0.673平均有提升,但不是所有游戏都大幅提升
code policy 是否可行Harness-as-Policy 平均 reward 0.870规则化 1P 游戏上很有潜力
成本是否降低code policy 测试时几乎不调用 LLM推理成本优势明确

6. 总结

本文的贡献可以概括为四点。

第一,提出 code as harness:让 LLM 自动合成外部代码约束器,用可执行程序补齐 agent 在动作合法性上的短板。

第二,把 harness 生成建模为代码空间中的 tree search,而不是单轮代码生成或线性 prompt refinement。Thompson sampling 使系统能在探索新代码和修复已有代码之间平衡。

第三,在 TextArena 145 个游戏上验证自动合成 harness 能把 legal action success rate 提升到 100%。这说明很多 agent failure 可以通过自动生成环境接口代码来修复,而不一定需要直接训练模型。

第四,提出并验证 harness-as-policy 的极限形态:在部分规则化 1P 游戏中,LLM 先生成策略代码,测试时不再调用 LLM,平均 reward 超过更强的大模型 agent。

这篇论文最重要的启发是:改进 LLM agent 不一定只靠更大的模型、更强的 prompt 或更长的推理链。对于有清晰规则和环境反馈的任务,自动合成“模型外部的程序化约束与策略”可能更稳、更便宜。

7. 个人思考与展望

7.1 优点

AutoHarness 抓住了 LLM agent 的一个真实痛点:很多失败不是因为模型完全不会玩,而是因为它在接口层面违反环境规则。用外部代码修复合法性,比单纯提示模型“注意规则”更可靠。

方法也比较务实。它不要求访问模型参数,不需要 fine-tuning,只需要模型能写代码、环境能执行和反馈。对于许多工程型 agent 场景,这比训练一个新模型更可落地。

另一个优点是成本逻辑清晰。尤其是 harness-as-policy,把昂贵的 LLM 推理成本前置到训练/合成阶段,测试时只运行代码。这对大量重复环境很有吸引力。

7.2 局限性

第一,任务必须有可执行环境反馈。AutoHarness 依赖 rollout、错误消息和 reward。如果任务没有明确环境、没有可验证动作合法性,方法就难以直接使用。

第二,当前实验集中在 TextArena 游戏。游戏规则清晰、状态文本结构相对稳定,这有利于代码 harness。真实软件操作、网页任务、机器人任务中的 observation 可能更杂乱,错误反馈也未必足够结构化。

第三,harness 的泛化方式仍是 one harness per environment。论文也承认当前为每个游戏生成单独 harness。这样能解决单任务,但还没有证明能形成跨任务可复用的通用 harness 库。

第四,合法动作不等于好动作。action-verifier 能过滤非法动作,但不能保证战略最优。Harness-as-policy 能进一步提高 reward,但在 2P 对抗游戏上学习完整策略更难,可能需要 world model 或搜索。

第五,安全和执行风险需要认真处理。论文要求生成 safe-to-execute 代码,但自动生成并执行代码天然有风险。真实系统中需要沙箱、权限隔离、资源限制和代码审计。

7.3 可追问的问题

AutoHarness 是否能从 145 个游戏中抽象出可复用组件,而不是每个游戏单独学习?

如果环境反馈很稀疏或错误消息不清楚,Critic 和 Refiner 是否还能稳定修复代码?

对网页 agent、工具调用 agent、数据库 agent 这类真实任务,action legality 如何定义?

harness-as-policy 的上限在哪里?它是在学习真正策略,还是只在规则化小游戏上写启发式?

自动执行 LLM 生成代码时,如何保证安全性和资源可控性?

7.4 后续研究方向

一个自然方向是建立 reusable harness library。不同游戏或任务可能共享状态解析、动作格式检查、搜索模板、约束求解器等组件。如果系统能检索和组合已有 harness,合成成本会进一步下降。

另一个方向是把 harness 反哺给模型。论文未来工作提到希望把 domain-specific experts 蒸馏回 base LLM,使系统递归自我改进。这会把“外部代码修复”转成“模型内部能力提升”。

第三个方向是扩展到真实 agent 工具链。比如浏览器自动化、API 调用、数据库操作、机器人控制中,都有明确的非法动作和环境约束。AutoHarness 的思想可以用来自动生成 action validator、参数检查器、状态解析器或 fallback policy。

总体来看,AutoHarness 的价值不在于证明小模型全面强过大模型,而在于指出一种更工程化的 agent 改进路径:让模型用代码为自己补上环境接口和规则约束。这个路径在规则明确、反馈可执行、调用频率高的任务中尤其有意义。