概述

ReAct(Reasoning + Acting)智能体是一种结合推理和行动能力的智能体模型,由Google Research于2022年提出。ReAct智能体的核心思想是让语言模型通过交替执行思考(Reasoning)和行动(Acting)步骤来解决复杂问题。这种方法的优势在于让模型能够显式地分享其思考过程,使用工具来收集信息,并利用这些信息进行进一步的推理,从而提高解决问题的能力。

工作原理

ReAct 智能体遵循以下工作流程:

  1. 思考 (Thought):智能体分析当前情况并决定下一步行动

  2. 行动 (Action):智能体执行选择的工具以获取信息

  3. 观察 (Observation):智能体接收工具执行的结果

  4. 重复:基于观察结果进行新的思考,直到问题解决

ReAct

优势

  • 更透明的推理:通过显式思考过程提高可解释性

  • 提高准确性:结合外部工具减少幻觉

  • 更好的问题分解:将复杂问题分解为可管理的子问题

  • 自我验证:能够检查和纠正自己的错误

基本用法

以下是创建和使用基本ReAct智能体的完整示例:

from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_react_agent
from langchain.tools import DuckDuckGoSearchRun, Calculator
from langchain.prompts import PromptTemplate

# 初始化LLM
llm = ChatOpenAI(model="gpt-3.5-turbo-16k", temperature=0)

# 创建工具集合
tools = [
    DuckDuckGoSearchRun(name="搜索"),
    Calculator(name="计算器"),
]

# 创建ReAct智能体提示模板
react_prompt_template = """回答以下问题,尽可能地详细和有帮助。

你可以使用以下工具:

{tools}

使用以下格式:

问题: 你需要回答的输入问题
思考: 你应该始终思考该做什么
行动: 工具名称 -> 输入工具的参数
观察: 工具的结果
思考: 我现在知道了答案
最终答案: 对原始问题的最终答案

开始!

问题: {input}
思考: """

prompt = PromptTemplate.from_template(react_prompt_template)

# 创建ReAct智能体
agent = create_react_agent(llm=llm, tools=tools, prompt=prompt)

# 创建智能体执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)

# 执行ReAct智能体查询
result = agent_executor.invoke({"input": "2022年世界杯冠军是哪个国家?如果将该国GDP除以人口,结果是多少?"})

print(result["output"])

高级用法

自定义ReAct提示模板

为不同的应用场景创建定制化的ReAct提示模板:

from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder

