笔记日期: 2026-10-27
论文: Self-Evolving Coding Agents via Harness-Policy Optimization
作者: Zhepei Wei, Wenlin Yao, Baolin Peng, Danqing Wang, Qianhui Wu, Hao Cheng, Yu Meng, Jianfeng Gao
版本与日期: arXiv:2610.22791v1,2026-10-16
资源: 论文 · 全文 · 作者文章 · 官方代码入口 · 模型
1. 先把“会做”和“做成”分开
读这篇论文,最容易记住的是一个有些令人意外的失败:模型已经改好了文件,也运行了测试,最后却提交了一段总结,没有把补丁交出去。对于真正使用编码智能体的人,这种错误一点也不抽象。工作区里有正确修改,并不意味着评测器收到了正确修改,更不意味着整个任务已经完成。
Self-HPO 讨论的正是这类能力与流程相互牵制的问题。模型负责选择行动,harness 则负责把任务、工具、上下文、错误反馈和结束条件组织起来。模型可能不知道下一步该做什么,也可能知道该做什么,却因为接口在错误的时刻结束了任务而没有机会继续。只训练模型或者只优化外围流程,都可能留下另一半的瓶颈。
作者把这两部分放进一个交替循环:先固定模型,搜索更好的 harness;再固定选中的 harness,用强化学习更新模型;下一轮让这个更新后的模型继续解题,也继续提出 harness 修改。搜索所用的难题还会随训练结果刷新。这不是简单地在训练前调一次提示词,而是把接口和策略看作会相互改变学习条件的两个对象。
在不依赖更强外部提案模型的设置中,Self-HPO 在 SWE-Bench Verified 上达到 69.5%,基础智能体是 61.0%,只训练策略的 RLVR 是 67.5%,只优化 harness 的 Self-Harness 是 65.2%。三个基准的平均分从 57.8% 提高到 64.8%,增加 7.0 个百分点。[1,表 1] 这些结果值得重视,但它们还不是故事的全部。
我更关心三个问题。第一,新的 harness 是否让训练中出现了原本拿不到的有效奖励?第二,模型离开与它共同进化的接口后,还保留多少收益?第三,成功率提高中有多少来自发现更好的修复,有多少来自把已有修复可靠地交付?论文的交叉评测和附录案例,恰好提供了讨论这些问题的材料。
下面把证据分成三层:表格数字是作者报告的结果;概率和代数推导是为了理解机制而作的解释,假设会明确写出;对照实验建议是我的分析,不是作者已经完成的实验。这样才能避免把一条合理机制直接写成已经得到因果验证的结论。
2. 前置知识:智能体不等于一组模型权重
策略 是生成 assistant 行动的语言模型。在终端编码任务中,行动可以包括解释、命令和提交文本。Harness 是包围这个模型的运行程序:构造上下文、调用工具、整理输出、管理长度、识别完成、处理异常,并决定某次提交到底是否结束整个回合。
因此,harness 并不只是一段 system prompt。一次“空补丁请重试”的提示,以及“先不结束任务,允许模型再行动一次”的控制,都属于它能改变的行为。前者改变模型看到的信息,后者改变轨迹是否还有后续;两者都可能影响训练最终拿到的奖励。
论文把任务记为 ,轨迹记为 ,目标写为
这里 是可执行验证器给出的二值结果。关键不在期望符号,而在 的两个上标:行为分布由模型和 harness 共同决定。即使权重完全相同,在“第一次提交直接结束”和“发现提交不是补丁时保留一次修正机会”这两种框架里,模型能走到的轨迹也不同。
为了把这个关系展开,可以使用下面的解释性分解:
这不是论文额外提出的公式,而是一种理解方式。 在 harness 提供的上下文 下选择行动; 表示环境反馈、上下文加工和结束规则,其中一些过程是确定性的。它说明一个简单事实:如果回合已经被接口结束,模型再强也无法在同一条轨迹里利用下一条反馈。

图 1:依据论文第 2、3 节重绘的交互过程。模型生成行动,harness 组织观察、反馈和结束条件。这是机制示意,不是实验数据。
另一个基础概念是信用分配。工具返回的几百行日志会影响下一步行动,但这些日志不是模型采样出来的动作,不能当作 assistant token 一起计算策略损失。反过来,工具输出不参与动作梯度,也不代表它对训练无关紧要:它决定了模型下一步有机会学到什么。
还要记住验证器测量的对象。软件修复评测要求交付的产物能够被应用,并通过相应测试。这个事件同时依赖“修复是否正确”和“修复是否正确交出”。它并不直接测量所有工程质量,例如可维护性、安全性、对未覆盖边界的影响。成功率是重要结果,但不是模型能力的全部定义。
3. 为什么采用交替优化?
Self-HPO 的 H-step 固定当前模型,搜索运行框架;P-step 固定选中的框架,训练策略。训练后得到的模型既是下一轮的 solver,也是 proposer。任务集也随之更新,形成模型、框架和失败分布之间的反馈关系。[1,第 2 节]

