别把智能体往一条直路上逼:DART-SD 用"钻石拓扑"给工具调用蒸馏做了次手术

训练一个多轮工具调用的学生模型,最常用的套路是什么?拿老师的成功轨迹做 SFT,或者上 GRPO 跑 RL。但有没有想过一个很别扭的场景:一个任务要查三个互不依赖的子问题,老师先查 A 再查 B 再查 C,学生先查 B 再查 A——明明都对,全轨迹模仿却会把学生这条完全合法的路径当成错误去惩罚。顺序无关的子目标组合起来,解空间根本不是一条线,而是一个巨大的钻石格(diamond lattice)。把它压成一条线来学,这就是这篇文章所说的"拓扑坍缩"。

核心摘要:这篇来自字节跳动与中科大的论文(arXiv:2608.18524)提出 DART-SD,把多轮工具调用的执行过程建模成一张交互状态转移图(ISTG),让成功与失败的探索路径在图上自然汇成钻石拓扑;学生 rollout 失败时,在图上定位"关键拓扑断点"(CTB),检索教师参考做恢复续写,然后用断点局部化的 loss mask 做监督——只对断点之后生成的恢复步骤算损失,严格保护已经走对的前缀。结果相当能打:Qwen3-8B 学生在 5 个 benchmark 上平均分 45.58,超过标准 SFT(41.64)和 GRPO 系 RL(40.33),甚至在 FTRL、ToolHop、τ-bench 上反超 27B 级教师。我的判断:这不是又一篇"换个数据集刷分"的蒸馏论文,它把"多轮交互的监督应该加在哪一步"这个问题从工程调参上升到了图拓扑层面,值得细读。

论文信息 - 标题:DART-SD: Diamond-topology Aware Retrieval and Tuning for Self-Distillation of Multi-Turn Tool-Calling Agents - 作者:Hangrui Xu、Jiarui Wang(共同一作)、Yang Yang(通讯)、Chuanbo Zhu、Fangda Chen、Ziqi Wu、Jingming Cai、Yan Song(通讯) - 机构:ByteDance、University of Science and Technology of China - 链接:https://arxiv.org/abs/2608.18524(2026 年 8 月 19 日提交)


🎯 问题动机:全轨迹模仿的三个病根

先说清楚这篇文章到底在跟什么过不去。

三种训练范式的对比

图1:三种范式的对比。(a) SFT Teacher Boosting 对整个轨迹施加无差别全局 loss,会把学生的有效探索步骤一起覆盖掉;(b) 标准 RL(GRPO)把结果奖励均匀摊到所有中间工具调用上,失败轨迹里明明走对的步骤也被连坐扣分——信用错配;(c) DART-SD 只定位到关键断点(图中红色 CTB 标记),对断点之后做局部纠错,前面的有效步骤一律不碰。

这张图把三类主流方案的毛病画得很直白:

SFT 全局强迫。轨迹级别的行为克隆不区分哪步好哪步坏,一条轨迹整体拟合。在长程任务里这会同时放大两个老问题——级联错误和曝光偏差,学生模型记住的是冗余轨迹的表面形式,而不是任务的逻辑骨架。

RL 信用错配。GRPO 这类方法把最终成败的奖励/优势回传到整条轨迹。我之前在做类似事情的时候踩过一模一样的坑:一条 rollout 最后答案错了,但它前半段的信息收集其实完全正确,结果整段都被负优势拉低。多训几轮,模型学到的不是"哪里错了",而是"这条路整条都别走",策略多样性肉眼可见地萎缩。

Hindsight 类方法的线性假设。像 HINT-SD 这类事后标注方案,仍然把多轮交互当成严格线性序列,模型分不清"致命错误"和"无害探索",token 效率和知识一致性都打折扣。

三条病根指向同一件事:当任务的解空间是钻石格——多条顺序无关的获取路径在共享中间状态处交汇——任何把轨迹当线性序列处理的监督方式,都会无差别惩罚合法替代路径。

DART-SD 的回答是:别把监督加在轨迹上,加在拓扑上。


