Qwen-agent 核心功能分析学习
Qwen-agent 核心功能分析学习
核心代理模块(Agents)的核心代码与功能分析
一、基础代理类(核心代码与功能)
-
Agent
基类(qwen_agent/agent.py
)- 核心代码:定义了
__init__
初始化方法(加载LLM、工具列表、系统提示词)、run
方法(处理输入消息并返回流式响应)、_call_llm
(调用大模型)和_call_tool
(调用工具)等核心接口。 - 核心功能:作为所有代理的基类,统一封装了消息处理流程、LLM交互和工具调用能力,要求子类实现
_run
方法以定义具体工作流。
- 核心代码:定义了
-
BasicAgent
(隐含于继承关系中)- 核心功能:在
Agent
基础上进一步简化通用逻辑,为功能型代理提供更便捷的继承基础(如默认消息处理、工具调用封装)。
- 核心功能:在
二、功能型代理(核心代码与功能)
-
Assistant
类(qwen_agent/agents/assistant.py
)- 核心代码:继承
FnCallAgent
,重写_run
方法,新增_prepend_knowledge_prompt
方法实现RAG(检索增强生成)逻辑,自动从文件中提取知识并注入对话上下文。 - 核心功能:
- 集成工具调用(如代码解释器、图像生成)和RAG能力,支持处理文档输入。
- 支持角色定义(通过系统提示词),适用于通用问答、多轮对话等场景(示例:
examples/assistant_qwen3.py
展示Qwen3模型的工具调用)。
- 核心代码:继承
-
DocQAAgent
类(qwen_agent/agents/doc_qa.py
)- 核心代码:基于
BasicDocQA
实现,专注于长文档解析与问答,通过拆分文档、检索相关片段、生成答案的流程处理任务。 - 核心功能:优化长文档问答效率,支持PDF、DOCX等格式解析(示例:
examples/assistant_rag.py
展示检索增强问答)。
- 核心代码:基于
-
ReActChat
类(qwen_agent/agents/react_chat.py
)- 核心代码:基于ReAct框架(Reason + Act),通过
_run
方法实现“思考-工具调用-生成答案”的循环逻辑。 - 核心功能:适用于需要逐步推理和工具协作的任务(如复杂计算、多步查询),示例见
examples/multi_agent_router.py
中的工具助手。
- 核心代码:基于ReAct框架(Reason + Act),通过
-
GroupChat
类(qwen_agent/agents/group_chat.py
)- 核心代码:维护代理列表和对话顺序,通过
_run
方法协调多代理轮流交互,支持用户介入(Human-in-the-loop)。 - 核心功能:实现多代理协作(如群聊、分工任务),示例
examples/group_chat_chess.py
展示五子棋对战中的代理协作。
- 核心代码:维护代理列表和对话顺序,通过
三、工具调用代理(FnCallAgent
)
- 核心代码(
qwen_agent/agents/fncall_agent.py
):封装工具调用的核心逻辑,包括解析LLM生成的函数调用指令、执行工具、处理返回结果并生成最终响应。 - 核心功能:作为
Assistant
等代理的父类,提供标准化的工具调用流程,支持并行工具调用(示例:examples/function_calling_in_parallel.py
)。
四、多代理协作模块
-
MultiAgentHub
(qwen_agent/multi_agent_hub.py
)- 核心代码:抽象类,定义
agents
属性(代理列表)和校验逻辑(确保代理名称唯一、非空)。 - 核心功能:为多代理协作提供基础框架,子类(如
GroupChat
)需实现具体协作策略。
- 核心代码:抽象类,定义
-
GroupChatAutoRouter
(qwen_agent/agents/group_chat_auto_router.py
)- 核心代码:通过LLM自动判断输入任务应由哪个代理处理,动态路由消息至最合适的代理。
- 核心功能:优化多代理分工,避免人工指定代理(示例:
examples/multi_agent_router.py
中路由至多模态助手或工具助手)。
五、核心功能总结
- 统一交互接口:所有代理通过
run
方法接收消息列表,返回流式响应,简化集成流程。 - 灵活的工具集成:通过
function_list
配置工具,支持内置工具(如code_interpreter
)和自定义工具注册。 - 多模态与RAG支持:
Assistant
等代理原生支持文档解析、图像理解,结合检索增强生成提升回答准确性。 - 多代理协作:从简单群聊到智能路由,支持复杂场景下的代理分工与协同。
示例代码支撑
- 单代理工具调用:
examples/assistant_qwen3_coder.py
展示Qwen3-Coder模型调用代码解释器。 - 多代理协作:
examples/multi_agent_router.py
演示路由代理协调多模态与工具代理工作。 - 群聊功能:
examples/group_chat_demo.py
提供Gradio界面体验多代理对话。
功能型代理核心代码与功能深度分析
1. Assistant 类(通用助手代理)
核心代码解析:
- 继承关系:继承自
FnCallAgent
,复用工具调用基础能力,同时扩展 RAG 功能。 _run
方法:重写父类方法,先通过_prepend_knowledge_prompt
处理知识注入,再调用父类的工具调用逻辑,实现“知识增强 + 工具调用”的融合流程。_prepend_knowledge_prompt
方法:- 从文件或外部输入中提取知识(通过
self.mem.run
调用记忆模块检索)。 - 将知识格式化(支持多语言模板,如
KNOWLEDGE_TEMPLATE_ZH
/EN
),并插入对话上下文的系统提示中。 - 示例:将文档片段转换为
## 来自 [文件] 的内容:...
格式,确保模型能识别参考来源。
- 从文件或外部输入中提取知识(通过
- 初始化参数:支持
files
(输入文档)、rag_cfg
(RAG 配置),可指定检索策略。
核心功能:
- RAG 增强生成:自动解析 PDF、DOCX 等文档,提取相关片段注入上下文,提升回答准确性(如
tests/agents/test_assistant.py
中通过文件总结标题的案例)。 - 工具集成:支持调用
code_interpreter
(代码执行)、image_gen
(图像生成)等工具,且工具调用与知识检索无缝衔接(示例examples/assistant_qwen3.py
中结合时间工具与文档知识)。 - 角色扮演:通过
system_message
定义角色(如“天气预报助手”),约束模型行为(见test_assistant.py
中指定角色后优先调用amap_weather
工具)。 - 多模态支持:兼容文本、图像输入(如
test_assistant.py
中对图片的描述任务)。
2. DocQAAgent 类(文档问答代理)
核心代码解析:
- 基于
BasicDocQA
实现:封装长文档处理的核心逻辑,包括:- 文档拆分:将长文档按语义分割为短片段(避免超出模型上下文)。
- 相关性检索:根据用户 query 从片段中检索最相关内容(通常基于向量相似度)。
- 答案生成:结合检索结果生成精准回答,而非直接生成。
- 流程控制:通过多步调用 LLM 完成“拆分-检索-生成”,优化长文档处理效率。
核心功能:
- 长文档优化:解决大文件(如数百页 PDF)的问答难题,避免模型“遗忘”关键信息。
- 格式兼容性:支持解析 PDF、DOCX、TXT 等常见格式(依赖
DocParser
工具)。 - 检索增强:确保回答严格基于文档内容,减少幻觉(示例
examples/assistant_rag.py
中基于文档片段生成答案)。
3. ReActChat 类(推理型代理)
核心代码解析:
_run
方法:实现 ReAct 框架的循环逻辑:- 思考(Thought):调用 LLM 生成推理过程(如“我需要先查询当前时间”)。
- 行动(Action):解析 LLM 输出中的工具调用指令(通过
_detect_tool
方法识别Action:
和Action Input:
标记)。 - 观察(Observation):执行工具并获取结果,追加到上下文。
- 循环迭代:重复上述步骤,直到生成最终答案(最多
MAX_LLM_CALL_PER_RUN
次调用,避免无限循环)。
_detect_tool
方法:通过字符串匹配提取工具名称和参数,兼容 Markdown 格式(如代码块包裹的参数)。_prepend_react_prompt
方法:生成工具描述提示(如TOOL_DESC
模板),告知模型可用工具及调用格式。
核心功能:
- 分步推理:适用于需要多步逻辑的任务(如“计算 A 公司近 3 年营收增长率并绘图”),每步推理对应一次工具调用。
- 透明决策:通过
Thought
输出暴露模型思考过程,便于调试和用户理解。 - 工具协作:支持连续调用多个工具(如先
fetch
获取数据,再code_interpreter
分析),示例examples/multi_agent_router.py
中的工具助手。
4. GroupChat 类(群聊代理)
核心代码解析:
- 初始化:接收代理列表(
agents
)和发言选择策略(agent_selection_method
),支持auto
/round_robin
/random
/manual
四种模式。 _run
方法:协调多代理交互流程,通过_gen_batch_response
控制多轮对话,_gen_one_response
生成单轮回复。_select_agent
方法:根据策略选择下一个发言代理:auto
:通过GroupChatAutoRouter
(主机代理)分析上下文自动选择。round_robin
:按顺序轮流发言。random
:随机选择代理。manual
:用户手动指定。
_manage_messages
方法:格式化对话历史,确保每个代理只看到与自己相关的上下文(如将其他代理的发言转为“用户”角色的提示)。
核心功能:
- 多代理协作:支持多个不同角色的代理分工(如一个负责图像理解,一个负责代码生成),示例
examples/group_chat_chess.py
中对战双方代理的交替落子。 - 灵活调度:通过不同选择策略适应场景(如正式任务用
auto
智能调度,闲聊用random
增加趣味性)。 - 用户介入:支持
manual
模式,允许人类参与群聊决策(如指定某个代理回答特定问题)。
总结:功能型代理的共性与差异
代理类型 | 核心能力 | 典型场景 | 依赖模块 |
---|---|---|---|
Assistant | RAG + 工具调用 + 角色扮演 | 通用问答、文档分析 | 记忆模块(memory ) |
DocQAAgent | 长文档精准问答 | 论文解读、合同分析 | 文档解析工具(DocParser ) |
ReActChat | 分步推理 + 工具协作 | 复杂计算、多步任务 | LLM 循环调用逻辑 |
GroupChat | 多代理协同 | 群聊、分工协作 | 代理路由(GroupChatAutoRouter ) |
这些代理通过封装特定场景的工作流,降低了 LLM 应用开发门槛,同时支持灵活扩展(如自定义工具、调整 RAG 策略)。
工具模块(Tools)核心代码与功能分析
一、核心代码结构
-
工具基类与注册机制
BaseTool
抽象类(位于qwen_agent/tools/base.py
):定义工具的基础接口,包括name
(工具名称)、description
(功能描述)、parameters
(参数规范)和抽象方法call
(工具调用逻辑)。所有工具需继承此类并实现call
方法。- 工具注册装饰器(
@register_tool
):通过TOOL_REGISTRY
字典管理工具,确保工具名称唯一。示例:from qwen_agent.tools.base import BaseTool, register_tool@register_tool('my_tool') class MyTool(BaseTool):description = '自定义工具功能描述'parameters = [{'name': 'param1', 'type': 'string', 'required': True}]def call(self, params, **kwargs):return f"处理结果: {params}"
-
预置工具实现
- 文档处理:
DocParser
/SimpleDocParser
(解析 PDF、DOCX 等文件):核心代码位于qwen_agent/tools/doc_parser.py
,通过调用第三方库(如pdfplumber
)提取文档内容。ExtractDocVocabulary
(提取文档词汇):位于qwen_agent/tools/extract_doc_vocabulary.py
,实现关键词、实体提取逻辑。
- 检索与搜索:
Retrieval
(文档检索):位于qwen_agent/tools/retrieval.py
,支持从本地文件或知识库中检索相关内容。- 搜索工具(
WebSearch
、KeywordSearch
等):位于qwen_agent/tools/search_tools/
,封装网页爬取、关键词匹配等逻辑。
- 代码执行:
CodeInterpreter
/PythonExecutor
:位于qwen_agent/tools/code_interpreter.py
和python_executor.py
,通过沙箱环境执行 Python 代码并返回结果。
- 数据存储:
Storage
:位于qwen_agent/tools/storage.py
,提供基于文件系统的键值对操作(put/get/delete/scan)。
- 其他工具:
ImageGen
(图片生成):调用第三方 API 生成图片;AmapWeather
(天气查询):对接高德地图 API 获取天气数据。MCPManager
(模型上下文协议管理):位于qwen_agent/tools/mcp_manager.py
,管理外部工具服务的启动与通信。
- 文档处理:
-
工具测试代码
tests/tools/test_tools.py
验证各工具功能,例如:def test_code_interpreter():tool = CodeInterpreter()result = tool.call("print('hello qwen')") # 执行代码并返回结果assert 'hello qwen' in result
二、核心功能
1.** 工具注册与管理 - 统一注册机制 :通过 @register_tool
装饰器将工具加入 TOOL_REGISTRY
,Agent 可通过工具名称动态调用(如 agent._call_tool('code_interpreter', params)
)。
- 多类型工具支持 **:允许通过工具名、配置字典或工具实例传入 Agent(如 function_list=['code_interpreter']
或 function_list=[MyTool()]
)。
2.** 文档处理与解析 **- 支持 PDF、DOCX 等格式文件的内容提取,为智能体提供处理结构化/非结构化文档的能力。例如,DocParser
可解析论文 PDF 并提取文本,供 Retrieval
工具检索关键信息。
3.** 检索与搜索能力 **- 结合本地文档检索(Retrieval
)和网络搜索(WebSearch
),帮助智能体获取外部知识。例如,用户提问“最新 AI 进展”时,WebSearch
工具可爬取最新资讯并返回结果。
4.** 代码执行与数据处理 **- CodeInterpreter
支持动态执行 Python 代码,可用于数据分析、图表生成等场景。例如,用户要求“分析股票数据并绘图”时,工具执行 Pandas 代码并返回结果。
5.** 数据存储与管理 **- Storage
工具提供轻量级键值对存储,用于临时保存对话状态、中间结果等。例如,多轮对话中存储用户历史输入,避免重复处理。
6.** 外部服务集成 **- 通过 MCPManager
集成第三方工具服务(如 SQLite 数据库、文件系统),扩展智能体功能边界。例如,通过 MCP 协议调用外部 SQL 服务执行数据库查询。
三、关键流程示例
1.** 自定义工具注册与调用 **```python
定义工具
@register_tool(‘my_weather’)
class MyWeatherTool(BaseTool):
description = ‘查询城市天气’
parameters = [{‘name’: ‘city’, ‘type’: ‘string’, ‘required’: True}]
def call(self, params,** kwargs):
city = params[‘city’]
return f"{city} 天气晴朗"
在 Agent 中使用
from qwen_agent.agents import Assistant
agent = Assistant(function_list=[‘my_weather’])
response = agent.run_nonstream([{‘role’: ‘user’, ‘content’: ‘查询北京天气’}])
2. **文档解析与检索**
```python
# 解析 PDF 并检索内容
doc_parser = DocParser()
content = doc_parser.call({'file_path': 'paper.pdf'}) # 解析文档
retrieval = Retrieval()
result = retrieval.call({'query': '论文作者', 'content': content}) # 检索关键词
- 代码执行
code_interpreter = CodeInterpreter() code = "import pandas as pd\nprint(pd.DataFrame({'a': [1,2]}))" result = code_interpreter.call(code) # 执行代码并返回表格结果
四、总结
工具模块是 Qwen-Agent 实现“智能体能力扩展”的核心,通过以下特性支撑上层应用:
- 标准化接口:
BaseTool
定义统一规范,确保工具开发与集成的一致性。 - 丰富预置工具:覆盖文档处理、检索、代码执行等常见场景,降低开发成本。
- 灵活扩展性:通过装饰器注册自定义工具,或通过 MCP 集成外部服务,适应多样化需求。
- 可测试性:完善的测试用例确保工具功能稳定,为智能体可靠运行提供保障。
该模块使智能体能够突破纯文本交互限制,与文件、网络、代码环境等外部系统交互,实现更复杂的任务(如数据分析、知识问答、自动化操作等)。
LLM 模块核心代码与功能分析
一、核心代码结构
-
基类定义
BaseChatModel
(qwen_agent/llm/base.py
):LLM 模块的抽象基类,定义了统一的交互接口,包括:- 核心方法
chat(...)
:支持消息输入、工具函数调用、流式/非流式输出,是所有 LLM 实现的入口。 - 预处理与后处理逻辑:统一消息格式(如将字典转换为
Message
对象)、截断超长输入、缓存管理等。 - 工具调用相关配置:支持
functions
参数传入工具定义,通过fncall_mode
控制函数调用逻辑。
- 核心方法
-
具体实现类
QwenChatAtDS
(qwen_agent/llm/qwen_dashscope.py
):对接 DashScope 服务的 Qwen 模型实现,支持文本生成与函数调用。QwenVLChatAtDS
(qwen_agent/llm/qwenvl_dashscope.py
):Qwen-VL 多模态模型的 DashScope 接口,支持图像输入(support_multimodal_input=True
)。TextChatAtOAI
(qwen_agent/llm/oai.py
):兼容 OpenAI API 的模型接口,支持本地部署或第三方 OpenAI 兼容服务。BaseFnCallModel
(qwen_agent/llm/function_calling.py
):为不原生支持工具调用的模型提供封装,通过 ReAct 风格提示词实现函数调用能力。
-
注册与实例化
LLM_REGISTRY
(qwen_agent/llm/__init__.py
):维护模型类型与实现类的映射,支持通过model_type
动态选择模型。get_chat_model(...)
函数:根据配置(model
、model_server
等)自动推断模型类型并实例化,简化调用流程。
二、核心功能
-
多模型接入能力
- 支持对接 DashScope 服务(Qwen、Qwen-VL、Qwen-Audio 等)、OpenAI 兼容接口(本地部署模型)、Azure 服务等。
- 示例配置:
# DashScope 服务 llm_cfg = {'model': 'qwen-max', 'model_server': 'dashscope', 'api_key': 'xxx'} # OpenAI 兼容服务 llm_cfg = {'model': 'qwen2-7b', 'model_server': 'http://localhost:8000/v1', 'api_key': 'EMPTY'}
-
函数调用(Function Calling)
- 支持传入工具定义(
functions
参数),模型可自动生成符合格式的调用指令(如{"name": "get_current_weather", "parameters": {...}}
)。 - 支持并行函数调用(通过
parallel_function_calls=True
配置),示例见examples/function_calling_in_parallel.py
。 - 对不原生支持工具调用的模型,通过继承
BaseFnCallModel
实现(基于 ReAct 提示词模板)。
- 支持传入工具定义(
-
流式与非流式输出
- 流式输出:通过
stream=True
实时返回生成结果,适用于交互场景(如examples/function_calling.py
中的逐段打印)。 - 非流式输出:一次性返回完整结果,简化处理流程。
- 流式输出:通过
-
多模态支持
- Qwen-VL 等模型支持图像输入,消息内容可包含图像 URL(如
{'image': 'https://xxx.jpg'}
),示例见examples/llm_vl_mix_text.py
。 - 自动过滤模型不支持的模态类型(如非音频模型会忽略音频输入)。
- Qwen-VL 等模型支持图像输入,消息内容可包含图像 URL(如
-
输入管理与缓存
- 自动截断超长输入(通过
max_input_tokens
配置),避免超出模型上下文限制。 - 支持磁盘缓存(依赖
diskcache
),重复请求可直接返回缓存结果,提升效率。
- 自动截断超长输入(通过
-
灵活的生成配置
- 支持调整生成参数(
top_p
、seed
等),通过generate_cfg
传入。 - 控制工具调用策略(
function_choice
可指定强制调用、不调用或自动判断)。
- 支持调整生成参数(
三、关键特性总结
核心能力 | 实现方式 | 典型应用场景 |
---|---|---|
多模型兼容 | LLM_REGISTRY 动态注册 | 切换 DashScope/本地模型 |
工具调用 | chat(...) 接口 + functions 参数 | 天气查询、代码生成等工具协作 |
流式输出 | 生成器迭代返回 | 实时对话界面 |
多模态交互 | QwenVLChatAtDS 等实现类 | 图像理解、图文混合问答 |
输入截断与缓存 | BaseChatModel 内置逻辑 | 长文档处理、重复请求优化 |
通过统一接口与模块化设计,LLM 模块实现了对不同模型、服务的灵活对接,同时封装了工具调用、流式生成等复杂逻辑,为上层代理(如 Assistant
、ReActChat
)提供了可靠的大模型交互能力。
记忆模块(Memory)核心代码与功能分析
一、核心代码结构
-
核心类定义
Memory
类(qwen_agent/memory/memory.py
):继承自Agent
,作为特殊代理处理文件管理与 RAG 逻辑,核心属性与方法包括:- 初始化参数:
function_list
(工具列表)、llm
(大模型配置)、system_message
(系统提示)、files
(初始文件列表)、rag_cfg
(RAG 配置,如最大参考token、解析页大小等)。 _run
方法:处理输入消息中的文件,生成检索关键词,调用检索工具并返回结果。get_rag_files
方法:从消息中提取支持的文件类型(PDF、DOCX等),过滤重复文件。
- 初始化参数:
-
依赖工具与模块
Retrieval
工具(qwen_agent/tools/retrieval.py
):实现文件解析与检索逻辑,支持多文件类型解析(通过DocParser
)和混合检索(关键词搜索、首页搜索等)。- 关键词生成策略:通过
keygen_strategies
模块(如SplitQuery
)从用户查询中提取检索关键词,优化检索精度。 - 文件处理工具:
simple_doc_parser
支持解析 PDF、DOCX、PPTX 等文件类型,extract_files_from_messages
从消息中提取文件路径。
-
测试与示例
- 测试代码(
tests/memory/test_memory.py
):验证文件解析与检索功能,检查返回结果格式与有效性。 - 示例代码(
examples/virtual_memory_qa.py
):基于VirtualMemoryAgent
展示记忆模块在文档问答中的应用。
- 测试代码(
二、核心功能
-
文件管理与解析
- 支持文件类型:PDF、DOCX、PPTX、TXT、CSV、XLSX、HTML 等(通过
PARSER_SUPPORTED_FILE_TYPES
定义)。 - 文件来源:包括初始化时传入的
system_files
和会话消息中提取的session_files
,自动去重后处理。 - 解析逻辑:通过
DocParser
将文件拆分为指定大小(parser_page_size
)的片段,便于检索时高效匹配。
- 支持文件类型:PDF、DOCX、PPTX、TXT、CSV、XLSX、HTML 等(通过
-
检索增强生成(RAG)
- 关键词生成:根据
rag_keygen_strategy
(默认SplitQueryThenGenKeyword
),利用 LLM 从用户查询中提取关键词(支持中英文),示例:# 从查询中提取关键词并格式化 query = "如何翻转图片" keyword_dict = {"text": "如何翻转图片", "keywords": ["翻转图片", "image flip"]}
- 检索工具调用:通过
Retrieval
工具结合多种检索策略(rag_searchers
,如关键词搜索、首页搜索),从解析后的文件片段中匹配与查询相关的内容。 - 结果整合:将检索到的内容格式化为结构化数据(包含来源文件和相关片段),返回给上层代理(如
Assistant
)用于生成回答。
- 关键词生成:根据
-
配置灵活性
- 可配置参数:
max_ref_token
:检索结果的最大 token 限制(默认DEFAULT_MAX_REF_TOKEN
)。parser_page_size
:文件解析时的单页大小(默认DEFAULT_PARSER_PAGE_SIZE
)。rag_searchers
:检索策略列表(默认['keyword_search', 'front_page_search']
)。
- 动态适配:若未提供 LLM,自动禁用关键词生成策略(
rag_keygen_strategy='none'
),仅使用基础检索。
- 可配置参数:
-
与其他模块协同
- Agent 集成:作为
FnCallAgent
、VirtualMemoryAgent
等代理的内置组件,提供文件检索能力(如VirtualMemoryAgent
通过retrieval
工具调用记忆模块)。 - 多轮对话支持:在长对话中,
DialogueRetrievalAgent
利用记忆模块将历史对话存储为文件,通过检索相关片段辅助回答。
- Agent 集成:作为
三、关键流程示例
-
用户提问并上传文件:
messages = [Message(role=USER, content=[ContentItem(text="文档的核心贡献是什么?"),ContentItem(file="example.pdf")]) ]
-
记忆模块处理:
get_rag_files
提取并验证文件类型(example.pdf
符合支持列表)。- 从用户查询中生成关键词(如
["核心贡献", "key contributions"]
)。 - 调用
Retrieval
工具解析文件并检索相关片段。
-
返回检索结果:
[{"source": "[文件](example.pdf)","content": "本文的核心贡献包括:1. ... 2. ..."} ]
四、总结
记忆模块通过 Memory
类实现了文件管理与 RAG 功能的深度整合,核心价值在于:
- 统一处理多类型文件,降低上层代理的文件操作复杂度;
- 结合关键词生成与混合检索策略,提升长文本/文档的信息提取效率;
- 灵活的配置参数适配不同场景(如 token 限制、检索策略调整)。
该模块是 Qwen-Agent 中实现知识增强能力的核心组件,广泛支持文档问答、长对话记忆等场景。
GUI 模块核心代码与功能分析
一、核心代码结构
-
核心类定义
WebUI
类(qwen_agent/gui/web_ui.py
):GUI 模块的主类,基于 Gradio 5 实现可视化交互界面,核心属性与方法包括:- 初始化参数:
agent
(单个或多个智能体实例)、chatbot_config
(界面配置,如用户/智能体头像、输入提示、推荐问题等)。 run()
方法:启动 Gradio 应用,配置界面布局(聊天窗口、输入框、智能体选择器等)、交互逻辑(消息提交、智能体切换、流式响应)。- 辅助方法:
change_agent()
(切换智能体时更新界面信息)、add_text()
(处理用户输入并添加到对话历史)、agent_run()
(调用智能体处理消息并生成响应)。
- 初始化参数:
-
依赖管理与工具函数
gradio_dep.py
:检查并导入 Gradio 5 及相关组件(modelscope_studio
组件),若依赖缺失则提示安装pip install "qwen-agent[gui]"
。gradio_utils.py
:提供界面美化工具,如format_cover_html()
生成智能体信息卡片(包含名称、描述、头像),covert_image_to_base64()
处理图像资源。utils.py
:对话历史格式转换(convert_history_to_chatbot()
)、工具调用信息格式化(convert_fncall_to_text()
)等。
-
配置与样式
- 界面主题:使用
gr.themes.Default
定制主题(主色调、边框圆角等)。 - CSS 样式:通过
appBot.css
定义聊天窗口、卡片布局等样式(位于qwen_agent/gui/assets/
)。
- 界面主题:使用
二、核心功能
-
快速部署智能体交互界面
- 支持单个或多个智能体(如
Assistant
、ReActChat
、ParallelDocQA
等),通过WebUI(bot).run()
一键启动 Gradio 应用。 - 示例代码(来自
examples/assistant_rag.py
):from qwen_agent.gui import WebUI bot = Assistant(llm={'model': 'qwen-plus-latest'}) WebUI(bot).run() # 启动包含 RAG 能力的智能体界面
- 支持单个或多个智能体(如
-
多模态交互支持
- 输入框支持文本、文件(PDF、DOCX 等)、音频(麦克风输入)、图像等多模态内容,适配智能体的多模态处理能力(如 Qwen-VL、Qwen-Audio)。
- 输出自动渲染富文本(Markdown、LaTeX 公式)、图像、代码块等,例如代码解释器工具的执行结果可直接在界面展示。
-
智能体管理与切换
- 当传入多个智能体(如
agent_list = [agent1, agent2]
)时,界面显示下拉选择器,支持动态切换当前交互的智能体,并自动更新智能体描述信息。 - 示例场景:在
examples/gpt_mentions.py
中,用户可切换“代码解释器”“文档问答”“小助理”等不同角色的智能体。
- 当传入多个智能体(如
-
对话增强功能
- 推荐问题:通过
chatbot_config={'prompt.suggestions': [...]}
配置常用提问示例,用户可一键选择输入。 - @提及功能:在多智能体场景中,支持通过
@智能体名称
指定特定智能体处理请求(如@代码解释器 计算 2^10
)。 - 对话历史管理:自动保存聊天记录,支持消息复制、流式输出(实时显示智能体的生成过程)。
- 推荐问题:通过
-
灵活的界面配置
- 可自定义用户/智能体头像(
user.avatar
、agent.avatar
)、输入框提示语(input.placeholder
)、界面主题等。 - 支持启动参数配置:
share=True
生成公网访问链接,server_port
指定端口,concurrency_limit
限制并发数。
- 可自定义用户/智能体头像(
三、关键流程示例
-
用户提问并上传文件:
- 在输入框输入文本(如“介绍文档核心贡献”)并上传 PDF 文件。
- 点击提交后,
add_text()
方法将输入转换为标准消息格式({'role': 'user', 'content': [...]}
)并添加到对话历史。
-
智能体处理与响应:
agent_run()
调用智能体(如ParallelDocQA
)的run()
方法处理消息。- 智能体的流式输出通过 Gradio 实时更新到聊天窗口,包含文本、引用的文档片段等。
-
多智能体切换:
- 用户通过下拉选择器切换到“代码解释器”智能体。
change_agent()
方法更新界面显示的智能体描述和功能说明,确保交互匹配当前智能体能力。
四、总结
GUI 模块通过 WebUI
类封装了 Gradio 界面的复杂逻辑,核心价值在于:
- 降低智能体调试门槛,无需编写前端代码即可快速获得可视化交互界面;
- 支持多智能体、多模态交互,适配框架内各类智能体(如 RAG 问答、代码解释器、多模态助手);
- 提供灵活的配置选项,可根据需求定制界面样式和交互功能。
该模块是 Qwen-Agent 快速演示、调试智能体功能的重要组件,广泛应用于示例代码(如 assistant_omni.py
、react_data_analysis.py
等)中。
示例与测试模块核心代码与功能分析
一、核心代码结构
-
示例应用(
examples/
目录)
包含多种基于 Qwen-Agent 框架开发的实际应用场景,核心代码文件及作用如下:assistant_add_custom_tool.py
:演示如何自定义工具(如my_image_gen
图像生成工具)并集成到Assistant
智能体中,支持工具调用与多模态交互。assistant_rag.py
:基于检索增强生成(RAG)的文档问答示例,展示如何通过Assistant
类处理 PDF 等文件并生成回答。assistant_weather_bot.py
:天气查询机器人示例,集成amap_weather
工具,支持结合文件(如诗歌 PDF)进行多任务处理。qwen2vl_assistant_tooluse.py
:多模态工具调用示例,包含快递查询(express_tracking
)、天气查询(area_to_weather
)、图像裁剪(crop_and_resize
)等工具,展示跨模态交互能力。assistant_omni.py
:全模态助手示例,支持音频、视频、图像、文本输入,基于qwen-omni-turbo-latest
模型实现多模态理解与响应。function_calling.py
与function_calling_in_parallel.py
:展示工具调用的基础用法与并行调用能力,验证智能体多工具协同效率。
-
测试用例(
tests/
目录)
覆盖框架核心模块的单元测试与集成测试,核心代码文件包括:tests/tools/test_tools.py
:测试内置工具功能,如AmapWeather
(天气查询)、CodeInterpreter
(代码执行)、ImageGen
(图像生成)、Retrieval
(检索)等,验证工具调用的正确性。tests/agents/test_assistant.py
:测试Assistant
类的核心能力,包括系统提示与工具结合、文件处理、空查询响应、多模态(VL)处理等场景。tests/examples/test_examples.py
:验证示例应用的完整性,如assistant_add_custom_tool
的图像生成、react_data_analysis
的数据分析、group_chat_demo
的多智能体对话等。tests/examples/test_long_dialogue.py
:测试长对话场景下智能体的上下文记忆与连贯性。
二、核心功能
-
示例应用的核心功能
- 自定义工具集成:通过
@register_tool
装饰器定义工具(如MyImageGen
),并在Assistant
中配置使用,实现功能扩展(如示例assistant_add_custom_tool.py
)。 - 多模态交互:支持文本、图像、音频、视频输入,结合对应工具(如
qwen-vl-max
模型处理图像,qwen-audio
模型处理音频)生成多模态响应(如assistant_omni.py
、qwen2vl_assistant_video.py
)。 - 检索增强生成(RAG):结合
Retrieval
工具解析 PDF、网页等文件,提取相关信息辅助回答(如assistant_rag.py
中对 arXiv 论文的解析与问答)。 - 代码解释器应用:通过
code_interpreter
工具执行 Python 代码,实现数据处理、图表绘制等功能(如react_data_analysis.py
中对股票数据的分析与可视化)。 - 多智能体协作:展示多智能体对话(
group_chat_demo.py
)、角色分工(multi_agent_router.py
)等场景,验证框架的分布式协作能力。
- 自定义工具集成:通过
-
测试用例的核心功能
- 工具正确性验证:检查工具输入输出格式(如
test_amap_weather
验证天气查询参数与返回结果,test_code_interpreter
验证代码执行逻辑)。 - 智能体能力测试:验证
Assistant
类的工具调用决策(如根据用户 query 自动选择amap_weather
工具)、文件解析能力(如处理 PDF 链接并生成总结)、多模态理解(如描述图片内容)。 - 示例完整性保障:确保所有示例应用可正常运行,覆盖关键场景(如
test_assistant_add_custom_tool
验证自定义图像生成工具的调用流程)。 - 边界条件测试:包括空查询处理(
test_assistant_empty_query
)、长对话上下文管理(test_long_dialogue
)、异常参数容错等。
- 工具正确性验证:检查工具输入输出格式(如
三、关键流程示例
-
自定义工具开发与使用(
assistant_add_custom_tool.py
)- 定义工具:通过继承
BaseTool
并注册my_image_gen
,实现基于文本生成图像 URL 的功能。 - 配置智能体:在
Assistant
中指定function_list=['my_image_gen', 'code_interpreter']
,结合系统提示实现“生成图像→下载→处理”的完整流程。 - 交互测试:用户输入“画一只狗”,智能体调用
my_image_gen
生成图像,再调用code_interpreter
下载并处理图像。
- 定义工具:通过继承
-
工具调用测试(
tests/tools/test_tools.py
)- 对
AmapWeather
工具,传入参数{'location': '北京市'}
,验证返回的天气数据格式正确。 - 对
CodeInterpreter
工具,执行print('hello qwen')
,检查输出是否符合预期。 - 对
Retrieval
工具,传入论文 PDF 链接和查询“作者是谁”,验证检索到的信息准确性。
- 对
-
多模态智能体验证(
tests/agents/test_assistant.py
)- 向
Assistant
传入包含图片的消息(如“描述这张图片”+狗和女孩的图片 URL),验证返回的图像描述内容非空且合理。
- 向
四、总结
示例与测试模块是 Qwen-Agent 框架的重要组成部分,核心价值在于:
- 示例应用:提供可直接运行的场景化代码,降低开发者使用门槛,展示框架在自定义工具、多模态交互、RAG、代码解释器等场景的能力。
- 测试用例:通过单元测试与集成测试保障核心模块(工具、智能体)的稳定性,确保功能符合预期,支持框架的迭代与扩展。
这些模块共同构成了框架的“实践指南”与“质量保障体系”,帮助开发者快速上手并信任框架的可靠性。
配置与部署模块核心代码与功能分析
一、核心代码结构
-
模型服务配置相关代码
- 环境变量与配置解析:框架通过读取环境变量(如
DASHSCOPE_API_KEY
)或显式传入的配置参数初始化模型服务,核心逻辑位于qwen_agent/llm/base.py
和qwen_agent/llm/dashscope.py
中。例如:# 从环境变量加载API密钥(示例来自llm/dashscope.py) import os api_key = llm_cfg.get('api_key', os.getenv('DASHSCOPE_API_KEY'))
- 模型服务适配:
qwen_agent/llm/__init__.py
中的get_chat_model
函数根据配置选择模型服务类型(DashScope 或 OpenAI 兼容服务,如 vLLM/Ollama),返回对应的模型实例。
- 环境变量与配置解析:框架通过读取环境变量(如
-
本地模型部署适配代码
- 兼容 vLLM/Ollama 部署的 OpenAI 风格 API,核心配置逻辑在
qwen_agent/llm/openai.py
中,通过model_server
参数指定本地服务地址(如http://localhost:8000/v1
)。 - 示例配置(来自
examples/assistant_qwen3_coder.py
):llm_cfg = {'model': 'qwen3-coder-480b-a35b-instruct','model_server': 'https://dashscope.aliyuncs.com/compatible-mode/v1', # 兼容OpenAI的服务地址'api_key': os.getenv('DASHSCOPE_API_KEY'), }
- 兼容 vLLM/Ollama 部署的 OpenAI 风格 API,核心配置逻辑在
-
模型上下文协议(MCP)集成代码
- MCP 工具配置格式定义在
examples/assistant_mcp_sqlite_bot.py
等示例中,通过mcpServers
字典指定工具服务的启动命令和参数:tools = [{'mcpServers': {'sqlite': {'command': 'uvx','args': ['mcp-server-sqlite', '--db-path', 'test.db'] # 启动SQLite工具服务}} }]
- MCP 工具调用逻辑在
qwen_agent/tools/mcp.py
中,负责解析配置、启动外部服务并处理交互。
- MCP 工具配置格式定义在
二、核心功能
-
模型服务灵活配置
- DashScope 服务集成:通过设置
DASHSCOPE_API_KEY
环境变量或在llm_cfg
中指定api_key
,直接调用阿里云 DashScope 提供的 Qwen 系列模型(如qwen-max
、qwen-vl-max
)。支持动态切换模型类型(文本/多模态)和版本。 - 本地模型部署:适配 vLLM(高并发 GPU 部署)和 Ollama(本地 CPU/GPU 部署),通过配置
model_server
指向本地 API 服务地址(如http://localhost:8000/v1
),实现开源 Qwen 模型的本地化运行。 - 模型参数定制:在
llm_cfg
的generate_cfg
中配置超参数(如top_p
、max_input_tokens
、parallel_function_calls
等),控制模型生成行为。例如:llm_cfg = {'model': 'qwen3-32b','generate_cfg': {'top_p': 0.8,'parallel_function_calls': True # 支持工具并行调用} }
- DashScope 服务集成:通过设置
-
模型上下文协议(MCP)工具集成
- 外部工具服务管理:通过 MCP 配置启动第三方工具服务(如文件系统、SQLite 数据库、内存服务等),实现智能体与外部系统的交互。例如,
assistant_mcp_sqlite_bot.py
中通过 MCP 集成 SQLite 服务,支持数据库查询。 - 跨语言工具兼容:MCP 支持通过
npx
(Node.js)、uvx
(Python)等命令启动不同语言开发的工具服务,扩展智能体的功能边界。 - 安全隔离:工具服务独立于智能体进程运行,降低恶意代码执行风险(如代码解释器工具通过 MCP 隔离运行)。
- 外部工具服务管理:通过 MCP 配置启动第三方工具服务(如文件系统、SQLite 数据库、内存服务等),实现智能体与外部系统的交互。例如,
-
部署灵活性支持
- 多环境适配:支持云服务(DashScope)和本地部署(vLLM/Ollama),满足不同场景的资源需求(如开发调试用本地模型,生产环境用云服务)。
- 服务启动参数配置:通过命令行参数(如
--model_server
、--api_key
)启动应用(如run_server.py
),方便部署时动态调整模型服务地址和密钥。
三、关键流程示例
-
DashScope 模型服务配置与调用
- 环境变量配置:
export DASHSCOPE_API_KEY="your_api_key"
- 代码中初始化模型:
from qwen_agent.llm import get_chat_model llm = get_chat_model({'model': 'qwen-max', 'model_server': 'dashscope'}) response = llm.chat(messages=[{'role': 'user', 'content': 'Hello!'}])
- 环境变量配置:
-
本地 vLLM 服务配置
- 部署 vLLM 服务:
python -m vllm.entrypoints.openai.api_server --model Qwen2.5-7B-Instruct --port 8000
- 代码中接入服务:
llm = get_chat_model({'model': 'Qwen2.5-7B-Instruct','model_server': 'http://localhost:8000/v1','api_key': 'EMPTY' # 本地服务无需密钥 })
- 部署 vLLM 服务:
-
MCP 工具集成(SQLite 示例)
- 配置 MCP 工具:
tools = [{'mcpServers': {'sqlite': {'command': 'uvx','args': ['mcp-server-sqlite', '--db-path', 'test.db']}} }]
- 智能体调用工具:用户提问“查询数据库中用户数量”,智能体通过 MCP 调用 SQLite 服务执行查询并返回结果。
- 配置 MCP 工具:
四、总结
配置与部署模块是 Qwen-Agent 框架的“基础设施”,核心价值在于:
- 灵活的模型接入:支持云服务与本地部署,适配不同场景的模型需求,降低使用门槛。
- 扩展的工具生态:通过 MCP 协议集成外部工具服务,丰富智能体功能,实现与数据库、文件系统等的交互。
- 可定制的运行参数:允许开发者根据需求调整模型生成策略和部署配置,平衡性能与效果。
该模块为框架的稳定性和扩展性提供了基础保障,是连接模型服务、工具生态与上层应用的关键环节。