图 2:依据论文方法和算法 1 重绘。实验每轮搜索 6 个候选 harness,再做 50 次策略更新,共进行两轮。
这个过程有一点坐标优化的味道,但不能直接套用连续优化中的收敛直觉。Harness 候选是离散程序修改,数量很少;每个分数来自随机轨迹;策略更新优化的是采样得到的替代目标;下一轮搜索任务还会变化。因此,“轮流更新两个部分”并不能推出全局最优,也不能保证每次接受的修改都提升未见任务表现。
它的实际优点是把变化拆开。在 H-step 内,候选都面对同一模型,可以比较框架的作用;在 P-step 内,模型面对稳定的工具和反馈规则,不必每个回合都适应新接口。如果两个部分每一步都同时变,失败就很难解释:是模型选错了行动,提示词改变了行为,还是结束规则让一个本来可以挽救的轨迹提前终止?
但“拆开更新”不等于两部分独立。新 harness 改变策略见到的数据分布,策略更新又改变下一轮哪些问题值得修。论文正是希望利用这种跨阶段耦合。最初从 2,484 道训练任务中均匀抽取 300 道作为搜索集;后续则把上一阶段训练中从未成功过的任务交给下一轮搜索,并重新生成当前模型下的轨迹证据。
这里复用的是难题身份,不是把早期模型的失败日志永久当成事实。这个区别很重要:一个模型训练后可能已经不再犯早先的错误,继续围绕旧轨迹打补丁,可能会修错问题。
4. H-step:从失败轨迹中找值得修改的流程
一轮搜索并不是同时随机生成六个框架,然后挑一个最高分。它先评估当前 harness,保留为基准;随后逐个提出候选,每次围绕当前最好的框架修改。已经评估过的框架和它们的轨迹都会进入经验集合,下一次提案可以参考成功与失败的尝试。即使候选没有被接受,它产生的失败证据仍然有价值。[1,算法 1]
算法 1:单轮 harness 搜索
输入:当前框架 H、固定策略 P、搜索任务集 S、候选预算 K=6
1. 在 S 上评估 (H, P),保存分数 v 与轨迹 T。
2. best = H,best_score = v,经验集合 = {(H, T)}。
3. 对 k = 1, ..., K:
4. 让 P 根据经验分析失败,并提出对 best 的修改。
5. 使用相同的 P,在相同的 S 上评估候选。
6. 把候选及其轨迹加入经验集合。
7. 只有候选分数严格更高时,才替换 best。
8. 返回 best;如果没有提升,就保留原框架。
候选之间使用相同的任务集,这个控制很重要。如果一个候选碰到更简单的题,另一个碰到更难的题,分数差就不能直接解释成框架差。把原框架也放进候选比较,则为本轮提供了一个已测量的退路,不必因为“已经开始优化”就强行接受某个新设计。
不过,严格大于并不等于统计显著。每个候选在每道搜索题上只跑一次,分数会受到采样影响。在同一组题上反复选胜者,还可能逐渐选择到特别适合这组题的规则。搜索集上的单调分数,只是局部选择标准,不是未见任务的性能保证。把这个边界写清楚,比把过程称为自动进化更有解释力。
附录中的提案约束也值得注意。提案者被要求保留父框架的方法,并新增一个机制,同时保持模型、采样参数、步数、token 预算和验证器不变。这样至少排除了一类简单取巧:不能仅靠偷偷增加推理预算,声称框架变好了。每次新增一个机制,也让人比较容易解释“这一轮到底改了什么”。
代价是搜索空间带有累积偏好。如果早期修补针对的弱点后来已被 RL 内化,旧控制可能仍然留在框架里。两轮实验还不足以判断这种累积是否会成为负担,但这是长期运行时必须考虑的问题。合理的替代方案包括删除过时规则、合并重叠提醒,或者允许回滚某个局部机制。这些是后续研究建议,不是论文已经执行的步骤。
还有一个容易被“自我改进”叙事掩盖的信息来源:提案者在诊断训练失败时可以查看参考修复。约束禁止把参考补丁或任务专属事实写进通用 harness,但允许利用这些训练证据理解错误。因而它不是零数据学习。关键问题是从训练答案中抽象出的规则能否跨任务有效,以及测试任务与这些信息是否严格分离,而不是简单地问“有没有外部大模型”。
论文也做了更强外部提案者的对照,称为 HPO,由 Opus 4.8 提出框架改动。Self-HPO 则使用当前策略自己提案。后者减少了对更强提案模型的依赖,却仍然依赖预训练模型、任务集、验证器和大量轨迹。不要把减少一种外部依赖,写成不再依赖任何外部知识。
5. P-step:新框架为什么会改变训练信号?
选出 harness 后,作者在这个固定框架下收集新鲜的 on-policy 轨迹,并更新策略。这里的重点不只是数据“更好看”。如果旧框架在第一次错误提交后立即结束,新框架则让模型看到反馈并补交一次,那么后一种轨迹里会出现旧框架根本没有提供过的恢复行动。
这会改变奖励分布。模型未必立刻学会了更难的程序修复,但可能更经常把已有修复转化成成功样本;成功与失败并存,又会为组内相对优势提供更清楚的信号。因此,接口改动既能影响当前推理表现,也能改变未来策略学习所依赖的数据。
作者使用 GRPO,并结合 Orchard 中的 Balanced Adaptive Rollout,简称 BAR。附录给出的设置是:每道题先采样八条轨迹,再挑选四条,使成功比例落在 0.25 到 0.75 之间,也就是四条中有一至三条成功。持续采样任务,直到凑齐 32 个合格组;一次更新使用 128 条被选中的训练轨迹。[1,附录 A]
“被选中的 128 条”不能写成“总共生成 128 条”。八选四已经产生额外开销;无法构造混合奖励组时,采样也不会自动变成免费。训练批次大小只告诉我们送入优化器的数据量,并不告诉我们为了取得这些数据付出了多少工具调用、测试运行和生成 token。
论文的 actor 目标只对 assistant token 计算。令 是轨迹里的 assistant 位置集合,可以紧凑地写成
是当前策略与 rollout 策略对该 token 的概率比。下界 0.8、上界 1.28 来自附录给出的非对称裁剪参数 0.2 和 0.28。这里展示的是 actor 替代目标;完整训练还报告了 的熵系数,并且不加 KL 惩罚。不能把这一个式子当成所有训练系统行为的完整描述。
先看优势为正的情况:提高概率比会增加未裁剪目标,但超过 1.28 后,取较小值使这部分激励不再增长。再看优势为负的情况:减小概率比有利于降低坏行动概率,但降到 0.8 以下后,裁剪项阻止继续获得更大的替代目标收益。它限制的是沿有利方向过度更新的激励,并没有硬性保证整个新策略始终处于一个固定信赖域内。

