10 · Qwen-Agent:模型厂自带框架长什么样
图片来源:QwenLM/Qwen-Agent
| 仓库 | QwenLM/Qwen-Agent |
| Star | 17.0k |
| 最后提交 | 2026-03-04(节奏偏慢,但仍在更新,2026-02 刚适配 Qwen3.5) |
| 语言 | Python |
| 许可证 | Apache 2.0 |
| 层级 | Framework |
| 一句话 | 阿里通义团队围绕 Qwen 模型能力做的官方 Agent 框架,也是 Qwen Chat 的后端 |
一、它的特殊身份:不是「通用框架」,是「模型的配套」
本专题里其他框架都在追求模型中立,Qwen-Agent 反过来 —— 它的设计前提就是「你在用 Qwen」。官方自述:
基于 Qwen 的指令遵循、工具使用、规划、记忆能力开发 LLM 应用的框架。
这个定位带来一个很实在的好处:框架里的 function call 模板是跟着 Qwen 各代模型手工调过的。
README 里有一段细节很能说明问题:
- QwQ / Qwen3:建议 vLLM 部署时不要加
--enable-auto-tool-choice和--tool-call-parser hermes,因为 Qwen-Agent 会自己解析工具输出 - Qwen3-Coder:建议开启这两个参数,用 vLLM 内置解析,配合
use_raw_api
这种「哪代模型该用哪种解析方式」的知识,通用框架里是拿不到的。 如果你在自建 vLLM 上跑 Qwen 系列做工具调用,这一条能省掉好几天的调试。相关部署细节可以对照 vLLM 快速部署入门。
二、核心抽象:Agent / BaseTool / BaseChatModel
它的分层很传统,也很好懂:
| 层 | 基类 | 说明 |
|---|---|---|
| 模型 | BaseChatModel | 自带 function calling |
| 工具 | BaseTool | @register_tool 注册,类属性声明 description / parameters |
| Agent | Agent | Assistant 等预置实现,也可继承自定义 |
完整例子
import json5, urllib.parse
from qwen_agent.agents import Assistant
from qwen_agent.tools.base import BaseTool, register_tool
# 1. 自定义工具:继承 BaseTool + 用类属性声明,而不是从函数签名推断
@register_tool('my_image_gen') # 注册到全局工具表,后面用这个名字引用
class MyImageGen(BaseTool):
# description 给模型看,决定它「什么时候调这个工具」
description = 'AI painting (image generation) service, input text description, and return the image URL.'
# parameters 手写 JSON Schema —— 比装饰器方案啰嗦,但你写 什么模型就看到什么
parameters = [{
'name': 'prompt',
'type': 'string',
'description': 'Detailed description of the desired image content, in English',
'required': True
}]
def call(self, params: str, **kwargs) -> str:
# 注意 params 是模型生成的 JSON 字符串,要自己解析。
# 用 json5 而不是 json,是因为模型偶尔会输出单引号、尾逗号这类不严格的 JSON
prompt = urllib.parse.quote(json5.loads(params)['prompt'])
# 返回值也必须是字符串,会被原样塞回对话历史给模型看
return json5.dumps({'image_url': f'https://image.pollinations.ai/prompt/{prompt}'},
ensure_ascii=False)
# 2. 配置模型:DashScope 或任意 OpenAI 兼容服务
llm_cfg = {
'model': 'qwen-max-latest',
'model_type': 'qwen_dashscope', # 走阿里云百炼;API Key 从 DASHSCOPE_API_KEY 读
# 换成自建 vLLM / Ollama:注释掉上面两行,改用下面三行(OpenAI 兼容协议)
# 'model': 'Qwen3-8B',
# 'model_server': 'http://localhost:8000/v1', # 也就是 base_url
# 'api_key': 'EMPTY', # 本地服务通常不校验
'generate_cfg': {'top_p': 0.8}, # 采样参数,直接透传给模型
}
# 3. 创建 Agent —— 注意 files 参数:直接喂 PDF,内置 RAG
bot = Assistant(
llm=llm_cfg,
system_message='...',
# function_list 传的是工具「名字」,其中 code_interpreter 是内置的
# 代码执行工具(基于本地 Docker 沙箱),不用你自己实现
function_list=['my_image_gen', 'code_interpreter'],
# files 一传,框架自动做切分 + 向量化 + 检索 —— 内置 RAG,
# 不用自己搭向量库。这是 Qwen-Agent 最省事的地方之一
files=['./examples/resource/doc.pdf'],
)
# 4. 跑起来(流式)
messages = [{'role': 'user', 'content': '画一只狗然后旋转 90 度'}]
# bot.run() 是生成器:每产生一点内容就 yield 一次当前的完整响应列表,
# 所以做打字机效果时是「整体替换」而不是「追加」,这点和别的框架不同
for response in bot.run(messages=messages):
...
# 想接着多轮对话,就把 response 追加回 messages 再调一次
BaseTool 用类属性声明参数,而不是从函数签名推断 —— 这比 LangChain 的 @tool 或 Pydantic AI 啰嗦,但胜在显式,schema 里写什么就是什么。
三、开箱即用的三件套
Qwen-Agent 的实用主义体现在:几个最常用的能力是内置的,不用自己拼。
| 能力 | 怎么用 | 说明 |
|---|---|---|
| Code Interpreter | function_list=['code_interpreter'] | 基于本地 Docker 容器的沙箱执行 |
| RAG | files=['doc.pdf'] | 直接把文件交给 Agent,内置切分 + 检索 |
| GUI | WebUI(bot).run() | 一行代码起 Gradio 界面 |
from qwen_agent.gui import WebUI
# 一行起一个 Gradio 聊天界面,自带文件上传、流式输出、工具调用展示。
# 做内部工具或给业务方演示时,这一行能省掉一整个前端
WebUI(bot).run()
这三行相加,等于别的框架里好几天的活。 尤其是 WebUI(bot).run() —— 做内部工具、做 Demo 给业务方看的时候,这一行的价值被严重低估。
安装时按需选:
# 方括号里是可选依赖,按需装:
# gui → Gradio 界面
# rag → 文件问答(files 参数要用它)
# code_interpreter → 代码执行沙箱
# mcp → MCP 协议支持
# 只要最小依赖就 pip install -U qwen-agent
pip install -U "qwen-agent[gui,rag,code_interpreter,mcp]"
- 需要本机装好 Docker 并运行,首次构建镜像取决于网络
- 早期示例里的 python executor 不是沙箱,README 明说只适合本地测试
生产环境跑代码执行,无论用哪个框 架,都要认真做沙箱隔离 —— 这和 DeepAgents 的 LocalShellBackend 警告 是同一件事。
四、MCP 支持
配置格式和主流一致:
{
"mcpServers": {
"memory": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-memory"] },
"filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allowed/files"] },
"sqlite": { "command": "uvx", "args": ["mcp-server-sqlite", "--db-path", "test.db"] }
}
}
怎么读这段配置:
| 字段 | 含义 |
|---|---|
mcpServers 的键 | MCP server 的别名,工具名会以它作前缀 |
command + args | 怎么把这个 server 进程启动起来 |
npx -y | 临时下载并运行 Node 包,不用预先全局安装 |
uvx | Python 版的 npx,用来跑 Python 写的 MCP server |
/path/to/allowed/files | 文件服务的白名单目录,Agent 只能读写这个目录 |
到 2026 年,MCP 支持已经是及格线而非加分项 —— 本专题 11 个框架全都支持。
五、DeepPlanning:它还产出评测基准
2026-01 开源的 DeepPlanning 是一个 Agent 规划能力评测基准。框架团队自己做 benchmark,说明他们的关注点在「模型的 Agent 能力」而不只是「框架的易用性」 —— 这也符合它「模型配套」的身份。
六、优势与短板
优势
- Qwen 适配最好 —— function call 模板、vLLM 参数建议、各代模型差异,都是一手信息
- 国内可用性 —— DashScope 直连,不用处理网络问题
- 开箱即用度高 —— Code Interpreter + RAG + WebUI 三件套
- 代码量小、可读 —— 想看懂一个 Agent 框架内部怎么工作,它是个好读本
- Apache 2.0
短板(必须说清楚)
| 短板 | 影响 |
|---|---|
| 迭代节奏慢 | 最后提交 2026-03,本领域 5 个月是一代半 |
| 缺少持久执行 / checkpoint | 长任务崩了从头再来,对比 LangGraph |
| 缺少结构化 HITL | 没有工具级审批中断机制 |
| 多智能体弱 | 有 GroupChat 等,但成熟度远 不及 LangGraph / MAF |
| 可观测性弱 | 无内置 tracing,要自己接 |
| 生态小 | 17k star 但集成数量和 LangChain 不在一个量级 |
七、模型厂自带框架这一类,该怎么看
Qwen-Agent 是一个典型样本。同类还有 OpenAI 的 Agents SDK、Google 的 ADK、Anthropic 的 Claude Agent SDK。
共同规律:
判断标准:这家厂把框架当战略产品(OpenAI、Google、Anthropic 都在持续重投),还是当模型的配套工具(Qwen-Agent 更接近后者)?前者可以长期押注,后者更适合「用它的适配知识,但架构上留退路」。