二十年来,让 AI 从经验中学习这件事,一直卡在一个隐性假设上:我们需要先知道"经验长什么样",然后才能教 AI 用它。On-policy self-distillation 让 agent 用自己的轨迹做自我蒸馏,但 teacher 该看什么特权信息——答案?推理链?技能摘要?每篇论文都在设计新的 artifact,却没有一篇问过:这个 artifact 本身能不能学出来?
LOPD(Latent On-Policy Self-Distillation)来自新加坡国立大学、北邮和上交,给出了一个干净的回答:不需要设计特权信息的格式,让 model 自己从轨迹中学出 latent representation 作为 teacher 的特权上下文。
固定格式为什么不灵
现有 OPSD 方法的做法各不相同:OPSD 给 teacher 注入 oracle 解答,SDPO 用同批次的成功 sibling 轨迹,Skill-SD 提炼技能摘要,SDFT 提供 ground truth。直觉上都是对的——但实验数据暴露了一个尴尬的事实。
没有任何一种固定格式的特权上下文是万能的。SDPO 在 BFCL-v3 上甚至低于 vanilla 模型;OPSD 在 Qwen3-8B 的 BFCL-v3 总分上也低于未经蒸馏的 baseline。一种在代码生成上有效的格式,换到工具调用场景可能变成噪声。
这揭示了一个更深层的问题:现有方法的监督质量被预定义的上下文构造器封死了。你设计的 artifact 越精确,它在匹配场景下的效果越好——但它也越脆弱。
LOPD:可学习的特权上下文
LOPD 的核心思路是一个框架级的转换:从"设计 teacher 看什么"变成"让 model 学 teacher 该看什么"。
框架分三个阶段运作。第一,维护一个经验库,存储成功轨迹的精简版本——任务描述加上动作-结果 trace,去掉冗长的 observation。对于每个新任务,用 dense retriever 检索最相似的 J 条历史经验。
第二,用一个 frozen backbone + LoRA encoder 把每条经验编码为隐状态,然后通过 QFormer-style compressor 压缩成 K 个连续 latent token。这些 latent token 拼接后作为特权上下文,以普通 context position 的形式喂给 teacher。
第三,student 在同样的前缀上跑轨迹,teacher 拿着 latent context 重新评估——两者做 reverse-KL 蒸馏。teacher backbone 是冻结的,但 latent token 在计算图内,梯度可以回传到 composer 的 LoRA 和 QFormer 参数。
防止 teacher 坍缩
这里有一个精妙的问题。如果让 composer 自由优化蒸馏 loss,它会发现一条阻力最小的路径:让 teacher 分布坍缩到 student 分布。KL 散度直接归零,loss 完美——但什么也没学到。
没有 margin 约束时,composer 的最优策略不是让 teacher 更有信息量,而是让 teacher 和 student 趋同。特权上下文的"特权性"需要被显式保护。
LOPD 的解决方案是 privileged-margin 目标:β[m - Δ(φ)]。Δ(φ) 衡量 teacher 和 student 在 latent token 上的对齐程度,m 是最小间隔阈值。当对齐度超过阈值,margin loss 就惩罚 composer,迫使它维持 teacher-student 之间的信息差距。
消融实验干净地验证了这个设计的必要性。不加 margin(m=0),性能从 frozen baseline 的 0.573 降到 0.551。弱 margin(m≤0.01)挡不住坍缩。margin m=0.05 时,性能跃升到 0.637——比 frozen baseline 高出 6.4 个点。
实验:全面超越且高效
在 10 个 backbone-benchmark 组合上,LOPD 全部取得最佳或并列最佳结果。测试覆盖了两个 backbone(Qwen3-4B/8B 和 OLMo3-7B)、三个工具使用 benchmark(EnvScaler、BFCL-v3、ACEBench)和两个代码 benchmark(LiveCodeBench、EvalPlus)。
| Backbone | Method | EnvScaler | BFCL-v3 | ACEBench | LCB Avg | EvalPlus Avg |
|---|---|---|---|---|---|---|
| Qwen3-4B | Vanilla | 56.0 | 25.25 | 56.0 | 45.61 | 78.79 |
| GRPO | 60.2 | 26.00 | 56.0 | 48.29 | 79.34 | |
| Skill-SD | 58.0 | 26.50 | 56.0 | 47.32 | 79.70 | |
| LOPD | 63.7 | 27.38 | 60.6 | 48.78 | 81.36 | |
| Qwen3-8B | Vanilla | 49.2 | 28.38 | 58.0 | — | — |
| GRPO | 59.8 | 28.38 | 58.0 | — | — | |
| OPSD | 52.3 | 29.00 | 52.6 | — | — | |
| LOPD | 66.4 | 29.88 | 62.7 | — | — | |
| OLMo3-7B | Vanilla | — | — | — | 46.34 | 75.28 |
| GRPO | — | — | — | 48.29 | 77.67 | |
| LOPD | — | — | — | 50.98 | 78.41 |
效率数据更值得注意。LOPD 用不到 30% 的 rollout 预算就超越了 GRPO 和 Skill-SD。320 个 generation 后 LOPD 就突破 0.61 mean reward,而 GRPO 和 Skill-SD 在 1600 个 generation 后分别只达到 0.611 和 0.588。这意味着 latent teacher 能从每条轨迹中提取更密集的学习信号。
行为变化:从乱枪打鸟到有序探索
更高 reward 之外,LOPD 还改变了 student 的交互模式。在 EnvScaler 测试集上,蒸馏后的 student 每步 tool call 从 3.5 降到 1.11,总交互步数从 11.12 增加到 17.04,首次响应长度缩短 37.5%。这不是性能退化——是从"一次发一堆调用碰运气"变成了"更有序地逐步探索"。
Reward per tool call 从 0.038 提升到 0.050。每个调用都更有针对性了。
评价
LOPD 的贡献不只是又一个更强的蒸馏 baseline。它把 OPSD 的核心问题从"选什么特权信息"重新定义为"如何学习特权信息的表示"。这个转换有实际的工程意义——你不再需要为新领域设计 teacher 的输入格式,composer 会自己适应。
框架本身也很干净:experience bank + retriever + LoRA encoder + QFormer compressor,都是标准组件。主框架没有贡献新的注意力机制或架构——它的贡献是把这些组件组合成一个端到端可学习的特权上下文管道,然后用 privileged-margin 目标防止坍缩。