图 3:把优势分别设为 +1 与 −1,直接计算式(3)的替代目标。纵轴是要最大化的量,损失再取其负值。这是解析示意,不是训练日志。
轨迹长度归一化也不能忽略。对 assistant token 求平均,可以避免长轨迹仅因 token 更多就在损失中占据更大权重。但终局奖励仍会给许多行动分配同一个轨迹优势:一次成功提交,并不能直接告诉优化器哪些早期搜索是多余的。Harness 可以改善轨迹组织和恢复机会,却没有因此彻底解决长时序信用分配。
6. 逐步推导:二值奖励怎样产生组内学习信号?
考虑同一道题的一组 条轨迹,奖励 只能是 0 或 1。记这一组的成功比例为 。为了说明常见的组内标准化,可以先忽略数值稳定项,并使用总体形式的方差。成功样本占比是 ,每条偏离均值 ;失败样本占比是 ,每条偏离均值 ,因此
于是,成功轨迹的标准化优势是 ;失败轨迹的是 。这段推导是解释组内相对奖励的背景知识,不是在替论文补充一个未明确给出的方差实现约定。是否使用不同的归一化常数,并不改变下面最核心的退化现象。
当组内全部失败时,减去组均值后每条仍是零;当组内全部成功时,也没有组内相对好坏可供区分。长轨迹可能耗费很多 token,却没有提供直接的结果对比。这就是为什么“让原本全失败的一组出现一条成功”可能同时带来两种收益:当前任务更容易做成,下一次策略更新也更容易得到有效区分。
不过,全成功和全失败的含义不同。全成功可能说明任务已较容易,再采样的边际学习价值低;全失败则可能说明任务太难、交付流程有问题,或奖励对有进展的失败过于粗糙。单看零方差不能判断是哪一种。Harness 搜索的价值,在于有机会把其中一部分流程性失败转化为模型能够利用的成功。
再做一个明确带假设的计算。假设每次 rollout 独立,成功概率都等于 。一组样本包含两种结果的概率为
推导就是从 1 中减去全成功与全失败的两个互斥事件。当 时,四次尝试得到混合结果的概率是 0.3438;八次尝试至少出现一次成功和一次失败的概率约为 0.5695。只要八条中两种结果都有,就能选出一个含一至三条成功的四条子集。这个简单计算解释了先多采样再组队的动机。

