把改 harness 和改权重分开记:完整轨迹定位该改哪里,分数越好看越要回查。
关于 AI 自我改进,我的笔记连写了三页多:前面是工作流、文件记忆、子代理,后面转到模型权重更新。整理时得先说清“改了什么”,不然换提示词、改工具和训练模型会被混成同一种进步。
Harness 和权重是两处不同的改动
我把 harness 理解为模型周围的运行机制:工具调度、提示结构、解析、重试和搜索流程。权重更新改的是模型自己的参数。
两者生效的路径不一样。harness 改完,后续执行就用上新机制,但下一次结果未必跟着变;权重要先走一遍训练流程,新参数再回到执行环节。
同一次失败可能出在任何一边。两边分开记录,事后追查才有材料可看;不过记录只提供线索,单凭它判定不了问题出在哪边。
SIA 的论文开头其实就是这么起题的。它把之前的自改进研究分成两摊:一摊让元 agent 重写工具、提示、重试和搜索,权重冻结;另一摊用手写的 RL 流程做 test-time training,harness 冻结。作者说这两摊 “operate in isolation”(论文 §1.2)。摘要里对两边的分工有一句很干脆的说法:
Harness updates make the model agentic, shaping how it searches and acts … weight updates build the domain intuition that no prompt or scaffold can instil.
SIA: Self Improving AI with Harness & Weight Updates 把这两种更新放进同一个反馈循环:task-specific agent 执行任务,反馈智能体依据轨迹决定修改 harness 还是发起权重更新。下图画出这个循环,省略了训练内部的步骤。
查看 Mermaid 源码
flowchart TD spec["任务规格和验证器"] --> meta["Meta-Agent:构造初始 Harness"] meta --> run["Task-specific Agent:执行任务"] run --> trace["执行轨迹与验证反馈"] trace --> feedback["Feedback-Agent:选择改进方向"] feedback --> harness["更新工具、解析或工作流程"] feedback --> weights["调用训练流程更新权重"] harness --> run weights --> run图里画成“选一个方向”,实际跑起来是一串交错的决策。论文 §5.1 特意说明,harness 更新和权重更新只是 “soft labels for these two action types, not rigid sequential stages”;Figure 2 举的 7 步例子,决策序列是 H/H/H/W/H/W/W。也就是说,先改哪边、什么时候切换,本身就是每一步的决策,顺序也得记进日志。
角色分工在 §5.2 里是写定的:Meta-Agent 和 Feedback-Agent 用 Claude Sonnet 4.6,执行任务的 agent 用 gpt-oss-120b,权重更新一律 LoRA(rank 32)。Meta-Agent 生成初始脚手架时会同时看多个任务规格,避免一开始就过拟合某个 benchmark。
论文在三个任务上比较了更新方式:法律分类、GPU kernel 优化、单细胞 RNA 去噪。这里只整理方法,不抄性能数字,也不把这几个特定任务的结果推广成通用能力结论。原文和版本可以从 v2 全文回查。
完整轨迹才说得清该改哪里
反馈智能体读的是完整 trace。答案错了,原因可能是:
- 没有拿到材料;
- 工具解析失败;
- 搜索策略没覆盖到;
- 模型在已有材料上判断失误。
这几种情况可能得到同样的低分,要改的位置却各不相同。只留一个总分,区别就被压平了。
保存轨迹也不用无限堆消息,能定位四样东西就行:任务输入、工具返回、关键状态变化、最终验证结果。分辨失败通常要把它们合起来看。材料拿没拿到,除了任务输入,还要看工具返回和当时的上下文;解析是否失败,看解析后的状态或报错;最终验证只报出错,不一定说明模型错在哪。
轨迹里关于路径、组件和决策的记录,是带着具体问题回头核对用的,单看某一项对不出结论。
改动落在外面还是里面
论文 §7.2 和 §7.4 给了一组对照,正好当判据用。harness 迭代改出来的东西都是“外置”的(externalised):LawBench 上多了答案抽取层和一个 SVC re-ranker,GPU kernel 任务上多了 CUDA 编译错误解析器和取中位数的计时工具,单细胞去噪任务上多了批量配置驱动。这些是软件工程层面的改进,checkpoint 没动。
权重更新编进去的则是“内化”的知识:191 类罪名之间更细的区分,H100 上的 kernel 写法(shared-memory tiling、fp32 寄存器累加),还有去噪任务里一个两行的后处理——np.clip 加 np.rint,把插补出的计数取成非负整数。论文说这一步 “no scaffold edit could encode”,harness 从来没提出过。
所以排查时先问一句:缺的是外部工具,还是模型不知道的领域规律?前者去翻轨迹,后者去翻训练记录。
开源实现怎么落盘
官方实现把这套记录做成了文件。每个任务目录分 data/public/(task.md 和可见输入)、data/private/(留出的评测数据);评测器是 data/public/ 下的 evaluate.py,对私有数据打分、结果写成 JSON。每一代落到 runs/run_{id}/gen_{n}/,里面是 target_agent.py、agent_execution.json、improvement.md:当前的 harness、执行轨迹、这一轮改了什么,和上面说的四样东西基本对得上。
README 里有一条安全提醒值得照抄:默认的 --sandbox none 会以宿主权限运行 agent 生成的代码,不是可信任务就用 --sandbox docker。
分数越好看,越要回查实际问题
笔记在 Goodhart effect 旁边画了个框:优化过程可能只让硬指标变好。周围还列了几种风险:过度乐观、失败后仍报告成功、领域判断不足、实验偏离问题。这些是笔记里的研究疑问,不是对 SIA 的逐项实验结论。
不过论文自己在 §8 局限里也认了一个耦合版本,叫 coupled co-evolutionary Goodhart:harness 搜索和 RL 优化的是同一个固定验证器,每一轮都在改变对方的输入分布,最后得到的更像“两个互不知道对方更新历史的优化器之间的 Nash 均衡”,所以可能 “look strong on the training verifier yet be fragile under perturbation”。另外全文没报 GPU 小时、墙钟或花费,循环只写到 “until the step budget is exhausted”。回查时可以多问一句:这分数是用多少算力换的。
同一批结果的写法也能差很远。README 首段的提升是相对初始脚手架算的,论文摘要是相对之前的 SOTA 算的,§7.1 里 GPU kernel 那个百分比又是拿 harness-only 的最好成绩当基线。两边不矛盾,但换个基线,“快一成多”就能写成“省九成多”。引用任何一个数字,都得连基线一起抄。
检验一次改进,就回到失败类型上看三件事:原来失败的案例修好没有,其他案例有没有退步,改动是不是只是在适配当前评分器。每一轮具体改了 harness 哪部分、训练用了什么流程,也要记下来,才分得清效果来自哪一步。
后来的工作把这一步做成了硬门槛。VACE 每轮 RL 之后提一个 harness 修改,新旧 harness 在同一个新模型下比,验证变好才采纳;它的 44 个提案里有 17 个降低了验证表现,被直接拒掉。VERSE 的结论更直白:没有基于执行的验证,自演化提升不了表现。
最能说明“两边要对着记”的是一个反例。Co-Evolving Harnesses and Models 先用弱模型演化出 harness,再在演化后的 harness 下用强专家的轨迹做模仿训练,结果七个企业任务全部回退 4 到 30 分;同样的流程放在没演化过的 harness 下反而有益。作者的解释是模仿 “disrupts model-harness fit”:弱模型学了专家的规划方式,却执行不了,也不再匹配按自己风格长出来的 harness。只看权重侧或只看分数,都发现不了这件事。
还没展开的阅读线索
待读的还有 AlphaEvolve、ADAS、AFlow 和 STOP。它们允许修改的对象、调用的工具和反馈来源可能各不相同,逐一核实之后再比较才有意义。
先按“改什么”粗分一下,坐标借论文 §4.4 的 Table 1(改不改 harness、改不改权重):
| 方法 | 改什么 | 反馈从哪来 |
|---|---|---|
| AlphaEvolve | 用进化循环改整段代码 | 自动评测器 |
| ADAS | meta agent 用代码写新的 agent 设计 | 不断增长的设计档案和任务表现 |
| AFlow | 用代码表示的工作流,MCTS 搜索 | 数据集上的评测 |
| STOP | 脚手架程序改进自己,模型不变 | 下游任务效用 |
这四个都不动权重。STOP 论文自己说 “the language models themselves are not altered”,所以不算完整的递归自改进。SIA 的 GPU kernel 任务正是取自 AlphaEvolve 的评测集。
我还想弄清三个问题:怎么选择改进方向,一轮更新什么时候停,已经积累的经验怎么在新任务上检查。它们也决定了这种反馈循环需要保存什么样的状态。
这三个问题已经有人在拆。选方向这件事,ActiveSaddler 指出既有方法都在优化“harness 怎么改”,却基本固定了用哪些训练场景,于是把场景选择做成非平稳 bandit;AutoSaddler 则管“补丁怎么生成、怎么挑”。经验能不能迁移,Evo-Bench 专门想把 harness 带来的提升和基座模型的强弱分开测。至于什么时候停,SIA 的 §9 把“下一步选哪种动作”列成未来工作,想做成外层的 meta-RL;我觉得在这之前,VACE 那种“不过验证就不采纳”的门槛是最便宜的停止条件。
留下几句话 读者来信
读到这里,有什么想法?欢迎留下你的看法。