核心要点

  • 能讲清本质:FC 不是预训练天生具备,而是后训练(SFT + 可选 RL)针对结构化工具调用专门对齐出来的

  • 能说出数据构造:大量「用户意图 + 可用工具 schema + 正确的结构化调用」轨迹,覆盖单次/多次/并行/嵌套,以及「无需调用」的负样本防过度调用

  • 能说出格式与多轮:用特殊 token 或固定格式(如 tool_call 标签包 JSON)标注调用,并训练「调用→工具结果→继续推理→最终答」的多轮交错

  • 能说出来源与挑战:合成(真实 API + 程序校验)+ 人工标注;难点在参数抽取准确、何时不调用、不幻觉不存在的函数、JSON 合法性

标准回答

本质:后训练对齐出来的能力

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 或沙箱执行调用,程序就能自动判断参数是否正确、结果是否符合预期,从而低成本地产出带干净标签的大规模轨迹,并精准覆盖并行、嵌套、错误恢复等长尾情形——这比纯人工标注更快也更可控,人工标注则用于补足真实意图的多样性与边界判断。

🔗 相似问题

同一考点的不同问法,面试官可能换着问,一起刷更稳

没找到想看的面试题?把你想看的告诉我们 →

延伸学习

按主题分类的相关资源,便于系统复习