最近越来越觉得,很多模型“变笨”不是参数出了问题,而是技能的存放位置选错了。明明同样是让模型先分析再回答,写在提示词里的规则就是不稳定,换到权重里的能力却更可靠。这篇题为Distill Skills into Weights, Not Prompts: Abstract Skills as Privileged Signals for On-Policy Self-Distillation的研究,正是在回答一个更底层的问题:技能应该活在提示词里,还是活在权重里。
这个问题,prompt engineering 做得越久,越容易有体感。你花一个下午写好的 system prompt,换一个模型版本,效果可能直接打折;你把 few-shot 示例喂得再全,任务一变又得从头调。最近连 “weights” 相关的话题都开始频繁出现,某种程度也说明行业关注点正在从“怎么把提示词说清楚”慢慢下沉到“模型参数里到底存了什么能力”。
我对这个方向的判断是:它不是要否定提示词,而是试图把一类能力——抽象技能——从推理时的文本读取,搬到训练时的参数固化。真正值得关注的地方,不在于“能不能不用 prompt”,而在于“能力获取的层级”变了。下面把标题拆开讲清楚。
1. 提示词是“临时备忘录”,权重才是“长期记忆”
1.1 提示词为什么总让人不踏实
Prompt 本质上是一份在推理时临时注入的声明。模型每次都要重新读它,根据当前上下文来调整行为。这意味着几个天然限制:
- 提示词占用上下文窗口,技能描述写得越长,越挤占输入空间。
- 提示词是概率性的激活,换一种表达方式,行为就可能漂移。
- 提示词无法改变模型的先验知识,它只能临时“唤醒”某种行为。
在很多项目里,这三点都是硬伤。尤其是 agent 类应用,系统提示词里塞满了各种技能定义,每次请求还要带一长串历史和工具描述,推理成本和效果都受影响。技能不是被模型“拥有”的,而是每次开会时被临时提醒的。开完会,技能又还回去了。
用一个生活化的类比:教练在场边喊“注意观察后视镜”“变道前先打灯”,这是提示词;学员练了三个月之后,不用人提醒也能自然完成这些动作,那是权重。很多人把大量精力花在怎么把教练的话说得更响、更清楚,却忽略了一个更根本的问题——训练量够不够,技能有没有真正长在模型身上。
1.2 权重中的技能是“会了”,提示词只是“知道了”
“知道了”和“会了”的区别,决定了稳定性的差别。提示词再完美,也只是让模型在当次生成时按规则执行;而权重里的技能,是模型在相关输入下自动触发的行为,它不依赖外部提醒,也不需要每次重新宣读。
从训练机制看,把技能放进权重的过程并不神秘,本质是让模型在大量带技能标注的数据上做参数更新。只要训练数据分布足够贴近真实使用分布,模型就会把“输入特征 → 技能触发 → 行为输出”这条路径固化进参数。之后哪怕你什么都不写,它也会自然表现出这类技能。
这里也能解释为什么很多团队对 prompt 越来越不放心:prompt 可以随时改,但也意味着行为随时可能变。权重一旦训练完成,行为相对稳定,代价是迭代周期变长。两种方案其实各有用处,但如果你追求的是“长期稳定的能力”,权重显然是更接近本质的位置。
2. “抽象技能”和“具体任务”,是两件不同的事
为什么是技能,而不是任务?这决定了蒸馏出来的东西能不能迁移。
2.1 技能是可迁移的能力,任务是具体的目标
具体任务是“做一道除法题”“写一段排序代码”。抽象技能则是“把复杂问题拆成子问题”“先检查输入边界再做操作”“在给出答案前做一次自检”。这些技能不绑定某个任务,而是跨任务生效。
这个区别在落地时非常关键。如果把蒸馏目标定成具体任务,模型学到的是“这个输入的答案是什么”,换一种问法就失效。如果把蒸馏目标定成抽象技能,模型学到的是“遇到这类结构时应该如何组织推理过程”,迁移性要好得多。
一个典型的抽象技能清单可能是这样:
| 技能 | 典型行为 | 适用场景 |
|---|---|---|
| 逐步分解 | 把复杂指令拆成子步骤,按序执行 | 数学、代码、多步任务 |
| 先验证后输出 | 检查输入、边界、潜在错误再给答案 | 代码生成、数据清洗、agent 工具调用 |
| 结构化表达 | 按固定格式输出,保持字段完整 | 数据抽取、接口返回 |
| 自检修正 | 生成后自查一遍,发现并修复错误 | 长文本、代码、推理 |
上面这些技能,如果你用提示词来教,每一轮都要把定义重新写一遍;如果用权重来教,只要模型在训练中见过足够多“输入 → 技能 → 输出”的样例,它就能内化。长期看,维护成本反而更低。
2.2 抽象技能在蒸馏中扮演“特权信号”
论文标题里的 privileged signals,说的是训练阶段可以拿到、推理阶段拿不到的信息。技能就是这一类:训练时,你知道这条样本体现的是“逐步分解”这个技能;但推理时,你不想依赖任何技能名的提示。模型必须在没有技能标签的情况下,自己判断“这个问题需要分解”,然后自动做到。
这正是把技能做成权重而不是提示词的核心逻辑:技能只出现在训练监督信号里,不出现在推理输入里。就好比驾校教练在训练时不停提醒你“看后视镜”,但你拿到驾照以后,没人提醒你也会看。提醒的话是特权信号,会看后视镜是长在身体里的能力。
而“抽象”这个限定词同样重要。抽象技能比具体技能更容易跨任务迁移,更不容易过拟合任务表面特征;同时,训练时只需要标注一个技能标签或一段简短描述,标注成本相对可以接受。如果你把蒸馏目标换成“回答这道题的具体格式”,那它就成了任务记忆,失去了迁移价值。
3. On-Policy Self-Distillation:让模型在自己的分布里学习
标题里最不好读的一块,是 on-policy self-distillation。拆开就三件事:蒸馏、自蒸馏、on-policy。
3.1 自蒸馏为什么能成立
知识蒸馏本来是用一个大模型(或教师模型)的输出分布去训练一个小模型(或学生模型)。传统蒸馏里,教师往往是一个更强、更大或更稳定的模型。而“自蒸馏”里的教师和学生可以是同一个模型,或者同一个模型的历史快照。
这听起来有点绕:模型本来就不会的东西,向自己学能学到什么?答案在于,模型在一次生成中,往往已经具备“表现出某个技能”的潜力,只是不稳定。自蒸馏要做的,是从自身输出里筛选出高质量的那一部分,把它们变成训练数据,再让参数更稳定地朝这个方向调整。换句话说,它是在把“偶尔会”变成“每次都”。
3.2 On-policy 的价值:训练数据必须来自当前模型
On-policy 这个词来自强化学习。它要求训练数据由当前策略生成,而不是用一批别人采集好的固定数据。在自蒸馏场景里,这意味着每个训练轮次,模型先用自己的当前状态生成一批候选输出,经过筛选后再训练自己。
为什么不能直接用离线数据?因为离线数据分布和当前模型行为之间可能存在漂移。如果数据来自一个已经迭代过的旧模型,里面有些行为是新模型已经改掉的,用它做蒸馏会把模型往回拉。用 on-policy 数据,模型学到的是“在目前的参数状态下,哪些输出更好、哪种技能该被强化”,分布始终是对齐的。
一个典型的 on-policy 自蒸馏循环长这样:
- 当前模型在任务集上生成候选输出。
- 用规则、评测集或 LLM 评判筛选出高质量输出。
- 给被选中输出打上技能标签(特权信号)。
- 用这些数据做一轮蒸馏训练,产生新模型。
- 新模型继续生成,进入下一轮迭代。
这样每一轮模型都在“自己的输出中挑选更好的自己”作为老师,再把自己变成更像这个老师的学生。如果不控制筛选质量,模型很容易学到错误模式,所以第 2 步是整个循环的成败关键。
3.3 抽象技能在循环里起什么作用
如果没有技能标签,上面这个循环本质上是普通的自我训练,模型只是记住哪些输出更受好评。而加入抽象技能作为特权信号之后,训练目标就多了一个维度:模型不仅要学“输出长什么样”,还要学“当前输入触发了哪个技能、为什么要触发这个技能”。
这让蒸馏出来的东西不再是样例层面的模仿,而是技能层面的内化。打个比方,普通自蒸馏是让模型看到“这道题你要这样答”,带技能的蒸馏是让模型看到“这道题要用逐步分解的技能来答”。后者学到的是一套可复用的策略,而不是一道题的答案。
4. 特权信号在训练里的几种落地形态
前面讲清楚了概念,这一节具体聊聊,技能标签作为特权信号,在训练代码里到底长什么样。
4.1 信号注入的几种常见方式
从工程上看,特权信号可以有不同