本文由ChatGPT和Claude.ai辅助完成
大模型(LLM)在现代应用中的一个核心能力,是能够按照严格结构调用外部工具,例如数据库查询、Python 代码执行、HTTP 请求、存储系统等。围绕这一点,业界形成了“function calling”与“tools API”等概念。尽管二者在语义上相近,但其实现逻辑、系统结构与应用接口存在明显差异。
本文围绕以下主题展开:
- Function calling 与 tools 的定义与区别
- Function calling 是否只是一种“更严格的格式输出”
- 如何指定 function calling 模式
- 为什么大模型能够进入工具模式(tool mode)
- 工具模式是概率行为,不是硬编码逻辑
- 工具模式的本质:训练、API 与提示词的协同机制
- MCP 协议:Function Calling 的标准化实践
1. Function Calling 与 Tools:定义与本质区别
1.1 Function calling 是“结构化调用能力”
在 OpenAI、Google、Anthropic 的 API 中,“function calling”本质是一套结构化输出机制,其核心特征是:
- 模型输出必须是一个JSON 结构
- 结构中必须包含函数名(name)与参数(arguments)
- 参数格式必须符合预定义的 schema
- 模型输出的是“工具调用指令”,而非自然语言
它是对大模型输出格式的一种能力层面的约束。
1.2 Tools 是“可调用的工具清单”
Tools 则是 API 层提供给模型的工具定义集合,包括:
- 函数名称
- 输入参数 schema
- 参数类型与约束
- 功能描述(让模型理解工具用途)
它是系统告诉模型:“你现在可以调用哪些工具”。
1.3 区别总结
两者关系可以这样理解:
- Tools 是系统提供给模型的工具目录
- Function calling 是模型执行工具调用的能力与方式
- API 层负责定义结构;模型负责决策与生成调用
换句话说:
Tools = 可用工具清单
Function calling = 选择并正确调用工具的能力
2. Function Calling 与普通格式化输出的本质差异
2.1 普通提示词格式要求:基于概率,无强制保证
当你通过提示词要求模型输出 JSON:
1 | 请以 JSON 格式输出,包含 name 和 age 字段 |
模型可能会:
- 输出不合法的 JSON
- 混入注释或说明文字
- 结构不完整或嵌套错误
- 使用错误的引号或缺失逗号
它只是较高概率地遵循要求,但没有强制保证。
2.2 Function calling 是训练赋予的专门能力
Function calling 模式下:
- 模型在训练阶段专门学习了工具调用的格式
- 输出空间被约束为符合 schema 的 JSON
- 通过大量监督数据强化了格式准确性
- 错误率极低(但仍非零)
- 不会输出额外的自然语言解释
2.3 本质差异总结
| 维度 | 普通格式化 | Function Calling |
|---|---|---|
| 控制方式 | 纯提示词引导 | 训练能力 + API 结构 |
| 可靠性 | 概率性,误差较大 | 高可靠,误差极小 |
| 实现机制 | 模型对自然语言的理解 | 专门训练的结构化输出能力 |
3. 如何指定 Function Calling 模式
3.1 API 中的工具定义
以 OpenAI API 为例:
1 | { |
3.2 调用模式控制
A. 自动模式(模型决策)
1 | { |
模型根据对话内容判断是否需要调用工具。
B. 强制调用特定工具
1 | { |
C. 禁用工具调用
1 | { |
3.3 这是 API 层面的声明式控制
与纯提示词不同,这是结构化的控制信号,模型在训练中已学会如何响应这些信号。
4. 大模型为什么能够进入“工具模式”
核心原因:模型在训练阶段专门学习了工具调用能力。
现代大模型(GPT、Gemini、Claude)的训练流程包括:
4.1 数据收集
- 收集数十万至百万级的工具调用对话数据
- 包含完整的调用流程:
- 用户请求
- 模型决策(是否调用工具)
- 工具调用的 JSON 格式
- 工具返回结果
- 模型整合结果生成最终回复
4.2 监督微调(SFT)
- 让模型学习正确的工具调用格式
- 强化参数提取与 JSON 生成能力
- 学习何时应该调用工具
4.3 强化学习(RLHF/RLAIF)
- 优化工具调用的时机判断
- 提高格式准确性
- 改进多工具协作能力
4.4 触发机制
当 API 请求包含 tools 字段时:
- 模型识别到这是一个工具可用的上下文
- 激活训练时学习的工具调用行为模式
- 输出空间偏向于工具调用格式
- 根据对话内容决策是否调用及调用哪个工具
这不是规则系统,而是模型的学习能力。
5. 工具模式是概率性的,非确定性逻辑
5.1 不是硬编码的 if-else
模型进入工具模式不是因为:
1 | if api_has_tools: |
5.2 而是概率模型的高概率行为
实际机制:
- 模型在训练中形成了对工具调用的强偏好
- 当上下文信号(messages + tools schema)出现时
- 输出工具调用格式的概率变得极高
- 但仍然是概率分布,不是绝对规则
- 因此存在微小概率的格式错误或拒绝调用
5.3 为什么可靠性很高
- 大量高质量训练数据
- 专门的损失函数优化
- RLHF 阶段的强化
- 结果:成功率通常在 95%-99%+ 之间
但这仍然是概率模型的表现,而非确定性系统。
6. 工具模式的本质:训练、API 与提示词的协同
6.1 “本质是提示词工程”这个说法的对与错
部分正确之处:
- API 中的 tools schema 确实是给模型的“上下文提示”
- System prompt 也会包含工具使用指南
- 从信息论角度,这些都是“输入控制输出概率空间”
不完全准确之处:
- API 的 tools 字段不是纯自然语言,而是结构化控制信号
- 模型对 tools 的响应不仅靠“理解提示词”,更靠训练出的专门能力
- 这种能力不是通过提示词现场“告诉”模型的,而是预先训练好的
6.2 更准确的理解
Function calling 是以下三者的协同机制:
- 模型能力层(训练获得的结构化输出能力)
- API 控制层(tools 定义与 tool_choice 参数)
- 上下文层(system prompt 与对话历史)
公式化表达:
1 | 工具调用成功 = 模型训练能力 × API结构化控制 × 上下文引导 |
任何一项缺失,可靠性都会大幅下降。
7. MCP 协议:Function Calling 的标准化实践
在理解了 function calling 的本质后,我们可以进一步探讨业界如何将这一能力标准化和生态化。MCP (Model Context Protocol) 正是 Anthropic 基于 function calling 能力构建的标准化协议。
7.1 从能力到协议:为什么需要 MCP
虽然各大模型提供商都支持 function calling,但在实际应用中面临以下问题:
碎片化的工具定义:
- 每个开发者自定义工具格式
- 相同功能的工具在不同项目中重复开发
- 工具无法跨应用、跨平台复用
缺乏统一标准:
- 没有工具发现机制
- 权限和安全管理各自实现
- 集成成本高,维护困难
MCP 的出现就是为了解决这些问题,将 function calling 能力从“单点技术”提升为“生态标准”。
7.2 MCP 的技术定位
MCP 是建立在 function calling 之上的应用层协议。 可以用技术栈来理解它们的关系:
1 | ┌─────────────────────────────────────┐ |
这种分层架构类似于网络协议栈:
- Function calling 就像 TCP/IP,提供可靠的数据传输能力
- MCP 就像 HTTP/REST,定义了应用层的标准化交互方式
- 具体工具 就像各种 Web 服务,基于标准协议提供具体功能
7.3 MCP 的核心价值
1. 统一的工具定义标准
MCP 规范了工具的描述格式(基于 JSON Schema),任何遵循 MCP 的工具都可以被任何支持 MCP 的 AI 应用调用:
1 | { |
2. 标准化的通信协议
MCP 基于 JSON-RPC 2.0 协议,定义了客户端与服务器之间的标准通信方式,确保不同实现之间的互操作性。
3. 可复用的工具生态
开发者可以将工具打包为 MCP 服务器,发布到社区供他人使用。用户可以像安装浏览器插件一样,为 AI 应用添加新能力,而无需修改应用代码。
7.4 MCP 的实际应用场景
基于 function calling 能力,MCP 让以下场景变得标准化和简单化:
- 文件系统访问: 通过 filesystem MCP 服务器,AI 可以读写本地文件
- 数据库操作: 通过 database MCP 服务器,AI 可以查询和修改数据
- 云服务集成: 通过 Google Drive、Slack 等 MCP 服务器,AI 可以访问云端资源
- 开发工具: 通过 Git MCP 服务器,AI 可以执行版本控制操作
所有这些能力的底层都依赖模型的 function calling 能力,但通过 MCP 的标准化,开发者无需关心底层实现细节。
7.5 类比理解 MCP 与 Function Calling
| 概念 | 网络技术类比 | 角色 |
|---|---|---|
| Function Calling | HTTP 协议 | 提供通信能力 |
| MCP | RESTful API 规范 | 定义标准化设计模式 |
| MCP Servers | 各种 Web 服务 | 提供具体功能实现 |
或者用移动应用生态来理解:
- Function calling = 手机的应用安装和运行能力
- MCP = 应用商店的标准(如何打包、分发、安装应用)
- MCP Servers = 商店中的各个应用
7.6 从孤立能力到开放生态
MCP 的意义在于将 function calling 从“每个项目自己实现”转变为“整个生态共享复用”:
没有 MCP:
1 | 项目A → 自己实现文件读取工具 |
有了 MCP:
1 | filesystem-mcp-server (统一实现,开源共享) |
这种标准化让 AI 应用的开发效率大幅提升,同时也让工具质量更有保障(社区验证和维护)。
总结:从能力到生态的完整图景
核心要点
Function calling 是基础能力
- 模型通过专门训练获得的结构化调用能力
- 高可靠性来自训练优化,而非硬编码逻辑
工具模式是概率行为
- 基于训练数据形成的高概率输出模式
- 需要 API 控制、训练能力、上下文提示三者协同
MCP 是能力的标准化和生态化
- 基于 function calling 构建的应用层协议
- 解决了工具定义、发现、复用的问题
- 类似于 HTTP 之上的 RESTful 规范
技术演进的三个阶段
- 阶段1: 模型具备 function calling 能力
- 阶段2: 各家自定义工具调用格式
- 阶段3: MCP 统一标准,建立开放生态
理解层次关系至关重要
1
2
3
4
5
6
7应用产品 (用户体验)
↓
MCP 协议 (标准化)
↓
Function Calling (核心能力)
↓
模型训练 (能力来源)
实践启示
设计工具调用时:
- Schema 描述要清晰准确,这是模型理解的基础
- 利用 system prompt 补充使用指南和约束
- 实现错误处理和边界情况的降级方案
- 理解概率系统的特性,做好监控和兜底
采用 MCP 生态时:
- 优先使用成熟的 MCP 服务器,避免重复造轮子
- 关注权限和安全配置,保护敏感数据
- 开发自定义工具时遵循 MCP 规范,便于分享和维护
- 将工具逻辑与业务逻辑分离,提高系统可扩展性