🍃作者介绍:双非本科大四网络工程专业在读,阿里云专家博主,前三年专注于Java领域学习,擅长web应用开发,目前已转行人工智能领域。
🦅个人主页:@逐梦苍穹
📕所属专栏:人工智能
🌻gitee地址:xzl的人工智能代码仓库
✈ 您的一键三连,是我创作的最大动力🌹
1、什么是MCP
MCP 是一种模型上下文协议,由 Claude 公司最早提出,优势在于统一标准,实现 AI模型/助手/Agent 等应用端与外部工具/互联网数据/本地数据的双向通信。
1.1、定义和特点
模型上下文协议(Model Context Protocol,MCP)是一种开放标准,使开发人员能够在数据源和人工智能工具之间建立安全的双向连接。
正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方法一样,MCP提供了一种将 AI 模型连接到不同数据源和工具的标准化方法。
开发人员可以通过MCP服务器公开数据,也可以构建连接到这些服务器的 AI 应用程序,即各种MCP客户端。
模型上下文协议MCP有三个重要组件,分别是:模型上下文协议规范和 SDK、Claude 桌面应用程序中的本地 MCP 服务器支持、MCP 服务器的开源存储库。那么本文所展示的则是第二个组件相关的内容,结合Claude Desktop和本地MCP服务器。
1.2、架构和工作原理
模型上下文协议的核心遵循Client-Server架构(即客户端-服务器架构),其中主机应用程序可以连接到多个MCP服务器。
- MCP主机:想要通过 MCP 访问数据的程序,例如 Claude Desktop、IDE 或 AI 工具
- MCP服务器:轻量级程序,每个程序通过标准化的模型上下文协议去公开特定的功能
- 本地资源:MCP服务器可以访问的计算机文件、数据库和服务等(基于人为允许的操作进行,安全性较高)
- 远程服务:MCP服务器可以通过API接口连接外部系统
3.3、MCP 的主要优势
- 开发流程简化: 只需一次编写,即可实现多次集成。在面对新集成需求时,无需重新编写定制代码,极大地提高了开发效率。
- 灵活性极高: 当需要切换 AI 模型或工具时,无需进行复杂的重新配置,能够轻松适应不同的技术选择,为用户提供便捷的使用体验。
- 实时响应迅速: MCP 连接始终保持活跃状态,可实时更新上下文信息,并支持即时交互,确保用户在使用过程中能够获得及时、准确的反馈。
- 安全合规有保障: 内置完善的访问控制机制,遵循标准化的安全实践,从各个层面保障系统的安全性和合规性,让用户无后顾之忧。
- 强大的可扩展性: 随着 AI 生态系统的不断发展壮大,只需连接新的 MCP 服务器,便能轻松添加新功能,无缝对接生态系统的扩展需求,为用户持续提供更多创新服务。
2、什么是Function Calling
函数调用是LLM直接请求执行特定操作的机制。
在这种模式下,开发者定义可供模型调用的函数,包括函数名称、描述和所需参数。
当模型需要执行某个操作时,它会生成一个包含函数名称和参数的请求,外部系统接收并执行相应的操作,然后将结果返回给模型。
这种方式通常由模型服务提供商定义,格式可能因供应商而异。
举个例子:实现一个天气查询示例:
import openai
import json
# 设置您的 OpenAI API 密钥
openai.api_key = "YOUR_API_KEY"
# 定义一个简单的天气查询接口
functions = [
{
"name": "get_current_weather",
"description": "查询指定城市的当前天气",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位"
}
},
"required": ["location"]
}
}
]
# 模拟一个天气查询函数
def get_current_weather(location, unit="celsius"):
# 这里可以调用实际的天气 API,简单返回一个示例结果
return {
"location": location,
"temperature": 22,
"unit": unit,
"description": "晴朗"
}
# 用户提出问题
user_message = "请告诉我北京今天的天气如何?"
# 调用 OpenAI API,启用 Function Calling 功能
response = openai.ChatCompletion.create(
model="gpt-4-0613",
messages=[{"role": "user", "content": user_message}],
functions=functions,
function_call="auto"# 自动检测是否需要调用函数
)
# 获取模型的回复
message = response["choices"][0]["message"]
# 如果模型生成了函数调用指令
if message.get("function_call"):
func_name = message["function_call"]["name"]
func_args = json.loads(message["function_call"]["arguments"])
# 执行对应的函数
if func_name == "get_current_weather":
result = get_current_weather(**func_args)
# 将结果反馈给模型,生成最终回答
second_response = openai.ChatCompletion.create(
model="gpt-4-0613",
messages=[
{"role": "user", "content": user_message},
message,
{"role": "function", "name": func_name, "content": json.dumps(result)}
]
)
final_message = second_response["choices"][0]["message"]["content"]
print("AI 的回答:", final_message)
else:
print("AI 的回答:", message["content"])
看起来其实跟MCP有很多相似之处。下面细说不同点在哪里。
3、MCP和Function Calling的区别
先看两张图:
简单来说就是MCP适合复杂场景、Function Calling适合简单场景。而且MCP具有上下文。
查询天气案例可能看不出具体区别,举个更复杂的例子: 如果用户请求一个包含天气、航班信息、餐馆推荐的完整行程。
- MCP能够协调多个工具的调用,并将结果整合在一起。
- 多个函数调用的方式,则不具备上下文管理和任务协调,比如 需要先查询天气,再根据天气做决策,模型必须通过多个函数调用完成,但每次调用都无法记住之前的步骤。
- 任务协调与上下文管理: MCP允许模型在一个连续的上下文中与多个外部工具交互,并在执行任务时能够持续地跟踪上下文。例如,用户查询某地天气,模型在调用天气API后,可能会调用一个餐馆推荐API,然后基于天气结果来推荐合适的餐馆。在这个过程中,MCP会管理每一步的上下文,确保信息的协调和整合。
- 跨任务管理: MCP可以协调多个步骤的执行,例如,首先查询天气,再根据天气的结果做出决策,接着查询航班信息。每一步都可以通过MCP定义的标准协议进行通信,模型不需要重新“记住”先前的步骤,整个任务流程是连续的。
4、总结
MCP与函数调用的核心区别:
- 任务复杂性:
- 函数调用适合简单任务的顺序执行,例如独立的天气查询或信息检索。
- MCP适合处理复杂、多步骤任务,能够协调多个工具之间的交互,执行更加复杂的操作。
- 上下文管理:
- 函数调用无法管理多步骤任务的上下文,每次调用是独立的。
- MCP提供了上下文跟踪能力,能够管理多步骤的复杂任务,保证任务的连续性和一致性。
- 多工具协作:
- 函数调用通常是线性的调用,无法实现不同工具之间的协作。
- MCP能够在多个工具之间协调操作,支持跨工具的协作,适用于多功能和多API集成的任务。
总的来说:
- 函数调用是一个简单、直接的机制,适用于执行简单任务,但在面对需要协调多个操作和管理复杂上下文的场景时存在局限。
- MCP则是一个更强大和灵活的解决方案,适用于复杂的任务管理和多工具协作,尤其在任务之间需要保持上下文一致性时更加有效。