这段时间大家都被 MCP 刷屏了吧,不少小伙伴都在问我:MCP 到底是啥玩意? 今天,我们就从大模型的角度切入,聊聊 MCP 的核心原理和它的实际应用。
大模型的局限性
大模型本质上就是一个具有文本推理生成 token 能力的大脑。当用户输入问题时,大模型会根据已学习的知识进行推理并返回答案。但是大模型的局限性也很明显:如果不联网,它只能依赖训练数据进行推理,无法获取实时信息或处理动态变化的情况。
比如,如果我们现在问大模型:
“现在的时间是多少?”
“当前的天气情况如何?”
在不联网的情况下,大模型是无法准确回答这些问题的。它无法像人类一样查阅最新数据,而是只能依赖过去学到的信息进行推理,这一点想必大家多多少少都了解。
那为了解决这个问题,我们就发明了一种工具——Function Calling(函数调用),它就像给大模型搭建了一座通往外部世界的桥梁。
借助 Function Calling,大模型可以调用外部 API,与数据库、Web 服务、应用程序等进行交互,从而突破大模型本身知识储备的局限。
如何实现 Function Calling?
以天气查询功能为例,我们需要编写一个 Function Calling 函数,使大模型能够获取实时天气信息。这个过程主要包括以下步骤:
-
选择可靠的天气查询 API:比如 OpenWeatherMap、WeatherAPI、和风天气等,可以提供全球各地的天气信息。
-
定义 Function Calling 函数:这个函数需要明确输入参数(如城市名称、经纬度等)和输出参数(如温度、湿度、天气状况等)。
-
编写函数并连接 API:通过 API 获取天气数据,并将结果返回给大模型,让模型能够基于这些实时数据进行推理。
编写 Function Calling 需要选择合适的数据源、定义清晰的参数格式,并确保 API 响应能够被大模型正确解析。虽然这个过程较为繁琐,但只要搞完,模型就可以随时查询实时天气,突破知识局限。
示例代码(Python 实现 Function Calling):
# 看不懂的同学可以当看个热闹,以下就是一个Python代码写的 Function Calling 函数:
import requests
def get_weather(city):
api_key = "你的API密钥"
url = f"http://api.weatherapi.com/v1/current.json?key={api_key}&q={city}&aqi=no"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
weather_info = {
"location": data["location"]["name"],
"temperature": data["current"]["temp_c"],
"condition": data["current"]["condition"]["text"]
}
return weather_info
else:
return {"error": "无法获取天气信息"}
# 测试调用
print(get_weather("Beijing"))
工具集(Tools):Function Calling 的组合应用
如果我们把多个 Function Calling 函数组合起来,就形成了一个功能更强大的工具集(Tools)。
工具集的作用
大模型在回答问题之前,会先分析用户输入的内容,并从工具集中选择适合的函数。比如查询天气、获取时间、发送邮件、控制智能设备等。相比单纯基于训练数据进行推理,结合实时数据的 AI 具备更强的智能化能力。
Function Calling 的局限性
由于大语言模型在 Function Calling 函数的接口规范上缺乏统一的标准,导致开发者在实现跨模型、跨语言开发时存在很多适配问题。以数据库的操作为例,比如我们基于 OpenAI 开发的 SQL 查询功能,需要封装成特定的参数与流程。但是我们想把这个特定的流程迁移到千问平台时,那么就可能存在因为接口的差异而无法直接复用的情况。
MCP 的工作流程
所以 Claude 发明了 MCP(Model Context Protocol,模型上下文协议),通过 MCP 这个具有特定功能的函数,复用性得到了大大增强。也就是说,任何人编写的 Function Calling 函数我们都可以通过调用 MCP 来实现,遵循客户端(Client)–服务器(Server)架构。其中,SSE 模式的 MCP 使用 HTTP 协议进行通信。
MCP Client 作为连接大语言模型与 MCP Server 的桥梁,它的工作流程如下:
首先,MCP Client 从 MCP Server 获取当前可用工具列表,并了解每个工具的功能。
接下来,MCP Client 会将用户的查询与工具功能的描述一并发送给大模型。大模型根据查询判断是否需要使用工具,以及具体需要使用哪些工具来解决问题。如果需要调用工具,MCP Client 将通过 MCP Server 执行工具调用,并将结果反馈给大模型。
最后,大模型结合用户的原始查询问题和工具调用结果生成最终的回复展示给用户。
MCP 的官方介绍中,除了支持大模型调用的函数外,还提供了两项功能:第一是资源(resources),可以直接访问文件数据;第二是预设模板(promptes),通过预先编写的模板帮助用户完成特定任务。
总结来说,虽然单个 MCP Server 的开发工作量没有减少,但复用性大大提高。之前,各大厂商提供的是独立的 API,因为使用的模型不同,我们需要开发自己的调用函数。但是现在,我们可以直接复用其他人开发的 MCP Server,避免了重复造轮子的过程,许多 MCP Server 工具已开源,除了 Claude 之外,Cline 和 Curser 等工具也都集成了 MCP。