前言
随着 AI Agent 技术飞速发展,大模型不再局限于单次问答、文本生成等静态能力,具备自主思考、工具调用、任务规划、循环迭代执行的智能体,已经成为大模型落地企业业务、自动化流程、智能助手场景的核心形态。
在各类 AI Agent 底层架构中,ReAct 架构 是最经典、应用最广泛、最容易落地的基础范式。无论是开源框架 还是字节、阿里等大厂自研智能体平台,底层几乎都基于 ReAct 思想做扩展演进。
可以说没有ReAct架构的基础就没有当前大热的Agent, 因此作为开发者的我们还是很有必要学习ReAct架构的。
本文将带你了解:
- 什么是ReAct,ReAct的流程以及的好处是什么?
- 如何自己写一个ReAct架构的Agent?
- ReAct存在的一些问题以及如何解决?
ReAct介绍
ReAct是智能体🤖最被广泛应用的一种底层架构,采用"思考"+"行动"的方式,让Agent的行为更加规范可控,当我们在看到某个 AI 在"思考-调用工具-再思考"循环中解决问题,那就是 ReAct 风格下的 Agent。
ReAct即Reason(推理)+Action(行动) , 核心原理就是使得AI模型模型一边想一边做的循环,而不是想完了再做或者一直闭门思考。
工作流程
工作流程可以概括为"T-A-O"循环,即思考-行动-观察 
- 思考: AI模型对问题的分析,总结,并规划下一步的行动(比如明天要不要带雨伞,那我应该去分析一下天气,就需要调用天气的接口)
- Action🖊️: 行动, AI模型利用对上一步思考的结果采取对应的行动, 调用对应的工具( 比如去调用对应的天气API)
- Observation👁️:观察,将工具返回的结果整理成LLM能理解的格式,再次输入给LLM。
ReAct的思考方式跟我们正常的思考方式很像,它不会在一开始就规划好一切路线死板的往前走,而是走一步想一步,思考下一步怎么走。下面是一个T-A-O循环思考的示例:
js
用户:2027 年春节是几号?
第1轮 - Thought: 需要查询万年历或搜索...
Action: search["2027 春节 公历日期"]
Observation: 2027年1月...
第2轮 - Thought: 已拿到日期,不需要进一步工具,可以回答
Reflection: 来源可靠,无遗漏
Final Answer: 2027年春节是1月28日(公历)
ReAct的好处
ReAct之所以强大,是因为它解决了纯"思维链"的致命缺陷:
- 合理性:纯推理是"闭眼睛赛跑",容易跑偏。而ReAct强制模型用外部真实信息作为"思考素材",能极大地减少一本正经胡说八道的情况。
- 可信赖:用户能看到AI的"心路历程"。看到"我需要先查天气"的想法,远比直接得到一个不确定的答案要可靠得多。
- 在线学习 与动态纠错:它不是一条路走到黑。如果第一步行动没有拿到有效信息,ReAct Agent会分析失败原因,然后切换策略,这种灵活性是固定流程无法比拟的。
可执行的ReAct
讲述完成一个ReAct的关键要素,以及实现步骤,最后实现一个简单demo及提出问题
ReAct的五大要素
1.推理引擎 Reasoning Engine🧠
可以说是Agent的大脑,一般是我们经常使用LLM大语言模型, 负责规划agent的执行路线,分析当前情况,怎么走向下一步? 不同的模型推理能力不同,这都将从根本上影响到agent的能力。

2.工具集 Toolset 🛠️
这是 Agent 能够作用于外界的"手",是 ReAct 区别于纯思维链的关键。执行具体的动作,获取真实世界的信息或将意图转化为系统操作。
比如:天气 API(获取实时数据)、代码解释器(执行计算)、向量数据库(检索知识)、浏览器(获取网页内容)。
3.记忆模块 Memory 📖
我们在不仅要知道下一步怎么走,更要记住之前是怎么走的,这样才符合"走一步看一步"的原则。这里的记忆模块可以分为短期记忆和长期记忆。
短期: 保存当前对话的 Thought -> Action -> Observation 历史记录,作为下一次 LLM 请求的上下文(Context)
长期: 存储关键变量,例如"当前已检索到的数据"或"当前第几步"。也可以我们人工手动设置一些关键变量存储到记忆模块中

