Skip to content

分开训练能力与工程品味

递归式 Golang 编码智能体的训练,交一份进度报告。

过去几周,我在一台 DGX Spark 上对一个 Qwen 编码模型做发展式训练。模型参与它自己的成长:它表达兴趣,一个更强的模型把这些变成有边界的编程任务,一个验证器裁决代码行不行,另一个模型提供批评,孩子有一次机会修订或保留自己的答案。说「我懂了」不值一分。写出更好的代码才算数。

第一个大孩子,v125,在多个正确实现之间的盲比中,显出了更好的工程品味的苗头。不只是「过没过?」,而是「哪一个是我真想放进代码库的实现?」然后我们对 v125 在第二份语料上做递归训练。第一把玩砸了:在原来的 2e-5 学习率下,孩子掉到 66/120,品味优势也没了。

学习率消融

于是我们跑了一次干净的消融:同样的父模型、数据、更新、种子、LoRA 几何和评测。只改一处:2e-5 → 5e-6。

回退消失了:低率孩子 74/120,原版基座 72/120,v125 父模型 70/120,之前的 SFT 68/120。恢复是全方位的。HTTP handlers 上,全率孩子曾崩到 17/30;低率孩子回到了 22/30。训练剂量是要紧的。

正确与品味分家了

但接着怪事来了。孩子在「正确」上变好,同时在「如何正确」的选择上显然变差。在宽品味集上,父子接近:18 比 16。但在预注册的严格子集上——四家模型全对且各不相同的那部分:

Base: 16
v125 父模型: 10
之前的 SFT: 6
低率孩子: 3

这没过我们的门。所以我们停了。没有新鲜的晋升基准。没有因为 74/120 好看就挪动球门柱。

这可能是关键结果:能力和工程判断,看起来部分独立。你能不能解出问题、活过验证器?这是一问。另起一问:当几条路都走得通,你选哪条?保住什么结构?拒绝引入什么复杂度?什么时候停手?

训练信号强调了什么

语料 2 里有 559 条普通解题轨迹,89 对修订,和 115 条比较偏好记录。但那些偏好记录是证据,不是直接的 SFT 目标。所以大部分梯度仍在说:「这是又一个解法。」少得多的部分在说:「这里有两个能用的解法。这个更好,理由在此。」

训练那个信号之前,得先把尺子校好。下一步是一个评审器稳定性研究:固定的正确解、盲化的标签排列、独立的评审器种子,不许对解题侧重采样。

几周前的问题是,发展式玩耍能不能改善一个编码模型。现在的问题是:能力和工程判断,能不能作为两条独立的发展轴来训练,然后一起提升,而互不抹掉对方?

感觉上,这才是那个实验。