Q05工具调用FunctionCallAgentAlpha 社区约 6 分钟更新 2026-09-14

Function Call 的训练数据怎么构建:正样本、难例与合成数据

Function Call 的训练数据不是「问题加正确调用」的集合,而是围绕会选、会填、会排格式、会修正四个目标构造的轨迹集。本文讲清正样本之外的负样本与难例怎么造、合成数据与真实日志怎么取舍,以及 LoRA 轻训与 SFT 加 DPO 重训的边界。

面试官原题

Function Call 的训练数据怎么构建?

面试官 · Agent 岗面试现场

「Function call 怎么训练的?怎么微调的?」——这道题最常见的答案是「准备一批问答对,做 SFT」。答到这里就断了:数据从哪来、除了正样本还要什么、合成数据和真实日志怎么选,一个都接不上。

丢分的根源是把它当成了普通对话训练。Function Call 的训练数据不是一问一答的集合,而是带完整轨迹的任务样本集——工具怎么注册、对话怎么演进、调用错在哪、怎么修正,都在轨迹里。

先说结论

构建思路是「先定训练目标,再配数据形态」:围绕工具选择、参数绑定、格式化、多轮修正四个能力,组织正样本、负样本、拒绝样本和纠错轨迹;合成数据负责覆盖面,真实日志负责贴近线上分布;最后按错误层次决定投入——格式问题修工程,知识问题 LoRA 轻训,行为问题 SFT 加 DPO。

训练数据的三类托盘:正样本、难例、合成 图:小蓝图解——训练数据的三类托盘:正样本、难例、合成。

四个训练目标,四种样本形态

模型要学会的不是「输出一段 JSON」,而是四个能力,每个能力对应不同的样本形态:

能力目标模型要学会什么对应样本形态
工具选择候选里挑对工具;无工具可用时拒答带干扰工具的候选集样本;明确的拒绝样本
参数绑定取值从上下文和工具返回里来,不编造取值来源可追溯的调用;缺值时先澄清的样本
格式化稳定产出合法调用格式覆盖长参数、嵌套结构、边界值的格式样本
多轮修正依赖前序结果;报错后修正再试失败、报错、修正、成功的完整轨迹

美团篇还有一道配套题:「Function call怎么把下游的一些工具,插件变成模型可以理解的方式?」(AgentAlpha 面试题库 · 美团篇)——训练数据就是这道题的答案实体:每条样本把工具注册信息、对话历史、该产出的调用对齐成一条轨迹,这个对齐本身就是「翻译」。

正样本之外,难例才是分水岭

只用成功轨迹训练,模型学到的先验是「每问必调、一调就对」。线上从来没有那种世界。

要刻意构造四类样本:

  1. 无效调用样本:参数越界、调用不存在的工具,让模型学会看到报错后修正,而不是硬编下去;
  2. 拒绝样本:请求超出工具能力时明确说做不到。没有这类样本,模型会把「答不了」扭曲成一个看起来像样的错误调用;
  3. 歧义难例:多个工具都能完成任务。字节篇考过标签设计:「一个 Query 有两个正确工具时,训练标签如何设计才不会惩罚合理策略?」(AgentAlpha 面试题库 · 字节篇)两种正解:一条样本挂多个参考答案,任一命中算对;或者把选择做成偏好数据,不设唯一标签;
  4. 纠错轨迹:真实任务里完整的失败、修正、成功过程,这是多轮修正能力的唯一来源。

配比没有万能数字,原则只有一条:难例配比跟着线上错误分布走。日志里参数类错误占大头,训练集里参数难例就该占大头,闭门造车的配比只是自我安慰。字节篇把字段级要求也考了:「工具调用训练数据应该包含哪些字段?无效调用和拒绝调用样本怎样构造?」(AgentAlpha 面试题库 · 字节篇)

合成数据与真实日志的取舍

两条来路各有分工。

合成数据的优势是快、覆盖广、能定向补难例;风险是分布偏置——用模型生成数据再教模型,等于让一个学生的错题本来自另一个学生的错题本,口味会自我强化,难度也难控。

