
我最近在做多轮 Agent 的蒸馏实验时遇到了一个特别反直觉的现象一个能力不错的 Agent 基座模型作为教师去蒸馏一个更小的学生模型。离线测试指标一直在涨可一旦把学生模型放进真实的多轮环境里跑效果反而一轮比一轮差在第二、第三轮开始频繁答非所问甚至把工具调用参数都传错。这个现象在 Agent 训练圈里常被叫作 agentic OPD 问题。OPD 的全称是 Online Policy Distillation翻译过来就是“在线策略蒸馏”。传统知识蒸馏是让大模型当老师、小模型当学生通过拟合老师在某个状态下的输出分布来迁移能力。逻辑听起来顺理成章但任务一旦从单轮问答切换到多轮 Agent 交互问题就全变了。这篇文章我会把 agentic OPD 背后的机制拆开讲讲多轮 Agent 为什么越蒸馏越差也会把我自己踩过的坑、最终的排查和修复路径分享出来给正在做 Agent 蒸馏或模型压缩的同行一个直接能用的参考。1. agentic OPD 到底是什么先分清三个概念很多人第一次听到 agentic OPD 都会皱眉觉得这个词组有点拗口。这里面的 agentic 强调的是“Agent 场景”也就是模型要处理的不只是生成一段文本而是要根据用户输入和上下文做决策、调用工具、维护多轮状态。OPD 强调的是“在线策略蒸馏”训练过程会不断和环境交互再拿新交互数据去蒸馏。两者叠在一起就是在多轮 Agent 工作流里让教师模型实时指导学生模型做策略层面的对齐。1.1 从知识蒸馏到策略蒸馏中间发生了什么在传统 NLP 里知识蒸馏的思路非常直接教师模型的 softmax 输出里不仅包含正确答案还包含“哪些错误答案更像正确答案”的信息。学生模型通过拟合这些软标签能学到比硬标签更丰富的知识典型场景就是图像分类模型压缩。到了策略蒸馏事情就不一样了。教师模型的输出不再是几个分类标签而是高维动作分布。在一个 Agent 场景里学生在某个状态下需要决定“下一句回复说什么”“该调用哪个工具”“工具的参数怎么写”。动作空间可能有好几万甚至几十万评价单个动作好不好本身就是个难题。更麻烦的是Agent 的动作会改变环境状态单纯的分类式蒸馏根本没有覆盖这一步。在线策略蒸馏和离线蒸馏的差别也在这里体现。离线蒸馏是用固定数据集里的状态-动作对训练学生数据采集成本低但数据分布完全由教师行为决定。在线策略蒸馏则要求学生在环境中自己跑把跑出来的状态交给教师打分再把教师的监督信号拿回来继续训练。这样能把学生自身的分布偏移纳入训练过程但在多轮场景里这种跑动产生的分布漂移恰恰是很多坑的开始。1.2 多轮为什么不是“多几个单轮”单轮问答的蒸馏状态基本是静态的。模型答完一个问题任务就结束了不存在状态转移。多轮 Agent 则是一个闭环系统学生模型的每一步输出都会影响下一步环境状态下一步状态再影响学生后续输出。一个微小的偏差在闭环里会被不断放大类似麦克风正反馈的啸叫。举个例子我在一个客服 Agent 蒸馏实验中学生模型在前两轮表现得都正常到第三轮开始记错用户最早说的订单号。用户明明说的是“订单 A123”学生模型在写查询工具参数时却把订单号写成了上下文里出现过的另一个字符组合。这个错误一旦发生后续所有工具返回信息都变得不可信。教师模型为什么不出这种错因为它有足够强的长程记忆和纠错能力即使某一步模糊了也能靠整体的语义理解找回正确上下文。学生模型如果只是局部拟合教师的高频输出学到的往往是“单步模仿”而学不到“整盘纠错”。所以“多轮会越蒸馏越差”并非偶然。它不是训练不充分导致的震荡而是策略蒸馏目标在多轮闭环环境里天然存在结构性问题。2. 为什么多轮 Agent 越蒸馏越差四个核心原因这一节是全文的骨架。我把实践中反复验证过的四类原因写出来每一类都会附上机制解释和实战判断标准方便你对照自己的实验现象。2.1 分布漂移与暴露偏差学生在一个不属于自己的世界里模仿这是最基础也最致命的问题。假设教师策略是 \pi_t学生策略是 \pi_s。离线蒸馏时训练数据里的状态大多由教师模型跑出来也就是状态分布近似 P(s|\pi_t)。学生在这些状态下拟合教师动作学得再好也只是“教师的舒适区”里的好学生。到了部署环节状态分布会变成 P(s|\pi_s)也就是由学生自己的策略主导。学生造出来的状态和在训练教师状态分布里见过的状态并不一致。一旦学生做出一个偏离教师选择的动作环境会进入一个在训练数据里很少出现的新状态。这个新状态对输出来说更陌生于是更可能做出错误决策错误决策又制造更新、更罕见的状态。周而复始分布漂移就成了正反馈。这就像驾校学员在固定路线练了上百遍教练坐在副驾时一切正常。真自己上路后遇到的路况凡是训练路线里没出现过的学员就会加速紧张、操作变形接着进入一个更不熟悉的路口然后彻底懵掉。多轮 Agent 的暴露偏差就是这条“新路况”循环。所以做多轮 Agent 蒸馏时如果训练数据里 90% 都是教师采样或历史专家日志而你发现线下指标提升但线上成功率下降十有八九是分布漂移。2.2 稀疏回报与蒸馏信号的冲突教师也不保证每一步都对第二个原因是训练信号来源太单一。很多走蒸馏路线的团队直接把教师输出当成标准答案用交叉熵或者 KL 散度去拟合把环境奖励完全扔在一边。单轮分类任务里这么做问题不大。但在多轮 Agent 任务中环境奖励通常只在最后一步才出现比如任务完成得 1 分没完成得 0 分。中间每个动作的对错都是模糊的。教师模型本身也远非全知全能。我在实验中就发现教师模型在某个中间步骤会调用一个略显冗余的工具去确认信息。这个动作放在教师自己的全局规划里完全没问题因为教师有能力整合后续信息。可学生模型没有这个判断力它只是模仿了教师的“调用工具”动作却没有继承“为什么在这里要调用工具”的意图。结果就是学生模型滥用工具调用频率虚高真实环境的回报反而更低。这就是策略蒸馏和普通蒸馏最大的差异普通蒸馏的学习目标是静态的“正确答案”策略蒸馏的学习目标必须包含“这个动作放在当前状态里到底产生什么后果”。后果只能从环境反馈里读出来而环境反馈是多轮结束后才能拿到的。如果蒸馏 loss 完全淹没了 reward 信号学生就会变成一个“学得很像但在真实环境中没有回报”的面具模型。2.3 logits 对齐不等于决策对齐蒸馏目标选错了第三个原因更隐蔽也是我最开始没意识到的一个。语言模型蒸馏最常用的损失是让学生模型的 token 概率分布去拟合教师模型的 token 概率分布通常用 KL 散度训练时还会把教师输出的 logits 除以一个温度系数比如 T2来放大分布中的暗知识。这个目标的潜台词是只要 token 分布接近模型行为就接近。但在多轮 Agent 中模型最终好不好不只是看单个 token 概率像不像而是要看它“选择的动作序列”和“放弃的动作序列”之间的边界是否一致。两个学生的 top-1 动作可能和教师一致但在某个工具的调用参数置信度上差一点在回答多轮问题时对早期上下文的注意力差一点。这些差别在单步评测里根本体现不出来放到多轮自回归生成里就会被无限放大。我试着直接对比过学生的解码输出。教师模型在某个不确定节点会有明显的犹豫概率分布比较平滑。学生模型为了拟合教师分布也会把平滑区域模仿出来但在线上推理时如果采样参数设置得比较激进比如 temperature 调到 0.9学生就会把这个“犹豫的尾巴”也采样出来教师本来不会犯的错学生竟然“忠实”地犯了一遍。这说明指导策略蒸馏的不应该是逐 token 的分布拟合而应该是更抽象的动作序列匹配、工具调用格式匹配和回合级的决策边界匹配。2.4 多轮复合误差一个 token 错一路错最后一个原因是由语言生成的自回归特性和多轮闭环特性共同造成的累积误差。Agent 的每一次输出都由大量 token 组成每个 token 都依赖前一个 token 和整段对话上文。一个 token 生成错后续所有 token 的生成条件就变了。在单轮短文本任务里这个误差最多影响一整句话改正成本还可以接受。多轮 Agent 里这个错误 token 会进入下一轮上下文成为新一轮推理的“前提”。于是你能看到一个典型病相模型越往深走越蠢。第一轮表现很好第二轮开始出现和用户话题不一致的回复第三轮可能把用户之前提到的约束条件忘了第四轮干脆重复自己刚才说过的话。不是模型突然坏了而是早期某个低概率 token 的错误在后续每轮中都在被重新提及和强化。教师模型遇到这种错误可以用全局规划能力进行 correction。学生模型只学会了局部模仿没有学会修正策略于是直接把小错误滚成了大错误。很多团队看到一个多轮蒸馏模型“单轮指标还行一进 Eval 就崩”第一反应是继续加数据、加大训练量。但我的经验是如果训练量和数据量已经足够你必须回头检查上述四类机制再决定下一步怎么调而不是盲目训练。3. 实操复盘一次多轮 Agent 蒸馏失败的全过程前面说了很多理论判断可能还是有点抽象。我把我自己最近一次完整的蒸馏实验复盘放在这一节包括模型配置、失败现象和最终修好的路径。为了避免暴露具体业务信息我对场景做了脱敏处理但整体流程和数值形态基本能说明问题。3.1 复现场景与模型配置任务场景是一个多轮客服 Agent需要根据用户的订单号、退货需求、库存状态等信息决定是否调用查订单工具、查库存工具、发起退款流程。整个 Agent 可能有 4 到 8 轮对话不等且有状态依赖用户在第三轮补充的信息会改变工具的查询参数。教师模型一个有较强规划能力的通用大模型参数量大概在 300B 量级。学生模型7B 量级的开源语言模型。训练数据离线采集了 2 万条历史 Agent 日志和 5000 条教师模型模拟轨迹每一条轨迹都标注了完整的状态-动作序列。蒸馏方式先用教师轨迹做 SFT 预热 1 个 epoch然后用 KL 散度蒸馏 3 个 epochbatch size 128学习率 2e-5温度系数 T2。初始结果学生模型在离线评测集上的“下一动作准确率”从 61% 涨到 82%工具调用格式合法率从 88% 涨到 96%看起来非常理想。我当时一度觉得这次蒸馏稳了。3.2 失败现象拆解离线指标 vs 在线指标真正的 Eval 用了两套指标一套是离线静态指标比如下一动作准确率、格式合法率、回复相似度另一套是在线动态指标让 Agent 直接在模拟环境里和测试用户跑完整轮次统计任务成功率、平均轮数、工具调用有效率。结果就是典型的“离线涨、在线掉”任务成功率从教师 baseline 的 61%一路掉到学生模型的 47%第二轮失败率尤其高第三轮以后经常出现上下文丢失。我拆了十多个失败案例发现最集中的错误是“电话号码复制错”“订单号使用旧数据”“同义重复”。这些都是典型的多轮累积误差表现。我列了一张表方便你看清这个矛盾指标类型具体指标蒸馏前学生蒸馏后学生教师参考离线下一动作准确率61%82%90%离线工具参数格式合法性88%96%98%在线整体任务成功率50%47%61%在线工具调用有效率64%55%72%在线平均对话轮数7.28.86.5这张表其实揭示了一个真相离线指标衡量的是“在当前输入状态下的输出正确性”在线指标衡量的是“模型实际产生的状态序列是否在朝目标推进”。两个东西在单轮任务里强相关在多轮任务里几乎可以完全背离。学生模型确实更会模仿教师的高频动作了但它的动作导致环境状态越来越偏因此在线表现不升反降。3.3 从数据回放和课程学习找突破口发现问题之后我没有继续堆离线数据而是对整个训练流程做了一次比较大的改造。核心思路很简单把环境反馈请回来让教师当顾问而不是当裁判。第一步切换到真正的在线策略蒸馏框架。每个训练 step先让学生模型在当前环境里随机采样一批轨迹把轨迹里的中间状态抽出来送给教师模型打分。教师给出的 soft label 和学生自己的动作共同进入 loss。这样一来训练数据里的状态不再全部来自教师采样而是大量来自学生自己的真实足迹。第二步对教师的监督信号做置信度过滤。只有教师模型在某个动作上预测概率大于 0.8 的时候这条数据才参与蒸馏 loss。教师自己都不确定的样本不再强迫学生模仿。这些低置信样本留给环境 reward 信号来约束。第三步加入混合重放缓冲。缓冲区里既有教师的历史轨迹也有学生的近期轨迹。采样时优先抽取那些在实时评估中表现差、任务失败的轨迹也就是困难样本挖掘。这样能让学生集中精力修复自己的弱点。第四步课程化训练。初期只让学生跑两轮以内的短轨迹等在线准确率回升后再逐渐增加轮数上限从两轮加到五轮最后放开到八轮。这能让模型先在可控的误差范围内学会基础行为再逐步适应更长的闭环链路。第五步对 loss 做了混合。总损失大致是蒸馏 KL 散度加一个环境 reward 加权后的动作对数似然再加一个动作熵正则。用公式写大概是这样loss α * KL(student || teacher) β * reward_weighted_action_logprob γ * entropy_bonus其中 α 从 1.0 开始随着训练进程逐步衰减到 0.3β 从 0.1 开始逐步升到 0.8γ 固定为 0.01。这个设计的意图是前期让教师带路学生先学到基本的动作结构后期让环境说了算学生不能只躺在教师的阴影里。改造之后我重新跑了同样的 Eval。任务成功率从 47% 回到了 58%工具调用有效率从 55% 提升到 68%平均轮数也从 8.8 降回 7.0。虽然没有完全超过教师模型但至少不再是“越蒸馏越差”。这个结果也验证了我对核心原因的判断问题不在学生模型的容量而在训练目标把多轮闭环里的状态转移忽略掉了。4. 常见问题与排查技巧实录在实际做 Agent 蒸馏的过程中肯定还会碰到各种分不清是数据问题、策略问题还是评估问题的情况。我整理了下面几类高频问题和排查方法都是自己踩过坑之后沉淀下来的。4.1 怎么判断是蒸馏本身出问题还是评估环境有问题一个很重要的自检方法把教师模型放在完全相同的在线 Eval 环境里跑一遍。如果教师模型的在线指标也在掉说明评估环境本身可能有问题不一定是学生模型的锅。如果教师模型在线表现稳定学生模型在线掉分而离线指标又在涨那大概率是蒸馏过程中的分布漂移或目标错配。我还会加一个动态诊断把学生模型的参数冻结几层比如只训练后半段或者只训练 LoRA 层。如果训练 loss 下降很正常但下游任务成功率在下降那几乎可以肯定模型正在过度拟合教师的表面分布而不是学到策略背后的决策逻辑。这时候必须停下来检查蒸馏目标而不是继续跑训练。4.2 在线收集数据还是离线固定数据集很多团队受条件限制只能做离线蒸馏因为在线环境要么太贵要么根本没搭好。我的建议是纯离线做多轮 Agent 蒸馏的成本其实非常隐性。你看起来省了环境部署的钱但后续 debug 可能要花好几倍时间。如果实在只能离线至少要保证数据集里 30% 以上的轨迹来自“多样性探索”而不是“教师单一策略”也就是尽量覆盖用户乱说话、模型出错、工具返回报错等边缘状态。如果预算允许我强烈建议至少留一部分在线数据作为联合训练。不需要一开始就全程在线用 20% 比例的在线新鲜数据 80% 离线数据混合训练就可能明显缓解分布漂移。我自己实验下来加入 30% 在线数据时在线成功率回升最明显再往上加收益就开始递减成本却高很多。4.3 该不该混合偏好学习和蒸馏损失多轮 Agent 场景里我越来越倾向于把蒸馏损失和偏好学习混合起来用。理由很简单蒸馏告诉学生“教师大概率会这样做”偏好学习告诉学生“哪些做法更受环境或用户欢迎”。这两者在数据形式上并不冲突。实操时我会把每条轨迹按最终结果打个分完成目标为正样本没完成或副作用很大为负样本。正负样本组成对比对用 Bradley-Terry 目标或 DPO 目标来优化。这个损失可以和蒸馏损失并行计算共同作用于学生模型的策略网络。实验结果里混合偏好学习之后学生模型不仅任务完成率提高了而且“胡说八道”的频率明显降低因为它不再需要模仿那些教师会做但学生把控不住的失败动作。4.4 避坑清单速查表下面这张表我经常发给团队里的新同学它基本能覆盖多轮 Agent 蒸馏最常见的坑和排查方向失败现象最可能的原因建议处理方式离线指标上涨在线指标下跌分布漂移 / 暴露偏差加入学生 rollout 数据做在线蒸馏训练 loss 波动剧烈难以收敛教师输出不稳定降低蒸馏权重 α增大 batch size过滤低置信教师样本工具调用格式错误频繁训练中格式损失占比不够增加格式合法率损失或推理时加格式约束解码越往后面轮次越差多轮复合误差与上下文遗忘使用课程学习、外部记忆或长上下文微调回复趋向单一、缺少探索熵塌缩蒸馏温度太低提高温度 T增加熵正则项学生模型过度调用工具教师行为被无理解耦给工具调用加成本惩罚提高环境 reward 权重这张表不是金科玉律但在我几十次实验中命中率比我预期的要高。遇到类似症状时可以直接按对应方向去检查。5. 留给你的几条实战建议讲到这里我不打算再来一段“总结与展望”。我只想说几条自己在多轮 Agent 蒸馏上沉淀下来的实操体会。第一条体会是教师模型不是“真理机器”。在一对一问答领域教师偶尔错一步影响不大。但在 Agent 多轮任务里教师某一步看似合理的动作可能是依赖它强大的全局纠错能力才显得合理。学生学了这个动作却没有配套的纠错能力就会东施效颦。以后做蒸馏前先想想你要迁移的到底是“知识”还是“策略”。知识可以静态拟合策略必须放到环境里去闭环验证。第二条体会是多轮 Agent 的目标函数不能只盯着逐 token 的似然。我最后悔的事情就是一开始用标准的知识蒸馏工具直接套在多轮任务上。正确做法是把回合级收益、工具调用有效性、用户状态变化全部编码成训练信号的一部分。没有这些你的模型再像教师也是纸老虎。第三条体会是小步快跑比一口吃成胖子更稳。课程学习不是多此一举它是在用最自然的方式让学生模型逐渐适配自己的分布偏移。如果你发现模型在一进多轮环境就崩先限制轮数用两轮以内的 mini 任务把基础策略巩固好再慢慢放开。这个过程虽然看起来慢但通常能帮你省掉很多不必要的返工。最后再分享一个我做 debug 时的小技巧保存每一个 epoch 的模型 checkpoint跑到在线 Eval 环境里跑同一个固定测试集。在线指标突然掉的那一个 epoch往回看对应训练数据往往就是“教师低质量输出”大量涌现的地方。优先清理这些脏数据比调任何超参数都管用。希望这些经验和工具能让你少走几步弯路也希望你这边的多轮 Agent 蒸馏能顺利跑通。