Appearance
ReAct 模式详解
ReAct(Reasoning + Acting)是一种让 AI Agent 结合推理和行动的框架。它由 Google Research 提出,旨在解决大模型在复杂任务中的局限性。
为什么需要 ReAct
传统大模型的局限:
- 纯推理:只能"想",不能"做"
- 知识过时:训练数据有截止日期
- 无法行动:无法获取实时信息或操作外部系统
ReAct 让模型能够:
- 在推理过程中主动调用工具
- 将思考过程外化(让人类可见)
- 边想边做,动态调整策略
ReAct 的核心思想
思考(Reasoning)→ 行动(Action)→ 观察(Observation)→ 思考(Reasoning)...三个关键要素
- Thought(思考):分析当前情况,决定下一步
- Action(行动):执行具体操作(如调用工具)
- Observation(观察):获取行动结果,供下一步使用
工作流程图
用户问题
↓
思考:这个问题需要什么信息?
↓
行动:调用搜索工具
↓
观察:获取搜索结果
↓
思考:结果中有哪些有用信息?
↓
行动:继续搜索或直接回答
↓
...
最终答案代码实现
基础 ReAct Agent
python
from openai import OpenAI
client = OpenAI()
def react_agent(query, tools):
"""ReAct 循环"""
context = [{"role": "user", "content": query}]
max_iterations = 10
for _ in range(max_iterations):
# 1. 让模型思考并决定行动
response = client.chat.completions.create(
model="gpt-4",
messages=context + [
{"role": "system", "content": """你是一个 ReAct Agent。
对于用户问题,你需要:
1. Think: 分析问题,思考需要什么信息
2. Act: 如果需要外部信息,使用工具获取
3. 格式:先写 Think,再写 Action(如果需要)
可用工具:""" + ", ".join(tools.keys())}
]
)
assistant_msg = response.choices[0].message.content
context.append({"role": "assistant", "content": assistant_msg})
# 2. 解析行动
action = parse_action(assistant_msg)
if action is None:
# 没有行动,说明已有答案
return assistant_msg
# 3. 执行行动
tool_name, tool_input = action
result = tools[tool_name](tool_input)
# 4. 添加观察结果
context.append({"role": "user", "content": f"观察结果:{result}"})
return "达到最大迭代次数"LangChain 实现
python
from langchain_openai import ChatOpenAI
from langchain.agents import AgentType, create_react_agent
from langchain.tools import Tool
from langchain import hub
# 定义工具
def search(query):
# 搜索逻辑
return f"搜索结果:{query}"
tools = [
Tool.from_function(
func=search,
name="search",
description="当你需要搜索信息时使用"
)
]
# 创建 ReAct Agent
llm = ChatOpenAI(model="gpt-4")
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)
# 执行
from langchain.agents import AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools)
result = agent_executor.invoke({"input": "北京今天的天气怎么样?"})ReAct vs 其他模式
| 模式 | 特点 | 适用场景 |
|---|---|---|
| ReAct | 边想边做,推理外显 | 需要多步推理和工具调用 |
| Chain-of-Thought | 纯推理,不行动 | 数学、逻辑问题 |
| Self-Consistency | 多次推理,取多数 | 需要准确性的任务 |
| Tree-of-Thought | 探索多条路径 | 创意、规划任务 |
ReAct 的优势
- 可解释性强:思考过程清晰可见
- 灵活性高:可动态选择工具
- 效果好:在多个基准测试上表现优异
- 易于调试:可以追踪每一步
注意事项
- 迭代次数:设置合理的上限,避免无限循环
- 工具设计:工具描述要清晰准确
- 错误处理:工具调用可能失败,需要容错机制
- 成本控制:每次迭代都有 API 调用成本
进阶:ReAct + Reflection
结合自我反思机制,让 Agent 能从错误中学习:
python
def react_with_reflection(query, tools):
context = [{"role": "user", "content": query}]
history = []
for iteration in range(max_iterations):
response = get_response(context)
thought = extract_thought(response)
# 反思:之前的尝试有没有成功?
if iteration > 0:
past_attempts = "\n".join([f"- {h}" for h in history])
thought += f"\n反思过去尝试:\n{past_attempts}"
action = extract_action(thought)
if action:
result = execute_tool(action)
history.append(f"尝试 {action}: {result}")
context.append({"role": "user", "content": f"结果:{result}"})
else:
return thought