Qwen3(vllm部署) 使用 MCP

为什么选择 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 用于模型推理:

bash 复制代码
pip install vllm
pip install transformers
pip install openai

2. 安装 qwen-agent 依赖

modelscope 用于下载模型(若已下载模型可忽略)。

bash 复制代码
pip install -U "qwen-agent[rag,code_interpreter,gui,mcp]"
pip install uv
pip install modelscope

括号内的内容皆为可选依赖,其中 mcp 是本文需要用到的。

css 复制代码
> [gui] 用于提供基于 Gradio 的 GUI 支持;
> [rag] 用于支持 RAG;
> [code_interpreter] 用于提供代码解释器相关支持;
> [mcp] 用于支持 MCP。

3. 下载模型权重

本文使用 modelscope 进行模型下载,选用模型为 8B,可根据实际情况进行选择。

bash 复制代码
from modelscope import snapshot_download 
model_dir = snapshot_download('Qwen/Qwen3-8B', cache_dir="./model")

调用 MCP

1. 模型部署

直接利用 vllm 进行模型部署,其中参数可以根据自身情况增加:

bash 复制代码
vllm serve ./model/Qwen3-8B

2. 模型测试

部署后可以先进行测试,确保模型能够正常运行:

python 复制代码
from openai import OpenAI

class 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 response


if __name__ == "__main__":
    model = LLM()
    prompt = "你好!"
    response = model.chat(prompt)
    print(response)

3. 使用 qwen-agent

接下来借助 qwen-agent 来实现与模型的对话:

python 复制代码
from qwen_agent.agents import Assistant
from qwen_agent.utils.output_beautify import typewriter_print

llm_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 进行演示,创建包含五本名著的数据表:

python 复制代码
from qwen_agent.agents import Assistant

from qwen_agent.utils.output_beautify import typewriter_print


def 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 文件,内容如下:

相关推荐
起风了___1 分钟前
Python 自动化下载夸克网盘分享文件:基于 Playwright 的完整实现(含登录态持久化与提取码处理)
后端·python
汀丶人工智能2 分钟前
AI Compass前沿速览:Qwen3-Max、Mixboard、Qwen3-VL、Audio2Face、Vidu Q2 AI视频生成模型、Qwen3-Liv
人工智能
唐天下文化2 分钟前
展厅迎宾机器人:豹小秘2如何打造科技第一印象
人工智能·科技·机器人
帅帅爱数学6 分钟前
DeepMimic论文详细解析:基于示例引导的深度强化学习实现物理仿真角色技能
算法·强化学习
我是华为OD~HR~栗栗呀12 分钟前
测试转C++开发面经(华为OD)
java·c++·后端·python·华为od·华为·面试
qiu_zhongya29 分钟前
iree 用C++来运行Qwen 2.5 0.5b
开发语言·c++·人工智能
拾贰_C35 分钟前
【anaconda】anaconda安装配置,git安装配置以及pytorch安装
人工智能·pytorch·git
IT成长日记41 分钟前
【LVS入门宝典】LVS调度算法轮询(RR)深度解析:从原理到实战的公平调度之道
算法·lvs·rr·轮询调度算法
荼蘼43 分钟前
Dlib+OpenCV 人脸轮廓绘制
人工智能·opencv·计算机视觉
九河云1 小时前
物流仓储自动化升级:物道供应链 AGV 机器人实现分拣效率提升 60%
人工智能·科技·物联网·机器人·自动化