没有标准答案,Agent也能自己把自己调好——RHO:在黑暗中进化的harness优化
论文:Evolving Agents in the Dark: Retrospective Harness Optimization via Self-Preference arXiv:https://arxiv.org/abs/2606.05922
🎯 核心摘要
先说一个让我挺头疼的现实:你部署了一个Agent去跑SWE-Bench这种真实任务,跑完一堆轨迹,里面藏着大量"它哪里做错了"的信息。可你想拿这些信息去改进它的工具、技能、工作流(论文里统称 harness),第一件事就卡住了——优化算法几乎都要一个带标准答案的验证集。生产环境里,标注数据恰恰是最稀缺的东西。
这篇论文给的答案有点反直觉:完全不要标签,只靠Agent自己回看过去的轨迹,一轮就把自己调好。 方法叫 RHO(Retrospective Harness Optimization)。它从历史任务里挑一小撮"有难度又多样"的子集重新做一遍,让Agent用自验证(自己检查这条轨迹对不对)和自一致性(多条轨迹互相对照找分歧)去诊断失败,然后生成几版候选harness,靠成对自偏好选出最好的那版部署。
效果最炸的一个数:SWE-Bench Pro 上 pass rate 从 59% 干到 78%,整整 19 个点,全程没碰过任何外部评分。我的第一反应是怀疑——没标签怎么知道改对了?但看完它的诊断机制和消融,确实站得住。这是一篇我愿意推荐工程团队认真读的论文,尤其是手里攒了一堆Agent运行日志却不知道怎么用的人。
📖 先搞清楚:harness到底是个啥,为什么要优化它
现在主流的Agent,能力其实分两层。一层是底座大模型本身(这篇里固定用 Codex gpt-5.5,不动它);另一层是套在模型外面的那一圈东西——可执行工具、领域技能、工作流提示,论文把这一圈叫 harness。
你想想看,同一个模型,给它一套烂工具和给它一套打磨过的工具,干活效果差出十万八千里。所以"持续改进harness"这件事,价值非常实在。问题是怎么改。
现有的改法基本分两派,论文里 Table 5 列得很清楚:
一派是验证集反馈优化(OPRO、DSPy、TextGrad、GEPA、ADAS、Meta-Harness 这一串)。思路是拿一个带标签的验证集当裁判,反复迭代搜索,哪版harness在验证集上得分高就留哪版。问题很直接——它要标签。生产里你上哪儿找标注好的验证集?而且大多还只改prompt,不敢动真正的工具和技能。
另一派是基于经验的自我改进(Dynamic Cheatsheet、ReasoningBank、Sleep-time Compute 这些)。这派不要标签了,靠在线流式地攒经验、写memory。但它们大多只改记忆条目或输入上下文,碰不到可执行的工具和技能,改动面很窄。
RHO 想同时占住三个位置:不要标签(label-free)、改完整harness(工具+技能+指令都能改)、单趟搞定(single pass,不迭代搜索)。这三条在过去的工作里没人同时满足过。

图1:左边是验证集反馈式方法——拿带标签的验证集反复迭代打分;右边是RHO——只回看过去的轨迹,单趟优化,全程没有ground-truth标签。这张图把两条路线的根本差异说透了:一个反复跟标准答案对,一个对着自己的历史复盘。
🤔 没有标准答案,凭什么知道自己改对了?
这是整篇论文的命门,也是我读之前最大的疑问。
RHO 的回答是:当一个任务被求解多次时,失败的信号其实是会自己冒出来的,根本不需要外部标签。 它从两个维度去捞这个信号:
自验证(self-validation):Agent 回看单条轨迹,对照任务要求和环境观测,检查自己每一步是否站得住。比如它声称"测试通过了",但轨迹里根本没真正跑测试——这种自相矛盾,模型自己读一遍就能逮到。
自一致性(self-consistency):同一个任务并行解 G 次(论文里 G=3),多条轨迹之间一旦出现分歧,分歧点往往就是脆弱、不可靠的地方。大家都走A路线只有一条走了B,B大概率有问题。
把这两个信号合起来,就构成了一个不依赖标签的失败诊断器。这一步我觉得是全文最聪明的地方——它没有去发明什么神秘的无监督奖励,而是利用"重复求解"这个动作本身天然携带的冗余信息。
🏗️ RHO 三步流水线:选题、群体重解、提案选优
整个方法就三个算子,全部由同一个backbone模型扮演(难度判官 judge、求解器 solve、优化器 optimize、排序器 rank 都是它),互相之间靠输入不同来区分,没有任何一步看标签。

图2:RHO 三步走。① Coreset Selection:用行列式点过程(DPP)从历史任务里挑一小撮"难度多样"的子集;② Group Rollout:每个任务在当前harness下并行重解 G 次,用自验证诊断单轨迹失败、用自一致性诊断跨轨迹分歧;③ Harness Proposal:生成多版候选harness更新指令,靠成对自偏好选出最优部署。右侧那几行 −0.5、+1.4、+0.7 就是候选版本互相对比打出的相对分。
第一步:Coreset Selection——别拿简单题浪费预算
不是所有历史任务都值得复盘。太简单的题Agent本来就会做,复盘它纯属浪费算力;你要的是那些"有难度、又能覆盖不同失败模式"的题。
RHO 用行列式点过程(DPP)来挑。DPP 这东西的好处是天生能在"质量"和"多样性"之间平衡——它倾向于选出既各自有价值、彼此又不冗余的一组样本。论文里给的核心权衡公式是:
这里 \(r_i\) 是任务难度分,\(\theta\) 是难度/多样性的权衡系数(默认 0.7),\(\epsilon\) 是难度下界(0.1)。说人话就是:\(\theta\) 越大越偏向选难题,越小越偏向选多样。最终 coreset 大小 k=10,从一堆历史任务里只挑10个出来复盘。
为什么这步重要,后面消融会告诉你——只看难度或只看多样性,效果都比随机选还差,只有 DPP 把两者捏在一起才登顶。
第二步:Group Rollout——重解 + 诊断
挑出的每个任务,在当前harness \(h_0\) 下并行重解 G=3 次。然后上面讲的自验证 + 自一致性两把诊断刀同时下,把每条轨迹里的失败点、轨迹间的分歧点全标出来。这就是给下一步"改哪儿"提供的原材料。
第三步:Best-of-N Harness Proposal——生成 N 版,自己选最好的
拿着诊断结果,优化器生成 N=3 版候选harness更新。怎么选?不靠验证集,靠成对自偏好排序:
意思是,对 coreset 里每个任务 \(t\),把候选版本 \(j\) 跑出来的轨迹 \(\tau_t^{(j)}\) 和原始harness的轨迹 \(\tau_t^{(0)}\) 做成对比较,看哪个更好。所有任务上的相对得分平均一下,得分最高的那版 harness 就是 \(h^\star\),直接部署。
整个目标函数其实很干净:
只不过这里的效用 \(U\) 不是来自标签,而是来自Agent自己的偏好判断。
📊 实验:19个点不是吹的
主实验在三个差异很大的域上做:软件工程(SWE-Bench Pro)、技术工作(Terminal-Bench 2)、知识工作(GAIA-2)。全部用 Codex gpt-5.5 当backbone,reasoning effort 拉满 high。
主表:RHO vs 各路免标签baseline
| 方法 | 改的部位 | SWE-Bench Pro | Δ | Terminal-Bench 2 | Δ | GAIA-2 | Δ |
|---|---|---|---|---|---|---|---|
| Vanilla Codex | 无 | 0.59 | — | 0.71 | — | 0.29 | — |
| Dynamic Cheatsheet | Skills | 0.62 | +0.03 | 0.73 | +0.02 | 0.30 | +0.01 |
| ReasoningBank | Memory | 0.61 | +0.02 | 0.73 | +0.02 | 0.28 | −0.01 |
| Sleep-time Compute | Memory | 0.64 | +0.05 | 0.73 | +0.02 | 0.32 | +0.03 |
| RHO | Skills+Tools | 0.78 | +0.19 | 0.76 | +0.05 | 0.37 | +0.08 |
SWE-Bench Pro 上 +19 个点,把其它免标签方法甩开一个量级——人家最多 +5。GAIA-2 上 +8 个点也很能打。Terminal-Bench 2 涨得最少(+5),论文自己也没回避,原因后面行为分析里会提到。
我注意到一个细节:那几个baseline大多只动 Memory,RHO 动的是 Skills+Tools。这其实回应了前面 Table 5 的论点——只改记忆条目天花板很低,敢改可执行的工具和技能,上限才高。
harness 里到底被改出了什么

图3:RHO 生成的harness由三类东西组成——Instructions(任务无关的流程规则)、Skills(记录评分器或环境的怪癖,这些怪癖之前正是导致失败的元凶)、Tools(可执行脚本)。图里展示的是代表性条目。我觉得这张图最有说服力的地方在于:Skills 那一栏明确写着"之前因为环境idiosyncrasy翻车,现在把这个坑记下来"——这说明诊断是真的击中了历史失败点,不是泛泛地写些正确的废话。
跟验证集反馈式优化正面刚
| 方法 | 要验证标签 | Agent调用次数 | SWE-Bench Pro |
|---|---|---|---|
| RHO | 不要 | 103(1.0×) | 0.78 |
| Meta-Harness(1轮) | 要 | 41(0.4×) | 0.62 |
| Meta-Harness(10轮) | 要 | 320(3.1×) | 0.80 |
这张 Table 2 很有意思。Meta-Harness 是要标签的验证集反馈优化器。跑1轮(预算只有RHO的0.4倍)只到0.62,被RHO的0.78吊着打;要追平RHO得跑10轮,烧3.1倍的预算才勉强到0.80。
说实话这个对比挺漂亮的:RHO 用一趟、零标签、约三分之一的算力,就逼近了对手烧十轮标签换来的成绩。 这才是它真正的卖点——不是绝对天花板最高,而是性价比和落地友好度碾压。
🔬 消融:诊断这一步到底贡不贡献
这是我最看重的部分,因为它直接回答"自验证+自一致性是不是真有用,还是花架子"。
| 变体 | SWE Pro | TB 2 | GAIA-2 |
|---|---|---|---|
| 完整诊断 | 0.78 | 0.76 | 0.37 |
| 去掉自一致性 | 0.56 | 0.75 | 0.27 |
| 去掉自验证 | 0.70 | 0.73 | 0.30 |
| 原始轨迹(完全不诊断) | 0.60 | 0.75 | 0.29 |
看 SWE-Bench Pro 这一列:完整诊断 0.78,砍掉自一致性直接掉到 0.56——比 Vanilla 的 0.59 还低!这说明在缺了自一致性的情况下,Agent 反而被误导写出了更差的harness。自验证砍掉也掉到 0.70。把诊断整个跳过、直接拿原始轨迹喂给优化器,只有 0.60。
这组数我盯着看了一会儿。结论很硬:诊断不是装饰,是核心引擎;其中自一致性在SWE-Bench Pro上尤其关键。 没有它,免标签优化甚至会帮倒忙。
不过我也得说句公道话——Terminal-Bench 2 那一列几乎不动(0.73~0.76),消不消融差别都不大。这其实暴露了RHO的适用边界:诊断信号强不强,高度依赖任务本身能不能产生有效的失败/分歧信号。TB2 涨得少,可能就是因为它的失败模式不太能被这套自监督诊断捕捉到。
还有两个值得看的发现
Best-of-N 的选择质量(Table 3):N=3 个候选里,SWE-Bench Pro 上随机选的期望分是 0.79,RHO 实际选中的是 0.78,最差的是 0.73。坦白讲,这里 Chosen(0.78) 还略低于 Mean(0.79)——说明它的成对自偏好选择并不完美,偶尔会错过更好的候选。论文没藏这个,我觉得这种坦诚反而加分。
Coreset 选择策略(图5):

图5:(a) 各种选择器挑出的任务落在task embedding空间的什么位置——纯coverage的铺得很开,纯difficulty的挤成一团,只有RHO的DPP把两者平衡住了;(b) 从不同coreset优化出的harness的held-out pass rate。只看难度或只看多样性,效果连随机采样都不如,只有DPP的组合才登顶。这张图把"为什么要用DPP"论证得很扎实——不是炫技,是真的两个维度缺一不可。
💡 行为层面:优化后的Agent变得不一样了

图4:RHO 之后Agent的行为变化。它能撑住更长的工作会话,并且每一步的动作分布发生了迁移——在 SWE-Bench Pro 上更偏向verification(验证),在 Terminal-Bench 2 和 GAIA-2 上更偏向execution(执行)。这点挺有意思:harness的改动不是抽象的,它实打实改变了Agent干活的姿势。
论文有个观察我很认同:RHO 虽然创造了新的skills和tools,但它真正改变的是Agent的行为模式——让它在长程任务里维持更高的准确率,不会越跑越飘。这跟开篇那个痛点呼应上了:部署久了的Agent容易"油条化",而RHO相当于给它做了一次针对性复盘和纠偏。
🧐 我的判断:值不值得读
亮点,我觉得有三个:
第一,问题选得准。"生产环境没有验证集标签"是真痛点,不是伪命题。任何做过Agent落地的人都知道,标注数据有多贵、多难拿。
第二,核心机制优雅。用"重复求解天然产生的冗余"去替代标签,自验证抓单轨迹矛盾、自一致性抓跨轨迹分歧——这个思路干净、可复现,消融也证明了它确实是引擎而非摆设。
第三,性价比叙事诚实。它没吹"绝对最强",而是老老实实摆出"零标签+单趟+三分之一算力≈对手十轮带标签"的账,这种定位反而更可信。
问题和边界,也得说清楚:
一是适用面有依赖。Terminal-Bench 2 上几乎没涨、消融也不敏感,说明这套自监督诊断对"失败信号弱、分歧少"的任务效果有限。它不是万灵药。
二是自偏好选择不完美。Table 3 里 Chosen 偶尔还不如随机期望,成对偏好排序本身也是模型在打分,存在它自己看不出来的盲区——如果一个失败模式连多条轨迹都一致地犯,自一致性是逮不到的。
三是强backbone的隐藏前提。整套方法吃的是 Codex gpt-5.5 这种强模型的自我诊断能力。换个弱一点的底座,self-validation 还靠不靠谱,论文没验证。我个人偏向认为这套方法对模型自我反思能力的下限是有要求的。
跟同期工作比,RHO 在 Table 5 的三轴坐标里确实占了个别人没占的位置(label-free + full harness + single pass)。它不是某个单点的颠覆,更像是把"免标签自监督"和"敢改完整harness"这两件过去分属两派的事,第一次干净地缝在了一起。
如果你手上正攒着一堆Agent运行日志、又苦于没有标注验证集,这个思路真的值得试试——尤其是软件工程这类"失败信号明确、可重复求解"的场景,RHO 大概率能给你惊喜。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我