函数调用
3 秒看懂
大模型的“函数调用”不是让模型运行代码,而是让模型输出结构化的调用意图——它根据你的描述,决定该调用哪个函数、用什么参数,然后把结果以约定的 JSON 格式返回给你的程序,由你的程序去实际执行。
一句话:模型做“大脑”,你的代码做“手脚”。
3 分钟产业解释
在 AI 应用里,大语言模型虽然能聊天、写文章,但无法直接查询实时数据库、发送邮件、控制智能家居。函数调用就是用来打通这层隔阂的桥梁。其工作流程可概括为三步:
- 定义工具:开发者将可用的函数(如
get_weather(city, date))及参数说明,以 JSON Schema 的形式传给模型。 - 模型决定:当用户问“北京明天天气怎样?”,模型不会直接回答天气,而是输出一个结构体,如
{“name”:“get_weather”,“parameters”:{“city”:“北京”,“date”:“2026-01-25”}}。 - 程序执行并反馈:你的代码实际调用天气 API,把结果(如“晴,-5°C”)拼回对话,让模型生成最终的自然语言回复。
这种做法把 LLM 从“知识库”变成“意图路由器”,有效规避幻觉、利用外部实时数据、安全可控地执行有副作用的操作。目前主流的闭源/开源模型 API(如 OpenAI、Anthropic、Gemini、Qwen、DeepSeek 等)均已内置函数调用支持,云厂商和开源框架(LangChain、Semantic Kernel)也围绕它构建了庞大的工具调用生态。
15 分钟专家深入
函数调用看似简单,但要将非结构化的自然语言可靠地映射到严格类型的函数签名上,需要解决语义消歧、参数填充、多轮反问、并行调用、错误修正等一系列工程难题。当前产业的做法主要有两个层次:
1. 协议与格式层
- OpenAI 风格(tools / tool_choice):在 Chat Completions API 中,通过
tools字段传入函数列表,tool_choice控制调用策略(自动/强制/不调用)。响应中的tool_calls包含id、function.name和function.arguments(JSON 字符串)。后续将执行结果封装成role: tool消息回传,模型据此生成最终答案。 - Anthropic 的 tool use 块:类似,但根植在 Content Blocks 体系下,强调交叠思考(chain-of-thought)与工具调用的交替进行。
- 通用化趋势:各厂商接口趋同,但细节(如是否支持多工具并行调用、参数流式返回、拒答方式)仍有差异,多模型适配层(如 LiteLLM)将这些抽象统一。
2. 模型能力层
函数调用不是简单的外挂,而是模型需要内建的一种结构化输出能力。训练数据中会混入大量的工具调用对话示例,让模型学会:
- 从用户模糊表述中提取精确参数(“深圳”需要转为“Shenzhen”还是城市代码?)
- 在信息不足时主动反问(“您要查哪个城市的天气?”)
- 调用失败时,根据错误信息调整参数重试
- 安全边界:拒绝调用危险函数(如转账),或在敏感字段(身份证号)上要求人工确认
目前顶尖模型(GPT‑4、Claude 3.5 Sonnet 等)的函数调用准确率在公开基准(如 BFCL)上整体约 80%,但面对复杂嵌套参数、长上下文干扰、多函数联合调用时,仍有较明显衰减。
3. 并行与流式调用
一次用户请求可能需要同时调用多个无关函数(例如“查北京天气、上海天气,并把结果发我邮箱”),模型需支持一次返回多条 tool_calls。流式场景下,参数需要逐块生成并即时解析,对 parser 的鲁棒性要求极高,业界常用部分 JSON 解析器(partial json parser)来处理不完整的参数片段。
技术原理
核心机制
大语言模型本质上是一个概率生成器,通过监督微调(SFT)和人类反馈强化学习(RLHF),模型被训练成在遇到工具调用场景时,输出符合特定语法的文本——而不是自由文本。对模型而言,“函数调用”就是在生成一种特殊的代码序列。
以典型的工具调用实现为例,底层流程如下:
用户输入 (经过聊天模板包装)
↓
[System Prompt + User Message]
↓
Token 序列 → Transformer 解码
↓
若模型决定调用工具,输出包含特殊标记的结构化文本
例如:
(模型生成包含特殊标记的 JSON,如 )
↓
API 层拦截该特殊标记块,解析为结构化调用对象
↓
返回给客户端,客户端执行真实函数
关键点:
- token 级控制:模型在训练中学习到,当生成某个特殊 token(如
<|tool_call|>)时,后续必须生成合法的函数名和 JSON 参数。 - 有限状态机约束:部分推理引擎(如 llama.cpp 的 GBNF 语法、Outlines、guidance)会在解码时强制下一个 token 必须符合 JSON Schema,从而保证 100% 格式正确。OpenAI 等闭源 API 也采用了类似的内部约束技术,但不是所有模型都原生支持。
- 参数准确性:模型从上下文和不明确的用户输入中推断缺失参数是核心挑战。常见技术包括:Few-shot 示例(提示中包含几个调用范例)、Chain-of-Thought 推理(让模型先思考再写参数)、自我验证(生成参数后再检查合理性)。
并行调用示例(序列维度)
用户: “查北京、上海 2026-01-26 天气”
模型输出:
[
{“id”:“call_1”,“function”:{“name”:“get_weather”},“arguments”:{“city”:“北京”,“date”:“2026-01-26”}},
{“id”:“call_2”,“function”:{“name”:“get_weather”},“arguments”:{“city”:“上海”,“date”:“2026-01-26”}}
]
两次调用可同时发起,结果收集后一次性返回模型汇总。
技术演进史
- 2022 年末 ~ 2023 年初:思维链、ReAct 模式兴起,研究者在提示词中手写工具调用语法(如“Action: search”、“Action Input: …”,LangChain 早期 Agent 均基于此)。
- 2023 年 6 月:OpenAI 为 GPT‑3.5/4 发布原生的 Function Calling 支持,首次将工具调用作为 API 的第一公民,极大提高了可靠性和开发体验。
- 2023 下半年 ~ 2024 年:Anthropic 推出 tool use;Google Gemini 支持函数调用;开源模型(Llama、Mistral、Qwen 等)通过格式指令或微调追赶该能力。2024 年,并行调用支持几乎成标配。
- 2024 年:走向更细粒度的控制:structured outputs(强制 JSON 模式,不仅仅函数调用)、工具调用的流式返回、工具调用代理(如 OpenAI 的 GPT Actions、Anthropic 的 MCP 协议),以及将工具调用融入多 Agent 编排。
技术路线对比
| 维度 | OpenAI 函数调用 (Chat Completions) | Anthropic Tool Use | 开源方案 (格式指令+微调) | LangChain / Agent 框架 |
|---|---|---|---|---|
| 实现方式 | API 原生 tools + tool_choice | Content Block 原生 tool_use | 提示词注入函数列表,模型输出特定格式文本,应用层解析 | 将函数描述注入提示,模型生成文本后正则/JSON 解析 |
| 格式可靠性 | 极高(内部约束解码) | 极高(内部约束解码) | 中等~高(依赖模型指令遵循度,可用语法约束引擎提升) | 中低(需要大量 prompt 工程和容错处理) |
| 并行调用 | 原生支持多条 tool_calls | 支持,但异步流式体验依赖客户端 | 取决于模型自身能力,部分模型支持 | 依赖模型输出,框架常辅以并行策略 |
| 流式参数返回 | 支持流式 tool calls(Beta) | 支持(通过 content_block_delta) | 部分推理引擎支持 token 流输出,需客户端拼接 | 自实现难度高 |
| 强制调用模式 | tool_choice:“required” 强制模型必须调用函数 | 通过系统提示引导不强制 | 可提示“必须返回工具调用”但不保证 | 不可靠 |
| 安全与权限 | API 不执行函数,责任在开发者 | 同左 | 同左 | 同左 |
| 典型应用场景 | 企业级助手、AI 代理、数字员工 | 长文档分析、编程助手、研究代理 | 本地部署、离线场景、数据敏感环境 | 快速原型、复杂 Agent 流程(多步、条件分支) |
【说明】上表能力对比基于 2025 年初主流模型与框架的公开文档,具体数字/版本号未引用外部数据,细节可能存在厂商更新而变动。
上下游
上游:
- 基座模型训练:需要大量工具调用对话数据,通常是合成数据(用强模型生成)或人类标注。
- 推理引擎/框架:vLLM、TensorRT-LLM、llama.cpp 等需支持结构化输出和工具调用解析的优化。
- 工具 API 提供方:天气服务、航班查询、数据库、CRM 系统等,要求接口文档详细、参数类型明确。
下游:
- AI 助手/Agent:个人助理、企业知识库助手、编码助手(如 Copilot)。
- 自动化流程:RPA 与 LLM 结合,处理发票、客服工单自动填写。
- 智能硬件:智能音箱、车载语音、机器人,将语音指令转为设备 API 调用。
- 多 Agent 协作系统:多个函数调用 Agent 分工协作,完成采购、调度等复杂任务。
关键指标
由于缺少检索证据,以下为产业通用的定性衡量维度,具体数值请参考各模型最新的 BFCL 等基准报告:
- 函数选择准确率 (Accuracy):当用户意图明确时,模型是否选择正确的函数。
- 参数填充完整性与合理性:必要参数是否全部提取,参数值是否匹配语义(如相对日期“明天”转为绝对日期)。
- 幻觉参数率:生成不在选项中的、或无意义的参数值(如虚构的机场代码)。
- 拒答/反问率:信息不足时,模型不会瞎猜,而是反问缺失参数——“请问哪个城市?”
- 格式合规率:输出 JSON 是否可解析,是否符合函数定义的类型。
- 延迟:从 prompt 到返回完整函数调用的时间,首 token 延迟尤为重要。
- 多函数联合调用成功率:同时涉及 3 个以上不同函数的复杂任务,工具调用顺序、依赖关系是否正确。
- 安全拦截率:对高风险函数(如大额支付、删除数据),模型在参数验证或用户确认前的调用拦截比例。
【基准数据】截至本文撰写日,BFCL 等公开排行榜提供了详细的函数调用评估数据,具体数值会随模型更新而变化,请以最新官方榜单为准。
供需与市场数据
(本节数据缺乏公开检索源,主要基于产业趋势的定性描述及 [行业估算])
- 需求侧:几乎所有企业级 AI 落地项目都需要打通外部数据与系统,函数调用是必备组件。产业观察显示,大量 AI 应用 PoC 会涉及工具调用/函数调用能力。
- 供给侧:闭源模型以 API 形式提供标准服务,边际成本体现在推理算力上;开源模型通过微调即可获得该能力,门槛持续降低。2024 年起,中小参数模型(7B~13B)在函数调用上的表现迅速追赶大模型,推动端侧和离线部署。
- 价格:函数调用的 API 调用与普通对话调用通常同价,但复杂工具定义会占用更多 context token,导致成本上升。企业级的函数调用网关、权限管理、审计工具成为新的软件市场(例如工具调用防火墙)。
- 趋势:函数调用正从“单个 API 能力”演变为“Agent 基础设施协议”(如 MCP、A2A),市场从模型接口层上移到了工具调用平台与安全治理层。
代表公司与资本映射
模型层:
- OpenAI(闭源)、Anthropic(闭源)、Google(闭源)、Meta(开源 Llama 系列)、阿里(Qwen 系列)、深度求索(DeepSeek 系列)、Mistral AI、智谱(GLM)等。
框架/中间层:
- LangChain、LlamaIndex、Semantic Kernel(微软)、CrewAI、AutoGen、Dify 等提供函数调用编排的抽象。
基础设施:
- 各云厂商(AWS Bedrock、Azure AI、GCP Vertex AI)提供托管函数调用 API;推理优化公司如 Fireworks AI、Together AI、Groq 也提供兼容 OpenAI 函数调用接口的低延迟服务。
资本关注点:
- 纯粹的“函数调用”能力已难构成壁垒,资本更看重上下文工程(如何高效组织函数描述、历史调用、用户数据)和安全可控的工具调用网关——能记录、重放、阻断每一次调用,并符合企业审计要求。工具身份认证、权限代理、调用链追溯成为新兴的创业方向。
产业映射
- 替代传统 API 编排逻辑:过去需要写大量 if-else、意图分类器、槽填充的对话系统,现在可以被一个函数调用模型替代,极大降低开发成本。可观察提供“低代码 Agent 工厂”的平台型公司。
- 从模型到 Agent 的范式迁移:函数调用是 Agent 的“手”。公司能力应看其是否拥有一套完整的工具调用治理体系(权限、网关、监控),而非模型本身。
- 安全与合规是痛点也是护城河:企业大规模上线 AI Agent 时,最担心模型“乱调函数”(如误删生产数据)。因此函数调用的安全沙箱、调用回滚、人类审批工作流将成为必选项,相关安全公司可能获得更多产业合作机会。
- 端侧部署的井喷:当小型模型(如 3B~8B)的函数调用可靠度达到商用门槛,智能硬件、车载、IoT 将出现更多方案,带动模型压缩/加速芯片和边缘推理框架的需求观察。
- 风险提示:开源模型快速追平能力,导致闭源 API 的函数调用溢价空间缩小;LLM 推理成本持续下降,但工具调用的序列化调用可能仍比单轮对话贵 3~5 倍,在大规模场景下毛利承压。
常见误读纠偏
误读 1:“函数调用就是让 AI 代替程序员写代码执行”
实际:模型只生成调用意图和参数,绝不执行代码。所有执行都由开发者的函数(或经开发者授权的沙箱)完成。模型本身没有执行环境,这是一个安全意义上的根本隔离。将“function calling”理解为“写好的服务被模型选择并传参”而非“模型写一段代码跑起来”。
误读 2:“只要把函数定义扔进 prompt,模型就能完美工作”
实际:函数定义的质量、描述的自然度、参数约束的明确性,对准确率有巨大影响。prompt 中函数的排列顺序也可能引发偏好偏差;多函数干扰下,语义相似的函数容易混淆。这不是即插即用的黑盒,需要持续的函数描述优化和线上评估,这被称为“函数调用提示工程”,是运维 Agent 的核心工作之一。
学习路径
- 入门:阅读 OpenAI 或 Anthropic 官方的 Function Calling/Tool Use 文档,用 Python 写一个简单的天气查询助手,理解
tools、tool_choice和toolrole 的消息流转。 - 实践:在 LangChain 中构建一个 Agent,集成搜索、计算器、数据库三种工具,体验多工具协调、错误处理。尝试用 Llama 等开源模型 + Ollama 本地搭建,观察与闭源模型的能力差距。
- 深入原理:研究约束解码(GBNF 语法、lm-format-enforcer、xgrammar)在函数调用的应用,了解如何在解码阶段保证输出格式。学习模型微调数据集的构造——如何从真实 API 文档自动合成多样的工具调用对话。
- 架构设计:阅读 MCP(Model Context Protocol)规范,理解工具提供方与 LLM 之间标准化通信的价值。分析企业级函数调用网关的架构要点:身份认证、调用审计、频率限制、参数脱敏。
- 评估体系:关注 BFCL、ToolBench、τ-bench 等评测基准,学会自己构造测试集,用全自动评分+人工审核的方式评判你部署的 Agent 的函数调用质量。
一句话总结
函数调用是把大语言模型从“聊天玩具”变成“业务执行引擎”的核心契约——它用结构化的意图表达替代了非结构化的自由文本,在安全边界内让模型指挥现实世界的数字化服务。
延伸阅读与来源
- OpenAI 官方文档:Function Calling (platform.openai.com)
- Anthropic 官方文档:Tool use (docs.anthropic.com)
- Berkeley Function Calling Leaderboard (gorilla.cs.berkeley.edu)
- 《A Survey on Tool Learning with Foundation Models》 (arXiv 2024 综述)
- LangChain Tool Calling 概念指南(python.langchain.com)
- 模型上下文协议 MCP 规范(modelcontextprotocol.io)
【免责声明】本文撰写时未能获得实时检索资料,部分市场趋势、性能区间的描述基于公开常识和业界公开信息推断,已标为定性/估算。具体技术规格、排行数值请以原厂最新文档和权威基准为准。