图 4:式(5)在四次和八次独立尝试下的曲线。它是教学用的概率模型,不是 BAR 的实测效率,也没有假设真实编码轨迹一定独立。
真实训练里,同一道题的轨迹可能高度相关,模型能力随更新变化,任务还会被自适应重采样。因此,这条曲线不能直接拿来估计实际训练成本,也不能据此声称成功概率提高了某个精确比例。它只说明:奖励平衡需要信息,而获得信息常常需要额外采样;成功组比例和生成成本必须一起看。
7. “从未解决”的任务集,实际上带着什么偏好?
下一轮 harness 搜索使用上一轮 P-step 中从未被解决的任务。这里的“从未”覆盖该训练阶段采到的轨迹,不是只在最终 checkpoint 上测一次。只要中途有一条成功,这道题就不再属于零成功集合,即使最终策略在它上面仍然很不可靠。
这个规则选择的是“尚未观察到成功”,不是直接选择“当前真实成功率最低”。两者有联系,但不能画等号。仍采用独立同分布的解释性模型:某题真实成功概率为 ,获得了 次尝试,那么它仍留在零成功集合的概率为
每多一次尝试,就再乘一个失败概率。由此可以看出,集合身份同时受题目难度与采样次数影响。两次都失败和二十次都失败,并不是同等强度的证据。在实际训练中 也会变化,更准确的抽象应该使用各时刻失败概率的乘积;这个简化式只是帮助我们理解选择偏差。
刷新任务集的理由很充分:早期模型的难题,未必还是训练后模型最值得修的难题。但“从未成功”仍可能错过两类情况。一类是偶然成功一次、整体仍然很不稳定的任务;另一类是原本稳定成功,却被新控制干扰的任务。只盯着最难的一端,还可能让有限的搜索预算被暂时超出模型能力的题占满。
算法 2:论文实验中的两轮联合优化
输入:H0、P0,以及包含 2,484 道题的训练集 D
1. 均匀抽取 300 道训练题,作为 S0。
2. 对 t = 0, 1:
3. H[t+1] = 算法 1(H[t], P[t], S[t], K=6)。
4. 在本轮策略训练中固定 H[t+1]。
5. 采集 on-policy 轨迹,并用执行结果给出二值奖励。
6. 组成奖励平衡的组,进行 50 次策略更新。
7. 把本阶段从未成功的任务身份记为 S[t+1]。
8. P[t+1] 同时担任下一轮的 solver 和 proposer。
9. 在未参与训练的基准上评估最终组合 H2、P2。
作者把难题集趋于稳定作为停止的考虑,实验做了两轮。集合稳定不代表继续训练一定无效:也可能是搜索空间太窄、探索不足、奖励无法区分进展。若要分析长期行为,除了集合大小,还应报告成员替换、题目曝光次数和失败类别变化。两个集合一样大,并不意味着它们包含同样的问题。
一个值得比较的替代方案是分层搜索:保留从未成功的任务,也保留低成功率但有学习潜力的任务,再留一小组已稳定解决的任务检查退化。它可以把“找到新能力”和“保护已掌握能力”分开测量。论文尚未比较这样的课程,因此不能把当前规则当作已经证明最优的选择。
8. 实验设置:先确认数字的分母
主实验使用 Qwen3.5-35B-A3B 和 mini-SWE-agent。训练集由 SWE-rebench、SWE-rebench V2、Scale-SWE 中的 2,484 道 Python 项目任务组成,harness 搜索和策略训练都使用这个训练池。评测包括 500 道 SWE-Bench Verified、300 道 SWE-Bench Multilingual,以及 SWE-Bench Pro 的公开 V2 测试集 642 道题。Multilingual 覆盖九种非 Python 语言。[1,第 3.1 节]
附录报告训练使用单节点八张 B200,训练框架为 slime,服务使用 SGLang。每个 P-step 做 50 次更新,总计 100 次;每次 32 组、每组四条,训练 batch 为 128,跑一个 epoch。Adam 使用恒定学习率 、weight decay 0.01;温度和 top-p 均为 0.95;评测最多 250 步。这些是论文提供的设置,不是我重新运行作者训练得到的观察。
外部 SFT 对照从同一批训练题收集 Opus 4.8 的成功轨迹,训练两个 epoch、batch 64、学习率 、warmup 10%。同一任务来源有助于比较,但不等于所有资源完全对齐:外部模型采集示范、harness 搜索、策略多次 rollout 的成本结构都不同。仅仅说“都训练了多少步”,不足以回答谁更省算力。
表 1 的主要指标叫 avg@3,意思是三次完整评测运行的成功率取平均,并报告标准差。它不是 pass@3,也不是给每道题三次机会后挑最好的答案。这个区别必须明确,否则一个平均成功率会被误读成多次采样后的覆盖率。
表中的 Avg 又是另一层平均:三个基准百分比的算术平均,未按题目数量加权。例如 Self-HPO 的 。如果把所有 1,442 道题混在一起计算,642 道题的 Pro 会占更大权重,结果会不同。两种统计各有含义,不能在叙述中随意交换。
论文对环境或 API 错误进行重跑,试图把基础设施事故与智能体能力分开。这是合理测量选择,但也意味着真实部署还需要另一组指标:运行失败率、重试次数、延迟和费用。一个在排除服务异常后很强的系统,未必拥有同样好的端到端使用体验。
9. 主结果:联合优化赢在哪里?
下面摘录论文表 1 的均值,单位都是解决任务的百分比。原表还提供了标准差;这里先保留均值,便于比较不同设置的模式。进行具体的不确定性分析时,应回到原表,不能只看柱子的高低。
| 方法 | Verified | Multi | Pro | 三基准平均 |
|---|---|---|---|---|
| Base | 61.0 | 54.2 | 58.3 | 57.8 |
| 外部 SFT | 65.0 | 49.6 | 49.1 | 54.6 |
| Meta-Harness | 69.1 | 56.5 | 64.8 | 63.5 |
| 外部 HPO | 71.6 | 61.4 | 66.0 | 66.3 |
| RLVR | 67.5 | 56.3 | 61.8 | 61.9 |
| Self-Harness | 65.2 | 54.3 | 60.7 | 60.1 |
| Self-HPO | 69.5 | 59.7 | 65.2 | 64.8 |

