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推理+行动+反思需要自我纠错

常见坑

  1. 不做最大步数限制: Agent 可能无限循环
  2. Action 格式不稳定: LLM 输出的 Action 格式不标准
  3. Observation 太长: 工具返回结果太长,撑爆上下文

参考资料

创建于 2026/6/30 更新于 2026/7/15