← 返回文章选择

读 SIA:同时改工作流程和模型权重

把改 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 还是发起权重更新。下图画出这个循环,省略了训练内部的步骤。

SIA 依据执行反馈选择更新 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 那种“不过验证就不采纳”的门槛是最便宜的停止条件。

留下几句话 读者来信

读到这里,有什么想法?欢迎留下你的看法。