# 创建面向科学研究的ReAct智能体提示模板
scientific_react_prompt = ChatPromptTemplate.from_messages([
    ("system", """你是一位科学研究助手。对于科学问题,你需要严谨、准确地回答,并引用可靠来源。
    
    你可以使用以下工具:
    {tools}
    
    遵循以下格式:
    思考: 你对问题的分析和思考过程
    行动: 工具名称 -> 参数
    观察: 工具返回的结果
    思考: 基于观察的进一步分析
    ...(可以重复思考-行动-观察的过程)
    最终答案: 基于收集到的信息给出最终答案,引用相关来源
    """),
    ("human", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad")
])

# 创建科学研究ReAct智能体
scientific_agent = create_react_agent(
    llm=llm,
    tools=tools,
    prompt=scientific_react_prompt
)

scientific_agent_executor = AgentExecutor(
    agent=scientific_agent,
    tools=tools,
    verbose=True
)

复杂工具组合

from langchain.tools import WikipediaQueryRun, YouTubeSearchTool, PythonREPLTool
from langchain_community.utilities import WikipediaAPIWrapper

# 创建更多样化的工具集
advanced_tools = [
    DuckDuckGoSearchRun(name="网络搜索", description="搜索互联网获取最新或特定信息"),
    WikipediaQueryRun(name="维基百科", api_wrapper=WikipediaAPIWrapper(), description="搜索维基百科获取概念解释和背景知识"),
    YouTubeSearchTool(name="YouTube搜索", description="搜索相关视频内容"),
    Calculator(name="计算器", description="执行数学计算"),
    PythonREPLTool(name="Python解释器", description="执行Python代码来解决编程或数据分析问题")
]

# 创建增强型ReAct智能体
advanced_react_agent = create_react_agent(
    llm=ChatOpenAI(model="gpt-4", temperature=0),  # 使用更强大的模型
    tools=advanced_tools,
    prompt=react_prompt  # 使用标准或自定义提示
)

advanced_agent_executor = AgentExecutor(
    agent=advanced_react_agent,
    tools=advanced_tools,
    verbose=True,
    max_iterations=10,  # 限制最大迭代次数
    return_intermediate_steps=True  # 返回中间步骤以便分析
)

实战应用场景

1. 研究助手

# 研究助手示例
research_query = """研究太阳能电池效率的最新进展,特别关注钙钛矿材料。
我需要了解:
1. 目前最高效率是多少
2. 主要研究挑战
3. 主要研究机构
4. 未来3-5年的发展预测"""

research_result = advanced_agent_executor.invoke({"input": research_query})

# 提取中间步骤以分析研究路径
research_steps = research_result["intermediate_steps"]
for i, (action, observation) in enumerate(research_steps):
    print(f"研究步骤 {i+1}: {action.tool} - {action.tool_input[:50]}... -> {len(observation)} 字节的结果")

2. 数据分析助手

from langchain_experimental.tools import PythonAstREPLTool

# 创建更安全的Python执行环境
python_repl = PythonAstREPLTool()

# 为数据分析准备的工具集
data_analysis_tools = [
    python_repl,
    Calculator(name="计算器")
]

# 数据分析助手提示
data_analysis_prompt = ChatPromptTemplate.from_messages([
    ("system", """你是一位数据分析专家。使用提供的工具帮助用户分析数据和解决问题。
    首先理解问题,思考分析方法,然后使用Python工具执行必要的代码。
    
    你可以使用以下工具:
    {tools}
    """),
    ("human", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad")
])

# 创建数据分析ReAct智能体
data_analysis_agent = create_react_agent(
    llm=ChatOpenAI(model="gpt-4", temperature=0),
    tools=data_analysis_tools,
    prompt=data_analysis_prompt
)

data_agent_executor = AgentExecutor(
    agent=data_analysis_agent,
    tools=data_analysis_tools,
    verbose=True
)

# 数据分析示例
data_query = """使用Python生成一个包含100个随机数的数据集,然后:
1. 计算均值、中位数和标准差
2. 绘制直方图
3. 检测是否有异常值(超过3个标准差)
4. 如果有异常值,移除它们并重新计算统计量"""

data_analysis_result = data_agent_executor.invoke({"input": data_query})

最佳实践

  1. 提供清晰的指令:在提示中明确定义思考-行动-观察的流程。

  2. 工具描述至关重要:为每个工具提供详细且明确的描述,确保智能体理解何时以及如何使用每个工具。

  3. 鼓励分步思考:指导智能体将复杂问题分解为更小的可管理部分。

  4. 监控和分析中间步骤:设置return_intermediate_steps=True以检查智能体的推理路径。

  5. 设置合理的迭代限制:防止智能体陷入循环或过度探索。

  6. 针对具体任务选择合适的LLM:对于需要高级推理的复杂任务,优先使用GPT-4等更强大的模型。

  7. 结合使用结构化输出解析器:确保智能体回答以一致的格式返回。

常见问题与解决方案

  1. 智能体忽略工具使用格式

    • 解决方案:在提示中加入更多格式示例

    • 使用思维链(Chain-of-Thought)提示技术

  2. 推理过程不够深入

    • 解决方案:鼓励智能体在采取行动前进行更深入的思考

    • 在系统提示中明确要求详细分析

  3. 陷入循环

    • 解决方案:设置max_iterations限制

    • 在提示中加入避免重复的指导

  4. 错误选择工具

    • 解决方案:提供更详细的工具描述

    • 为不同类型的查询添加工具选择指南

总结

ReAct智能体是一种强大的智能体模型,通过结合推理与行动能力,可以解决各种复杂任务。它的思考-行动-观察循环过程使得智能体的决策更加透明和可靠,特别适合需要多步骤推理和外部信息收集的应用场景。通过合理配置ReAct智能体并遵循最佳实践,可以打造出能够处理研究、分析和问题解决等各种任务的高效智能助手。