0%

Qwen3 MCP实测

大模型原生支持MCP协议是什么意思?

在前面的文章中,我们一起从零开始搭建了适配所有大模型的MCP Client,无论我们选择什么大模型,都可以完成MCP工具的调用。由于我们实现的方式是通过在系统提示词中对大模型的输出内容进行限制,并强制规范了大模型的输出结果,当大模型要进行工具调用时,我们利用提示词要求大模型按照MCP协议输出对应的规范化结果。这样做虽然降低了我们大模型的选择门槛,但是同样会带来一些问题,其中最突出的一个问题就是,一但大模型没有按照MCP协议的要求输出规范化的结果,那么就会导致MCP工具调用失败,正是由于这种不确定性的存在,导致很多企业不放心真正在生产中去使用MCP相关工具,仍然停留在测试环节中。

随着大型语言模型(LLM)的进一步发展,大模型对于MCP协议的支持度,也成为了消费者在选择大模型的上的一个参考标准。大模型“原生支持MCP协议”意味着该模型自身具备内置的、遵循 MCPModel Context Protocol,模型上下文协议)规范的能力,无需额外的适配层或中间件,就能直接与各种数据源、工具和服务进行双向、安全、高效的通信。这样的原生支持不仅提升了模型在调用外部接口时的速度和稳定性,也简化了开发者的集成工作,让模型与应用间的交互如同“开箱即用”般流畅。

说得通俗一点,原生支持MCP协议的大模型,就是模型在微调阶段,使用了MCP协议相关的数据对模型进行过微调,使得大模型原生就知道MCP协议的规范,那么在调用MCP工具时,大大降低大模型出错的可能性。

Qwen3简单介绍

image-20250430154355184

4月29日凌晨阿里推出新一代开源大模型Qwen3系列,在代码、数学、通用能力等基准测试中达到顶级模型水平(如DeepSeek-R1o1Grok-3等)。

有效融合推理模式和非推理模式,一个模型同时兼具之前QwQ模型(推理模式,用于数学、代码、逻辑推理等场景)和instruct模型(非推理模式,通用对话等场景)的回复能力。

  • 超多尺寸:两款MOE模型:Qwen3-235B-A22B(2350多亿总参数、 220多亿激活参)、Qwen3-32B(300亿总参数、30亿激活参数),以及六个Dense模型:Qwen3-30B-A3B、Qwen3-14B、Qwen3-8B、Qwen3-4B、Qwen3-1.7B、Qwen3-0.6B。
  • 推理能力大幅提升:在数学、代码和逻辑推理等评测中,显著超过QwQ(推理模式)和Qwen2.5-Plus-Instruct(非推理模式),达到同规模业界SOTA水平。
  • 模型人类偏好能力显著增强:创意写作、角色扮演、多轮对话、指令遵循能力均有明显提升,用户体验预期明显更佳,通用能力显著超过Qwen2.5-Plus-Instruct。
  • Agent能力显著增强:在上述两种模式下都达到目前业界领先水平,能够实现精准的外部工具调用。

此外,Qwen3原生支持MCP协议,并具备强大的工具调用能力,结合封装了工具调用模板和工具调用解析器的Qwen-Agent框架。

Qwen3的MCP实测

我们可以使用Qwen-AgentQwen3的工具调用能力进行测试。

使用uv工具创建测试工程:

1
uv init qwen3-mcp-test -p 3.12

image-20250430154917253

进入工程,然后创建虚拟环境

1
2
cd qwen3-mcp-test
uv venv

image-20250430155013780

安装依赖:

1
uv add qwen-agent[code-interpreter,gui,mcp,rag]

image-20250430155116543

接下来执行测试代码:

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
34
35
36
37
38
from qwen_agent.agents import Assistant
from dotenv import load_dotenv
import os

load_dotenv()

API_KEY = os.getenv("API_KEY")
BASE_URL = os.getenv("BASE_URL")
MODEL = os.getenv("MODEL")

# Define LLM
llm_cfg = {
'model': MODEL,
'model_server': BASE_URL,
'api_key': API_KEY,
'enable_thinking': False # 禁用思考模式
}
# Define Tools
tools = [
{
"mcpServers": {
"time-sse": {
"url": "https://time.mcp.minglog.cn/sse",
"name": "time-sse"
}
}
},
'code_interpreter' # Built-in tools
]
# Define Agent
bot = Assistant(llm=llm_cfg, function_list=tools)
# Streaming generation
messages = [{'role': 'user', 'content': '现在几点了?'}]
# Qwen3只支持流式返回,所以直接遍历取最后一次即可
for responses in bot.run(messages=messages):
...
print(responses)
print("___________________")

注意,这里我调用的是自己写的MCP Server,大家需要自己在工程中另外创建一个.env文件,用来存储自己的密钥。

image-20250430155302050

执行测试代码:

image-20250430155532042

开启调试,查看输出结果的细节信息。

image-20250430161133212

可以看到,responses一共返回了5条结果,依次将每条结果打印出来。

image-20250430161110870

从打印结果可以看出,qwen-agent框架在处理时,整体的流程和Function Call的处理流程一致。

  1. 首先根据用户的提问,判断是否需要调用工具。
  2. 如果需要调用工具,则返回function_call字段,并携带工具相关参数。如果不需要调用工具,则直接返回。
  3. 调用工具执行相关功能,并将工具的返回结果返回。
  4. 将用户的提问和工具的返回结果一起丢给大模型。
  5. 大模型综合工具的返回结果和用户的提问,给予用户最终回答。

结论,本质上来讲MCPFunction Call的一种特殊形式,所以在Agent框架中的处理方式和Function Call的处理方式一致。

-------------本文结束感谢您的阅读-------------