图 5:根据论文表 1 的均值重绘。同一种方法下的三根柱子对应三个基准,不是三次重复实验。此图省略误差棒,柱高之差本身不是显著性检验。
在自我改进设置中,Self-HPO 对两个单独优化的基线都形成了稳定方向的优势。相较 RLVR,Verified 提升 2.0 点,Multilingual 和 Pro 都提升 3.4 点。相较基础模型,两个分布外基准分别提升 5.5 和 6.9 点。这支持联合优化不只是针对原有 Python 任务集做局部修补,也能迁移到其他修复场景。
但外部提案模型仍然有价值。外部 HPO 的 Verified 是 71.6,三基准平均 66.3,分别比 Self-HPO 高 2.1 和 1.5 点。因此,准确的结论是“不用更强外部提案者,也能获得明显的联合优化收益”,而不是“自我提案已经超过更强模型”。把这一点写清楚,并不会削弱结果,反而明确了方法降低依赖时付出的性能差距。
SFT 的结果很值得停一下。它在 Verified 上比 Base 高 4.0 点,却在 Multilingual 上低 4.6 点、Pro 上低 9.2 点,三基准平均低了 3.2 点。这说明这套示范数据和训练设置的迁移并不理想。不能据此推广成“监督学习必然不如 RL”,因为示范选择、数据混合、目标函数和训练预算都可能影响泛化。
相比之下,Meta-Harness 不更新目标模型权重,却获得较好的跨基准收益;外部 HPO 再把框架与策略更新结合起来,进一步提升。这组对照提醒我们:从强模型获取知识,不一定只能通过蒸馏到权重;也可以把它用于改进目标模型的交互流程。两条路线转移的信息不同,失败边界也不同。
Self-HPO 的 Verified 数字为 ,三基准平均为 。这里的标准差描述报告的评测运行波动,不是置信区间,也没有自动覆盖重新训练、重新搜索 harness、重新划分任务带来的全部随机性。主结果方向是清晰的,但整个优化程序的方差还需要更多独立重复来估计。
10. 交叉评测:协同有效,但不能说策略在所有接口下都更强
我认为表 3 比单看最终分数更有分析价值。作者把三代 harness 和三代策略交叉组合,在 Verified 上评测。这样就能区分:某个组件自身带来了多少收益,以及原配组合额外带来了多少收益。
| 框架 / 策略 | |||
|---|---|---|---|
| 61.0 | 61.7 | 64.4 | |
| 64.3 | 67.8 | 68.1 | |
| 64.5 | 68.6 | 69.5 |

图 6:论文表 3 的 Verified avg@3 均值。行表示框架,列表示策略;最终两者一起使用时得分最高,单独换回初始组件时也保留部分收益。
以 61.0 为起点,只替换为联合进化得到的 ,得分为 64.5,增加 3.5 点;只替换为 ,得分为 64.4,增加 3.4 点;两个都替换,达到 69.5,增加 8.5 点。把两个单独收益相加是 6.9 点,比联合收益少 1.6 点。可以把这个描述性交互量写成
单位是百分点。这是根据表格做的差分计算,说明这些配对中的联合收益超过两个单独收益之和。它不是已经完成统计检验的“显著协同”,也不是脱离搜索与训练历史的随机化因果估计。数字本身有解释力,但结论不应超过数字支持的范围。
这里有两组特别容易混用的值。表 3 中 配原始 的 64.5,不是表 1 中独立优化 Self-Harness 的 65.2。前者的框架是在联合训练路径上长出来的,后者则走了另一条优化路径。同理,联合训练得到的 回到 后是 64.4,也不是独立在旧框架下训练 RLVR 得到的 67.5。
这两张表回答不同问题:表 1 比较优化方案,表 3 比较同一联合路径中组件拆开后还能保留多少价值。把两种意义混起来,就会错误地声称联合训练后的策略脱离新框架也优于独立 RL。
实际结果更细致: 在旧框架下比原始策略好,说明它并非只会识别新提示词;但它仍低于专门在旧框架下训练的 RLVR。因此,论文得到的是一个更强的组合,还没有证明得到一个在所有合理接口下都占优的通用策略。
沿着训练路径看, 为 64.3,经过训练成为 的 67.8;下一轮框架更新达到 的 68.6;最后训练达到 69.5。Verified 上每步都继续提升,但后面增量变小。两轮结果足以证明这种交替可以继续有效,却不足以推导长期自我改进规律,更不能外推为无限增长。
11. 消融实验:先认清 71.6 才是参照组
论文表 2 的参照不是 69.5 的 Self-HPO,而是使用外部提案者的 HPO,分数为 71.6。把其中的策略更新换成 SFT,降到 67.2;换成对目标策略自身成功轨迹做拒绝采样微调的 RFT,得到 70.5;固定初始搜索集不再刷新,得到 70.1;把外部提案者换成当前策略,得到 Self-HPO 的 69.5。[1,表 2]

