Function Calling 和 MCP 对比
一、引言
在人工智能领域,为了增强大型语言模型(LLM)的能力,使其能够与外部系统进行交互,Function Calling 和 MCP(Model Context Protocol)这两种技术应运而生。Function Calling 允许模型通过自然语言指令触发预定义的函数,而 MCP 则是一种开放标准,旨在实现大型语言模型应用与外部数据源、工具和服务之间的无缝集成。本文将从数据结构、使用场景、返回值结构等方面对 Function Calling 和 MCP 进行详细对比。
二、数据结构
(一)Function Calling 数据结构
1. 函数定义的数据结构
在使用 Function Calling 时,需要向模型描述可用的函数。函数定义通常使用 JSON Schema 来描述函数的名称、描述、参数等信息,以下是一个示例:
{
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"]
}
}
- name:函数的名称,用于标识函数。
- description:函数的描述,用于说明函数的作用。
- parameters:函数的参数,使用 JSON Schema 描述参数的类型、属性等信息。
- type:参数的类型,如
object、string、integer等。 - properties:参数的属性,每个属性对应一个参数。
- required:必需的参数列表。
- type:参数的类型,如
2. 模型生成的函数调用数据结构
当模型决定调用函数时,会生成一个包含函数调用所需参数的结构化输出,通常是一个 JSON 对象,例如:
{
"tool_calls": [
{
"function": {
"name": "get_current_weather",
"arguments": "{\"location\": \"Boston, MA\"}"
}
}
]
}
- tool_calls:一个数组,包含模型建议调用的函数信息。
- function:函数调用的详细信息。
- name:要调用的函数名称。
- arguments:函数调用所需的参数,以字符串形式存在的 JSON 对象。
- function:函数调用的详细信息。
(二)MCP 数据结构
1. MCP 工具定义的数据结构
MCP 中的工具允许服务器暴露可执行的函数,这些函数可以被客户端调用,并用于让 LLM 执行动作。工具的定义结构如下:
{
"name": "calculate_sum",
"description": "Add two numbers together",
"inputSchema": {
"type": "object",
"properties": {
"a": {
"type": "number"
},
"b": {
"type": "number"
}
},
"required": ["a", "b"]
}
}
- name:工具的唯一标识符。
- description:人类可读的描述。
- inputSchema:工具参数的 JSON Schema。
- type:参数对象的类型,通常为
object。 - properties:工具特定的参数。
- required:必需的参数列表。
- type:参数对象的类型,通常为
2. MCP 消息数据结构
MCP 使用 JSON - RPC 2.0 作为消息格式,包括请求、响应和通知三种消息类型。
- 请求消息:
{
"jsonrpc": "2.0",
"id": "string | number",
"method": "string",
"params": {
"[key: string]": "unknown"
}
}
- **jsonrpc**:协议版本,固定为 `"2.0"`。
- **id**:请求的唯一标识符,可以是字符串或数字。
- **method**:要调用的方法名称,是一个字符串。
- **params**:方法的参数,是一个可选的键值对对象。
- 响应消息:
{
"jsonrpc": "2.0",
"id": "string | number",
"result": {
"[key: string]": "unknown"
},
"error": {
"code": "number",
"message": "string",
"data": "unknown"
}
}
- **jsonrpc**:协议版本,固定为 `"2.0"`。
- **id**:与请求中的 `id` 相对应,用于标识响应所对应的请求。
- **result**:如果请求成功,`result` 字段包含操作的结果,是一个键值对对象。
- **error**:如果请求失败,`error` 字段包含错误信息。
- 通知消息:
{
"jsonrpc": "2.0",
"method": "string",
"params": {
"[key: string]": "unknown"
}
}
- **jsonrpc**:协议版本,固定为 `"2.0"`。
- **method**:要调用的方法名称,是一个字符串。
- **params**:方法的参数,是一个可选的键值对对象。
三、使用场景
(一)Function Calling 使用场景
1. 数据查询
调用外部函数查询数据库或 API,获取实时数据。例如,用户问“今天的天气怎么样?”,模型调用天气 API 获取实时天气数据。
2. 计算任务
调用外部函数执行复杂的计算任务。例如,用户问“计算 12345 的平方根。”,模型调用计算函数返回结果。
3. 任务自动化
调用外部函数执行自动化任务。例如,用户问“发送一封邮件给张三。”,模型调用邮件发送函数完成任务。
4. 简单指令执行
适合需要立即得到结果,并且后续代码依赖这个结果的场景。例如,查询天气信息或执行简单的数学计算。
(二)MCP 使用场景
1. 跨系统工单处理
在企业级应用中,涉及多个系统的工单处理流程,如“问题分类→知识库检索→工单生成→反馈跟踪”,MCP 可以协调各步骤的上下文传递,实现多步骤协作和上下文维护。
2. 多工具并行或串联调用
在智能家居控制场景中,通过 MCP 协调“语音识别→设备控制→状态反馈”的跨系统协作;在企业数据分析中,同时调度本地数据库、云存储和可视化工具生成报告。
3. 敏感数据处理
医疗机构通过 MCP Server 代理访问患者数据,将敏感数据的处理和传输限制在本地,降低泄露风险。
4. 跨平台工具集成
某车企同时接入百度文心、GPT - 4o、Claude 模型,工具调用统一通过 MCP 网关,实现不同模型和工具的兼容和集成。
四、返回值结构
(一)Function Calling 返回值结构
1. 模型生成的函数调用返回值
当模型决定调用函数时,会返回一个包含函数调用信息的 JSON 对象,如:
{
"name": "get_current_weather",
"arguments": "{\"location\": \"Boston, MA\"}"
}
- name:要调用的函数名称。
- arguments:函数调用所需的参数,以字符串形式存在的 JSON 对象。
2. 函数执行后的返回值
函数执行后的返回值取决于具体的函数实现。例如,天气查询函数可能返回一个包含天气信息的 JSON 对象:
{"location": "Boston, MA", "weather": "sunny", "temperature": 22}
(二)MCP 返回值结构
1. 响应消息返回值
MCP 的响应消息是对请求的答复,结构如下:
{
"jsonrpc": "2.0",
"id": "string | number",
"result": {
"[key: string]": "unknown"
},
"error": {
"code": "number",
"message": "string",
"data": "unknown"
}
}
- jsonrpc:协议版本,固定为
"2.0"。 - id:与请求中的
id相对应,用于标识响应所对应的请求。 - result:如果请求成功,
result字段包含操作的结果,是一个键值对对象。 - error:如果请求失败,
error字段包含错误信息。
五、其他方面对比
(一)标准化程度
- Function Calling:厂商私有实现,无统一标准,不同厂商的接口格式略有差异,开发者在支持多个大模型时需要为不同的 API 做适配。
- MCP:是行业通用标准,类似计算机领域的 USB 协议,要求工具调用必须遵循 JSON - RPC 2.0 格式,支持多模型、多工具混用。
(二)扩展性
- Function Calling:受限于厂商接口,新增工具需重新适配,随着可用函数数量的增加,向模型提供所有函数定义可能会变得繁琐,并触及上下文长度的限制。
- MCP:支持即插即用,新增数据源/工具只需符合协议即可接入,具有动态服务发现机制,可轻松集成新服务。
(三)安全性
- Function Calling:主要依赖 API Key 鉴权,开发者需自行管理安全,存在一定安全风险,例如恶意提示可能会欺骗 AI 调用敏感函数。
- MCP:采用 OAuth2.0 + RBAC 模型,对认证和授权进行标准化处理,数据的传输和访问过程更加安全,敏感数据可以保留在本地,无需全部上传到云端。
(四)性能
- Function Calling:在简单任务响应速度上领先,平均延迟 < 500ms,但在处理复杂任务和多步骤任务时效率较低,可能会导致延迟和高成本。
- MCP:复杂任务处理时间 < 3s,采用异步双向通信(SSE/WebSocket),但存在协议解析和网络通信的性能开销。
(五)开发难度
- Function Calling:在单模型场景下开发便捷,开发者只需掌握 JSON Schema 定义,5 分钟即可完成函数注册,但在支持多模型时开发难度增加。
- MCP:初始配置复杂,需要理解客户端 - 服务器架构和 JSON - RPC 2.0 协议,但长期维护成本低。
六、总结
Function Calling 和 MCP 各有其优势和适用场景。Function Calling 开发便捷,执行效率高,适合处理简单、低延迟的任务,如实时数据查询、简单指令执行等;而 MCP 具有更高的标准化程度、扩展性和安全性,适合处理复杂、多步骤的任务,如跨系统工单处理、多工具并行或串联调用等。在实际应用中,开发者可以根据具体需求选择合适的技术,也可以将两者结合使用,以充分发挥它们的优势。