图文+代码: 轻易搞懂Agent的底层架构-ReAct

前言

随着 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提示词,比如:

  1. 约束最少执行步长设置 最少通过LLM思考三轮;
  2. 必须执行action步骤获取结果,避免LLM主观臆想;
  3. 增加反思环节,给Agent最后加上反思 ;

通过严格约束LLM的执行步骤,就好像我们在使用codex等工具编程时,最后都会有一个排查代码的步骤。常,LLM调用异常等等;

结语

总而言之,ReAct 作为 AI Agent 最经典的底层架构,以思考-行动-观察的 T-A-O 循环 ,让大模型摆脱单纯闭门推理的局限,实现了边思考、边调用工具、边动态纠错的自主执行能力。

创作不易,如有遗漏,欢迎在评论区指出

相关推荐
行者-全栈开发4 小时前
【DeepSeek 实战】打造全能编程助手:DeepSeek V4 Agent 开发与工具调用
agent·智能体·工具调用·functioncalling·自动化编程·多步推理·deepseek v4
阿里云云原生5 小时前
不止于原型:AgentRun 如何通过 Serverless 运行时重构 Agent 开发全生命周期?
agent
飞龙14775657467505 小时前
daily_stock_analysis:数据访问层
agent
LinDaiDai_霖呆呆6 小时前
做 Agent 开发入门必懂的 10 个 Agent 核心概念
前端·agent·ai编程
七夜zippoe6 小时前
基于 JiuwenClaw AgentTeam 集群模式的年会策划实战:从源码部署到多智能体协作落地
人工智能·agent·openjiuwen·jiuwenclaw·agentteam
机器之心6 小时前
OpenAI杀疯了!砸40亿美元成立新公司、还祭出网络防御利器Daybreak
人工智能·openai
维元码簿6 小时前
Claude Code 深度拆解:远程模式 4 — 无环境直连架构
ai·agent·claude code·ai coding
devpotato6 小时前
人工智能(十六)- SSE 流式:让 Agent 像 ChatGPT 一样"边想边说"
langchain·llm·agent
用户948866003436 小时前
把串行 Agent Pipeline 改成 Temporal 工作流之后,快了 3 倍
agent