ReAct Pattern
ReAct Pattern 是让 LLM 交替进行推理(Reasoning)和行动(Acting)的 Agent 执行模式。模型先思考"我该做什么",再执行动作,观察结果,继续推理。
#type / concept
#status / evergreen
#tech / ai
#tech / architecture
[!info] related notes
ReAct Pattern
一句话定义
ReAct (Reasoning + Acting) Pattern 是让 LLM 交替进行推理和行动的 Agent 执行模式。模型先”想”(思考下一步该做什么),再”做”(调用工具),然后”看”(观察结果),循环直到任务完成。
它解决什么问题
纯推理(Chain-of-Thought):模型只能想,不能做。无法获取外部信息。
纯行动(直接调工具):模型不思考就行动。容易做错。
ReAct 把两者结合:先想再做,做完再想。
核心原理
ReAct 循环
Thought: 用户问的是天气,我需要调用天气工具
Action: get_weather(city="北京")
Observation: 北京今天晴,25°C
Thought: 我已经获取到了天气信息,可以回答用户了
Answer: 北京今天天气晴朗,气温 25°C。
Prompt 模板
REACT_PROMPT = """
你是一个能使用工具的助手。请按以下格式思考和行动:
Thought: 我需要做什么,为什么
Action: 工具名(参数)
Observation: 工具返回的结果
... (可以重复多次)
Thought: 我已经获取到足够信息了
Answer: 最终回答
可用工具:
{tools_description}
问题: {question}
"""
Python 实现
class ReActAgent:
def __init__(self, llm, tools: ToolRegistry):
self.llm = llm
self.tools = tools
async def run(self, question: str, max_steps: int = 5) -> str:
tools_desc = self.format_tools()
prompt = REACT_PROMPT.format(tools_description=tools_desc, question=question)
for step in range(max_steps):
# 1. LLM 推理
response = await self.llm.chat(prompt)
# 2. 解析 Thought 和 Action
thought = self.extract_thought(response)
action = self.extract_action(response)
if action is None:
# 没有 Action,说明已经得到最终答案
return self.extract_answer(response)
# 3. 执行 Action
tool = self.tools.get(action.name)
result = await tool.handler(**action.args)
# 4. 追加 Observation
prompt += f"\n{response}\nObservation: {result}\n"
return "达到最大步数,无法完成任务"
与其他模式的对比
| 模式 | 特点 | 适用场景 |
|---|---|---|
| ReAct | 交替推理和行动 | 通用 Agent |
| Plan-and-Execute | 先规划再执行 | 复杂多步任务 |
| Reflexion | 推理+行动+反思 | 需要自我纠错 |
常见坑
- 不做最大步数限制: Agent 可能无限循环
- Action 格式不稳定: LLM 输出的 Action 格式不标准
- Observation 太长: 工具返回结果太长,撑爆上下文