初面网初面网

ReAct 模式详解

ReAct(Reasoning + Acting)是一种让 AI Agent 结合推理和行动的框架。它由 Google Research 提出,旨在解决大模型在复杂任务中的局限性。

为什么需要 ReAct

传统大模型的局限:

  • 纯推理:只能"想",不能"做"
  • 知识过时:训练数据有截止日期
  • 无法行动:无法获取实时信息或操作外部系统

ReAct 让模型能够:

  • 在推理过程中主动调用工具
  • 将思考过程外化(让人类可见)
  • 边想边做,动态调整策略

ReAct 的核心思想

思考(Reasoning)→ 行动(Action)→ 观察(Observation)→ 思考(Reasoning)...

三个关键要素

  1. Thought(思考):分析当前情况,决定下一步
  2. Action(行动):执行具体操作(如调用工具)
  3. Observation(观察):获取行动结果,供下一步使用

工作流程图

用户问题
    ↓
思考:这个问题需要什么信息?
    ↓
行动:调用搜索工具
    ↓
观察:获取搜索结果
    ↓
思考:结果中有哪些有用信息?
    ↓
行动:继续搜索或直接回答
    ↓
...
最终答案

代码实现

基础 ReAct Agent

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 实现

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 的优势

  1. 可解释性强:思考过程清晰可见
  2. 灵活性高:可动态选择工具
  3. 效果好:在多个基准测试上表现优异
  4. 易于调试:可以追踪每一步

注意事项

  1. 迭代次数:设置合理的上限,避免无限循环
  2. 工具设计:工具描述要清晰准确
  3. 错误处理:工具调用可能失败,需要容错机制
  4. 成本控制:每次迭代都有 API 调用成本

进阶:ReAct + Reflection

结合自我反思机制,让 Agent 能从错误中学习:

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

下一步

更新于 2026/3/3