是什么?
在 AI 和大模型(LLM)的领域中,ReAct 是一个非常核心的专业术语。
它是 Reasoning(推理) 和 Acting(行动) 两个词的组合。简单来说,ReAct 是一种让大模型像人类一样解决复杂问题的"思考与行动"框架 。它的核心思想是:让模型在"内部思考"和"外部工具调用"之间交替循环,从而解决需要多步推理、实时信息获取或复杂操作的任务。
ReAct 的本质不是什么高深的底层算法,而是一个 "Prompt(提示词)规范" 加上一个 "While 循环"。
这个概念最早由普林斯顿大学和谷歌的研究人员在 2022 年的一篇著名论文(ReAct: Synergizing Reasoning and Acting in Language Models)中提出,目前已经成为构建 AI Agent(智能体)最主流的基础逻辑之一。
解决了什么问题?
在 ReAct 出现之前,大模型通常有两种工作模式,但各有缺陷:
- 只推理不行动(如 Chain of Thought, CoT): 模型会一步步思考("思维链"),但它只能依赖自己脑子里(预训练数据)的知识。如果遇到需要最新信息、或者需要计算的问题,它就容易胡说八道(幻觉)。
- 只行动不推理(传统的执行程序): 系统可以调用外部工具(如搜索引擎),但缺乏对整体任务的规划和对中间结果的理解,遇到复杂问题就容易卡死。
ReAct 的伟大之处在于把"推理"和"行动"结合在了一起。 它让模型在行动之前先思考,根据行动的结果再进行下一步思考,形成一个闭环。
ReAct 的核心运行机制:T-A-O 循环
ReAct 强制大模型按照一个经典的循环来工作:Thought(思考) -> Action(行动) -> Observation(观察),如此反复,直到解决问题。
我们用一个具体的例子来说明。
用户的提问:"苹果公司现任 CEO 是谁?他目前的年龄加上 10 是多少?"
如果是普通的 ChatGPT,它可能直接算错或者不知道今年的确切时间。但在 ReAct 框架下,Agent 的运行过程是这样的:
- Thought 1(思考):我需要先找出苹果公司现任 CEO 是谁。
- Action 1(行动) :调用搜索引擎工具
Search["Apple current CEO"]。 - Observation 1(观察):(搜索引擎返回结果)Tim Cook(蒂姆·库克)。
- Thought 2(思考):好的,CEO 是 Tim Cook。接下来我需要知道他的年龄。
- Action 2(行动) :调用搜索引擎工具
Search["Tim Cook age"]。 - Observation 2(观察):(搜索引擎返回结果)63 岁(假设当前数据)。
- Thought 3(思考):他现在 63 岁。最后一步,我需要把他的年龄加上 10。
- Action 3(行动) :调用计算器工具
Calculator["63 + 10"]。 - Observation 3(观察):(计算器返回结果)73。
- Thought 4(思考):我已经得到了所有需要的信息,可以回答用户了。
- Action 4(行动) :
Finish["苹果公司现任 CEO 是蒂姆·库克,他的年龄加上 10 是 73 岁。"]
优势是什么?
- 极大地减少了幻觉(Hallucination): 因为每一步的结论都来自于真实的工具反馈(Observation),而不是模型自己的猜测。
- 自我纠错能力: 如果某次行动失败了(例如搜索没有结果,或者 API 报错),模型会在下一个 Thought 阶段反思:"刚刚的方法没用,我换一个关键词搜索",然后采取新的行动。
- 过程透明可解释: 开发者可以清晰地看到 Agent 是如何一步一步得出结论的,方便调试和干预(这正是你之前问的"介入模型"的最佳切入点)。
- 动态工具路由: 无需硬编码工作流,模型根据中间结果自主决定下一步。
⚠️ 局限性与挑战
- Token 消耗大 & 延迟高:多轮循环导致上下文快速增长
- 易陷入死循环:若工具结果不明确或 Prompt 设计不当,模型可能重复调用同一工具
- 强依赖工具质量:工具返回格式不规范、延迟高或缺失关键信息会直接打断循环
- 简单任务过度复杂:对单步可回答的问题,ReAct 反而增加开销
基于Langchain的伪代码流程
// 1. 你只负责提供模型和工具
const llm = new ChatOpenAI({ modelName: "gpt-4" });
const tools = [new Calculator(), new WebSearch()];
// 2. SDK 内部生成 ReAct 专属的 Prompt
const prompt = await pull<PromptTemplate>("hwchase17/react");
// 3. 将它们绑定成一个 Agent(定义了思考模式)
const agent = await createReactAgent({ llm, tools, prompt });
// 4. SDK 内置的"循环引擎"接管一切(这就是 ReAct 逻辑的载体)
const agentExecutor = new AgentExecutor({ agent, tools });
// 5. 触发运行,SDK 会自动在后台跑完 Thought->Action->Observation 的全过程
await agentExecutor.invoke({ input: "苹果现任CEO的年龄加10是多少?" });
ReAct提示词模板
https://smith.langchain.com/hub/hwchase17/react
md
Answer the following questions as best you can. You have access to the following tools:
{tools}
Use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
Begin!
Question: {input}
Thought:{agent_scratchpad}
完整demo
import { ChatOpenAI } from "@langchain/openai";
import { Calculator } from "@langchain/community/tools/calculator";
import { TavilySearchResults } from "@langchain/community/tools/tavily_search"; // 或自定义 WebSearch
import { pull } from "langchain/hub";
import { createReactAgent } from "@langchain/agents";
import { AgentExecutor } from "langchain/agents";
import { PromptTemplate } from "@langchain/core/prompts";
import type { BaseMessage } from "@langchain/core/messages";
// ============================================
// 1. 定义模型和工具
// ============================================
const llm = new ChatOpenAI({
modelName: "gpt-4",
temperature: 0, // ReAct 需要确定性输出,建议低温
apiKey: process.env.OPENAI_API_KEY, // 确保环境变量已设置
});
// 内置工具:计算器
const calculator = new Calculator();
// 搜索工具(示例用 Tavily,可替换为 SerpAPI、DuckDuckGo 等)
// 需要 TAVILY_API_KEY 环境变量,或自行实现 WebSearch 工具
const search = new TavilySearchResults({
maxResults: 3,
apiKey: process.env.TAVILY_API_KEY,
});
const tools = [calculator, search];
// ============================================
// 2. 拉取 ReAct 专用 Prompt 模板
// ============================================
// "hwchase17/react" 是 LangChain Hub 上的经典 ReAct Prompt
// 包含 {tools}、{tool_names}、{input}、{agent_scratchpad} 等变量
const prompt = await pull<PromptTemplate>("hwchase17/react");
// ============================================
// 3. 创建 ReAct Agent(定义思考模式)
// ============================================
const agent = await createReactAgent({
llm,
tools,
prompt,
});
// ============================================
// 4. 创建执行器(内置循环引擎)
// ============================================
const agentExecutor = new AgentExecutor({
agent,
tools,
verbose: true, // 打印 Thought/Action/Observation 过程,便于调试
maxIterations: 10, // 安全熔断:最多 10 步
earlyStoppingMethod: "generate", // 超时/超步时的降级策略
});
// ============================================
// 5. 运行(SDK 自动处理 ReAct 循环)
// ============================================
async function main() {
const result = await agentExecutor.invoke({
input: "苹果现任CEO的年龄加10是多少?",
});
console.log("\n=== 最终答案 ===");
console.log(result.output);
// 完整轨迹(含所有 Thought/Action/Observation)
// console.log("\n=== 执行轨迹 ===");
// console.log(JSON.stringify(result.intermediateSteps, null, 2));
}
main().catch(console.error);