27届大模型面试准备(四十二):大模型工具调用与智能体化训练——从 Function Calling 数据构造到 Agentic 后训练

引言:本篇看"怎么造出一个会调工具的模型"

B18 从工程视角讲过 Function Calling 全链路(定义声明、意图路由、参数抽取、执行回写),那是"系统怎么调模型"。本篇换到训练视角:怎么把一个只会聊天的基座模型,训练成"天生会调工具、会按 schema 出参数、会在多轮里自主决策"的 Agentic LLM。这是后训练(post-training)里增长最快的方向之一,也是华为这类要做"多模态 + 工具智能"岗位最看重的硬实力:你不只会上层拼 Agent,还要懂底层是怎么训出来的。

一、整体流水线:从能力目标到训练数据

造一个会调工具的模型,本质是把"调用工具"这个能力,拆解成可训练的信号。典型流水线是:

能力目标
  │
  ▼
工具/API 定义库(OpenAPI / JSON Schema 集合)
  │  采样出"用户问题 + 可用工具集"
  ▼
轨迹合成(Self-Instruct / 模型扮演 / 人工标注)
  │  生成 (think → call_tool → observe → call_tool → answer)
  ▼
数据清洗 + 拒绝采样(过滤非法 JSON / 参数错误 / 逻辑错)
  ▼
分阶段训练:SFT(模仿)→ 偏好对齐(DPO)→ 强化(RLVR / 环境奖励)
  ▼
评测闭环:工具选择准确率 / 参数 F1 / 执行成功率

关键点:工具调用数据不能只靠人工写,成本高且覆盖窄;主流做法是"先模型合成、再拒绝采样筛选、最后人工抽检校准",形成可规模化的数据飞轮(呼应 A23 数据工程)。

二、工具调用数据的构造细节

第一,Schema 采样:从一个工具库里随机抽 1—N 个工具作为"当前可用集",避免模型只会调某一个固定工具;同时要混入"无关工具"做负样本,训练模型"不该调时不调"。第二,多轮轨迹合成:用强模型(或人工)扮演"用户提需求 → 模型决定调哪个工具 → 给出假定返回 → 模型再决策"的多步轨迹,最考验中间观察(observation)的合理性——合成时若返回乱编,模型会学到错误因果。第三,拒绝采样:对同一问题生成多条轨迹,用校验器(schema 合法性、参数类型、执行是否真能跑通)筛选,只保留正确轨迹进训练集。第四,格式固化:工具调用有固定协议(如带 name/arguments 的结构化块),训练数据要把这套格式固化进模型,使其"原生产生"合规调用,而不是靠外部 parser 硬抠。

三、分阶段训练:SFT → 偏好 → 强化

阶段 目标 数据 收获 风险
SFT 模仿正确调用轨迹 高质量合成轨迹 会按格式调工具、填参数 只会模仿,异常不会自救
偏好对齐(DPO) 区分"好调用"与"坏调用" 同一问题成对轨迹 选对工具、参数更准、少幻觉 偏好定义难、易过拟合风格
强化(RLVR/环境奖励) 最大化任务成功 可执行环境回报 真把事做成、鲁棒 奖励黑客、训练不稳

SFT 阶段解决"会不会调":让模型见过足够多样的 (问题, 工具集, 正确调用) 三元组,学会格式与基本路由。DPO 阶段解决"调得好不好":对同一问题构造"选对工具 vs 选错工具""参数正确 vs 编造参数"的偏好对,让模型在取舍上更稳。强化阶段解决"能不能做成":把工具调用结果接回环境,用"任务是否完成"做奖励(RLVR,呼应 A22),迫使模型学会在错误返回时换工具、重试、反思。

四、与 RAG / Agent 的关系

工具调用是 Agent 的"手"(B18/B34),RAG 是 Agent 的"知识外挂"(A32)。训练一个 Agentic LLM,往往是三者协同:模型既要会检索(调用检索工具)、又要会算(调用代码/计算器)、还要会交(调用 API)。训练时把这些工具统一抽象成"带 schema 的可调用单元",模型学的是"在什么时候、调哪个、填什么"。这也解释了为什么 Function Calling 训练常和 RAG、Code Interpreter 一起做联合后训练。

五、代码:工具声明与调用协议

模型侧看到的不是函数本身,而是它的 schema。训练与推理都围绕这套结构化协议:

{
  "name": "query_weather",
  "description": "根据城市名查询当前天气",
  "parameters": {
    "type": "object",
    "properties": {
      "city": {"type": "string", "description": "城市,如 北京"},
      "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
    },
    "required": ["city"]
  }
}

