标准回答
本质:后训练对齐出来的能力
Function Calling 不是基座模型预训练阶段就自带的天赋,而是在后训练(对齐)阶段专门「教」出来的。预训练让模型具备语言与推理基础,但要稳定地在合适时机输出一段机器可解析的结构化调用,必须用针对性的监督数据把这一行为对齐进去。
监督数据怎么构造
核心是构造大量三元组轨迹:用户意图、当前可用工具的 schema(函数名、参数、类型、描述)、以及对应的正确结构化调用。数据要覆盖多种形态:单次调用、一轮内多次/并行调用、嵌套调用(一个工具结果作为下一个工具的输入),尤其要包含「无需调用」的负样本——即问题用模型自身知识就能答、不该乱调工具,用于抑制过度调用(over-calling)。
格式标注与多轮交错
调用通常用特殊 token 或固定模板标注,例如把调用包成 tool_call 标签内的一段 JSON,让训练目标与解析边界清晰。同时要训练多轮交错的完整链路:模型发起调用 → 框架执行并回填工具结果 → 模型基于结果继续推理或再次调用 → 给出最终答案。这样模型学到的不只是「写出一次调用」,而是整个工具使用的交互节奏。
数据来源与 RL 强化
数据主要两条来源:合成(用真实 API 或可执行环境生成调用,再用程序自动校验参数与结果是否正确,天然提供干净标签)和人工标注(覆盖真实复杂意图与边界情况)。SFT 之后可再叠加 RL 或偏好优化,以「调用是否正确、参数是否准确、是否在该调用时调用」作为奖励信号,进一步提升可靠性。
常见误区
⚠️ 常见踩坑
别以为 Function Calling 是模型「天生会」的——它完全依赖后训练数据对齐;也别只喂正样本,缺少「无需调用」的负样本会导致模型过度调用、对简单问题也强行调工具,反而降低可用性。
追问
追问 1:为什么要专门构造「无需调用」的负样本?
如果训练数据几乎全是「该调用」的正样本,模型会学到「看到工具就倾向调用」的偏置,对本可直接回答的问题也强行调工具,造成延迟、成本和错误上升。加入大量负样本能教会模型「何时不调用」,让调用决策更接近真实场景的分布。
追问 2:怎么保证模型输出的调用参数是合法 JSON 且符合 schema?
训练侧用固定格式/特殊 token 标注并用程序校验过滤非法样本,让模型见过大量合法结构;推理侧可叠加约束解码(constrained/grammar decoding)强制输出符合 schema 的结构,或对非法输出做校验后重试。两者结合能显著降低 JSON 不合法或参数缺失的概率。
追问 3:为什么合成数据在 Function Calling 训练里特别有用?
工具调用天然可执行、可验证:用真实 API 或沙箱执行调用,程序就能自动判断参数是否正确、结果是否符合预期,从而低成本地产出带干净标签的大规模轨迹,并精准覆盖并行、嵌套、错误恢复等长尾情形——这比纯人工标注更快也更可控,人工标注则用于补足真实意图的多样性与边界判断。
🔗 相似问题
同一考点的不同问法,面试官可能换着问,一起刷更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习