4.解析与调度器 Parser & Dispatcher 📐
这是 Agent 的"神经系统",负责将 LLM 的模糊文本转化为具体的代码执行。主要负责以下功能:
-
解析:LLM总是长篇大论的,这时候就需要提取关键信息,形成结构化命令(例如正则匹配
Action: get_weather[city])。 -
调度:将解析出的动作名称匹配到具体的 Python 函数或 API 请求。
-
安全保障:过滤非法指令(例如拒绝执行
rm -rf /)。
5.终止条件 Termination Condition ⭕
T-A-O这个循环不能无休止地运行下去,必须有终止的判断条件,来判断是否完成任务,又或者遇到一些其它异常问题,需要终止循环。比如:网络异常,思考步骤异### ReAct的实现
示例代码
了解以上知识,我们就可以自己写一个ReAct架构的Agent了, 其实本质就是一个大语言调用循环,但中间可能加入各种工具集调用。
js
class ReActAgent {
constructor(config = {}) {
this.model = config.model || 'gpt-4';
this.maxIterations = config.maxIterations || 10;
this.tools = new Map();
this.apiKey = config.apiKey || process.env.OPENAI_API_KEY;
}
// 注册工具
registerTool(name, func, description) {
this.tools.set(name, {
func: func,
description: description
});
}
// 格式化工具描述
formatTools() {
let toolList = [];
for (const [name, info] of this.tools) {
toolList.push(`- ${name}: ${info.description}`);
}
return toolList.join('\n');
}
// 解析 Action 行
parseAction(text) {
const regex = /Action:\s*(\w+)[([^]]*)]/;
const match = text.match(regex);
if (match) {
return { toolName: match[1], input: match[2] };
}
return null;
}
// 调用 OpenAI API
async callOpenAI(messages) {
const response = await fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${this.apiKey}`
},
body: JSON.stringify({
model: this.model,
messages: messages,
temperature: 0.7
})
});
const data = await response.json();
return data.choices[0].message.content;
}
// ReAct 主循环
async run(query) {
const systemPrompt = `你是一个使用ReAct模式的AI助手。你需要通过交替进行思考(Thought)和行动(Action)来解决问题。
可用工具:
${this.formatTools()}
格式要求:
Thought: 你的推理过程
Action: 工具名称,格式为 Action: tool_name[input]
Observation: 工具返回的结果
当你有足够信息时,输出最终答案:
Final Answer: 你的最终回答
开始!`;
let messages = [
{ role: "system", content: systemPrompt },
{ role: "user", content: query }
];
for (let iteration = 0; iteration < this.maxIterations; iteration++) {
console.log(`\n[Iteration ${iteration + 1}]`);
// 获取 Agent 响应
const output = await this.callOpenAI(messages);
console.log(output);
// 检查是否有最终答案
if (output.includes("Final Answer:")) {
const finalAnswer = output.split("Final Answer:")[1].trim();
return finalAnswer;
}
// 解析 Action
const action = this.parseAction(output);
if (action) {
const { toolName, input } = action;
const tool = this.tools.get(toolName);
if (tool) {
// 执行工具
const result = await tool.func(input);
const observation = `Observation: ${result}`;
console.log(observation);
// 将思考和观察添加到对话中
messages.push({ role: "assistant", content: output });
messages.push({ role: "user", content: observation });
} else {
messages.push({
role: "user",
content: `错误: 未知工具 '${toolName}'`
});
}
} else {
// 没有找到 Action,提示重新思考
messages.push({
role: "user",
content: "请按照格式提供 Thought 和 Action,或者给出 Final Answer"
});
}
}
return "达到最大迭代次数,未能得出答案";
}
}
存在问题
这里的提示词比较简单,可能就会存在你第一次调用大模型时,LLM直接意象它完成工作了,然后直接就输出结束了,这就导致上面提到的T-A-O循环中断了
js
const systemPrompt = `你是一个使用ReAct模式的AI助手。你需要通过交替进行思考(Thought)和行动 (Action)来解决问题。
可用工具:
${this.formatTools()}
格式要求:
Thought: 你的推理过程
Action: 工具名称,格式为 Action: tool_name[input]
Observation: 工具返回的结果
当你有足够信息时,输出最终答案:
Final Answer: 你的最终回答
开始!`;
我们可以通过强制prompt提示词,比如:
- 约束最少执行步长设置 最少通过LLM思考三轮;
- 必须执行action步骤获取结果,避免LLM主观臆想;
- 增加反思环节,给Agent最后加上反思 ;
通过严格约束LLM的执行步骤,就好像我们在使用codex等工具编程时,最后都会有一个排查代码的步骤。常,LLM调用异常等等;
结语
总而言之,ReAct 作为 AI Agent 最经典的底层架构,以思考-行动-观察的 T-A-O 循环 ,让大模型摆脱单纯闭门推理的局限,实现了边思考、边调用工具、边动态纠错的自主执行能力。
创作不易,如有遗漏,欢迎在评论区指出