模型在轨迹中应产出的结构化调用(训练目标格式)形如:

用户:北京今天多少度?
模型:
<tool_call:6124c78e>query_weather
{"city": "北京", "unit": "celsius"}

这里"工具调用块"是训练目标的一部分,模型要原生产出合法 JSON、填对参数,并能在后续轮次消费工具返回。

六、评测体系:别只看"能不能调出来"

训练好不好,靠评测说话。工具调用有三个层次指标,必须分开看:

  • 工具选择准确率:面对一组可用工具,模型选的 name 对不对。这一层测的是"路由意识"。
  • 参数填充质量:选对工具后,参数类型、必填项、枚举值是否合法。常用参数级 F1(字段名 + 值)衡量,而不是只看 JSON 能不能解析。
  • 端到端执行成功率:把参数真灌进工具跑一遍,任务是否真的完成。这一层才能暴露"调对了但没做成"的问题。

三者要同看:一个模型可能选择准确率 98%、参数 F1 也很高,但真去执行时因为没处理工具报错而失败——只有端到端指标能抓到这类"纸面会调、实战翻车"的漏洞。评测集还要覆盖"不该调时不调"(拒识)和"工具报错后重试"的边界,否则模型上线遇到真实异常就露怯。

七、常见坑与训练陷阱

第一,Schema 爆炸:把几百个工具的完整 JSON Schema 全塞进上下文,会撑爆窗口、拖慢推理、还让模型选花眼。解法是用意图分类先做路由、只把候选子集的 schema 给模型(呼应 B18 的工具路由)。第二,参数幻觉:模型编造不存在的参数值或格式,尤其数值、日期、枚举。DPO 阶段专门构造"编造参数 vs 正确参数"的偏好对能有效压制。第三,长上下文工具描述漂移:多轮对话里前面调过的工具信息被压缩丢失,导致后面重复调用或参数错乱,需要把关键工具契约放进稳定记忆(呼应 B41)。第四,安全:能调工具的模型本身就是风险面,越权调用、提示注入借工具外泄数据(呼应 B16/B32)必须在训练与护栏两层同时防。第五,奖励黑客:RL 阶段若奖励只看"是否调用了某工具",模型会学会无意义狂调工具刷分,奖励要锚定真实任务成功率。

深度延展:工具调用训练的工程全貌

把工具调用训练讲成一套可执行的工程,关键在把三件事排好序:先想清数据怎么造、再想清训练怎么分阶段、最后想清怎么防退化。第一,数据飞轮的细节决定上限。合成轨迹不能随便编:用强模型扮演多轮调用时,中间的工具"返回"如果是模型瞎编的,模型会学到错误的因果——"调了 query_weather 就假设用户问天气"这类捷径。正确做法是能 replay 真实工具返回的就用真实返回、不能就用带噪声的模拟返回并显式标注,再用拒绝采样只保留执行能跑通的轨迹。规模上,先用十万级合成轨迹打底,再用真实线上日志回灌做难例挖掘,形成"合成→筛选→真实回灌"的闭环,呼应 A23 的数据飞轮。

第二,多模态工具是下一个难点。纯文本工具的参数是结构化 JSON,好训;但图像、视频、音频工具的参数含非结构化模态(如"参考这张图做编辑"),schema 要扩展模态字段,训练数据要含多模态轨迹,且多模态轨迹的构造成本远高于文本。这也是华为这类多模态岗位特别看重的点:模型不只文本调 API,还要能"看图调工具"。

第三,安全护栏要在训练侧就埋进去。能调工具的模型本身就是风险面:越权调用、借工具外泄数据(呼应 B16/B32)。训练数据里要注入"高危动作先问"的正样本、"绕过确认直接执行"的负样本、以及"提示注入试图让模型乱调工具"的对抗样本,让模型从参数层面就学会拒危险调用,而不是全靠外层护栏兜底。

第四,评测的回归集要从线上来。工具调用最怕"训练集漂亮、线上翻车":比如模型学会在训练分布里调对,但遇到线上新的工具组合就懵。解法和 B31 评测体系一致——用线上真实调用日志建回归集、加对抗样本、测长尾而非只测开心集,并随工具库版本持续更新。

第五,真实踩坑清单。一,schema 爆炸:把几百个工具全塞上下文,窗口爆、选择准下降,解法是意图路由只给候选子集(呼应 B18)。二,参数幻觉:编造枚举值或日期,靠 DPO 偏好对压制。三,长上下文工具描述漂移:多轮后面前调过的工具契约丢失,需放进稳定记忆(呼应 B41)。四,奖励黑客:RL 只看"是否调了工具"导致狂调刷分,奖励必须锚定端到端成功率。

