不少团队给通用模型补完工具调用数据后,看到的是JSON合法率上升、函数参数抽取稳了。⚠️ 但一进真实对话,模型就开始用又短又硬的句式回话。📉 明显的信号是开放问答胜率下降,解释能力发空。🧠 这不是模型变笨,是格式学习挤占了表达学习。
工具调用样本最容易把模型带偏到格式优先
工具调用样本有个天然偏置:大段schema、固定字段名和重复系统提示,会让损失快速收敛到外层格式。🔍 一旦再叠加长JSON和高频工具名,模型最容易学到的不是何时该调用工具,而是先把回答写成工具输出的样子。📌 结果就是结构化评测升得很快,普通解释型回答却开始发紧。🚨
很多团队的错法也很一致:把历史工具轨迹、普通问答和RAG解释样本一次性混在同一批里跑,还让所有 token 等权学习。🧩 问题在于,schema前缀和字段壳子更长、更重复,梯度会天然压过参数语义和自然语言转述。🛠️ 如果再把工具调用占比堆到三成以上,模型就会更偏向先排格式再想内容。⏱️
一组 SFT 回放里,真正拖垮体验的是配比和损失焦点
这次回放使用7B指令模型做SFT,训练集包含客服问答、代码解释和工具调用三类样本。🧪 基线方案保持原始通用数据;方案二直接把工具调用样本混到35%;方案三把工具调用占比做成分阶段 curriculum,并对schema壳子施加 format dropout。📊 结果很明确:拖垮体验的不是工具样本存在,而是它们以错误方式主导了损失。
| 方案 | 工具调用成功率 | 开放问答胜率 | 无效JSON比例 | 人工主观感受 |
|---|---|---|---|---|
| 原始通用 SFT | 61.8% | 68.4% | 6.9% | 回复自然,但工具不稳 |
直接混入35%工具样本 | 82.7% | 54.1% | 2.8% | JSON很稳,语气发硬 |
| Curriculum + format dropout | 80.9% | 66.2% | 3.1% | 工具稳定,解释能力保住 |
表里最关键的不是工具成功率,而是开放问答没有被一起拖下去。📍 直接混入高比例工具数据后,模型在函数调用评测上冲得很快,可解释型问题的胜率却掉了十多个点。✅ 把训练改成先低占比热身、中期拉高、后期回落,再给固定schema壳子做 dropout,模型会把学习重心拉回何时调用、参数填什么和解释怎么说。🔒
deftoken_weight(token):iftoken.is_schema_wrapper:return0.35iftoken.is_argument_value:return1.15return1.0deftool_mix_ratio(step,total_steps):warmup=step/total_stepsifwarmup<0.3:return0.18ifwarmup<0.7:return0.32return0.22真正有效的是控制格式学习节奏,而不是继续堆工具轨迹
更稳的工程顺序不是继续加数据,而是先治理工具样本的形状。🚦 经验上,工具调用样本适合作为阶段性强化数据,而不是长期占据高比例;schema说明越冗长、字段顺序越固定,越该在训练里打散外层壳子,避免模型把像工具输出误学成最安全回答。💡 同时,开放问答、解释型回复和工具后总结样本必须保留足够权重,不然最先坏掉的一定是自然表达质量。📎
笔者认为,未来3到6个月,AI agent训练的重点会从工具接得更多,转到工具接得准,同时还能解释为什么这样接。🚀 结构化输出和工具调用重要,但它们不该吃掉通用对话能力;谁先把 schema curriculum、format dropout 和后置总结样本治理好,谁的 agent 体验就更稳。💬 你们线上更常见的问题,是工具调用不稳,还是稳了以后通用回复开始发硬?如果这篇文章对你有帮助,欢迎点赞、收藏和关注。