Harness Learning Enables Generalizable Test-Time Adaptation
Alvin Zhang, Xuecheng Liu, Zixuan Wang, Fahim Tajwar, Daman Arora, Ruslan Salakhutdinov, Daniel Khashabi, Yuda Song, Andrea Zanette
cs.CL, cs.LG
2026-09-29
CMU用RL训练4B提案模型,根据执行反馈修改冻结solver的harness代码。21个未见推理任务均分从0.32升到0.62,反超35B教师的0.56。
一个语言模型 agent 由两块拼起来:模型本身,加上 harness。harness 是可执行程序,管模型何时被调用、能用哪些工具、中间结果怎么回流。同一套冻结权重,换一份 harness,分数可以差出一大截。
现有做法多半在测试时靠执行反馈手工或搜索式改程序,往往要反复试跑才能找到能用的修订,改完还锁在当前任务上。缺的是一套能迁到新任务的修订程序:看反馈、改代码、再跑,权重全程不动。
把这件事写成可执行程序上的元学习。外环训 proposer(提案模型),内环用它根据执行反馈改 harness。harness 修订相当于梯度更新,改控制流和工具接口,参数保持不动。
Proposer 读任务描述、当前 harness 和执行报告,输出一段结构化代码编辑:标出要替换的片段,再给出替换文本。Apply 解析并打补丁,解析失败记为无效。训练只更新 proposer,solver 冻结。
奖励是修订后 harness 在打分题上的均分,外加解析成功、能跑起来的辅助分。打分题和写执行报告的反馈题拆开。优化器用 GRPO,同一上下文采一组修订,用组内奖励归一化优势。
两条训练路径。Reasoning Gym 用 Qwen3.5-4B 当 proposer 和 solver,先拿 Qwen3.6-35B-A3B 教师的成功修订做 SFT,432 条里约 48% 是 interpreter loop,让 solver 把计算写成代码交给运行时,然后再 GRPO。QA 用 Qwen3-4B proposer 和 Qwen3-8B solver,从基座直接 RL,没有教师示范,训练任务只有 HotpotQA。
测试时同一套 proposer 可以多轮用。Reasoning Gym 每轮采 1 个候选,开发集分数不升就丢掉;QA 每轮采 8 个,低于父 harness 也推进最高分。
Reasoning Gym 单步修订看 21 个训练完全没见过的任务族,8 次提案取均分:
| 方法 | 均分 | best-of-8 |
| Base(未训 4B) | 0.32 | 0.63 |
| SFT | 0.49 | 0.78 |
| Single-step RL(4B) | 0.62 | 0.83 |
| Teacher(35B) | 0.56 | 0.85 |
RL 之后,平均一份提案已经超过 seed harness。Base 和 SFT 的平均提案还低于 seed。教师在 oracle best-of-8 上仍更高,那是事后用持出分数挑最好的一份,测试时拿不到。失败或开发集零分的提案比例,未见任务上从 Base 的 38% 掉到 RL 的 8%,SFT 几乎没动,仍是 35%。
五轮串行修订里,单步 RL 在格式变换题上大部分增益来自第一轮,SFT 爬得更慢。24 个任务族五轮后,格式变换题上 Single-step RL 到 0.725,Base 是 0.498;标准格式上三家训过的 proposer 都在 0.70 附近。五次串行修订能摸到八次独立提案的 oracle 上沿。
QA 上,HotpotQA 训出来的 RL proposer 迁到 MuSiQue 和 2WikiMultihopQA。MuSiQue 上独立修订均分只有 0.15 exact match,刚过 seed;十轮串行到 0.27。第一轮只贡献十轮增益的三分之一到三分之二。两个未见基准上,四条十轮链的终局均分超过 80 次独立提案的 oracle 最优。每条链的提案次数对齐了,总计算和反馈量没有对齐。
Multistep RL 在修订序列上继续训,没有稳定赢过 Single-step RL。标准格式题上略高,格式变换题上更低,0.649 对 0.725;QA 终局几乎打平。只在单次修订上训过的策略,测试时已经能连改多轮。
训完的 harness 结构也变了。Reasoning Gym 上 SFT 和 RL 都爱生成 interpreter loop。QA 上 Base 有时把流程砍成单次模型调用甚至拿掉 solver;RL 保住多跳检索,常见改法是摘要继续导下一跳查询,检索到的原文直接喂给答题调用。
对做 agent 的人,这条路把测试时适应从改权重挪到改程序。4B proposer 冻住,对着新任务看反馈改代码,均分能压过给它当老师的 35B。SFT 把教师的 interpreter loop 学进去了。后面那轮 RL 才把平均提案质量抬过教师。
能用的场景很窄:要有可编程的 grader、开发集反馈,以及一份能被补丁的 Python harness。不是通用 agent 训练配方。方向清楚:经验沉淀进修订策略,不沉淀进权重。
论文自己写了:修订提示是写死的,solver 冻结,Reasoning Gym 的 SFT 只有一个教师,而且几乎全是第一轮修订。组合奖励和 helper 工具指令没有稳定增益,失败常常出在解析、工具通信和答案抽取,helper 算法对了也接不上。
主图丢掉了 5 个 4B 和教师都搞不定的未见家族。26 个全算的话 Single-step RL 均分从 0.62 掉到 0.528,教师 0.501,优势还在,薄很多。QA 串行十轮赢过 80 次独立提案的 oracle,提案次数对齐了,计算和反馈总量没对齐。Multistep 训练用的是逐步即时奖励,跨轮 credit assignment 没做。两个设定的 seed harness 差很远,多轮增益能走多远,还分不清是修订策略还是起点不同。