Function Calling与MCP区别
# Function Calling与MCP区别
随着大语言模型(LLM)的广泛应用,模型本身的推理能力已不再是瓶颈,如何让模型“调用外部工具”变得尤为重要。从天气查询到数据库检索,模型只有具备与外界交互的能力,才能走向真正的“智能体(Agent)”。
目前,两种主流方案正在被广泛采纳:
- Function Calling:让模型以结构化方式调用本地注册函数。
- MCP(Model Context Protocol):一个标准协议,使模型可以通过统一的通信机制调用远程工具、访问资源和提示模板。
# 1. Function Calling 详解
Function Calling 是由 OpenAI 首创的一种能力,允许开发者向模型注册一组函数(通过 JSON Schema 定义),当模型判断需要执行某个工具时,会返回结构化的调用请求,由用户代码来处理和执行该调用。
它的核心是:让语言模型成为“函数调用的指挥者”,而不是执行者。
# 关键特性
- 结构化输出:模型输出包含
function_call
字段,表示调用哪个函数、传哪些参数。 - 参数自动提取:无需正则提取,模型能直接从用户自然语言中提取结构化参数。
- 函数筛选能力:模型根据上下文和描述,自动判断调用哪个函数。
- 与自然语言无缝整合:调用结果可嵌入后续回复中,自然流畅。
# 调用流程图
# 示例代码(使用OpenAI GPT)
import openai
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名,如:北京"
}
},
"required": ["city"]
}
}
}
]
response = openai.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": "帮我查一下上海的天气"}
],
tools=tools,
)
tool_call = response.choices[0].message.tool_calls[0]
print("模型调用的函数:", tool_call.function.name)
print("调用参数:", tool_call.function.arguments)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 2. MCP(Model Context Protocol)详解
MCP 是由 Anthropic 提出的一个开放协议,旨在为所有语言模型提供 统一的工具调用、资源访问与提示词管理接口。它更像是 AI 世界的“操作系统层协议”,让模型、工具、资源彼此解耦,并可以通过标准通信方式连接。
# 核心设计理念
MCP 不仅仅关注“调用某个函数”,而是构建“工具+资源+提示”的生态系统,并支持模型间复用。
# MCP 的核心组件
- MCP 主机(MCP Hosts):如 Claude Desktop、集成开发环境(IDE)或其他希望通过 MCP 协议访问数据的 AI 应用程序。
- MCP 客户端(MCP Clients):实现 MCP 协议的客户端组件,用于与 MCP 服务器保持一对一连接。
- MCP 服务器(MCP Servers):轻量级程序,通过标准化的 Model Context Protocol(模型上下文协议)对外暴露特定功能或服务。
- 本地数据源(Local Data Sources):如本机文件、数据库或本地服务,MCP 服务器可在安全前提下访问这些资源。
- 远程服务(Remote Services):可通过互联网访问的外部系统(例如公开 API),MCP 服务器可以连接并调用这些远程服务。
# MCP 架构图
# MCP 本地工具代码示例(使用 mcp-tools)
编写一个mcpserver,并在本地支持mcp的客户端中进行配置
from mcp_tools import stdio_json_rpc, mcp
@mcp.tool(name="get_time", desc="返回当前时间")
def get_time():
import datetime
return {"now": datetime.datetime.now().isoformat()}
if __name__ == "__main__":
stdio_json_rpc.serve()
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 3. Function Calling 与 MCP 的关系与区别
# 本质关系
内容 | Function Calling | MCP |
---|---|---|
核心角色 | 一种“模型能力” | 一种“交互协议” |
使用方式 | 向模型传 tools | 与 MCP Server 通信 |
MCP 本质是将工具描述与调用请求封装为标准格式,通过多种通信方式对外提供,客户端可将其转换为 Function Calling 所需格式。
# MCP如何与模型进行交互的
# 模式1:将 MCP 工具转为 Function Calling 工具(仅适配支持fc的模型)
def convert_mcp_tool_to_fc(tool):
return {
"type": "function",
"function": {
"name": tool["name"],
"description": tool["description"],
"parameters": tool["input_schema"]
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 模式2:将工具信息写入提示词中(适配所有模型)
system_prompt = f"""
你可以调用以下工具:
- 工具名称:{tool["name"]}
- 描述:{tool["description"]}
请在回答中使用该工具。
"""
1
2
3
4
5
6
2
3
4
5
6
Function Calling 是执行力强但封闭的调用方式,适合快速构建任务导向型AI;
MCP 是协议化、可扩展的通用工具层,为未来构建多模型、跨平台、长生命周期智能体系统提供标准支持。
# 4. 参考资料
编辑 (opens new window)
上次更新: 2025/06/25, 02:50:05