第六,联合后训练的课程设计。若同时做 RAG、Code Interpreter、Function Calling,不要一上来全混:先各自 SFT 打底、再联合轨迹做偏好与 RL、配合课程式难度递进(先单工具、再多工具依赖、最后故障重试)。这样各能力互不拖累,也方便单独回归。

最后给一组落地的数字感:工具选择准确率目标通常九成以上、参数级 F1 八成五以上、端到端执行成功率视任务定(简单查询可九成、复杂多跳六到七成)。这三个指标必须同看,单追某一个都会掩盖"纸面会调、实战翻车"。能把工具调用训练讲成"数据飞轮 + 三阶段训练 + 三层评测 + 安全埋点"的闭环,你在多模态工具智能岗的面试里就站稳了。

再补一个常被忽视的视角:工具调用训练本质上是"把外部能力内化进模型的行为策略"。这和 A16 后训练、A35 蒸馏是同一棵决策树上的不同分支——后训练决定模型"懂什么",工具训练决定模型"会用什么",蒸馏决定"怎么用小模型承载"。三者协同,才能既聪明又会干活。

关于数据规模与质量的权衡,给一组实战感。纯人工标注工具轨迹成本极高(一条多轮轨迹可能要十几分钟专家时间),所以健康的路径是"模型合成占八成、人工校准占两成":先用强模型批量合成多样轨迹,再用少量人工做抽检与难例标注,把人工精力花在"纠偏"而非"从零写"。拒绝采样阶段要建自动化校验器——schema 合法性检查、参数类型校验、以及最重要的一步"把参数真灌进沙箱工具跑一遍看是否成功",只有真能跑通的轨迹才进训练集。这一步的投入产出比,远高于堆更多合成数据。

再讲一个上线后的持续运营问题。工具库是会变的:今天加了新 API、明天某个工具改了参数、后天下掉一个旧工具。如果训练数据停留在旧版工具集,模型会逐渐"记错"工具,表现退化。正确做法和 A38 持续预训练一脉相承——建立工具变更的回归集,每次工具库变动就自动生成一批新轨迹回填训练,让模型持续跟上工具演进。能把"工具调用训练"当成持续运营的能力生产线,而非一次性项目,说明你有生产直觉。

最后落到面试表达:被问"怎么训练一个会调工具的模型",正确节奏是先讲数据飞轮(合成→拒绝采样→真实回灌)、再讲三阶段训练(SFT 模仿→DPO 取舍→RL 做成)、最后讲三层评测(选择/参数/执行)与安全埋点。能把这个闭环讲成一套工程而非堆名词,你在多模态工具智能岗的面试里就赢了多数只会说"用 Function Calling"的候选人。

顺着工具调用训练这条线,再补几个面试高频追问的作答要点。第一,模型产生非法工具调用、吐不出合法结构化输出怎么办?训练时就要把输出格式合法性当成硬约束,推理时用约束解码或语法引导生成,保证产出的一定可被解析,再在解析层做二次校验。第二,工具返回特别大、比如一次检索返回上百条怎么处理?不能整段塞回上下文,要做截断、摘要或二次检索,只把最相关的若干条写回,呼应检索工程的重排思路。第三,多工具之间出现依赖、先查订单号再查物流怎么训?在合成轨迹里构造这种链式依赖样本,让模型学会把上一步的观察结果作为下一步参数,而不是凭空编造。第四,如何防止模型在工具报错后陷入死循环?训练数据注入故障样本并标注正确重试或转人工的走向,配合运行时的步数上限双保险。把这四件事讲成一套格式可靠、上下文经济、依赖可学、失败可控的闭环,你在工具智能岗的面试里就有完整的故事线。

再补一点:工具调用训练和提示工程不是二选一,而是分层——提示工程解决这次怎么调,训练解决模型天生会调,二者配合最稳。很多团队一上来就想重训模型,其实先用提示与编排把效果跑通、再用数据驱动做针对性训练补齐短板,是更省成本的路线。最后落到和前面的呼应:本篇是 B18 工程视角的训练侧补完,也是 A16 后训练在工具维度的落地,三者合起来才是"模型既懂知识、又会用工具"的完整答案。

一句话收束:会调工具不是提示词教出来的,而是数据飞轮加三阶段训练训出来的。把"造一个会调工具的模型"讲成数据、训练、评测、安全四件事的闭环,你就拿到了多模态工具智能岗的入场券。它与 B18 的工程视角、A16 的后训练共同拼出"模型既懂知识、又会用工具"的完整拼图。

再补一个工程衔接点:训练出来的工具调用能力,最终要在推理侧落地,这就和 A25/A30 的推理服务化接上了。模型原生产出的工具调用块,要在 vLLM 这类推理引擎里配合约束解码(grammar-constrained decoding)保证 JSON 合法、用连续批处理扛住多工具并发、必要时用投机解码加速结构化输出生成;同时把工具 schema 作为静态前缀缓存,避免每轮重复编码。能把"训练会调工具"和"推理稳出工具"打通,才是生产级 Agentic LLM 的完整链路。

七补、训练语料构造的工程细节

工具调用训练的效果上限几乎完全由训练语料的覆盖度决定。实际工程中,语料通常由三部分混合:其一是合成轨迹,用更强的教师模型在受控环境里产生海量工具调用样本,优点是规模可控、可覆盖长尾工具,缺点是分布偏移,学生容易过拟合教师的错误格式化习惯;其二是人工精标轨迹,由标注员在真实业务场景里完成调用,质量最高但成本高昂,通常只用于关键工具与难例;其三是拒绝采样自蒸馏,让待训练模型先采样多条轨迹,再用奖励模型或单元测试筛出正确的轨迹作为正例,把错误轨迹的修正过程也作为负例监督,这种方法能把模型自身的弱点针对性补齐。三个来源的配比需要随训练阶段动态调整,早期以合成数据铺量建立格式意识,中后期逐步提升精标与自蒸馏比例强化质量。另一个常被忽视的细节是工具定义本身的稳定性:训练时使用的工具描述、参数 schema、返回结构,必须与线上推理时完全一致,任何字段名或默认值的变化都会让模型在部署后产生格式错误,因此工具 schema 应当纳入版本管理并作为训练配置的一部分冻结。

八、面试速答

问:训练一个会调工具的模型,为什么不能只做 SFT?
答:SFT 只让模型学会"模仿正确轨迹",遇到训练分布外的异常(工具报错、参数歧义)不会自救;需要 DPO 提升取舍质量、RL 让它在真实环境里学会把事做成。

问:工具调用数据怎么来,全靠人工标吗?
答:不全靠。主流是"模型合成轨迹 → 拒绝采样筛选合规样本 → 人工抽检校准"的飞轮,成本可控且覆盖广,呼应 A23 的数据工程。

问:Function Calling 训练和普通 SFT 的区别?
答:目标不同——它要模型原生产出结构化、schema 合规的调用,而非自然语言;数据要含多轮 (think→call→observe→call) 轨迹,评测要看选择/参数/执行三层。

问:RL 阶段奖励怎么定才不黑客?
答:奖励锚定端到端任务成功率,而不是"是否调用了工具";对工具报错后正确重试给正反馈,对无意义狂调给惩罚,必要时加过程奖励。

问:实际部署时几百个工具怎么办?
答:不让模型一次看全部 schema,先用意图分类路由到候选子集,再给模型,避免窗口爆炸与选择准确度下降。

九、高频追问清单

  1. 工具调用失败(如 API 超时)时,模型应该怎么训练才懂重试而不是放弃?(答:在轨迹数据里注入故障样本,RL 给"正确重试"正反馈。)
  2. 多工具依赖(先查 A 再用 A 的结果调 B)怎么训?(答:合成多步依赖轨迹,让模型学会把 observation 写回上下文再决策。)
  3. DPO 的偏好对怎么构造才不偏?(答:同一问题采多轨迹,用执行结果而非人工打分判定优劣,减少主观偏差。)
  4. 流式工具返回(长时间运行任务)如何纳入训练?(答:把"轮询状态/部分结果"建模成多轮 observation,训练模型耐心等待与聚合。)
  5. 多模态工具(看图、画图)调用和文本工具有什么不同?(答:参数含图像这类非结构化输入,schema 要扩展模态字段,训练数据要含多模态轨迹。)
  6. 如何防止模型绕过人工确认直接执行高危工具?(答:训练层注入"高危动作先问"的轨迹,配合 B27 HITL 护栏双保险。)
  7. 工具版本升级导致 schema 变了,模型要重训吗?(答:优先用兼容层/适配描述,必要时增量 SFT 少量样本,不必全量重训。)
  8. Agentic LLM 和 RAG 联合训练时怎么避免互相拖累?(答:分阶段——先各自 SFT 打底,再联合轨迹做偏好/RL,配合课程式难度递进。)
Logo

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

更多推荐