🧠 方法核心:从 ISTG 到 CTB 局部监督

DART-SD 六模块整体框架

图2:DART-SD 整体流程,六个模块。① 把教师 rollout 抽象为 ISTG(信息原子提取 + 主/辅节点);② 学生自主 rollout 收集失败轨迹用于诊断;③ 动态定位 CTB——首次离开成功可达区域的那一步;④ ISTG 引导的恢复采样,用保留前缀 + 特权教师参考生成恢复续写;⑤ CTB 局部化监督,前缀 mask 掉、只对恢复步骤算 loss;⑥ 跨轮次渐进自蒸馏,CTB 随学生能力边界外移。

这套方法的技术含量不低,我按模块拆着聊。

交互状态转移图(ISTG):怎么把轨迹变成钻石

核心难题是:怎么让"先查 A 再查 B"和"先查 B 再查 A"被识别为同一条路径的两种走法,而不是两条无关轨迹?

答案是信息原子(Information Atom)抽象。每个工具响应先过一道确定性规范化:所有字段都是空值/占位/错误信息的,直接判定为无信息并按工具折叠。幸存的响应再进入语义阶段,由 LLM 联合考察后映射到任务特定的原子集合 \(\mathcal{K}_x\)

\[\alpha_x:\ \bigl(\operatorname{tl}(e),\bar{o}(e)\bigr)\ \longmapsto\ \alpha_x(e)\subseteq\mathcal{K}_x,\qquad\lvert\alpha_x(e)\rvert\leq 1\]

关键约束是:返回同一事实的响应——哪怕表面形式不同、工具不同——必须拿到同一个原子。信息增量定义为

\[\Delta I_t=\left\{k\in\mathcal{K}_x\;\middle|\;\exists e\in B_t,\;k\in\alpha_x(e),\;k\notin I_{t-1}\right\}\]

这一步的妙处在于:状态不再由"调了什么工具"定义,而由"拿到了什么信息"定义。两条获取顺序不同但信息集合相同的路径,自然会汇聚到同一个主节点——钻石结构就是这么长出来的,不需要任何人工标注。无信息响应映射为空集,不产生虚假状态,图更稀疏但绝不捏造可达性。

交互状态写成 \(X_t=(I_t,U_t)\)\(I_t\) 是已获信息原子集,\(U_t\) 是最近主节点以来无效操作的多重集。有新信息的是主节点(main),只有无效操作的是辅助节点(aux)。整张图 \(G_x=(V_x,E_x)\) 由全部成功和失败的教师 rollout 共同构建成有向多重图,平行边保留。主节点构成信息获取的主干,辅助节点像藤蔓一样挂在主节点上记录无效探索。

CTB:失败轨迹的"第一个无法挽回的岔路口"

学生 rollout 在同一个状态空间里回放,每一步检查它是否还能投影到教师的"成功可达区域"。这个区域不是从根往前数的深度,而是从成功终端沿 rollout 反向测量的预算过滤:

\[\mathcal{R}_x^{+}=\left\{v\in V_x\;\middle|\;\exists\,\tau\in\mathcal{T}_x^{+},\;v\in\tau,\;r_\tau(v)\leq B_x\right\}\]

其中 \(B_x=\min(d_x^{\min}+\Delta_x,\ B_x^{\max})\)。这个反向测量的设计挺精巧的——它表达的是"从这里出发,剩余预算内还有没有教师验证过的成功路径",而不是"你走了多远"。

投影规则是类型特定的,而且放得很宽:学生主节点只要求信息集包含某个可达教师主节点的信息集(\(I(v)\subseteq I_t^s\)),不要求相等;辅助节点只比较无效操作的数量,不要求失败的工具完全一样。学生多拿了信息不算跑偏,试错次数没超教师支持的上限也不算跑偏。

CTB 就是首个"上一步还能投影、这一步投影不了"的位置:

\[t_{\mathrm{C}}=\min\{t:\rho_{t-1}=1,\ \rho_t=0\},\qquad a_{\mathrm{C}}=\pi(s_{t_{\mathrm{C}}-1})\]

