版权所有 2023 Qwen团队,阿里巴巴集团。保留所有权利。
根据Apache许可证第2.0版(“许可证”)获得许可; 除非符合许可证,否则不得使用此文件。 您可以通过以下网址获取许可证副本:
http://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,根据许可证分发的软件 是基于“现状”基础分发的, 不附带任何形式的保证或条件,无论是明示还是暗示。 有关特定权限和限制,请参阅许可证。
中文 | English
<p align="center"> <img src="https://gips1.baidu.com/it/u=2870446620,3941798008&fm=3081&app=3081&f=PNG?w=5444&h=1555" width="400"/> <p> <br> <p align="center"> 💜 <a href="https://chat.qwen.ai/"><b>Qwen Chat</b></a>   |   🤗 <a href="https://huggingface.co/Qwen">Hugging Face</a>   |   🤖 <a href="https://modelscope.cn/organization/qwen">ModelScope</a>   |    📑 <a href="https://qwenlm.github.io/">Blog</a>    |   📖 <a href="https://qwen.readthedocs.io/">文档</a> <br> 💬 <a href="https://github.com/QwenLM/Qwen/blob/main/assets/wechat.png">WeChat (微信)</a>   |   🫨 <a href="https://discord.gg/CV4E9rpNSD">Discord</a>   </p>Qwen-Agent 是一个基于 Qwen 的指令跟随、工具使用、规划和记忆能力来开发大模型应用的框架。 它还提供了示例应用程序,如浏览器助手、代码解释器和自定义助手。 目前,Qwen-Agent 担任 Qwen Chat 的后端。
reasoning_content 字段;调整了默认的 函数调用模板,适用于 Qwen2.5 系列通用模型和 QwQ-32B。如果您需要使用旧版本的模板,请参考 示例 传递参数。pip install -U "qwen-agent[gui,rag,code_interpreter,mcp]"
# 或者使用 `pip install -U qwen-agent` 来满足最小需求。
# 可选需求,用双括号指定:
# [gui] 用于基于 Gradio 的 GUI 支持;
# [rag] 用于 RAG 支持;
# [code_interpreter] 用于代码解释器支持;
# [mcp] 用于 MCP 支持。
git clone https://github.com/QwenLM/Qwen-Agent.git
cd Qwen-Agent
pip install -e ./"[gui,rag,code_interpreter,mcp]"
# 或者 `pip install -e ./` 来满足最小需求。
您可以使用阿里云提供的 DashScope 模型服务,或者部署并使用自己的模型服务,使用开源的 Qwen 模型。
如果选择使用 DashScope 提供的模型服务,请确保设置环境变量 DASHSCOPE_API_KEY 为您唯一的 DashScope API 密钥。
如果您更愿意部署并使用自己的模型服务,请按照 Qwen2 的 README 中提供的说明部署与 OpenAI 兼容的 API 服务。
具体而言,查阅 vLLM 部分以进行高吞吐量 GPU 部署,或查阅 Ollama 部分以进行本地 CPU(+GPU)部署。
对于 QwQ 和 Qwen3 模型,建议不要添加 --enable-auto-tool-choice 和 --tool-call-parser hermes 参数,因为 Qwen-Agent 将自行解析来自 vLLM 的工具输出。
对于 Qwen3-Coder,建议启用上述两个参数,使用 vLLM 内置的工具解析,并结合 use_raw_api 参数 [使用方法](#如何向代理传递 LLM 参数)。
Qwen-Agent 提供了原子组件,如 LLM(继承自 class BaseChatModel 并带有 函数调用)和工具(继承自 class BaseTool),以及高级组件如代理(派生自 class Agent)。
以下示例说明了创建一个能够读取 PDF 文件并使用工具的代理的过程,以及如何加入自定义工具:
import pprint
import urllib.parse
import json5
from qwen_agent.agents import Assistant
from qwen_agent.tools.base import BaseTool, register_tool
from qwen_agent.utils.output_beautify import typewriter_print
# 第一步(可选):添加一个名为 `my_image_gen` 的自定义工具。
@register_tool('my_image_gen')
class MyImageGen(BaseTool):
# `description` 告诉代理该工具的功能。
description = 'AI 绘画(图像生成)服务,输入文本描述,返回基于文本信息绘制的图像 URL。'
# `parameters` 告诉代理该工具有哪些输入参数。
parameters = [{
'name': 'prompt',
'type': 'string',
'description': '所需图像内容的详细英文描述',
'required': True
}]
def call(self, params: str, **kwargs) -> str:
# `params` 是由 LLM 代理生成的参数。
prompt = json5.loads(params)['prompt']
prompt = urllib.parse.quote(prompt)
return json5.dumps(
{'image_url': f'https://image.pollinations.ai/prompt/{prompt}'},
ensure_ascii=False)
# 第二步:配置您正在使用的 LLM。
llm_cfg = {
# 使用 DashScope 提供的模型服务:
'model': 'qwen-max-latest',
'model_type': 'qwen_dashscope',
# 'api_key': 'YOUR_DASHSCOPE_API_KEY',
# 如果这里没有设置 'api_key',则会使用 `DASHSCOPE_API_KEY` 环境变量。
# 使用与 OpenAI API 兼容的模型服务,如 vLLM 或 Ollama:
# 'model': 'Qwen2.5-7B-Instruct',
# 'model_server': 'http://localhost:8000/v1', # 基础 URL,也称为 api_base
# 'api_key': 'EMPTY',
# (可选)LLM 生成的超参数:
'generate_cfg': {
'top_p': 0.8
}
}
# 第三步:创建一个代理。这里我们以 `Assistant` 代理为例,它可以使用工具并读取文件。
system_instruction = '''在收到用户请求后,你应该:
- 首先绘制一张图片并获取图片 URL,
- 然后运行代码 `request.get(image_url)` 下载图片,
- 最后从给定的文档中选择一个图像操作来处理图片。
请使用 `plt.show()` 显示图片。'''
tools = ['my_image_gen', 'code_interpreter'] # `code_interpreter` 是一个内置工具,用于执行代码。
files = ['./examples/resource/doc.pdf'] # 给机器人一个 PDF 文件来阅读。
bot = Assistant(llm=llm_cfg,
system_message=system_instruction,
function_list=tools,
files=files)
# 第四步:将代理作为聊天机器人运行。
messages = [] # 这里存储聊天历史。
while True:
# 例如,输入查询 "绘制一只狗并将其旋转 90 度"。
query = input('\nuser query: ')
# 将用户查询追加到聊天历史中。
messages.append({'role': 'user', 'content': query})
response = []
response_plain_text = ''
print('bot response:')
for response in bot.run(messages=messages):
# 流式输出。
response_plain_text = typewriter_print(response, response_plain_text)
# 将机器人的响应追加到聊天历史中。
messages.extend(response)
除了使用内置的代理实现如 class Assistant,您还可以通过继承 class Agent 来开发自己的代理实现。
框架还提供了一个方便的 GUI 接口,支持快速部署代理的 Gradio 演示。 例如,在上述情况下,您可以使用以下代码快速启动一个 Gradio 演示:
from qwen_agent.gui import WebUI
WebUI(bot).run() # bot 是在上面代码中定义的代理,这里为了节省空间不再重复定义。
现在您可以在 Web UI 中与代理进行对话。更多使用示例,请参阅 示例 目录。
您可以在开源的 MCP 服务器网站 上选择所需的工具,并配置相关环境。
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"
]
}
}
}
更多细节,请参阅 MCP 使用示例
运行此示例所需的依赖项如下:
# Node.js(从 Node.js 官方网站下载并安装最新版本)
# uv 0.4.18 或更高版本(检查 uv --version)
# Git(检查 git --version)
# SQLite(检查 sqlite3 --version)
# 对于 macOS 用户,可以使用 Homebrew 安装这些组件:
brew install uv git sqlite3
# 对于 Windows 用户,可以使用 winget 安装这些组件:
winget install --id=astral-sh.uv -e
winget install git.git sqlite.sqlite
是的。LLM 类提供了 函数调用。此外,一些代理类也是基于函数调用能力构建的,例如 FnCallAgent 和 ReActChat。
当前默认的工具调用模板原生支持 并行函数调用。
llm_cfg = {
# 正在使用的模型名称:
'model': 'qwen3-32b',
# 正在使用的模型服务:
'model_type': 'qwen_dashscope',
# 如果这里没有设置 'api_key',则会默认读取 `DASHSCOPE_API_KEY` 环境变量:
'api_key': 'YOUR_DASHSCOPE_API_KEY',
# 使用与 OpenAI API 兼容的模型服务,如 vLLM 或 Ollama:
# 'model': 'qwen3-32b',
# 'model_server': 'http://localhost:8000/v1', # 基础 URL,也称为 api_base
# 'api_key': 'EMPTY',
# (可选)LLM 超参数:
'generate_cfg': {
# 此参数会影响工具调用解析逻辑,默认值为 False:
# 设置为 True:当内容为 `<think>this is the thought</think>this is the answer`
# 设置为 False:当响应由 reasoning_content 和 content 组成
# 'thought_in_content': True,
# 工具调用模板:默认为 nous(推荐用于 qwen3):
# 'fncall_prompt_type': 'nous'
# 最大输入长度,如果消息超过此长度将被截断,请根据模型 API 进行调整:
# 'max_input_tokens': 58000
# 将直接传递给模型 API 的参数,如 top_p、enable_thinking 等,根据 API 规范:
# 'top_p': 0.8
# 使用 API 的原生工具调用接口
# 'use_raw_api': True,
}
}
我们已经发布了 一个快速 RAG 解决方案,以及 一个昂贵但具有竞争力的代理,用于对超级长文档进行问答。它们已经在两个具有挑战性的基准上超过了原生长上下文模型,同时更加高效,并且在单针“针入草堆”压力测试中完美表现,涉及 1M-token 上下文。详情请参阅 博客。
<p align="center"> <img src="https://gips0.baidu.com/it/u=2522721553,863267645&fm=3081&app=3081&f=PNG?w=2320&h=2620" width="400"/> <p>BrowserQwen 是一个基于 Qwen-Agent 构建的浏览器助手。请参阅其 文档 了解详细信息。
代码解释器未沙箱化,它会在您的环境中执行代码。请勿要求 Qwen 执行危险任务,也不应直接将代码解释器用于生产目的。