什么是 LLM 的工具调用(Function Calling)
指模型在对话中主动决定"调用某个外部工具/函数",并输出结构化的调用请求(函数名 + 参数),而不是直接给出最终答案。典型流程:
- 系统提示词里提供工具清单(函数名、参数 schema、用途说明)
- 模型判断"当前需要外部信息/操作"时,输出一个
tool_call(如{"name":"search_db","arguments":{"sql":"..."}}) - 框架解析并执行该工具,把结果回填给模型
- 模型基于工具结果继续推理,直到给出最终回答
关键点:工具调用是模型自主决策(不是硬编码),且输出是结构化 JSON,可被程序解析执行。它让 LLM 从"只会说话"变成"能做事"——查库、调 API、发邮件、执行代码。
它是如何被训练出来的
工具调用不是模型天生就会的,而是通过多阶段训练习得,核心是让模型学会"何时调用 + 如何正确填参":
1. 预训练(Pretraining)
- 模型在海量文本中学会了函数签名、API 文档、JSON 语法等基础语言模式,为后续理解工具 schema 打底,但此时并不会"主动调用"。
2. 监督微调(SFT)
- 用人工/自动构造的"对话→工具调用"样本微调:给定用户请求 + 工具清单,标注正确的
tool_call(选哪个函数、填什么参数)。 - 让模型学会:识别"需要外部信息"的场景、匹配正确的工具、生成合法参数 JSON。
- 数据来源:人工标注、从真实 API 调用日志构造、用更强模型合成(distillation)。
3. 偏好对齐(RLHF / DPO / RLVR)
- 用奖励模型或可验证奖励(如"参数是否合法"“是否调对了工具”“最终任务是否成功”)对模型做强化学习。
- 让模型学会权衡:什么时候该调用(避免过度调用或该调不调)、参数填得准、调用失败后如何恢复。
- 近年常用RLVR(可验证奖励强化学习):直接以"工具执行是否成功、结果是否正确"作为奖励信号,显著提升工具调用的准确率。
4. 工具调用数据的关键设计
- 多工具选择:从多个候选工具中选对的那个
- 参数填充:从用户输入/上下文抽取正确参数值
- 多轮工具循环:调用→看结果→再决策(ReAct 式轨迹)
- 错误恢复:工具报错后如何重试/降级
一句话:工具调用能力 = 预训练打底(懂函数/JSON 语法)+ SFT 教会"何时调用、怎么填参" + RLHF/RLVR 教会"调得准、调得稳"。它把模型从"生成文本"升级为"生成可执行的结构化动作",是 Agent 能闭环执行任务的核心能力。