图 7:论文表 2 的均值。四项改动都应相对于外部 HPO 的 71.6 解读,不能当成从 Self-HPO 69.5 出发的四次独立消融。
RL 相较 SFT 的优势支持这套训练设计;相较 RFT 的优势较小,则说明 on-policy 成功经验本身也提供了重要价值。但仅凭终点分数,仍无法把目标函数、轨迹分布和采样数量的贡献完全分离。尤其在奖励平衡采样参与其中时,优化器看到的数据已经不是未经筛选的 rollout 分布。
固定搜索集低 1.5 点,支持“策略进步后应该换一批更合适的失败目标”。不过,这个消融只比较刷新与不刷新,并没有比较多种刷新标准,所以它还不能证明“从未成功”一定优于低成功率、高方差或按失败类型分层等其他规则。
Self proposer 低 2.1 点,则量化了这套设置中去掉更强外部提案者的代价。不能把这 2.1 点再与 SFT 的 4.4 点相加,预测同时替换两个组件会降多少,因为改动之间可能相互影响。若要估计这种关系,需要真正的组合消融,而不是默认各项差值可加。
12. pass@k:提升的是稳定性,还是能解决的任务范围?
论文另用每题八次尝试分析 pass@k。若 次里有 次成功,从中不放回选 次,至少包含一次成功的常用估计为
分母是所有选择方式,分子是只选中失败尝试的方式;两者相除给出全部失败的概率,再用 1 减去即可。如果失败次数不足 ,分子为零。这个量先逐题计算,再对任务求平均,而不是先把所有题的成功次数堆到一起。
两个边界很直观: 时,公式等于 ; 时,只要八次里出现过一次成功,这道题的值就是 1。因此 pass@1 更接近单次可靠性,pass@8 则更接近给定八次预算下是否找到过成功轨迹。论文为这组分析提供了 bootstrap 95% 置信区间。[1,图 4]
Self-HPO 的 pass@8 从 80.0% 提高到 84.8%,增加 4.8 点。这说明在这组采样中,出现成功轨迹的题目范围有所扩大,并不只是让原本能成功的题更频繁成功。不过,“能力边界扩大”仍要绑定到八次预算:基础策略八次都失败,不等于它在任意采样预算下都不可能解决该题。

图 8:根据论文图 4 明确报告的数字重绘。左侧为 pass@8,右侧为按基础策略结果划分的任务组中的 pass@1 变化;没有为未给出的中间 k 值编造曲线。
作者按 Base 的观察成功频率分组:Hard 是没有成功;Medium 是大于零、不超过一半;Easy 是超过一半但不满一;Resolved 是所有尝试都成功。Self-HPO 在前三组分别提高 6.1、17.2、12.9 点,但在 Resolved 组下降 2.2 点。
这个负值值得认真看。新框架可能挽救困难任务,却也可能打断旧系统已经处理得很好的轨迹。一个额外提醒并不是天然正确:它可能诱导不必要的检查、制造歧义、或消耗最后的预算。平均收益为正,并不说明每条新增规则都没有副作用。
同时,这些组是根据 Base 自己的采样结果定义的。被归入“全成功”的任务,既可能真的非常容易,也可能在有限样本里运气较好;“全失败”也有同样的问题。所以组内变化还包含选择效应和向均值回归的可能。它能揭示收益不均匀,却不能被当作每道题真实难度的无噪声标签。
训练分析中,Self-HPO 最后一个 P-step 的零成功组比例,在最后十次更新平均降到 6.5%;RLVR 最后五十次更新则大多处于 11% 到 17%。这个方向支持“更好的框架提供更可学习的轨迹”这一解释。但两边汇总窗口不同,不能直接拿两个摘要数字算出一个精确的相对下降比例,更不能据此完成全部因果归因。
13. 具体改了什么:必须区分外部 HPO 与 Self-HPO 的案例
论文图 5 和附录 D 展示的是外部提案者 HPO 生成的框架。它包含接近预算耗尽时的提醒、一次空补丁防护、首次非空提交前的一次检查要求,以及提交补丁不能应用时使用沙箱 diff 的后备路径。这些改变不仅调整措辞,也改变交互控制与结束时机。
每一种设计都有明确动机。预算提醒让模型在耗尽前交出最好已有结果;空补丁防护减少“做了工作却没有产物”;接口检查要求模型把 API 名称和签名与仓库测试对应起来;后备 diff 则尝试修复提交形式与工作区内容不一致的问题。它们针对的是不同阶段的失效,不能简单归类为一句“提示词变好了”。
对应的失败边界也不同。预算提醒过早可能促使模型仓促结束;空补丁规则需要考虑本来就不应修改的任务;反复要求 API 检查可能浪费已验证过的工作;直接使用工作区 diff 又必须避免带入与当前任务无关的文件。判断一个控制是否有用,要看触发条件、允许的恢复次数以及误触发成本。
这些四项控制不能直接写成 Self-HPO 最终框架的精确清单。附录 E 单独给出了自我改进设置的案例,任务是 sphinx-doc__sphinx-9658。在旧框架 下,最终策略做了修改,跑出 99 个测试通过,最后却提交了一段总结而不是补丁,导致没有正确交付结果。
换成 后的另一条轨迹通过了 195 个测试,但第一次想交的是源文件片段,仍不是 patch。框架比较了“碰过的文件”和“提交补丁包含的文件”,发现前者有一个、后者为零,于是暂缓结束一次。模型收到反馈后,转而生成合适的 diff,再完成提交。