锚点 \(a_{\mathrm{C}}\) 是偏离前最后一个有效教师投影。坦白讲,这个定义给我的感觉很像代码调试里的"第一个失败的断言"——不是崩溃点,而是最早能确定救不回来的那个岔路口。

恢复采样与断点局部化监督

定位到 CTB 后,从教师图里采样 2 条成功参考 + 1 条失败参考作为特权上下文。注意一个细节:这些参考不是直接拼接到学生前缀后面——两边的调用和观测可能对不上——而是交给增强生成器,以任务、保留的学生前缀、特权参考为条件,生成恢复续写:

\[c_{t_{\mathrm{C}}}^{*}=\operatorname{AugGen}\bigl(x,\tau_{<t_{\mathrm{C}}}^{s},\mathcal{C}^{\mathrm{priv}}\bigr)\]

训练轨迹 = 学生前缀 + 恢复续写,然后上带掩码的 CLM 损失:

\[\mathcal{L}_{\mathrm{DART}}=-\sum_{i=1}^{L}m_i\log p_{\theta}\bigl(\widetilde{y}_i\mid\widetilde{y}_{<i},x\bigr)\]

掩码定义在响应步骤级别:只有属于"CTB 之后、最终答案之前"的 assistant 生成步骤,\(m_i=1\)。学生前缀、用户消息、工具观测、最终答案,全部权重为零。

这就是整个方法最硬核的一句话:梯度只落在需要纠错的地方。学生已经走对的前缀,一个 token 都不动。跟 SFT 的全局 loss 和 GRPO 的轨迹级优势回传比,这等于把监督的粒度从"整条轨迹"切到了"断点后的恢复片段",而且切的位置是由图拓扑客观给出的,不是 LLM judge 拍脑袋。

渐进式自蒸馏

整个流程迭代 5 轮:当前学生产 rollout → 映射到状态空间 → 定位 CTB → 生成断点局部化的蒸馏实例 → 微调。随着学生变强,它的状态在轨迹更长的部分保持可投影,CTB 自然外移——监督始终对准当前能力边界之外的那一段。这形成一个自定进度的课程,不需要人工排课程表。


📊 实验结果:8B 学生反超 27B 教师

设置:训练用 FTRL 的 2,215 个任务(这套环境来自字节与复旦的 ACL 2026 工作,自动化构建本地可执行工具环境,反馈完全可验证,刚好是"钻石格"问题最突出的场景——Single / Para-Single / Multi / Para-Multi 四种任务结构里,后两类充满顺序无关子目标)。评测覆盖 in-domain 的 FTRL 加 4 个 out-of-domain benchmark:BFCL Multi-Turn、ToolHop、τ-bench、RoTBench。学生是 Qwen3-4B/8B,教师轨迹来自 Qwen3.6-27B 与 GLM-5.2 混合池。每轮每任务采 8 条轨迹,temperature 0.7,学习率 5×10⁻⁷,训练 5 轮。

主表(Qwen3-8B,关键行)

方法 FTRL Solve-F1 BFCL Multi-Turn ToolHop AC τ-bench Pass^1 RoTBench CF 平均
Base 23.48 18.38 28.54 10.13 22.19 29.60
♠ SFT 41.89 19.25 43.52 26.06 30.24 41.64
♢ FTRL-GRPO 40.22 35.25 34.57 23.03 27.02 40.33
♢ ToolRL 35.00 20.50 44.72 25.45 33.10 39.94
♢ MatchTIR (KM) 35.37 23.25 41.71 26.06 26.90 38.31
DART-SD 45.66 27.63 45.03 27.12 35.48 45.58

4B 上结论一致:DART-SD 平均 39.17,SFT 是 37.62,其余基线都在 35 以下。