真实日志贴近线上分布,但脏:要脱敏、去重,还要剔除偶然成功——那次调用碰巧对了,不代表策略可复制。字节篇考过筛法:「如何从线上轨迹中筛选 Agent RL 数据,避免把偶然成功当成优质样本?」(AgentAlpha 面试题库 · 字节篇)

大规模合成的代表是 ToolLLM:从上万条真实 API 的文档出发,自动生成多样的工具调用指令,覆盖单工具与多工具链场景;配一个 API 检索器为每条指令缩小候选范围,再用这些数据微调出 ToolLLaMA;配套的 ToolEval 用通过率和胜率做自动评测,论文报告这个开源模型在评测上接近当时 ChatGPT 的工具调用水平。它验证了两件事:合成数据足以把工具调用能力教到可用;评测集必须独立于合成管线——不然就是既当运动员又当裁判。

字节篇的这道题就是合成管线的验收清单:「合成训练数据如何做质量过滤、难度分层和去重?」(AgentAlpha 面试题库 · 字节篇)——事实校验对齐真实 API 文档,按难度分层做课程,按语义去重防止模板复读。

LoRA 轻训还是 SFT 加 DPO 重训

先说名词:LoRA 是只训练少量附加参数的低成本微调;SFT 是用标注样本做监督微调;DPO 是直接拿成对偏好数据调行为、不需要另训奖励模型的方法。

按错误层次决定投入:

问题层次现象值得的投入
工程层格式偶尔不合法、参数没人校验校验层加报错重试,不用训练
知识层选错工具、参数幻觉率高SFT 或 LoRA,喂领域工具的正负样本
行为层该拒绝不拒绝、多工具该选谁摇摆SFT 之后接 DPO,用偏好数据校行为

边界判断只有一句话:先确认错误不是工程层造成的,再谈训练。Schema 含糊、没有校验层造出来的错误,样本再多也教不会模型——你只是把工程债训进了参数,这是最贵也最冤的修法。

阿里篇把这组要求合成一题:「工具调用模型的训练集应包含哪些正例、负例、拒绝例和纠错轨迹?」(AgentAlpha 面试题库 · 阿里篇)——能按这四类报出样本形态和构造方法,这道题就过线了。

面试迁移

追问预测:

  1. 「合成数据怎么防止越训越偏?」——事实校验对齐真实 API 文档;评测集独立于合成管线;难度分层避免全是简单样本;
  2. 「训练标签遇到多解怎么办?」——多参考答案或偏好对,不给唯一标签;
  3. 「怎么判断该训练了而不是该修工程?」——错误归因:换 Schema 表述、加校验层能消掉的错误,不该进训练集。

容易扣分的说法:「SFT 一把梭」「数据越多越好」。前者忽略行为层需要偏好数据;后者忽略脏数据的伤害比缺数据大。

要点复盘

  • 数据形态是带完整轨迹的任务样本,不是一问一答;
  • 四个训练目标:工具选择、参数绑定、格式化、多轮修正,各有对应样本;
  • 必配四类非正样本:无效调用、拒绝、歧义难例、纠错轨迹,配比跟线上错误分布走;
  • 合成数据管覆盖,真实日志管分布,评测集必须独立于合成管线;
  • 训练投入按错误层次走:工程层修代码,知识层 LoRA 或 SFT,行为层上 DPO。

参考答案要点

Function Call 的训练数据围绕四个能力构造:会选工具、会绑参数、会排格式、会在多轮里修正,形态是带完整轨迹的多轮样本。正样本之外必须刻意造难例:无效调用、拒绝样本、多工具歧义的偏好数据、失败后修正的轨迹,配比跟着线上错误分布走。数据来源两条腿:合成数据保覆盖面,但要事实校验和难度分层;真实日志贴近分布,但要去重、脱敏、剔除偶然成功。常见的坑是把工程债训进模型——Schema 含糊和缺校验造成的错误,训练救不了,先修工程。投入边界:知识层错误 LoRA 或 SFT 轻训就够,行为层问题才上 DPO。

—— 本场面试完 ——