图 9:根据附录 E 重绘的 Self-HPO 案例。两条轨迹的前缀和行动并不相同,此图用于解释交付失败与恢复机会,不代表保持其余条件相同的配对因果实验。
附录还保留了一个不那么漂亮的细节:PR intent reminder 从问题描述中提取了与实际修复不够相关的关键词,产生误报。作者明确指出了这个问题。这个负面证据反而很有帮助,因为它提醒我们:从失败中归纳出的通用规则,可能一边修复有效问题,一边制造新的错误提示。
我对这个案例的解读是,模型的修复能力需要一个可靠的交付通道才能变成奖励。但它不能回答“总提升中有多少点来自这个通道”。旧、新轨迹运行的测试数量不同、行为历史不同,不能把最终差异全部归因于那一次暂缓提交。如果要做更强的因果判断,应在同一个提交前状态分叉,只替换结束规则,再控制后续采样。
14. 成本:进入训练的轨迹只是总开销的一部分
按论文设置,两个 P-step、每个五十次更新、每次 128 条被接纳轨迹,一共是 条训练输入。这个乘法没有问题,问题在于如何命名它:它不是生成过的全部环境回合,更不是全部 token 成本。
因为八条中只选四条,数据形成前已有筛选开销;无法凑出奖励平衡组时,还要继续采样;不同任务的回合长度、工具输出、测试耗时又不同。所以即使拿到完整 rollout 数量,也还需要长度分布和工具执行时间,才能做可靠的资源比较。
第一轮 H-step 的基础账目可以算得更清楚:六个候选乘以 300 道搜索题,是 1,800 条候选评测轨迹;再加上对进入本轮的框架评测 300 条,至少包括这 2,100 次任务评估。这里还没计提案生成、失败重试,也没有假设第二轮搜索集仍有 300 道题,因为后续集合大小由训练结果决定。
如果要完整比较资源,可以采用下面的记账分解:
它是本文建议的成本分类,不是作者已经拟合的费用模型。实际需要记录墙钟时间、模型生成 token、工具上下文 token、验证器耗时、轨迹接纳率,以及最后得到的质量。优化器更快不代表数据获取更便宜;训练更贵,也不代表在大量后续任务上无法回本。
这里还有预算分配问题:固定资源下,多做一轮 harness 搜索,还是多做一些策略训练?答案应该依赖剩余失败类型。模型经常做出有用改动却交付失败,说明框架仍有空间;如果能稳定交付但语义修复总是错,继续加结束提示可能帮助有限。论文展示了一种有效分配,却没有完整描出搜索预算和训练预算之间的最优边界。
15. 局限:哪些结论还不能从这篇论文推出?
第一,主要实验围绕一个基础模型和两轮交替优化。它没有证明更弱模型也能提出有用控制,也没有证明更强模型会获得同样幅度的收益。更没有证明长期循环稳定:框架可能累积互相冲突的检查,策略也可能越来越依赖特殊的反馈顺序。两轮有效,是具体而有价值的结论;长期自治增长则需要另一组证据。
第二,任务和验证器的结构非常重要。训练来自 Python 修复任务,跨分布评测扩展到其他语言和更复杂的软件工程问题,这确实构成迁移。但它仍然主要位于软件修复领域,不能直接推广到科学探索、开放式规划或主观质量评估。在这些场景里,成功信号可能昂贵、有噪声、不可重复,甚至根本无法化成一个明确的二值奖励。
第三,搜索决策具有随机性与适应性。在同一个搜索集上连续看结果、连续挑胜者,会面临选择偏差。最终独立基准能够检查总体泛化,却没有为每次接受候选的决定提供统计保证。“至少保留原框架”是工程上的合理退路,但原框架那一次测量本身也有噪声。
第四,整体成功尚未被充分拆解。补丁形式有效、补丁语义正确、测试覆盖充分,这些是不同层面的条件。Benchmark 要求正确交付,因此改善交付本来就是合法收益;只是我们在讨论能力时,应把它与发现更复杂修复的能力分开。案例证明交付瓶颈确实存在,却没有给出它在全部增益中的占比。
第五,组件可迁移性和局部退化都还存在。交叉矩阵显示新策略在旧接口下仍保留收益,却不及专门在旧接口中训练的 RLVR;难度分组显示最初全成功的任务有 2.2 点退化。这些并不否定主结果,而是说明“平均更好的组合”与“每个组件处处更好”不是一回事。
第六,终点质量与完整资源效率还没有完全对齐。成功率差异清楚,不代表可以在缺少总生成轨迹和总 token 的情况下计算性价比。尤其是提案者有无外部大模型、奖励平衡需要多少额外尝试,都会改变成本。只报训练 update 数不足以涵盖这些差异。
16. 批判性分析:怎样把合理机制变成更强的因果证据?
我的总体判断是,Self-HPO 找到了一个可信且实用的反馈回路,但回路内部各条因果路径还没有被完全测量。更好的框架能提供更可学习的轨迹;更好的策略能利用新框架,也可能提出更好的框架;更新难题集又把预算转向当前薄弱点。主结果、消融和案例都支持这种解释,但“解释合理”与“每个渠道贡献已被分离”之间仍有距离。
首先,应把修复能力与交付效率分开测。 可以在提交前保存状态,分别测量工作区是否已有正确修改、最终是否形成有效 patch、有效 patch 是否通过验证器。接着从同一状态出发替换结束规则,并控制后续采样。这样能估计一次暂缓提交到底挽救多少本来已正确的工作,也能发现哪些额外提醒反而破坏了正确结果。
这个设计还可以把“能修好但没有交出”与“没有修好却因为流程看起来完整而被误判”区分开。对使用者而言,交付可靠性本来就是能力的一部分;对研究而言,拆开测量能解释训练到底改变了什么。两种视角不冲突,关键是不要用一个总分替代所有细节。
其次,应扩展跨 harness 评测。 当前表 3 已经比只测最终组合更有价值,但所有组件都来自同一条联合演化路径。若进一步在多种框架下训练,并在未参与训练的合理接口上评测,就能更清楚地区分可迁移的修复知识与对一套特定反馈话术的适应。
目标不是要求策略对任意坏接口都不敏感,而是考察正常工程变化:工具返回格式改变、提交协议不同、错误反馈措辞调整、上下文截断策略变化。若只换一点表面格式就丢失大部分收益,说明学习更多依赖交互约定;若收益稳定保留,才更有理由说模型获得了可迁移能力。
第三,应给 1.6 点交互量配上合适的不确定性。 对同一批任务的四种配置做配对 bootstrap,可以保留结果之间的相关性;多次独立搜索和训练,则能估计整个方法的程序级波动。单看四个单元各自的标准差,并不足以判断差分之差是否稳定。最终组合比基线强,和“超出两项相加的部分显著为正”,是两个不同命题。
第四,应控制难题集中的曝光差异。 从未成功只是观察结论,强度随尝试次数变化。把题目按采样次数、估计成功率、失败类型分层,再比较零成功课程与其他刷新策略,能够检验真正起作用的是“换题”本身,还是特定的零成功标准。同时加入一小组稳定回归任务,可防止框架只顾挽救新失败,却破坏已经掌握的行为。
第五,应允许框架忘掉过时的补丁。 每轮新增一个机制有利于局部解释,但也可能把 harness 变成历史弱点档案。有些提醒在训练初期很有用,等策略内化后继续触发就只剩成本。定期删除、压缩、合并控制,并测量效果,可以判断系统是否学到了持久能力,还是一直靠越来越复杂的外部支撑维持表现。
这里也存在一个有趣的调度问题:某条控制是否该被“蒸馏”进策略,然后从接口中移除?如果移除后表现稳定,说明学习已经接管了功能;如果立刻退化,就需要保留它,或者继续训练。这样的实验比简单展示 harness 代码越来越长,更能说明自我改进的质量。
最后,应完整说明信息和资源来源。 Self-HPO 不需要更强的外部提案者,是一个有意义的特性;但初始模型、精选任务、参考修复、执行测试都提供了信息。把这些来源说清楚,同时记录所有生成轨迹和工具成本,比宣称“系统完全靠自己”更有研究价值。清楚的边界不会削弱成果,只会让其他人知道它适合在哪里继续发展。
17. 结论:先优化组合,再看拆开后剩下什么
这篇论文最有说服力的地方,是把 harness 从训练前固定好的外围配置,变成了可以与策略交替改进的学习条件。最终 Self-HPO 在三个软件修复基准上都超过只改框架或只训策略的基线;交叉评测表明两个组件拆开后仍保留部分收益;pass@8 则显示在给定尝试预算下,出现成功轨迹的任务范围也扩大了。
但读完后,我更愿意带走一个评估原则:不要只问最终组合强不强,还要问策略换接口后怎样、框架换模型后怎样、原本可靠的任务有没有退化,以及为了生成有效训练信号付出了多少开销。这样才能知道改进发生在能力、接口、数据分布,还是它们的配合之中。
Self-HPO 是一次扎实的两轮联合优化展示。还需要继续研究的是长期控制累积、跨接口迁移、交付与推理的贡献分解,以及完整资源效率。今天加入队列的 HASE 和 HarnessBandit 正好延伸这两个方向:前者把解题与改 harness 纳入同一行动空间,后者研究多个 harness 之间的策略训练调度。它们提供了不同的耦合方式,值得接着比较。
参考资料与图表说明
- Zhepei Wei, Wenlin Yao, Baolin Peng, Danqing Wang, Qianhui Wu, Hao Cheng, Yu Meng, Jianfeng Gao. Self-Evolving Coding Agents via Harness-Policy Optimization,v1,2026-10-16。本文依据完整正文与附录 A–E;核心证据包括方法与算法 1、附录 A 的训练设置、表 1–3、图 4 和附录 E 的轨迹案例。
- Haochen Luo 等,Harness-Aware Self-Evolving: Co-Evolving Model Weights, Harness, and Task Solutions,2026-07-04。作为后续候选阅读,不是本文新增测量的基线。
- Hongliang Wei 等,HarnessBandit: Joint Learnability-Transferability Scheduling for Multi-Harness Agentic Reinforcement Learning,2026-09-12。作为多 harness 训练与迁移问题的后续阅读。
九张图均为本笔记重新绘制。图 1、2、9 是机制或案例示意;图 3、4 是明确标注假设的解析示例;图 5–8 重绘论文已报告数值。本文没有新增实验结果、复现结论,也没有为未报告的曲线点补造数据。