4B 学生教 35B 老师:Harness Learning 让 Agent 调度程序变成可学习对象
论文:Harness Learning Enables Generalizable Test-Time Adaptation arXiv: 2609.35738
4B 学生教 35B 老师:Harness Learning 让 Agent 的"调度程序"变成可学习对象
论文:Harness Learning Enables Generalizable Test-Time Adaptation
arXiv: 2609.35738
场景:同一个模型,换个任务就变笨
你有一个 Qwen3-8B 的 Agent,在 HotpotQA 上跑多跳问答,表现不错。换到 MuSiQue 上,准确率掉一截。再换到 2WikiMultihopQA,又掉一截。
模型没变,工具没变,prompt 没变。变的是任务。
传统做法是:调 prompt、加 few-shot、换工具组合——都是人工试错。或者微调模型参数——但参数一改,原来能做的任务可能就不会了。
这篇论文提出第三条路:不改模型参数,改"调度程序"(harness)。而且不是人工改,是训练一个"提案者"模型来改。
什么是 Harness
Harness 是 Agent 的"调度程序"——决定模型看到什么、调用什么工具、如何组织执行流程。ReAct 的"思考-行动-观察"循环是 harness,Chain-of-Thought 的"逐步推理"是 harness,Reflexion 的"反思-重试"也是 harness。
同一个模型 + 不同 harness = 不同表现。Qwen3-8B + ReAct 在 HotpotQA 上是 60 分,换成 Tree-of-Thought 可能是 65 分,换成纯 CoT 可能是 55 分。harness 的选择决定了模型能力的发挥程度。
但 harness 选择通常是人工的——工程师根据经验选一个,或者试几个取最好的。harness 本身不是学习对象。
这篇论文要做的就是把 harness 变成学习对象。
方法:元学习 + RL
Harness Learning 的框架分三个角色:
1. Solver:执行任务的模型(Qwen3-8B),参数冻结 2. Harness:可执行的程序(Python 代码),组织 solver 的调用 3. Proposer:修订 harness 的模型(Qwen3.5-4B),这是唯一被训练的
流程:
任务 → 当前 harness h_t → solver 执行 → 执行报告(分数+反馈)
↓
proposer 读报告 → 生成新 harness h_{t+1}
↓
solver 用 h_{t+1} 执行 → 新分数
↓
重复 T 轮
训练分两阶段:
- SFT:用 35B 模型当老师,在 21 个 Reasoning Gym 任务族上生成 harness 修订示例,4B proposer 监督学习
- RL:用任务性能作为奖励,进一步优化 proposer
数据:4B 学生超过 35B 老师
实验在两个设置上做:
Reasoning Gym(21 个训练任务族 + 21 个未见任务族):
- Base proposer(未训练):平均低于 seed harness
- SFT proposer:略高于 seed
- Single-step RL:明显高于 SFT
- Multistep RL:在 canonical 问题上最高,format-varied 上略低于 single-step
- 关键:4B proposer 在 21 个未见任务族上,平均超过 35B teacher 的修订质量
- 训练后的 proposer 在两个未见 benchmark 上都持续改进 harness
- 多轮修订(5 轮)在所有三个 benchmark 上都超过 Base
- Base proposer 在 HotpotQA 和 MuSiQue 上最终低于 seed——未训练的 proposer 越改越差
35B 模型可以写出好的 harness 修订,但 4B 模型经过 RL 训练后,修订质量更高。这不是"小模型逼近大模型",而是"小模型学到了大模型没学到的模式"——大模型是"一次性写修订",小模型是"学到了怎么从反馈中改进"。
类比:实习生 vs 资深工程师
想象一个公司:
- 资深工程师(35B teacher):经验丰富,给一个任务能直接写出好的工作流程(harness)
- 实习生(4B proposer):刚入职,直接写不如资深工程师,但被训练成"看反馈改流程"
- 执行团队(8B solver):按流程执行,不参与流程设计
因为"从反馈中改进"是一种可学习的技能,而"从头写好"是一种天赋。35B 模型有天赋(参数多,见多识广),但没学过"从反馈中改进"。4B 模型没天赋,但学了这门技能。
这指向一个更深的洞察:适应能力可以和学习能力分离。模型不需要很大,只要学会"怎么从失败中改进",就能在测试时持续变强。
三个关键发现
1. 跨任务泛化
在 Reasoning Gym 上训练的 proposer,在 21 个未见任务族上仍然有效。在 HotpotQA 上训练的 proposer,在 MuSiQue 和 2WikiMultihopQA 上仍然有效。学到的不是"某个任务的 harness",而是"怎么改 harness"——这是一种任务无关的元技能。
2. 多轮持续改进
单轮修订已经有效,但多轮修订(5 轮)在所有 benchmark 上都超过单轮。proposer 学到的不只是"改一次",而是"连续改进"——每轮都从上一轮的反馈中学习。
3. 训练数据中的模式涌现
SFT 数据中 48% 是"解释器循环"(interpreter loops)——让 solver 把计算写成代码,交给运行时执行。RL 后,proposer 更多地生成这种结构。这不是人工设计的,是从反馈中学到的——解释器循环确实比纯 LLM 推理更可靠。
为什么重要
1. Harness 正式成为学习对象
过去两年,harness 一直是"工程实践"——工程师手动设计、调试、优化。这篇论文把 harness 变成"学习对象"——可以训练、可以泛化、可以持续改进。这是 harness 从工程到科学的转折点。
2. 测试时适应的新范式
传统的测试时适应(test-time adaptation)改的是模型参数——用测试任务的反馈做梯度下降。Harness Learning 不改参数,改 harness。参数是连续的、高维的、改一处影响全局;harness 是离散的、结构化的、改一处影响局部。改 harness 比改参数更可控、更可解释。
3. "小模型教大模型"再添一例
4B proposer 超过 35B teacher,这不是孤例。之前有"小模型当思路生成器"(Beyond Repeated Sampling)、"小模型教大模型"等研究。模式越来越清晰:小模型在"生成方向"上可以超过大模型,大模型在"收敛到答案"上更强。分工协作比单打独斗好。
4. "判断-闸门解耦"谱系的实例
Harness Learning 把"执行"(solver)和"调度"(proposer)解耦。solver 只负责执行,不负责调度;proposer 只负责调度,不负责执行。这是"判断-闸门解耦"在 Agent 工程层的实例——执行权和调度权分离,避免"既当运动员又当裁判"的利益冲突。
局限
- 训练成本:SFT 需要 35B teacher 生成数据,RL 需要多轮 rollout,总训练成本不低
- Harness 空间限制:harness 是 Python 代码,proposer 只能在"可执行程序"空间内搜索,不能发明全新的非代码调度模式
- 多轮 RL 不稳定:论文承认 multistep RL 在 format-varied 问题上不如 single-step,多轮训练的收益不稳定
- 泛化边界:从 Reasoning Gym 到 QA 的跨域泛化没有测试,只在同域内测试
论文链接: arxiv.org/abs/2609.35738 HTML 全文: arxiv.org/html/2609.35738v1