为什么选择 Qwen3 来调用 MCP?因为 Qwen3 是全球首款原生支持 MCP 的大模型,能够更好地理解 MCP 的功能,并更好地规划工具调用流程,对于复杂的任务也是信手拈来,因为 Qwen3 在训练阶段(SFT)就带入了大量的工具调用对话数据进行训练,能够识别外部工具并发起对外部工具调用的请求,并且还支持支持工具的串联、并联以及自动 debug。同时 官方发布的 qwen-agent 兼容 mcp,使得开发更加容易。
MCP 全名为模型上下文协议(Model Context Protocol),它规定了大模型的上下文信息的传输方式。实际上就是一种规范,相当于是大模型的通用工具箱。以前开发者让大模型调用工具都是使用 Function Calling,但是它的缺点比较明显,不同场景下需要不同的设定和工具的开发,因此难以实现复用,而 MCP 规定了大模型上下文的传输规范,适配不同的大语言模型,能够更高效地开发应用,目前已经有不少成熟的 MCP 供开发者使用,能够大量减少重复造轮子的时间。
准备工作
1. 安装 vllm 依赖
首先去 pytorch官网 安装 cuda 版本对应的 pytorch。
随后安装 vllm 以及 transformer 用于模型推理:
pip install vllmpip install transformerspip install openai
2. 安装 qwen-agent 依赖
modelscope 用于下载模型(若已下载模型可忽略)。
pip install -U "qwen-agent[rag,code_interpreter,gui,mcp]"pip install uvpip install modelscope
括号内的内容皆为可选依赖,其中 mcp 是本文需要用到的。
> [gui] 用于提供基于 Gradio 的 GUI 支持;> [rag] 用于支持 RAG;> [code_interpreter] 用于提供代码解释器相关支持;> [mcp] 用于支持 MCP。
3. 下载模型权重
本文使用 modelscope 进行模型下载,选用模型为 8B,可根据实际情况进行选择。
from modelscope import snapshot_download model_dir = snapshot_download('Qwen/Qwen3-8B', cache_dir="./model")
调用 MCP
1. 模型部署
直接利用 vllm 进行模型部署,其中参数可以根据自身情况增加:
vllm serve ./model/Qwen3-8B
2. 模型测试
部署后可以先进行测试,确保模型能够正常运行:
from openai import OpenAIclass LLM: def __init__(self): openai_api_key = "EMPTY" openai_api_base = "http://localhost:8000/v1" self.client = OpenAI( api_key=openai_api_key, base_url=openai_api_base, ) self.messages = [] def chat(self, prompt): self.messages.append({"role": "user", "content": prompt}) response = self.client.chat.completions.create( model="./model/Qwen3-8B", messages=self.messages, ) response = response.choices[0].message.content.strip() self.messages.append({"role": "assistant", "content": response}) return responseif __name__ == "__main__": model = LLM() prompt = "你好!" response = model.chat(prompt) print(response)
3. 使用 qwen-agent
接下来借助 qwen-agent 来实现与模型的对话:
from qwen_agent.agents import Assistantfrom qwen_agent.utils.output_beautify import typewriter_printllm_cfg = { "model": "./model/Qwen3-8B", "model_server": "http://localhost:8000/v1", "api_key": "EMPTY"}bot = Assistant(llm=llm_cfg, system_message="你是一个乐于助人的人工智能助手。", name="小千" )messages = []while True: query = input("\n用户请求(输入 quit 退出对话):") if query.lower() == "quit": break messages.append({"role": "user", "content": query}) response = [] response_plain_text = "" print("助手回复:") for response in bot.run(messages=messages): response_plain_text = typewriter_print(response, response_plain_text) messages.extend(response)
得到如下结果:
调用 MCP
这里使用 sqlite 的 MCP 进行演示,创建包含五本名著的数据表:
from qwen_agent.agents import Assistantfrom qwen_agent.utils.output_beautify import typewriter_printdef init_agent_service(): llm_cfg = { "model": "./model/Qwen3-8B", "model_server": "http://localhost:8000/v1", "api_key": "EMPTY" } system = ("你扮演一个数据库助手,你具有查询数据库的能力。") tools = [{ "mcpServers": { "sqlite": { "command": "uvx", "args": [ "mcp-server-sqlite", "--db-path", "test.db" ] } } }] bot = Assistant( llm=llm_cfg, system_message=system, name="数据库管理员", description="你是一个数据库管理员,具有对本地数据库的增删改查能力。", function_list=tools ) return bot def run_query(query=None): bot = init_agent_service() messages = [] messages.append({"role": "user", "content": [{"text": query}]}) previous_text = "" print("助手回复:", end="", flush=True) for response in bot.run(messages): previous_text = typewriter_print(response, previous_text) if __name__ == "__main__": query = "帮我创建一个书籍表,包含书名、作者和出版日期。随机填入五条名著数据。" run_query(query)
运行代码后输出内容如下,模型会进行思考并进行操作:
最终生成一个 test.db 文件,内容如下: