一步步教你使用 Qwen-Agent 构建智能 AI Agent 应用

一步步教你使用 Qwen-Agent 构建智能 AI Agent 应用

一步步教你使用 Qwen-Agent 构建智能 AI Agent 应用

前言

在人工智能快速发展的今天,大语言模型(LLM)已经从单纯的文本生成工具演变为能够执行复杂任务的智能代理(Agent)。阿里云通义千问团队推出的 Qwen-Agent 框架,正是为了帮助开发者快速构建基于大语言模型的智能代理应用而生的利器。本文将带领读者从零开始,深入学习 Qwen-Agent 的各项功能与使用技巧,让你能够独立开发出功能强大的 AI Agent 应用。

Qwen-Agent 是一个功能丰富的 Agent 开发框架,它不仅提供了基础的 Agent 构建模块,还包含了工具调用、代码解释器、浏览器环境、RAG 检索增强等高级功能。通过本教程,你将掌握如何使用这个框架来创建能够自主决策、调用工具、处理多模态信息的智能代理系统。


一、项目简介与核心特性

1.1 什么是 Qwen-Agent

Qwen-Agent 是阿里云通义千问团队开源的一个 Agent 开发框架,旨在为开发者提供一套完整、易用的工具来构建基于大语言模型的智能代理应用。该框架将复杂的 Agent 技术封装成简洁易用的接口,让开发者能够专注于业务逻辑的实现,而不必担心底层的技术细节。

作为一个活跃的开源项目,Qwen-Agent 在 GitHub 上已经获得了超过 16000 颗星,这充分说明了社区对它的认可和喜爱。项目保持着持续更新和优化,文档完善,示例丰富,非常适合想要入门 Agent 开发的开发者学习使用。

1.2 Qwen-Agent 的核心优势

模块化设计:Qwen-Agent 采用了高度模块化的架构设计,将 Agent 的各个组件(如 LLM、工具、记忆系统等)解耦,使得开发者可以根据需求灵活组合。这种设计不仅提高了代码的可维护性,也方便开发者进行定制化开发。

丰富的工具支持:框架内置了多种常用工具,包括浏览器环境、代码解释器、文件操作工具等。开发者还可以方便地扩展自定义工具,满足各种业务场景的需求。

强大的多模态能力:支持处理文本、图像等多种模态的信息输入,让 Agent 能够更好地理解和处理复杂的世界信息。

易于集成:Qwen-Agent 可以与多种大语言模型配合使用,包括通义千问系列模型以及其他开源和商业模型,提供了极大的灵活性。

1.3 主要功能模块

Qwen-Agent 的功能可以分为以下几个主要模块:

Agent 组件:提供了多种预置的 Agent 类型,包括 ReAct Agent、ReWOO Agent 等,每种 Agent 都有其特定的应用场景和优势。开发者可以直接使用这些预置类型,也可以基于它们进行二次开发。

工具系统:完整的工具调用框架,支持工具注册、工具选择、工具执行等完整流程。内置了浏览器操作、代码执行、文件处理等多种工具。

记忆系统:提供了多种记忆管理方案,包括基于向量数据库的检索增强、对话历史管理等,帮助 Agent 在多轮对话中保持上下文一致性。

RAG 检索增强:内置了检索增强生成功能,支持从文档、数据库等来源检索相关信息,为 Agent 提供更准确的知识支持。

浏览器环境:提供了模拟浏览器操作的能力,支持网页导航、元素交互、信息提取等功能,非常适合开发网页自动化和数据采集类应用。


二、环境搭建与快速入门

2.1 系统环境要求

在开始之前,我们需要确保开发环境满足基本要求。Qwen-Agent 主要使用 Python 开发,因此需要准备 Python 环境。

Python 版本:建议使用 Python 3.8 或更高版本。Python 3.9、3.10、3.11 都有良好的兼容性支持。

系统要求:支持 Linux、macOS 和 Windows 系统。对于需要使用浏览器功能的场景,建议在有图形界面的环境中运行。

内存与存储:建议至少 4GB 可用内存用于运行模型推理。如果需要加载较大的语言模型,可能需要更多的内存资源。

2.2 安装 Qwen-Agent

安装 Qwen-Agent 有多种方式,我们可以根据实际需求选择合适的方法。

方式一:使用 pip 直接安装

这是最简单直接的安装方式,适合大多数用户。使用以下命令即可完成安装:

pip install qwen-agent

如果你想要安装包含所有可选依赖的完整版本,可以使用:

pip install qwen-agent[all]

方式二:从源码安装

如果你想要使用最新开发版本,或者想要对源码进行修改后使用,可以选择从源码安装:

# 克隆仓库
git clone https://github.com/QwenLM/Qwen-Agent.git

# 进入项目目录
cd Qwen-Agent

# 安装依赖
pip install -e .

从源码安装的好处是你可以随时通过 git pull 获取最新更新,并且可以方便地查看和修改源代码。

方式三:使用 uv 安装

对于使用 uv 作为包管理工具的开发者,也可以使用以下命令:

uv pip install qwen-agent

2.3 安装额外依赖

根据你想要使用的功能,可能需要安装一些额外的依赖包。

浏览器功能依赖:如果需要使用浏览器相关功能,需要安装 Playwright 或 Selenium:

pip install playwright
playwright install chromium  # 安装 Chromium 浏览器

或者使用 Selenium:

pip install selenium webdriver-manager

向量数据库依赖:如果需要使用 RAG 功能,需要安装向量数据库相关依赖:

pip install faiss-cpu  # 或者 faiss-gpu(如果你有 NVIDIA GPU)
pip install chromadb

其他可选依赖

pip install dashscope  # 用于调用通义千问 API
pip install openai    # 用于调用 OpenAI API

2.4 验证安装

安装完成后,我们可以通过一个简单的测试来验证环境是否配置正确:

# 导入 Qwen-Agent 的核心模块
import qwen_agent

# 打印版本信息
print(f"Qwen-Agent 版本: {qwen_agent.__version__}")

# 检查 Agent 模块是否可用
from qwen_agent import Agent
print("Agent 模块导入成功")

# 检查工具模块是否可用
from qwen_agent.tools import Tool
print("工具模块导入成功")

# 检查 RAG 模块是否可用
from qwen_agent import RAG
print("RAG 模块导入成功")

print("\n恭喜!环境配置正确,所有核心模块都可以正常使用")

运行上述代码,如果看到类似的输出,说明环境配置成功:

Qwen-Agent 版本: 0.0.1.8
Agent 模块导入成功
工具模块导入成功
RAG 模块导入成功

恭喜!环境配置正确,所有核心模块都可以正常使用

2.5 配置 API 密钥

Qwen-Agent 需要调用大语言模型来完成各种任务。在使用之前,你需要配置相应的 API 密钥。

通义千问 API 配置

import os

# 设置通义千问 API Key
os.environ["DASHSCOPE_API_KEY"] = "your-api-key-here"

你可以在阿里云百炼平台(https://bailian.console.aliyun.com/)获取 API Key。

OpenAI API 配置(如果使用 OpenAI 模型):

import os

# 设置 OpenAI API Key
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"

# 如果使用代理,可以设置代理地址
os.environ["OPENAI_API_BASE"] = "https://api.openai.com/v1"

使用本地模型

如果你不想使用云端 API,也可以配置使用本地部署的模型:

# 设置本地模型服务地址
os.environ["API_BASE"] = "http://localhost:8000/v1"

# 或者直接在代码中指定
llm_cfg = {
    "model": "qwen",
    "api_base": "http://localhost:8000/v1",
    "api_key": "dummy"  # 本地服务可能不需要真实的 API Key
}

三、核心概念与架构

3.1 Agent 的基本构成

在 Qwen-Agent 框架中,一个完整的 Agent 通常由以下几个核心组件构成:

大语言模型(LLM):这是 Agent 的”大脑”,负责理解用户输入、进行推理决策、生成回复和调用指令。Qwen-Agent 支持多种大语言模型,包括通义千问系列、OpenAI GPT 系列、以及其他兼容 OpenAI API 格式的模型。

工具集(Tools):工具是 Agent 能力的扩展,让 Agent 能够执行各种实际操作,如搜索信息、执行代码、操作文件、浏览网页等。Qwen-Agent 提供了丰富的内置工具,同时也支持开发者自定义工具。

记忆系统(Memory):记忆系统帮助 Agent 记住对话历史、存储中间结果、保存重要信息等。良好的记忆系统是实现多轮对话和复杂任务处理的基础。

提示词模板(Prompt Template):提示词模板定义了 Agent 的行为模式、角色设定、输出格式等。通过精心设计的提示词模板,可以让 Agent 表现出不同的特性和能力。

执行循环(Execution Loop):执行循环控制 Agent 的运行流程,包括接收输入、调用 LLM、选择工具、执行动作、评估结果等步骤的循环执行。

3.2 框架的核心类

Qwen-Agent 定义了几个核心类来组织代码结构:

Agent 基类:这是所有 Agent 类型的基类,定义了 Agent 的基本接口和通用功能。所有具体的 Agent 实现都继承自这个基类。

from qwen_agent import Agent

# Agent 是所有 Agent 类型的基类
class MyAgent(Agent):
    def __init__(self, llm, tools=None):
        super().__init__(llm=llm, tools=tools)

    def run(self, messages):
        # 实现自定义的 Agent 逻辑
        pass

Tool 基类:所有工具都继承自 Tool 基类,通过继承这个基类可以方便地创建自定义工具。

from qwen_agent.tools import Tool

class MyCustomTool(Tool):
    # 工具的唯一标识符
    name = "my_custom_tool"
    description = "这是我的自定义工具的描述"

    def call(self, params):
        """
        工具的实际执行逻辑
        params: 包含工具参数的字典
        返回: 工具执行的结果
        """
        # 实现工具逻辑
        result = do_something(params)
        return result

LLM 配置:LLM 配置定义了如何连接和使用大语言模型。

# LLM 配置示例
llm_cfg = {
    "model": "qwen-plus",           # 模型名称
    "api_key": "your-api-key",       # API 密钥
    "api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1",  # API 地址
    "temperature": 0.7,               # 温度参数
    "top_p": 0.8,                    # Top-p 参数
    "max_tokens": 2048,              # 最大生成 token 数
}

3.3 工作流程解析

理解 Agent 的工作流程对于正确使用框架至关重要。下面我们详细解析 Qwen-Agent 中 Agent 的典型工作流程:

第一步:接收输入。Agent 接收用户的输入消息,这些消息可以是简单的文本,也可以是包含多模态信息的复杂结构。

第二步:构建提示词。根据系统提示词模板、用户输入、以及相关的记忆信息,构建完整的提示词。这个步骤会考虑对话历史、上下文信息、以及特定任务的指令。

第三步:调用 LLM。将构建好的提示词发送给大语言模型,获取模型的响应。模型会分析当前状态,决定下一步应该采取什么行动。

第四步:解析响应。解析 LLM 的响应,判断是否需要调用工具,以及应该调用哪些工具。Qwen-Agent 支持函数调用格式的响应解析。

第五步:执行工具。如果 LLM 决定需要调用工具,就执行相应的工具调用,获取工具的返回结果。

第六步:更新记忆。将当前的交互记录和工具执行结果添加到记忆系统中,为后续的交互提供上下文。

第七步:循环迭代。重复第三到第六步,直到 LLM 认为任务完成,生成最终的回复给用户。


四、基础 Agent 的创建与使用

4.1 最简单的 Agent

让我们从最简单的例子开始,创建一个能够进行基本对话的 Agent。这个例子展示了 Qwen-Agent 最核心的使用方式。

"""
第一个 Qwen-Agent 示例:创建最简单的对话 Agent
"""
from qwen_agent import Agent, AgentList
from qwen_agent.llm import get_chat_model

# 第一步:配置 LLM
llm_cfg = {
    "model": "qwen-plus",
    "api_key": "your-api-key",  # 请替换为你的实际 API Key
    "api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1",
}

# 第二步:初始化 LLM
llm = get_chat_model(llm_cfg)

# 第三步:创建 Agent
bot = Agent(llm=llm)

# 第四步:运行 Agent
messages = [{"role": "user", "content": "你好,请介绍一下你自己"}]
response = bot.run(messages)

# 第五步:打印响应
for item in response:
    print(item)

这个例子展示了创建 Agent 的最基本流程:配置 LLM、初始化 LLM、创建 Agent、运行 Agent。虽然代码很简单,但背后的工作流程却包含了 Agent 框架的核心要素。

4.2 带系统提示词的 Agent

为了让 Agent 表现出特定的角色或行为模式,我们可以使用系统提示词来定义 Agent 的人设和功能。

"""
示例:创建带有角色设定的对话 Agent
"""
from qwen_agent import Agent
from qwen_agent.llm import get_chat_model

# 配置 LLM
llm_cfg = {
    "model": "qwen-plus",
    "api_key": "your-api-key",
    "api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1",
}

llm = get_chat_model(llm_cfg)

# 定义系统提示词,设置 Agent 的角色
system_instruction = """你是一位专业、友好的 Python 编程教练。

你的职责包括:
1. 解答 Python 编程相关的问题
2. 提供代码示例和最佳实践
3. 帮助用户理解和调试代码
4. 给出学习建议和进阶路径

在回答问题时,请:
- 使用清晰易懂的语言
- 提供完整的代码示例
- 解释关键的概念和原理
- 如果有多种解决方案,列出它们的优缺点

请始终保持耐心和专业,像一位经验丰富的导师一样引导用户学习。"""

# 创建带有系统提示词的 Agent
bot = Agent(
    llm=llm,
    system_message=system_instruction,
)

# 运行 Agent
messages = [{"role": "user", "content": "什么是装饰器?请给我一个简单的例子"}]

print("用户问题:什么是装饰器?请给我一个简单的例子")
print("-" * 50)

response = bot.run(messages)
for item in response:
    print(item)

通过设置系统提示词,我们可以让 Agent 扮演不同的角色,如客服、技术顾问、写作助手等,而无需修改任何代码逻辑。

4.3 多轮对话 Agent

在实际应用中,我们经常需要与 Agent 进行多轮对话。Qwen-Agent 提供了简单的方式来维护对话历史。

"""
示例:实现多轮对话功能
"""
from qwen_agent import Agent
from qwen_agent.llm import get_chat_model

# 配置 LLM
llm_cfg = {
    "model": "qwen-plus",
    "api_key": "your-api-key",
    "api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1",
}

llm = get_chat_model(llm_cfg)

# 创建 Agent
bot = Agent(llm=llm)

# 初始化对话历史
chat_history = []

def chat_with_bot(user_input, history):
    """
    与 Agent 进行对话的函数

    参数:
        user_input: 用户输入的文本
        history: 对话历史列表

    返回:
        assistant_response: Agent 的回复
        updated_history: 更新后的对话历史
    """
    # 将用户输入添加到历史记录
    history.append({"role": "user", "content": user_input})

    # 运行 Agent
    response = bot.run(history)

    # 处理响应
    assistant_response = ""
    for item in response:
        if isinstance(item, dict) and item.get("role") == "assistant":
            assistant_response = item.get("content", "")

    # 将助手回复添加到历史记录
    if assistant_response:
        history.append({"role": "assistant", "content": assistant_response})

    return assistant_response, history

# 开始多轮对话
print("=" * 50)
print("欢迎开始多轮对话!输入 'quit' 退出")
print("=" * 50)

while True:
    user_input = input("\n你: ")

    if user_input.lower() == "quit":
        print("感谢对话,再见!")
        break

    response, chat_history = chat_with_bot(user_input, chat_history)
    print(f"\n助手: {response}")

    # 显示当前对话轮数
    print(f"\n[当前对话历史长度: {len(chat_history)} 条消息]")

这个例子展示了一个完整的多轮对话实现,包括对话历史的维护、用户输入的处理、以及响应的提取和展示。


五、工具系统的深度使用

5.1 工具系统概述

工具是扩展 Agent 能力的关键组件。Qwen-Agent 提供了一套完整的工具系统,包括内置工具和自定义工具的接口规范。

工具的结构:在 Qwen-Agent 中,每个工具都是一个独立的类,包含以下关键属性和方法:

"""
工具类的基本结构
"""
class BaseTool:
    # 工具名称,用于在工具列表中唯一标识
    name: str = "tool_name"

    # 工具描述,告诉 LLM 这个工具能做什么
    description: str = "工具的详细描述"

    # 工具参数模式,定义工具接受的输入参数
    parameters: dict = {
        "type": "object",
        "properties": {},
        "required": [],
    }

    # 工具的实际执行逻辑
    def call(self, params: dict) -> str:
        """
        执行工具逻辑

        参数:
            params: 包含参数值的字典

        返回:
            str: 工具执行的结果
        """
        pass

5.2 内置工具介绍

Qwen-Agent 内置了多种常用工具,可以满足大多数常见需求。

天气查询工具

"""
示例:使用内置天气工具
"""
from qwen_agent import Agent
from qwen_agent.llm import get_chat_model
from qwen_agent.tools import Weather

# 配置 LLM
llm_cfg = {
    "model": "qwen-plus",
    "api_key": "your-api-key",
    "api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1",
}

llm = get_chat_model(llm_cfg)

# 创建天气工具实例
weather_tool = Weather()

# 创建带工具的 Agent
bot = Agent(
    llm=llm,
    tools=[weather_tool],  # 传入工具列表
)

# 测试天气查询
messages = [{"role": "user", "content": "北京今天天气怎么样?适合出门吗?"}]

response = bot.run(messages)
for item in response:
    print(item)

计算器工具

"""
示例:使用计算器工具进行数学运算
"""
from qwen_agent import Agent
from qwen_agent.llm import get_chat_model
from qwen_agent.tools import Calculator

# 配置 LLM
llm_cfg = {
    "model": "qwen-plus",
    "api_key": "your-api-key",
    "api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1",
}

llm = get_chat_model(llm_cfg)

# 创建计算器工具
calc_tool = Calculator()

# 创建带工具的 Agent
bot = Agent(
    llm=llm,
    tools=[calc_tool],
)

# 测试计算
messages = [{"role": "user", "content": "计算 12345 乘以 6789 除以 123"}]

response = bot.run(messages)
for item in response:
    print(item)

5.3 自定义工具

当内置工具不能满足需求时,我们可以创建自定义工具。下面是一个完整的自定义工具示例。

"""
示例:创建自定义工具
"""
from qwen_agent.tools import Tool
from qwen_agent import Agent
from qwen_agent.llm import get_chat_model
import json
from datetime import datetime

# 定义一个待办事项管理工具
class TodoListTool(Tool):
    """待办事项管理工具 - 用于添加、查看、完成任务"""

    name = "todo_list"
    description = """
    管理待办事项列表,支持以下操作:
    - 添加新的待办事项
    - 查看所有待办事项
    - 标记事项为已完成
    - 删除待办事项

    输入参数格式:JSON 字符串
    {
        "action": "add|list|complete|delete",
        "item": "待办事项内容(添加时需要)",
        "id": "事项ID(完成或删除时需要)"
    }
    """

    def __init__(self):
        super().__init__()
        # 初始化待办事项存储
        self.todos = []
        self.next_id = 1

    def call(self, params):
        """
        执行待办事项管理操作
        """
        try:
            # 解析参数
            if isinstance(params, str):
                params = json.loads(params)

            action = params.get("action", "")

            if action == "add":
                # 添加新事项
                item = params.get("item", "")
                todo = {
                    "id": self.next_id,
                    "content": item,
                    "completed": False,
                    "created_at": datetime.now().isoformat()
                }
                self.todos.append(todo)
                self.next_id += 1
                return json.dumps({
                    "success": True,
                    "message": f"已添加待办事项 #{todo['id']}: {item}"
                }, ensure_ascii=False)

            elif action == "list":
                # 列出所有事项
                if not self.todos:
                    return json.dumps({
                        "success": True,
                        "message": "当前没有待办事项",
                        "todos": []
                    }, ensure_ascii=False)

                active = [t for t in self.todos if not t["completed"]]
                completed = [t for t in self.todos if t["completed"]]

                return json.dumps({
                    "success": True,
                    "active_todos": active,
                    "completed_todos": completed,
                    "summary": f"共 {len(active)} 个待办,{len(completed)} 个已完成"
                }, ensure_ascii=False, indent=2)

            elif action == "complete":
                # 标记完成
                todo_id = params.get("id")
                for todo in self.todos:
                    if todo["id"] == todo_id:
                        todo["completed"] = True
                        todo["completed_at"] = datetime.now().isoformat()
                        return json.dumps({
                            "success": True,
                            "message": f"已标记 #{todo_id} 为完成"
                        }, ensure_ascii=False)

                return json.dumps({
                    "success": False,
                    "message": f"未找到 ID 为 {todo_id} 的待办事项"
                }, ensure_ascii=False)

            elif action == "delete":
                # 删除事项
                todo_id = params.get("id")
                original_length = len(self.todos)
                self.todos = [t for t in self.todos if t["id"] != todo_id]

                if len(self.todos) < original_length:
                    return json.dumps({
                        "success": True,
                        "message": f"已删除 #{todo_id}"
                    }, ensure_ascii=False)
                else:
                    return json.dumps({
                        "success": False,
                        "message": f"未找到 ID 为 {todo_id} 的待办事项"
                    }, ensure_ascii=False)

            else:
                return json.dumps({
                    "success": False,
                    "message": f"未知操作: {action}"
                }, ensure_ascii=False)

        except Exception as e:
            return json.dumps({
                "success": False,
                "error": str(e)
            }, ensure_ascii=False)

# 使用自定义工具
llm_cfg = {
    "model": "qwen-plus",
    "api_key": "your-api-key",
    "api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1",
}

llm = get_chat_model(llm_cfg)

# 创建待办事项工具
todo_tool = TodoListTool()

# 创建带自定义工具的 Agent
bot = Agent(
    llm=llm,
    tools=[todo_tool],
    system_message="你是一个待办事项管理助手,可以帮用户管理待办事项。"
)

# 测试添加待办
messages = [
    {"role": "user", "content": "帮我添加三个待办事项:买牛奶、写报告、给妈妈打电话"}
]

response = bot.run(messages)
print("添加待办事项:")
for item in response:
    print(item)

# 测试查看待办
messages = [{"role": "user", "content": "现在有哪些待办事项?"}]
response = bot.run(messages)
print("\n查看待办事项:")
for item in response:
    print(item)

5.4 工具注册与使用最佳实践

在实际开发中,合理地组织和管理工具非常重要。以下是一些工具使用的最佳实践:

"""
示例:工具管理最佳实践
"""
from qwen_agent.tools import Tool
from qwen_agent import Agent
from qwen_agent.llm import get_chat_model

# 方式一:单独注册工具
class SearchTool(Tool):
    name = "web_search"
    description = "搜索网络信息"

    def call(self, params):
        query = params.get("query", "")
        # 实现搜索逻辑
        return f"搜索结果:关于 '{query}' 的信息..."

class WeatherTool(Tool):
    name = "weather_query"
    description = "查询天气信息"

    def call(self, params):
        location = params.get("location", "")
        # 实现天气查询逻辑
        return f"{location} 的天气:晴朗,25°C"

# 方式二:批量注册工具
def get_all_tools():
    """获取所有可用工具的工厂函数"""
    return [
        SearchTool(),
        WeatherTool(),
        # 可以继续添加更多工具
    ]

# 方式三:根据配置选择性加载工具
def get_tools_by_env():
    """根据环境变量决定加载哪些工具"""
    import os

    tools = []

    if os.getenv("ENABLE_SEARCH", "true").lower() == "true":
        tools.append(SearchTool())

    if os.getenv("ENABLE_WEATHER", "true").lower() == "true":
        tools.append(WeatherTool())

    return tools

# 完整示例
llm_cfg = {
    "model": "qwen-plus",
    "api_key": "your-api-key",
    "api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1",
}

llm = get_chat_model(llm_cfg)

# 创建 Agent 时传入工具列表
bot = Agent(
    llm=llm,
    tools=get_all_tools(),  # 使用工厂函数获取工具
    system_message="你是一个智能助手,可以帮助用户搜索信息和查询天气。"
)

# 测试工具调用
messages = [
    {"role": "user", "content": "帮我搜索一下 Python 异步编程的资料,然后查一下上海今天的天气"}
]

response = bot.run(messages)
for item in response:
    print(item)

六、ReAct Agent 的实现

6.1 ReAct 原理介绍

ReAct(Reasoning + Acting)是一种将推理和行动相结合的人工智能方法论。这种方法让 Agent 能够像人类一样,在执行任务时进行”思考”,然后基于思考结果采取相应的行动。

ReAct 的核心思想可以用一个循环来表示:思考(Reason)→ 行动(Act)→ 观察(Observe)→ 思考(Reason)… → 结束

思考阶段:Agent 分析当前状态,理解任务要求,决定下一步应该做什么。

行动阶段:Agent 执行具体的行动,可能是调用工具、查询信息、或者生成文本。

观察阶段:Agent 获取行动的结果,更新对环境的认知。

这种循环持续进行,直到 Agent 认为任务完成。

6.2 Qwen-Agent 中的 ReAct Agent

Qwen-Agent 提供了开箱即用的 ReAct Agent 实现,可以帮助开发者快速构建具备推理和行动能力的智能代理。

"""
示例:使用 ReAct Agent
"""
from qwen_agent import Agent
from qwen_agent.llm import get_chat_model
from qwen_agent.tools import Calculator, BaseTools

# 配置 LLM
llm_cfg = {
    "model": "qwen-plus",
    "api_key": "your-api-key",
    "api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1",
}

llm = get_chat_model(llm_cfg)

# 准备工具
calculator = Calculator()

# 创建 ReAct Agent
bot = Agent(
    llm=llm,
    tools=[calculator],
    system_message="""你是一个智能数学助手,擅长解决各种数学问题。

你使用 ReAct(推理+行动)的方式来解决问题:
1. 先理解问题的本质
2. 制定解决步骤
3. 使用计算器执行计算
4. 验证结果是否正确

请一步一步地思考和行动。""",
)

# 测试复杂数学问题
messages = [
    {"role": "user", "content": "计算 (123 + 456) * 789 / 12 的结果是多少?"}
]

print("问题:(123 + 456) * 789 / 12 的结果是多少?")
print("-" * 50)

response = bot.run(messages)
for item in response:
    print(item)

6.3 完整的 ReAct Agent 示例

让我们创建一个更完整的 ReAct Agent 示例,模拟一个能够回答复杂问题的研究助手:

“`python
“””
完整的 ReAct Agent 示例:智能研究助手
“””
from qwen_agent import Agent
from qwen_agent.llm import get_chat_model
from qwen_agent.tools import Tool
import json
import math

定义多个工具

class CalculatorTool(Tool):
name = “calculator”
description = “科学计算器,可以进行数学运算。支持:加(+)、减(-)、乘()、除(/)、幂()、平方根(sqrt)、三角函数等。”
parameters = {
“type”: “object”,
“properties”: {
“expression”: {
“type”: “string”,
“description”: “数学表达式,如 ‘2+3
4′ 或 ‘sqrt(16)'”
}
},
“required”: [“expression”]
}

def call(self, params):
    try:
        expression = params.get("expression", "")
        # 安全评估数学表达式
        # 注意:实际使用时应该使用更安全的表达式解析器
        allowed_names = {
            "sqrt": math.sqrt,
            "sin": math.sin,
            "cos": math.cos,
            "tan": math.tan,
            "log": math.log,
            "pi": math.pi,
            "e": math.e,
            "abs": abs,
            "round": round,
        }
        result = eval(expression, {"__builtins__": {}}, allowed_names)
        return f"计算结果:{expression} = {result}"
    except Exception as e:
        return f"计算错误:{str(e)}"

class ConverterTool(Tool):
name = “converter”
description = “单位转换器,支持长度、重量、温度等单位转换。”
parameters = {
“type”: “object”,
“properties”: {
“value”: {“type”: “number”, “description”: “要转换的数值”},
“from_unit”: {“type”: “string”, “description”: “原始单位”},
“to_unit”: {“type”: “string”, “description”: “目标单位”}
},
“required”: [“value”, “from_unit”, “to_unit”]
}

def call(self, params):
    value = params.get("value")
    from_unit = params.get("from_unit").lower()
    to_unit = params.get("to_unit").lower()

    # 长度转换转换为米
    length_to_meter = {
        "m": 1, "meter": 1, "meters": 1,
        "km": 1000, "kilometer": 1000, "kilometers": 1000,
        "cm": 0.01, "centimeter": 0.01, "centimeters": 0.01,
        "mm": 0.001, "millimeter": 0.001, "millimeters": 0.001,
        "mi": 1609.344, "mile": 1609.344, "miles": 1609.344,
        "ft": 0.3048, "foot": 0.3048, "feet": 0.3048,
        "in": 0.0254, "inch": 0.0254, "inches": 0.0254,
    }

    # 温度转换
    if from_unit in ["c", "celsius"] and to_unit in ["f", "fahrenheit"]:
        result = value * 9/5 + 32
        return f"{value}°C = {result}°F"
    elif from_unit in ["f", "fahrenheit"] and to_unit in ["c", "celsius"]:
        result = (value - 32) * 5/9
        return f"{value}°F = {result}°C"

    # 长度转换
    if from_unit in length_to_meter and to_unit in length_to_meter:
        meter_value = value * length_to_meter[from_unit]
        result = meter_value / length_to_meter[to_unit]
        return f"{value} {from_unit} = {result:.4f} {to_unit}"

    return f"不支持的转换:{from_unit} -> {to_unit

Project: https://github.com/QwenLM/Qwen-Agent

Stars: 16342

如果内容对您有帮助,欢迎打赏

您的支持是我继续创作的动力

前往打赏页面

评论区

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注