(单)ReAct 智能体 (ReAct Agent)
概述
ReAct(Reasoning + Acting)智能体是一种结合推理和行动能力的智能体模型,由Google Research于2022年提出。ReAct智能体的核心思想是让语言模型通过交替执行思考(Reasoning)和行动(Acting)步骤来解决复杂问题。这种方法的优势在于让模型能够显式地分享其思考过程,使用工具来收集信息,并利用这些信息进行进一步的推理,从而提高解决问题的能力。
工作原理
ReAct 智能体遵循以下工作流程:
思考 (Thought):智能体分析当前情况并决定下一步行动
行动 (Action):智能体执行选择的工具以获取信息
观察 (Observation):智能体接收工具执行的结果
重复:基于观察结果进行新的思考,直到问题解决
优势
更透明的推理:通过显式思考过程提高可解释性
提高准确性:结合外部工具减少幻觉
更好的问题分解:将复杂问题分解为可管理的子问题
自我验证:能够检查和纠正自己的错误
基本用法
以下是创建和使用基本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})
最佳实践
提供清晰的指令:在提示中明确定义思考-行动-观察的流程。
工具描述至关重要:为每个工具提供详细且明确的描述,确保智能体理解何时以及如何使用每个工具。
鼓励分步思考:指导智能体将复杂问题分解为更小的可管理部分。
监控和分析中间步骤:设置
return_intermediate_steps=True
以检查智能体的推理路径。设置合理的迭代限制:防止智能体陷入循环或过度探索。
针对具体任务选择合适的LLM:对于需要高级推理的复杂任务,优先使用GPT-4等更强大的模型。
结合使用结构化输出解析器:确保智能体回答以一致的格式返回。
常见问题与解决方案
智能体忽略工具使用格式
解决方案:在提示中加入更多格式示例
使用思维链(Chain-of-Thought)提示技术
推理过程不够深入
解决方案:鼓励智能体在采取行动前进行更深入的思考
在系统提示中明确要求详细分析
陷入循环
解决方案:设置
max_iterations
限制在提示中加入避免重复的指导
错误选择工具
解决方案:提供更详细的工具描述
为不同类型的查询添加工具选择指南
总结
ReAct智能体是一种强大的智能体模型,通过结合推理与行动能力,可以解决各种复杂任务。它的思考-行动-观察循环过程使得智能体的决策更加透明和可靠,特别适合需要多步骤推理和外部信息收集的应用场景。通过合理配置ReAct智能体并遵循最佳实践,可以打造出能够处理研究、分析和问题解决等各种任务的高效智能助手。
- 感谢你赐予我前进的力量