Function Calling 和 MCP 对比

439 阅读7分钟

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:参数的类型,如 objectstringinteger 等。
    • properties:参数的属性,每个属性对应一个参数。
    • required:必需的参数列表。
2. 模型生成的函数调用数据结构

当模型决定调用函数时,会生成一个包含函数调用所需参数的结构化输出,通常是一个 JSON 对象,例如:

{
    "tool_calls": [
        {
            "function": {
                "name": "get_current_weather",
                "arguments": "{\"location\": \"Boston, MA\"}"
            }
        }
    ]
}
  • tool_calls:一个数组,包含模型建议调用的函数信息。
    • function:函数调用的详细信息。
      • name:要调用的函数名称。
      • arguments:函数调用所需的参数,以字符串形式存在的 JSON 对象。

(二)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:必需的参数列表。
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 具有更高的标准化程度、扩展性和安全性,适合处理复杂、多步骤的任务,如跨系统工单处理、多工具并行或串联调用等。在实际应用中,开发者可以根据具体需求选择合适的技术,也可以将两者结合使用,以充分发挥它们的优势。