这次我们来看一个偏研究型、但直接关系到 LLM 工程落地的题目:TurnSight: Turn-Level Hindsight Self-Distillation for Tool-Integrated Reasoning。
如果你在做工具增强推理、Function Calling Agent、或者多轮工具调用微调,大概率会遇到一个现象:模型在整条轨迹层面能复现正确答案,却很难判断自己究竟在哪一轮推理、哪一次工具调用时已经跑偏。TurnSight 这个工作从标题和技术路线看,正是要解决这个“回合级”的监督信号问题,核心思路是把事后反思(Hindsight)和自蒸馏(Self-Distillation)下放到每个回合,而不是停留在整条轨迹层面。
先说明一个前提,这篇文章是对 TurnSight 研究方向的系统解读。目前我拿到的信息主要是论文标题和关键词,论文官方是否有完整开源代码、精确榜单数据,尚未拿到第一手材料。所以正文里我会重点做三件事:第一,拆解这个方法的动机和设计逻辑;第二,给出它可以落地的工程流程;第三,用通用代码模板演示“回合级事后自蒸馏”该怎么实现。如果后续官方放出仓库,这套流程可以直接作为第一版接入参考。
这个方向的重要性在于,工具集成推理已经是从“Chat 式 LLM”走向“Agent 式 LLM”的关键环节。只要模型需要反复调用搜索、计算器、代码解释器、数据库,每一条轨迹就不再是一次生成,而是一连串“思考-调用工具-观察结果-再思考”的回合。也正是在这种结构下,传统整轨迹优化开始显得不够细腻,TurnSight 的切入点是精准的。
1. 核心能力速览
在进入方法细节前,先梳理 TurnSight 的核心信息。以下速览基于论文标题与关键词,以及工具集成推理领域的常见技术框架整理:
| 维度 | 说明 |
|---|---|
| 项目类型 | 大模型训练/推理优化方法,属于工具增强智能体的对齐与自改进方向 |
| 核心问题 | 多轮流式调用工具时,模型无法精准获知“哪个回合出了问题” |
| 关键技术 | Turn-Level(回合级)监督、Hindsight Self-Distillation(事后自蒸馏)、Tool-Integrated Reasoning(工具集成推理) |
| 直接收益 | 为模型提供更细粒度的训练信号,改善多步工具调用中的错误定位和策略修正 |
| 目标读者 | LLM 算法工程师、Agent 应用开发者、做 Function Calling 微调和推理优化的团队 |
| 是否开源代码 | 未确认,需以论文官方仓库为准 |
| 是否需要特定 GPU | 取决于后续发布的模型规模和训练方案,蒸馏训练通常建议使用至少一块 24GB 显存的 GPU,推理测试阶段标准开源模型 8GB 也可尝试 |
| 部署方式 | 如果采用蒸馏后的模型,通常与标准 LLM 推理框架一致,也可通过 API 服务暴露 |
| 批处理能力 | 蒸馏训练天然支持批量构造训练样本,推理阶段也支持批量请求处理 |
从表格可以看出,TurnSight 不是一个新的推理框架,也不是一个可以“一键启动”的 WebUI。它更接近一种训练和自改进的信号构造方法。理解了这一点,后续所有实践才有正确预期:真正的产物应该是“更好的模型策略”,而不是一个可视化界面。
2. 多轮工具推理的三个致命节点
为什么需要 Turn-Level 的信号?这要从工具集成推理的实际运行过程说起。
2.1 错误会在回合之间逐级累积
当模型解决一道需要搜索和计算的任务时,典型轨迹是:
- 第一回合:模型理解问题,决定调用搜索工具获取数据。
- 第二回合:模型读取搜索结果,判断哪些数据有用,并规划下一步。
- 第三回合:模型调用 Python 解释器,写代码计算指标。
- 第四回合:模型汇总代码结果,生成最终答案。
任何一个回合的错误,都会污染后续所有回合。比如第二回合误读了搜索结果,第三回合的代码计算即使完全正确,最终答案也是错的。这种级联放大效应,让整条轨迹的优化特别困难。
如果采用整条轨迹的打分方式,模型只知道“最终答案对还是错”,却无法知道“错误究竟是出现在搜索关键词选择、结果信息提取,还是计算逻辑部分”。Turn-Level 的价值就在这里:它把错误归因粒度压缩到一个回合,模型可以精确知道“我在第二次工具调用时选取了错误的数据列”。
2.2 整轨迹奖励信号太稀疏
在常见的工具调用微调流程里,训练数据通常长这样:输入一个复杂问题,输出是一整段 chain-of-thought 加上工具调用序列。标注者或奖励模型给出的评分,通常作用于最终结果。
但最终结果正确,并不代表每一回合的决策都正确。反过来,最终结果错误,也不代表所有回合都错误。可能模型前几个回合的搜索策略非常漂亮,只是最后一步表达出了问题。整轨迹奖励无法表达这种“部分好、部分坏”的状态,导致模型在学习时被噪声信号拖累。
TurnSight 的思路是让模型基于最终结果进行事后反思,为每个回合生成更准确的改进信号。这种“事后”属性来自 hindsight 的思路:既然已经知道最终结果了,就可以回头修正中间决策,然后把这个修正后的决策作为训练目标。
2.3 策略分布会逐渐退化
另一个常见问题是策略退化。如果训练数据过度集中在“正确答案轨迹”上,模型会不断强化那些看起来符合正确答案模式、但实际并不稳定的决策路径。时间一长,模型在遇到新工具、新查询时就会变得僵硬。
Turn-Level 事后自蒸馏的优势在于,它可以不断从模型自身的新轨迹中筛选高质量回合,生成新的蒸馏样本。这样训练分布会持续更新,而不是锁定在一批静态数据上。
3. TurnSight 方法拆解:三个关键设计
从标题拆解,TurnSight 有四个核心关键词:Turn-Level、Hindsight、Self-Distillation、Tool-Integrated Reasoning。下面逐个解读。
3.1 Turn-Level:把监督信号从轨迹粒度压缩到回合粒度
在工具集成推理中,“回合”是一个天然边界。一个回合通常包括:模型产生一段思考或意图,决定调用某个工具,传入参数,工具返回观察结果。可以把回合理解为一组“单步决策”:在特定历史上下文下,模型做出一次动作选择。
Turn-Level 的作用,是对每一个回合独立计算质量信号。比如搜索回合,判断搜索关键词是否准确;代码执行回合,判断代码逻辑和工具调用参数是否合理;汇总回合,判断输出是否与工具观察一致。
这种细粒度的好处是训练时可以单独强化优秀的搜索策略,单独纠正错误的代码逻辑,而不受其他回合表现的影响。
3.2 Hindsight:基于最终结果做事后修正
Hindsight 的核心逻辑非常朴素:拿到结果后,再回头审视过程。
标准做法是先让模型完成一整条工具调用轨迹,得到最终答案。然后根据最终评价(答案对错、验证器打分、人工评价等),对每个回合重新生成一个“修正版”。这个修正版不是简单地让模型重写一句更好的思考,而是让模型站在“知道最终结果会是什么样的”视角,去反思每个回合中哪一步决策可优化。
举个例子,一个会计 Agent 在处理“计算某公司 2024 年 Q3 与 Q3 环比增长率”的任务时,模型第一回合调用搜索查询的是“公司 2024 年第三季度利润”,第二回合调用代码计算增长率。事后发现 Q3 数据缺失,真实原因是第一回合应该直接查询“2024 年第三季度净利润,需要与第二季度对比”。有了 hindsight 信息,系统可以指导模型:第一回合的搜索关键词需要修正为“公司 2024 年 Q3 与 Q2 净利润对比数据”。这个修正后的第一回合动作,就能成为训练信号。
这种方法还天然适合工具返回失败或异常观察的场景。如果某次工具调用返回了报错信息,hindsight 可以引导模型意识到:需要换一种工具,或者先检查参数格式。
3.3 Self-Distillation:让模型向修正后的自己学习
Self-Distillation 在这里扮演的是训练范式角色。经典蒸馏是两个模型:大模型当教师,小模型当学生。在 TurnSight 的语境下,教师不是另一个更大的模型,而是“加入 hindsight 修正后的模型自身输出”。
流程可以理解为:
- 模型在工具环境中运行,生成一条多回合轨迹。
- 系统根据最终结果,为每个回合生成修正后的决策。
- 过滤后的修正回合作为软标签或硬标签。
- 模型在这些标签上继续训练,逐步吸收更优的回合策略。
这里的“自”字很关键,它意味着模型不需要在训练时依赖人类专家逐回合标注,而是可以根据最终结果,自己生成改进版本。这既降低了数据标注成本,也增加了训练数据的规模上限。
3.4 Tool-Integrated Reasoning:整个方法作用的具体场景
Tool-Integrated Reasoning 是这套训练思路的应用场景。它的目标不是让模型“背会”答案,而是让模型学会正确使用工具完成推理。当前业界常见的具体形态包括:
- 代码解释器集成:模型生成代码,解释器执行,反馈结果。
- 搜索引擎检索:模型生成查询词,搜索引擎返回候选片段。
- 数据库查询:模型生成 SQL 或调用数据库工具。
- 办公文档处理:模型调用表格处理、文档 API、PDF 解析插件。
TurnSight 特别适合这些场景,因为工具调用过程天然带有结构化的回合边界,hindsight 信号容易对齐到具体动作。
4. 与主流方法的对比定位
要理解 TurnSight 的位置,需要把它放回工具集成推理训练方法的地图里。这里做一个通用对比:
| 方法 | 信号粒度 | 信号来源 | 训练范式 | 主要问题 |
|---|---|---|---|---|
| 整轨迹监督学习 | 整条轨迹 | 人工专家轨迹/模型采样 | 标准 SFT | 无法定位中间错误 |
| 结果奖励模型 (ORM) | 最终结果 | 规则验证/人工 | RL | 奖励稀疏 |
| 过程奖励模型 (PRM) | 中间步骤 | 训练一个过程打分器 | 监督+RL | 需要额外训练过程标注器 |
| ReAct/反思式提示 | 回合内 | 测试时提示策略 | 提示工程 | 能力取决于基座模型 |
| TurnSight(概念) | 单回合 | 基于最终结果的事后修正 | 自蒸馏 | 需设计好的 hindsight 生成策略 |
从这张表可以直观看到,TurnSight 不是与 PRM 完全对立,而是提供了一个不同的信号获取方式。PRM 需要额外的过程奖励模型来逐回合打分,TurnSight 则用“最终结果 + 事后回溯”来直接生成修正目标。如果要把二者结合,可以用 PRM 提供回合级质量过滤,然后用 TurnSight 生成修正标签,两者相辅相成。
与 ReAct 这类提示工程方法相比,TurnSight 属于训练层面,并不会在测试阶段增加额外推理开销。模型部署后仍然可以沿用标准的多回合工具调用推理流程。
5. 适用场景与使用边界
5.1 适合什么场景
- 工具调用 Agent 微调:手上已经有大量多回合工具调用日志,希望提升模型在复杂任务中的回合决策质量。
- 搜索增强问答:模型经常因为查询词不精准导致检索结果差,想要训练模型学会“如果第一轮搜索没找到,就换个更窄的查询词”。
- 代码任务 Agent:模型需要调用 Python 解释器或数据库,并读取错误信息修正下一步。
- 模型自我改进流水线:希望在不依赖大量人工标注的前提下,持续提升模型策略。
5.2 不适合什么场景
- 单轮问答场景:没有工具调用和回合结构,Turn-Level 无从谈起。
- 无法获取最终结果真值或可靠验证器的任务:hindsight 信号容易引入噪声。
- 超低算力环境:蒸馏训练需要额外的数据构造和训练计算,至少需要稳定的 GPU 训练环境。
5.3 使用边界与合规提醒
工具调用意味着模型可能访问真实搜索引擎、数据库、代码执行环境。在构造训练轨迹和事后修正时,必须注意:
- 数据合规:使用公司内部日志时,确保数据脱敏,不包含用户敏感信息。
- 工具授权:所有工具调用都应基于明确授权,不访问未授权的系统。
- 代码执行安全:工具执行环境要隔离,避免模型生成的代码执行危险操作。
- 结果复核:任何涉及金融、医疗、法律等高风险场景的输出,都必须人工复核。
- 版权合规:检索到的外部材料不得直接用于商业用途,除非确认授权。
6. 工程化落地一个最小验证流程
现在把 TurnSight 的概念转换成可操作的最小流程。整体分四步:数据准备、hindsight 信号生成、回合级蒸馏训练、验证。
6.1 数据准备:构造多回合工具调用轨迹
首先需要一个工具调用环境。这里以 Python 演示一个简化版工具集成推理框架:
# demo_tool_env.py # 一个最小化的工具调用循环示例,实际项目中需要按真实工具API接入 def run_tool(tool_name: str, params: dict) -> str: if tool_name == "search": # 实际项目中替换为真实检索API return f"搜索结果: {params.get('query', '')}" elif tool_name == "python": # 实际项目中替换为隔离的代码执行环境 code = params.get("code", "") return f"执行结果: {code[:50]}..." else: return "Unknown tool"接下来定义回合数据结构。每个回合包含模型思考、工具调用参数、观察结果。
from typing import List, Dict def collect_trajectory(question: str, max_turns: int = 8) -> List[Dict]: """模拟一条多回合工具调用轨迹的收集过程""" trajectory = [] history = [{"role": "user", "content": question}] for turn in range(max_turns): # 1. 生成模型决策,实际项目中调用LLM API model_thought = f"第{turn}轮思考,决定调用某个工具" tool_call = {"tool": "search", "params": {"query": f"问题{turn}"}} observation = run_tool(tool_call["tool"], tool_call["params"]) # 2. 记录当前回合 trajectory.append({ "turn_id": turn, "thought": model_thought, "tool_call": tool_call, "observation": observation, }) # 3. 更新历史 history.append({"role": "assistant", "content": model_thought}) history.append({"role": "tool", "content": observation}) # 判断是否结束,实际项目中根据模型是否生成final_answer判断 if turn == 2: break return trajectory这只是一个演示框架。真实项目中,轨迹来源通常是 Agent 运行日志、开源工具调用数据集或人工构造的 SFT 数据。
6.2 生成 Hindsight 信号
拿到完整轨迹并知道最终答案后,进入 hindsight 信号生成阶段。这一步的核心是用一个较强的 LLM,结合最终结果,对每个回合生成修正建议。
# 通用命令模板,实际项目需要按真实脚本替换路径和模型名 python generate_hindsight.py \ --trajectory_file ./data/trajectories.jsonl \ --output_file ./data/hindsight_samples.jsonl \ --model gpt4o_or_equivalent \ --judge_prompt ./prompts/hindsight_judge.txtgenerate_hindsight.py内部的逻辑大致如下:
# generate_hindsight.py 核心逻辑示例 import json from typing import Dict def build_hindsight_prompt(turn: Dict, final_answer: str, is_correct: bool) -> str: """构造一个回合级别的事后反思提示""" return f""" 这是工具推理轨迹中的一个回合: - 模型思考:{turn['thought']} - 工具调用:{turn['tool_call']} - 工具观察:{turn['observation']} 这条轨迹最终答案的正确性:{is_correct} 最终答案:{final_answer} 请站在事后视角,判断这个回合的决策是否合理。 如果合理,保留原来的决策内容。 如果存在问题,请输出一个修正后的思考+工具调用。 输出格式:JSON {{ "status": "keep|fix|remove", "revised_thought": "...", "revised_tool_call": {{"tool": "...", "params": {{}}}}, "reason": "..." }} """ def parse_hindsight_response(response_text: str) -> Dict: # 实际项目中需要处理JSON解析和异常情况 return json.loads(response_text)这里有一个关键设计点:不是所有回合都需要修正。如果模型回合本身已经合理,就保留;如果回合无关紧要,可以选择移除;如果回合出现错误,才生成修正版。这样可以避免蒸馏后模型变得畏首畏尾。
6.3 构建回合级蒸馏数据集
hindsight 信号生成后,需要转换成训练格式。每个样本的输入是“截至当前回合的历史上下文”,输出是“修正后的回合决策”。
{ "train_samples": [ { "instruction": "基于以下历史工具调用记录,完成下一步决策。", "history": [ {"role": "user", "content": "计算某公司2024年Q3净利润较Q2的增长率"}, {"role": "assistant", "content": "我需要先搜索公司的季度财务数据。"}, {"role": "tool", "content": "搜索结果是2024年Q3净利润数据。"}, {"role": "assistant", "content": "我现在需要确认Q2数据是否存在。"} ], "target": { "thought": "应当一次搜索同时包含Q3和Q2的财务数据,避免两次检索导致口径不一致。", "tool_call": "search[公司2024年Q3和Q2净利润对比数据]" } } ] }数据集组织上,建议把同一个原始轨迹的多个回合样本放在一组,便于训练时控制采样比例。比如每条轨迹最多抽取 5 个修正回合,避免长轨迹主导训练。
6.4 回合级蒸馏训练
蒸馏训练阶段,在目标模型上使用 SFT 方式训练,输入是历史上下文,输出是修正后的回合决策。如果目标是多任务模型,也可以同时保留原始完整轨迹 SFT 损失,防止模型只学局部决策而丢失全局规划能力。
# 训练命令通用模板 python train_distill.py \ --input_file ./data/hindsight_samples.jsonl \ --output_dir ./models/turnsight_distilled \ --base_model your_base_model \ --epochs 3 \ --batch_size 8 \ --gradient_accumulation_steps 4 \ --learning_rate 5e-6 \ --max_length 4096 \ --use_lora true训练时需要注意几个细节。第一个是 loss 应该只在 target 部分计算,不计算 history 部分的 loss。第二个是如果被蒸馏的是回合级动作,需要为每个回合构建独立的 attention mask。第三个是建议混合一部分全轨迹样本,防止模型上下文建模能力退化。
6.5 验证流程
蒸馏结束后,进入验证阶段。验证不能只看最终答案,必须看回合级行为变化。
# evaluate_turnsight.py # 验证蒸馏前后模型在工具调用回合上的行为差异 def evaluate_agent(test_questions, run_agent_fn): results = [] for q in test_questions: trajectory = run_agent_fn(q) final_correct = check_final_answer(trajectory) turn_validity = [check_turn_validity(t) for t in trajectory] results.append({ "question": q, "final_correct": final_correct, "turn_validity": turn_validity, "invalid_turn_ratio": 1 - sum(turn_validity) / len(turn_validity), }) return results建议从三个维度观察:
- 最终准确率:整体任务解决率是否提升。
- 回合无效调用率:是否存在明显无意义的工具调用。
- 错误修正能力:当工具返回错误或异常结果时,模型是否能在下一回合纠正。
如果蒸馏过程有效,第二和第三个维度的改善通常会先出现,最终准确率的提升会滞后一些。
7. 评估与训练细节
7.1 评估指标怎么设计
工具集成推理的评估不能只用单一指标,至少需要这三类:
- 任务完成指标:准确率、通过率、验证器分数。
- 过程质量指标:有效工具调用比例、无谓调用比例、平均回合数。
- 鲁棒性指标:同样的任务换一批数据后,模型是否仍然稳定。
任务完成指标衡量结果,过程质量指标衡量策略,鲁棒性指标衡量泛化。TurnSight 主要优化的是过程质量,最终结果提升是过程质量提升的自然结果,但不一定每次都能同步放大。
7.2 训练数据规模与配比
一条多回合轨迹通常包含 5 到 15 个回合,但并非所有回合都值得蒸馏。实践中建议:
- 优先保留最终答案正确但存在低效中间步骤的轨迹。
- 对最终答案错误但部分回合有效的轨迹,只保留其中高质量回合。
- 如果某条轨迹绝大多数回合都有问题,直接丢弃可能比修正更安全。
回合级蒸馏和轨迹级 SFT 的比例,建议从 1:1 起步。如果发现训练后模型反应过碎,就降低回合级样本比例;如果发现模型整体规划能力不足,就增加全轨迹样本。
7.3 基础模型选择
TurnSight 方法本身对基础模型没有特殊要求,但不同模型的表现差异明显:
- 强推理模型:更容易从 hindsight 信号中吸收策略,蒸馏效果明显。
- 中等规模模型:可能需要更多回合级样本才能看到改善。
- 工具调用能力弱的模型:先解决“会不会调用工具”的问题,再谈“回合级最优策略”。
如果基础模型本身执行一句话都调用不好工具,直接做回合级蒸馏意义不大,应该先补充基础工具调用 SFT 数据。
8. 常见问题与排查方法
在落地过程中,可能遇到下面几类问题。这里给出一份通用排查表:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 蒸馏后最终准确率下降 | 回合级样本占比过高,模型丢失整体规划能力 | 对比验证集上的回合有效率和最终准确率 | 降低回合级样本比例,增加全轨迹样本 |
| 模型开始频繁调用工具 | hindsight 错误地把“节省调用”修正为“多调用” | 检查修正样本中工具调用是否合理 | 在 hindsight prompt 中明确禁止无意义新增调用 |
| 修正后的工具参数无法执行 | 生成修正信号时没有经过真实工具环境验证 | 检查修正样本的 tool_call 格式 | 修正文本必须回填到真实工具执行,成功后才进入训练集 |
| 长时间训练后无法收敛 | 数据噪声过大或修正信号前后矛盾 | 统计样本中的修正率和保留率 | 提高最小置信度过滤阈值,或增加人工抽检 |
| 回合精度提升但最终答案被忽略 | 训练目标过于聚焦回合动作 | 检查 loss 设计 | 在回合级 loss 之外保留答案生成 loss |
| 模型在真实环境中暴露新错误 | 蒸馏数据覆盖了旧问题,但训练分布缺少新场景 | 对比线上错误分布 | 定期用新轨迹数据重新生成 hindsight 训练集 |
其中最容易踩的坑是“hindsight 噪声”。事后反思认为修正版更好,不代表修正版真的能在工具环境中跑通。比如模型修正后的搜索关键词可能语法正确,但搜索引擎返回为空。所以训练样本必须经过工具执行验证,凡是工具调用执行失败或返回异常的修正样本,要么丢弃,要么重新生成。
另一个常见坑是“蒸馏模型自我一致性下降”。因为回合级训练会让模型更关注局部动作,有时会忽略全局目标。解决方法是训练时混合一定比例的完整轨迹样本,并在验证时关注整体任务完成率。
9. 最佳实践与合规使用建议
从工程角度,我总结几条直接可用的建议。
9.1 先跑最小闭环,再放大数据
不要一开始就追求构建十万级回合级数据集。先拿 200 到 500 条轨迹跑通完整流程:收集轨迹、生成 hindsight、构建训练样本、训练小模型、验证效果。确认每个环节的信号质量后,再扩大规模。
9.2 建立回合级数据集的质量哨兵
在 hindsight 生成阶段,建议加入自动规则和抽检流程。自动规则包括:修正后的工具参数必须通过 JSON schema 校验;修正后的搜索词不能为空;修正后的代码必须可执行。抽检流程则是每隔一段时间人工看一批修正样本,确认信号没有跑偏。
9.3 工具环境必须隔离
模型生成的代码可能包含无意甚至恶意的系统命令。工具执行环境必须使用容器或沙箱隔离,不要让它直接接触生产数据库和内部网络。每次工具调用的日志都要保存,方便回溯分析。
9.4 数据合规与隐私边界
如果轨迹数据来自真实用户会话,必须做脱敏处理。用户名、会话 ID、IP、内部系统名都要替换。使用第三方工具时,确认该工具的运行环境数据不会被滥用。工具调用结果如果包含第三方版权内容,不能直接作为训练语料使用。
9.5 发布与商用前做效果复核
任何蒸馏后的模型,在发布到生产环境或商用之前,都要在独立测试集上做效果复核。重点观察:工具调用成功率、错误修正能力、输出内容是否涉及敏感信息、在高风险任务上是否产生不合理建议。如果涉及金融、医疗、法律等领域,必须有人工复核机制。
9.6 保留基线用于回归测试
每次迭代训练后,保存一份上一个版本的模型参数和评估结果。在回合级指标和最终任务指标上做对比,确认新版本没有出现明显的策略退化。没有基线的迭代,很容易在“看起来在变好”中逐渐积累隐性风险。
10. 总结与下一步行动
TurnSight 这个名字本身暗示了“将事后经验转化为下一步远见”。从标题和方法拆解来看,它最值得关注的不是“自蒸馏”这个概念本身,而是把优化粒度从整条轨迹下放到回合级。对于工具集成推理这种天然多回合、工具调用错一个环节就全盘错误的任务,回合级事后自蒸馏确实是一个方向感很强的解法。
如果你准备在真实场景中验证这套方法,建议按下面顺序行动:
- 先收集 100 条带最终答案标签的多回合工具调用轨迹。
- 搭一个最小 hindsight 生成流程,用较强的 LLM 为每个回合生成修正建议。
- 把修正建议回填到真实工具环境,过滤执行失败的样本。
- 在目标模型上混合回合级样本和原始轨迹样本,做一次小规模 Lora 训练。
- 对比验证集上的任务准确率、无效工具调用比例、错误修正能力三个指标。
最容易踩的坑是:修正样本没有经过工具执行验证就进入训练集,导致模型学了一堆“看起来正确但实际跑不通”的动作。这一点务必在一开始就做好过滤。
后续如果论文官方放出代码和基准,你可以很快把上面这套流程对齐到官方实现上。如果 TurnSight 后续还加入了多模型集成或过程奖励模型的扩展,那它很可能值得进一步观察:回合级信号构造,正在成为工具智能体训练里一块非常关键的基础设施。
这篇文章先到这里。建议收藏备用,特别是当你正在做工具调用 Agent 微调、Function Calling 数据构造、或者纠结“模型到底在哪一步跑偏”的时候,回来对照这套回合级蒸馏流程,会很有帮助。