说实话,看到这组数的时候我有两个反应。一是 DART-SD 在多数指标上确实是最优或接近最优,FTRL Solve-F1 从 SFT 的 41.89 拉到 45.66,涨了 3.8 个点,这个幅度在已经很强的蒸馏基线上不算小。二是它并非全胜——8B 的 BFCL Multi-Turn 上 FTRL-GRPO 的 35.25 明显高于 DART-SD 的 27.63。RL 在需要动态决策的多轮状态维护上还是有自己的优势,论文没有回避这一点,但这确实说明"拓扑感知蒸馏"和"在线 RL"各自抓到了不同维度的能力。

超越教师。8B 学生在 FTRL、ToolHop、τ-bench 三个 benchmark 上反超了 27B 级教师模型。这个点很说明问题——如果只是模仿教师轨迹,学生性能上限天然被教师锁死;而 CTB 机制允许学生保留自己的有效前缀、只在断点处借力教师,等于把教师的角色从"模板"降级成了"救援参考",上限自然就打开了。

开启 thinking 后依然领先(Qwen3-8B,thinking 模式):

方法 FTRL Solve-F1 BFCL Multi-Turn ToolHop AC
MatchTIR (KM) 37.33 47.13 46.16
DART-SD 41.03 49.75 46.43

通用能力不退反进。蒸馏最常见的副作用是通用能力塌掉,DART-SD 反而把 Qwen3-8B 的通用四项平均分从 43.92 推到 49.89(IFEval 34.75→45.29,AIME24 46.67→50.00,MMLU 70.94→74.27)。作者归因于局部监督不污染前缀,避免了全局 SFT 那种大面积参数漂移。这个解释我觉得是站得住的。

消融实验(FTRL,Qwen3-8B,Solve-F1):

配置 Solve-F1
Base 23.48
+SD(直接自蒸馏) 38.10
+CTB(断点局部监督) 39.51
+Progressive SFT(渐进迭代) 43.93
+ISTG(完整 DART-SD) 45.66

每一级组件都有实打实的贡献。我最在意的是最后一跳:从 LLM-judge 式的断点检测换成 ISTG 拓扑投影,Solve-F1 从 43.93 到 45.66,同时 Solve-R 从 49.65 拉到 54.13——召回端涨得最多,说明图结构确实抓到了 judge 抓不到的可恢复状态。

两个很有意思的分析。一是成功轨迹的工具调用数随迭代持续下降,Iter5 平均 3.55 次,比 golden 参考的 4.02 还短——学生发现了比参考答案更优的捷径,这基本排除了"只是在背教师轨迹"的质疑。二是失败轨迹里 CTB 的平均位置从 Iter1 的 0.348 外移到 Iter5 的 1.452,能力边界确实在一轮轮往外推,跟渐进课程的设计直觉完全吻合。


💡 我的判断

这篇论文最值钱的地方,是把"多轮智能体蒸馏的监督应该加在哪"从启发式调参变成了一个图论上有明确定义的问题。ISTG 的信息原子抽象让顺序无关路径自然汇聚,CTB 让断点定位不再依赖 judge 模型的主观判断,局部 loss mask 让保护前缀从口号变成机制。三个组件咬合得很紧。

但也不是没有疑问。ISTG 的语义阶段原子提取依赖 LLM 联合判定,这个环节的鲁棒性论文没有单独消融——如果原子分错,整个钻石结构就是歪的。另外整套流程需要在任务级维护 ISTG 并做多轮 rollout + 增强生成,工程复杂度明显高于标准 SFT,对数据管线的要求不低。还有 BFCL Multi-Turn 上被 FTRL-GRPO 反超这件事,暗示蒸馏范式和在线 RL 可能终究是要结合的,而不是互相替代。

工程上的启发很直接:如果你在做智能体蒸馏或轨迹筛选,先别急着全局 SFT——问自己三个问题:失败轨迹里有多少前缀其实是有效的?你的监督是在纠错还是在覆盖?你能不能客观定位"第一个救不回来的点"?哪怕不上完整的 ISTG,光是"断点后局部监督"这一个思路,消融里就值 1.4 个点的 Solve-F1,成本却远低于重跑一遍 RL。

工具调用的解空间从来都不是一条直线,是时候别再用直线的方式训练了。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我