在大模型技术飞速迭代的今天,"Agent"(智能体)早已不是陌生的概念。从能帮我们规划旅行行程的智能助手,到能自动处理数据分析的工具,再到能完成多步骤办公任务的自动化程序,Agent正在逐步渗透到我们工作和生活的方方面面。而支撑这些Agent实现"自主思考、自主行动"的核心底层范式,正是ReAct框架。
如果你关注过大模型面试,尤其是京东、阿里、字节等大厂的算法或工程岗面试,就会发现ReAct是高频考点。比如京东大模型二面中就曾明确提问:"请详细解释ReAct框架,它是如何将思维链和行动结合起来,以完成复杂任务的?" 这道题看似简单,实则考察的是对Agent工作原理的深层理解,它不只是让你背诵定义,更要你说清ReAct的设计初衷、工作流程,以及它如何解决传统大模型的痛点,甚至还要结合实际工程应用谈它的演进。
很多人对ReAct的理解停留在"推理+行动"的表面,却不知道它背后的设计逻辑、核心组件的协同关系,以及在LangChain等主流框架中的落地方式。今天,我们就从ReAct的由来、核心思想、工作流程、组件解析、工程实现,到它的优势局限与演进,全方位拆解这个Agent的"核心大脑",让你不仅能应对面试,更能真正吃透它的底层逻辑。

一、ReAct的由来:破解传统大模型的"两难困境"
要真正理解ReAct,首先要搞懂它解决了什么问题。在ReAct被提出之前,大模型在处理复杂任务时,始终面临着两条路线的"两难选择",而这两条路线都存在无法回避的致命缺陷。
第一条路线是以Chain-of-Thought(CoT,思维链)为代表的纯推理路线。这种方式的核心是让大模型在内部进行逐步推导,通过"一步一步想"来得出结论。比如我们问大模型"100的平方根加上50的平方等于多少",思维链会引导模型先计算100的平方根是10,再计算50的平方是2500,最后将两者相加得到2510。这种方式的优势是推理过程清晰,能让模型逐步拆解复杂问题,但它的短板也同样明显,模型只能依赖自身内部的参数知识进行推理,无法获取外部的实时信息、精确数据,也无法进行复杂计算。
举个很直观的例子,如果你问纯推理路线的大模型"今天北京的实时气温是多少",它没有联网能力,也无法调用气象工具,只能基于训练数据中的旧信息瞎编一个答案,这就是大模型常说的"幻觉"问题。再比如你让它计算"当前A股某只股票的市盈率",它既无法获取实时股价数据,也无法调用股票数据库,只能给出一个模糊的、可能早已过时的答案,甚至会编造数据。这种"闭门造车"式的推理,在面对需要外部信息支撑的复杂任务时,显得格外无力。
第二条路线是以WebGPT、SayCan等为代表的纯行动路线。这种方式的核心是让大模型直接映射到动作空间,通过调用外部工具来完成任务,却缺少中间的推理过程。简单来说,就是"只做不想",模型知道要调用工具,但不知道"为什么要调用这个工具""调用工具能解决什么问题""做完这一步之后下一步该做什么"。
比如我们让纯行动路线的大模型"帮我查一下《流浪地球》的导演还执导过哪些电影,以及这些电影中评分最高的一部",它可能会直接调用搜索引擎,但不知道第一步该搜索"流浪地球 导演",还是直接搜索"郭帆 电影作品";如果搜索到郭帆的作品列表后,它也不知道下一步需要调用评分工具来对比评分,只能漫无目的地重复调用工具,最终无法完成任务。这种"蛮干"式的行动,在面对多步骤、需要逻辑规划的复杂任务时,很容易迷失方向,效率极低。
正是在这样的背景下,ReAct框架应运而生。它的提出者们发现,人类在解决复杂问题时,既不会"先想完所有步骤再动手",也不会"不想就动手",而是采用"边想边做、边做边调整"的方式,想一步、做一步、看一步,根据每一步的反馈来优化下一步的计划。比如我们想做一道陌生的菜,不会先把所有步骤都记下来再动手,而是先想"第一步需要准备哪些食材",然后去冰箱里查看食材(行动),看到食材后再想"下一步该如何处理食材",处理完食材后再想"该如何烹饪",直到菜品完成。
ReAct的核心思想,就是把人类这种"交替推理和行动"的过程形式化、标准化,让大模型也能像人一样,"边想边做"。它打破了纯推理和纯行动的壁垒,将两者有机结合,形成了"推理指导行动,行动反馈推理"的闭环,从而解决了传统大模型的幻觉问题和方向迷失问题。
简单来说,ReAct的本质不是一个新的模型,而是一种组织大模型推理和行动的"协议"或"流程"。它不需要对大模型本身进行大规模修改,只要通过合适的引导,就能让任何足够强的大模型(比如GPT-4、Llama 3、文心一言等)按照这个流程来完成复杂任务。这也是为什么ReAct能成为LangChain、LlamaIndex等主流Agent框架的底层核心,它的通用性和灵活性,让它能够适配各种场景和模型。
二、ReAct的核心工作流程:Thought-Action-Observation的循环闭环

ReAct的名字本身就点明了它的核心:Reasoning(推理)+ Acting(行动)。它的整个工作流程,就是一个不断循环的"思考-行动-观察"三元组,直到任务完成。这个循环可以简单概括为:Thought → Action → Observation → Thought → Action → Observation → ... → Finish。
很多人觉得这个循环很抽象,其实只要结合一个具体的例子,就能轻松理解。我们以一个真实的复杂任务为例:"《流浪地球》的导演还执导过哪些电影?这些电影中评分最高的是哪一部?" 这个任务看似简单,但需要多步骤完成,而且需要调用外部工具获取实时信息,正好能体现ReAct的工作逻辑。
下面我们就一步步拆解ReAct处理这个任务的完整过程,看看它是如何"边想边做"的。
第一轮循环:明确初始目标,启动首次行动
当用户提出任务后,ReAct框架会先让大模型进行第一次思考,明确当前的任务目标和第一步需要做的事情。
Thought(思考):用户的问题是要找《流浪地球》的导演,以及这位导演其他作品中评分最高的一部。我现在不知道《流浪地球》的导演是谁,所以第一步必须先确定导演的名字,否则无法继续查找他的其他作品。因此,我需要调用搜索工具,搜索"流浪地球 导演"来获取导演信息。
Action(行动):调用搜索工具,执行搜索操作,搜索关键词为"流浪地球 导演"。这里的Action是结构化的,需要明确工具名称和调用参数,比如格式可以是"Search[流浪地球 导演]",这样系统才能解析并执行这个动作。
Observation(观察):工具执行完成后,返回搜索结果,《流浪地球》的导演是郭帆。这个Observation不是模型自己生成的,而是外部工具返回的真实信息,它会被拼接回模型的上下文,作为下一步思考的依据。
这一轮循环的核心是"破局",通过思考明确初始任务的卡点,然后通过行动获取关键信息,再通过观察得到反馈,为下一轮循环奠定基础。

第二轮循环:基于反馈,推进任务进度
拿到"导演是郭帆"这个反馈后,模型会基于新的信息进行第二次思考,确定下一步的行动方向。
Thought(思考):现在我已经知道导演是郭帆了,接下来需要完成任务的第二部分,也就是找出郭帆还执导过哪些电影。只有知道了他的全部作品列表,才能进一步对比评分,找到最高评分的作品。因此,我需要再次调用搜索工具,搜索"郭帆 导演 电影作品",获取他的作品清单。
Action(行动):调用搜索工具,执行搜索操作,搜索关键词为"郭帆 导演 电影作品",格式为"Search[郭帆 导演 电影作品]"。
Observation(观察):搜索结果返回郭帆的电影作品列表,包括《流浪地球》《流浪地球2》《同桌的你》《李献计历险记》等。这些信息被拼接回上下文,供模型进行下一步思考。
这一轮循环的核心是"推进",基于上一轮的反馈,明确下一步的任务重点,通过行动获取新的关键信息,逐步靠近最终目标。
第三轮循环:分析现有信息,补充缺失数据
拿到郭帆的作品列表后,模型会发现当前还有关键信息缺失,不知道这些电影的评分,无法判断哪一部评分最高。因此,需要进行第三轮循环。
Thought(思考):现在我已经有了郭帆的所有电影作品,但用户的问题还要求找出这些电影中评分最高的一部。我目前不知道每部电影的具体评分,所以需要调用搜索工具,查询这些电影的评分信息,然后进行对比。为了提高效率,我可以一次性搜索所有作品的评分,或者分步骤搜索,但考虑到准确性,最好一次性获取所有作品的评分数据。
Action(行动):调用搜索工具,执行搜索操作,搜索关键词为"郭帆 电影作品 评分",格式为"Search[郭帆 电影作品 评分]"。
Observation(观察):搜索结果返回各电影的评分数据,假设数据如下:《流浪地球》评分7.9分,《流浪地球2》评分8.3分,《同桌的你》评分7.2分,《李献计历险记》评分7.5分。这些评分数据被拼接回上下文,作为最终判断的依据。
这一轮循环的核心是"补全",通过思考发现现有信息的缺失,然后通过行动补充关键数据,为最终的结论输出做准备。
第四轮循环:整合信息,输出最终答案
拿到所有电影的评分数据后,模型会进行最后一次思考,整合所有信息,判断是否可以输出最终答案。
Thought(思考):现在我已经有了郭帆的所有电影作品及其评分,通过对比可以发现,《流浪地球2》的评分8.3分是最高的。所有任务要求的信息都已经获取完毕,没有缺失的内容,因此可以停止循环,输出最终答案。
Action(行动):执行"Finish"操作,输出最终答案,格式为"Finish[《流浪地球》的导演是郭帆,他还执导过《流浪地球2》《同桌的你》《李献计历险记》等电影,其中评分最高的是《流浪地球2》,评分8.3分。]"。
至此,整个ReAct循环结束,任务圆满完成。
通过这个例子,我们可以清晰地看到ReAct的核心逻辑:每一步行动都有明确的推理依据(Thought),每一步行动都会产生真实的反馈(Observation),而反馈又会指导下一步的推理和行动。这种"思考-行动-观察"的闭环,让模型能够像人一样,逐步拆解复杂任务,不断调整策略,最终完成目标。
需要注意的是,ReAct的循环次数并不是固定的,它取决于任务的复杂程度。简单的任务可能只需要1-2轮循环,而复杂的任务(比如规划一场跨国旅行、完成一份数据分析报告)可能需要几十轮甚至上百轮循环。但无论循环次数多少,其核心逻辑始终是"推理指导行动,行动反馈推理"。
三、ReAct的核心组件:Thought、Action、Observation的角色与协同
在ReAct的"思考-行动-观察"循环中,Thought、Action、Observation这三个组件各自承担着不同的职责,它们相互协同、相互支撑,构成了ReAct框架的核心。只有明确每个组件的角色和作用,才能真正理解ReAct的工作原理。
1. Thought:模型的"内心独白",思维链的具体体现
Thought是模型的"思考过程",相当于人类解决问题时的"内心独白"。它不会被发送给外部工具,也不会直接展示给用户,而是留在模型的推理链中,供模型自己参考和使用。Thought的核心作用,是分解任务、分析当前进度、判断下一步策略,它是Chain-of-Thought(思维链)在ReAct框架中的具体体现。
比如在前面的例子中,每一轮的Thought都在明确"当前我知道什么""我还缺少什么""下一步该做什么"。这种思考过程不是凭空产生的,而是基于当前的任务目标、已有的上下文信息(包括之前的Thought、Action和Observation)来生成的。
Thought的重要性在于,它让模型的决策过程变得"可解释、可追溯"。在传统的纯行动模型中,我们无法知道模型为什么要调用某个工具,只能看到它的行动;而在ReAct中,每一步行动之前都有明确的Thought,我们可以清晰地看到模型的思考逻辑,它为什么要这么做,这么做能解决什么问题。如果任务执行失败,我们也可以回溯到具体是哪一步的Thought出了偏差,从而进行优化和调整。
另外,Thought还具有"动态调整"的特性。它不是一成不变的,而是会根据Observation的反馈不断更新。比如,如果在前面的例子中,搜索"郭帆 电影作品"时,返回的结果中缺少某部作品,模型的Thought就会调整为"当前获取的作品列表不完整,需要重新搜索或补充搜索,确保获取所有作品信息",然后调整Action,进行二次搜索。
2. Action:模型与外部世界的"桥梁",行动的具体执行
Action是模型与外部世界交互的唯一方式,相当于人类解决问题时的"具体动作"。它的核心作用,是将模型的思考(Thought)转化为可执行的操作,通过调用外部工具来获取信息、处理数据,从而推进任务进度。
在ReAct框架中,Action通常是结构化的,它需要明确包含"工具名称"和"调用参数",这样系统才能解析并执行这个动作。常见的Action类型包括:
-
搜索类:调用搜索引擎(如百度、谷歌),参数为搜索关键词,格式为"Search[关键词]";
-
查找类:在指定文档或数据库中查找特定内容,参数为查找术语,格式为"Lookup[术语]";
-
计算类:调用计算器或编程工具进行数学计算,参数为计算表达式,格式为"Calculate[表达式]";
-
API调用类:调用第三方API(如气象API、股票API),参数为API所需的请求参数,格式为"API[API名称, 参数]";
-
结束类:当任务完成时,输出最终答案,格式为"Finish[答案]"。
需要注意的是,Action的执行必须依赖外部工具,模型本身无法直接执行Action。比如,模型生成"Search[流浪地球 导演]"这个Action后,系统会解析这个Action,调用搜索引擎,执行搜索操作,然后将搜索结果返回给模型,作为Observation。
另外,Action的选择是由Thought决定的。不同的Thought会对应不同的Action,比如如果Thought是"需要获取实时气温",对应的Action就是"Search[北京 实时气温]";如果Thought是"需要计算100的平方根",对应的Action就是"Calculate[sqrt(100)]"。这种"思考决定行动"的逻辑,确保了Action的针对性和有效性,避免了纯行动模型中"盲目行动"的问题。
3. Observation:外部环境的"反馈",推理的真实依据
Observation是外部环境对Action的反馈,相当于人类执行动作后得到的"结果"。它不是模型生成的,而是外部工具执行Action后返回的真实数据,是模型进行下一步思考的重要依据。
Observation的核心作用,是为模型提供"真实的外部信息",打破模型"闭门造车"的局限,从而减少幻觉。比如在前面的例子中,Observation是搜索引擎返回的"郭帆""郭帆的电影作品""电影评分"等真实信息,这些信息让模型的思考不再基于自身的参数知识,而是基于真实的外部数据,从而避免了编造信息的问题。
另外,Observation还会"更新模型的上下文"。每一次Observation都会被拼接回模型的输入上下文,模型在生成下一轮Thought时,会结合之前的所有Thought、Action和Observation,确保思考的连贯性和准确性。比如,模型在生成第二轮Thought时,会结合第一轮的Thought(需要找导演)、Action(搜索导演)和Observation(导演是郭帆),从而确定下一步需要搜索郭帆的作品。
需要注意的是,Observation可能是"正确的",也可能是"错误的"。比如,搜索引擎可能会返回错误的信息,或者API调用失败返回错误码。这时,模型的Thought就需要能够识别这些错误,并调整Action。比如,如果搜索"郭帆 电影作品"返回的结果是错误的,模型的Thought就会判断"当前获取的信息有误,需要重新搜索或更换搜索关键词",然后调整Action,进行二次搜索。这种"容错能力",也是ReAct框架的重要优势之一。
4. 三者的协同关系:闭环反馈系统
Thought、Action、Observation三者不是孤立的,而是相互协同、相互支撑,构成了一个闭环反馈系统。它们的协同关系可以总结为:
-
初始化:用户提出任务后,模型基于任务目标,生成第一次Thought,明确下一步的行动方向;
-
行动执行:模型基于Thought,生成结构化的Action,系统解析并执行Action,调用外部工具;
-
反馈接收:外部工具执行Action后,返回Observation,模型接收这个反馈;
-
上下文更新:Observation被拼接回模型的上下文,更新模型的认知;
-
循环迭代:模型基于更新后的上下文,生成下一轮Thought,重复上述过程,直到任务完成。
这个闭环反馈系统,让模型能够像人一样,在解决复杂问题时不断调整策略,逐步逼近目标。它既解决了纯推理模型的幻觉问题,又解决了纯行动模型的方向迷失问题,是ReAct框架能够高效完成复杂任务的核心原因。
四、ReAct与Prompt工程:如何"教会"模型按ReAct流程工作?
很多人会有一个疑问:ReAct是一个框架,不是一个模型,那我们如何让大模型按照ReAct的流程来工作呢?答案很简单,通过Prompt工程。
在实际工程实现中,ReAct的核心机制是通过精心设计的Prompt来驱动的。我们不需要对大模型本身进行修改,只需要通过Prompt"教会"大模型按照"Thought-Action-Observation"的固定格式来输出,就能实现ReAct的循环。
一个典型的ReAct Prompt模板,通常包含以下几个部分:
-
角色定义:明确模型的身份,比如"你是一个智能助手,可以使用以下工具来回答用户的问题";
-
工具列表:列出模型可以使用的外部工具,明确每个工具的使用格式,比如:
-
Search[query]:搜索相关信息,query为搜索关键词;
-
Lookup[term]:在指定文档中查找特定内容,term为查找术语;
-
Calculate[expression]:进行数学计算,expression为计算表达式;
-
Finish[answer]:给出最终答案,answer为具体答案内容;
-
格式要求:明确要求模型按照"Thought: 思考过程;Action: 工具调用;Observation: 工具反馈"的格式交替输出,直到任务完成;
-
示例引导(可选):如果模型的指令遵循能力较弱,可以加入1-2个完整的ReAct循环示例,让模型通过示例学习如何按照格式输出。
下面是一个完整的ReAct Prompt模板示例,大家可以直接参考使用:
text
你是一个智能助手,可以使用以下工具来回答用户的问题:
1. Search[query] - 调用搜索引擎,搜索query相关的信息,返回真实、准确的结果;
2. Calculate[expression] - 调用计算器,计算expression的结果,确保计算准确;
3. Finish[answer] - 当所有信息都获取完毕,输出最终答案,确保答案完整、清晰。
请严格按照以下格式交替进行思考和行动,不要遗漏任何步骤,直到完成任务:
Thought: 你的思考过程,明确当前的任务进度、缺少的信息、下一步的行动计划;
Action: 工具名[参数],严格按照工具列表中的格式编写,不要出现其他格式;
Observation: 工具返回的结果,如实填写,不要编造;
...(重复以上Thought-Action-Observation过程)
Thought: 所有信息都已获取完毕,我可以给出最终答案了;
Action: Finish[最终答案]
示例:
用户问题:2024年北京奥运会的举办时间是什么时候?
Thought: 我需要知道2024年北京奥运会的举办时间,但首先要确认2024年奥运会是否由北京举办,因为我记得奥运会每四年举办一次,2020年是东京奥运会,2024年应该是巴黎奥运会。不过为了确认,我需要调用搜索工具。
Action: Search[2024年奥运会 举办城市 举办时间]
Observation: 2024年奥运会的举办城市是法国巴黎,举办时间为2024年7月26日至8月11日,北京没有举办2024年奥运会。
Thought: 现在我已经获取了准确的信息,用户的问题存在一个误区,需要纠正并给出正确答案,因此可以输出最终答案了。
Action: Finish[2024年奥运会的举办城市是法国巴黎,并非北京,举办时间为2024年7月26日至8月11日。]
现在,请回答用户的问题:《流浪地球》的导演还执导过哪些电影?这些电影中评分最高的是哪一部?
通过这个Prompt模板,我们实际上是在用"指令+示例"的方式,"教会"大模型按照ReAct的流程来输出。模型在生成输出时,会严格遵循"Thought-Action-Observation"的格式,当生成到Action时,系统会截断模型的输出,解析Action的内容,调用相应的外部工具,获取Observation,然后将Observation拼接回模型的上下文,再让模型继续生成下一轮的Thought。
这种方式的优势在于,它不需要对大模型进行微调,只要模型具备足够的指令遵循能力和格式控制能力,就能按照ReAct的流程工作。而且,通过调整Prompt中的工具列表,我们可以让ReAct框架对接不同的外部工具,适配不同的场景,比如在数据分析场景中,我们可以加入"Excel[操作指令]"工具;在代码生成场景中,我们可以加入"Code[代码内容]"工具。
需要注意的是,Prompt的设计对ReAct的效果影响很大。如果Prompt中的工具列表不清晰、格式要求不明确,或者示例引导不足,模型很容易输出不符合格式的内容,导致系统无法解析Action,从而影响任务的执行。因此,在实际工程中,我们需要不断优化Prompt,确保模型能够准确理解并遵循ReAct的流程。
五、ReAct的优势与局限:理性看待这个"Agent核心框架"
ReAct框架作为目前Agent的主流底层范式,有着非常明显的优势,但同时也存在一些无法回避的局限。只有理性看待它的优势和局限,才能在实际工程中更好地应用它,扬长避短。
1. ReAct的三大核心优势
ReAct的优势主要体现在可解释性、准确性和泛化性三个方面,这也是它能够成为主流Agent框架底层的核心原因。
第一,可解释性强,便于调试和优化。正如我们前面所说,ReAct的每一步行动之前都有明确的Thought,模型的思考过程是可追溯、可解释的。如果任务执行失败,我们可以很容易地回溯到具体是哪一步的Thought出了偏差,或者哪一步的Action调用错误,从而针对性地进行优化。比如,模型在搜索郭帆的作品时返回了错误的结果,我们可以通过查看Thought,发现是搜索关键词设置不合理,然后调整关键词,重新执行Action。这种可解释性,在实际工程中非常重要,尤其是在一些对可靠性要求较高的场景(如医疗、金融)中。
第二,减少幻觉,提高结果的准确性。ReAct通过调用外部工具获取真实的Observation,让模型的推理过程基于真实数据,而不是自身的参数知识,从而大幅减少了模型编造信息的"幻觉"问题。比如,在回答"实时气温""股票价格"等需要实时信息的问题时,ReAct可以通过调用搜索引擎或API获取真实数据,确保答案的准确性。这也是ReAct相比纯推理模型的最大优势之一。
第三,泛化能力好,适配多种场景和工具。ReAct框架与具体的外部工具解耦,只要通过调整Prompt中的工具列表,就可以对接不同的工具集,适配不同的场景。比如,在问答场景中,我们可以对接搜索引擎;在数据分析场景中,我们可以对接Excel、Python等工具;在办公自动化场景中,我们可以对接邮件、文档编辑等工具。而且,ReAct可以套用在任何足够强的大模型上,不需要针对特定模型进行修改,通用性非常强。
2. ReAct的三大主要局限
尽管ReAct有很多优势,但它也存在一些明显的局限,这些局限在实际工程应用中需要我们重点关注,并采取相应的优化措施。
第一,效率较低,开销较大。ReAct的每一轮循环都需要一次大模型调用加一次工具调用,对于复杂的任务,可能需要几十轮甚至上百轮循环,这会导致任务执行的延迟较高,同时也会增加计算成本和工具调用成本。比如,完成一份复杂的数据分析报告,可能需要调用几十次Excel工具和搜索引擎,每一次调用都需要消耗时间和资源。对于一些对实时性要求较高的场景(如实时客服、紧急决策),ReAct的效率可能无法满足需求。
第二,存在错误累积风险。ReAct的循环是"一步错,步步错"的,如果中间某一步的Thought推理错误,或者Action调用工具返回错误的Observation,后续的步骤都会在错误的基础上继续推理和行动,导致错误不断累积,最终无法完成任务。比如,在前面的例子中,如果第一次搜索"流浪地球 导演"返回的结果是"张艺谋",那么后续的所有步骤都会围绕"张艺谋"展开,最终得到错误的答案。这种错误累积的风险,在复杂任务中尤为明显。
第三,对模型能力的依赖较强。ReAct需要模型具备较强的指令遵循能力和格式控制能力,能够严格按照Prompt中的格式要求,生成"Thought-Action-Observation"的内容。如果模型的能力较弱,很容易输出不符合格式的内容(比如遗漏Thought、Action格式错误),导致系统无法解析,从而中断任务执行。比如,一些小型开源模型,由于指令遵循能力不足,可能无法很好地适配ReAct框架,需要进行大量的微调才能使用。
六、ReAct的演进:从基础循环到现代Agent框架的升级
ReAct框架自提出以来,并没有停止演进的脚步。随着Agent技术的不断发展,现代主流的Agent框架(如LangChain、LlamaIndex、LangGraph)都是在ReAct的基础上做了增强和扩展,解决了ReAct的部分局限,让它能够适配更复杂的任务场景。
1. LangChain中的ReAct实现:AgentExecutor
LangChain是目前最流行的Agent开发框架之一,它的核心组件AgentExecutor,本质上就是ReAct循环的工程实现。在LangChain中,AgentExecutor的工作流程与ReAct的基础循环完全一致:
-
模型基于用户任务,生成Thought和Action;
-
AgentExecutor解析Action,调用相应的工具(Tool),获取Observation;
-
将Observation拼接回上下文,模型基于新的上下文生成下一轮Thought和Action;
-
重复上述过程,直到模型生成Finish Action,输出最终答案。
LangChain对ReAct的增强主要体现在两个方面:一是提供了丰富的工具集(如搜索工具、数据库工具、API工具等),开发者可以直接调用,无需自行开发;二是加入了"记忆机制"(Memory),可以保存整个ReAct循环的上下文信息,让模型的思考更加连贯,避免重复思考和重复调用工具。
比如,在LangChain中,我们可以通过以下代码快速实现一个基于ReAct的Agent(以Python代码为例):
python
from langchain.agents import AgentType, initialize_agent, load_tools
from langchain.chat_models import ChatOpenAI
# 初始化大模型(这里以ChatOpenAI为例,也可以替换为其他模型)
llm = ChatOpenAI(temperature=0, model_name="gpt-4")
# 加载工具(这里加载搜索引擎工具)
tools = load_tools(["serpapi"], llm=llm)
# 初始化ReAct Agent
agent = initialize_agent(
tools,
llm,
agent=AgentType.REACT_DESCRIPTION, # 指定使用ReAct范式
verbose=True # 打印详细的思考和行动过程
)
# 执行任务
agent.run("《流浪地球》的导演还执导过哪些电影?这些电影中评分最高的是哪一部?")
这段代码的核心逻辑,就是通过initialize_agent函数,将大模型、工具和ReAct范式结合起来,实现ReAct的循环。执行后,我们可以看到模型的每一步Thought、Action和Observation,就像我们前面手动拆解的例子一样。
2. LangGraph:将ReAct的线性循环扩展为图结构
LangGraph是LangChain团队推出的一个更高级的Agent框架,它在ReAct的基础上,将线性的"Thought-Action-Observation"循环扩展成了图结构(Graph),从而支持更复杂的分支和条件跳转。
在ReAct的基础循环中,流程是线性的,每一轮循环只能有一个Thought和一个Action,无法处理"分支选择"的场景。比如,在完成一个复杂任务时,模型可能需要根据Observation的结果,选择不同的行动路线,如果Observation返回的信息完整,就继续推进任务;如果信息不完整,就选择"重新搜索"或"补充搜索";如果信息错误,就选择"更换工具"或"调整关键词"。
LangGraph通过图结构,解决了这个问题。它将ReAct的每个组件(Thought、Action、Observation)作为图的节点,将组件之间的流转作为边,并且可以设置条件判断,让模型根据不同的Observation结果,选择不同的流转路径。比如,我们可以设置一个条件:如果Observation返回的信息完整,就流转到"生成Finish Action"的节点;如果信息不完整,就流转到"重新生成Thought和Action"的节点;如果信息错误,就流转到"调整Action"的节点。
这种图结构的扩展,让ReAct能够处理更复杂的任务场景,比如多分支任务、循环任务、条件判断任务等,大幅提升了Agent的灵活性和能力边界。
3. ReAct的变体与增强方案
除了LangChain和LangGraph的扩展,还有一些ReAct的变体和增强方案,针对性地解决了ReAct的部分局限,值得我们关注。
比如Reflexion(反思)框架,它在ReAct的基础上加入了"自我反思"机制。当任务执行失败时,模型会回顾整个ReAct循环的过程,总结经验教训,比如"哪一步的Thought推理错误""哪一步的Action调用不当""Observation的反馈如何影响了后续思考",然后将这些经验教训保存起来,下次再遇到类似问题时,就可以避免犯同样的错误。这种自我反思机制,有效解决了ReAct的"错误累积"问题,提升了任务执行的成功率。
再比如Plan-and-Execute(规划-执行)框架,它将ReAct的"边想边做"调整为"先规划,再执行"。模型首先会对整个任务进行全局规划,生成一个详细的步骤列表,然后再按照步骤列表,逐步执行ReAct循环。这种方式适合更长链路的复杂任务(比如规划一场跨国旅行、完成一份完整的项目报告),可以避免ReAct在复杂任务中出现"迷失方向"的问题,提升任务执行的效率和连贯性。
七、总结:ReAct的核心价值与未来展望
通过前面的详细拆解,我们可以发现,ReAct框架的核心价值,在于它首次将"思维链"和"行动"有机结合起来,让大模型从"只会思考不会行动""只会行动不会思考"的困境中走出来,实现了"边想边做"的自主决策能力。它不仅解决了传统大模型的幻觉问题和方向迷失问题,还提供了良好的可解释性和泛化性,成为了现代Agent框架的底层核心。
对于面试而言,理解ReAct不仅能应对面试官的直接提问,更能体现你对Agent技术的深层理解,面试官问ReAct,本质上是想知道你是否明白Agent是"如何思考和行动"的,是否具备Agent开发的底层思维。而对于实际工程应用而言,ReAct的价值在于它提供了一种标准化的流程,让我们能够快速开发出具备自主决策能力的Agent,适配各种复杂场景。
当然,ReAct也存在效率低、错误累积、依赖模型能力等局限,但随着技术的不断演进,这些局限正在被逐步解决,LangGraph的图结构扩展解决了复杂流程控制的问题,Reflexion的反思机制解决了错误累积的问题,Plan-and-Execute的规划机制解决了效率问题。未来,ReAct框架还会继续演进,可能会结合强化学习、多模态技术等,进一步提升Agent的自主决策能力和适配能力。
最后,我们可以用一句话总结ReAct的核心逻辑:ReAct不是让模型"想完再做"或"做完再想",而是让模型"想一步、做一步、看一步",通过推理指导行动,通过行动反馈推理,在循环迭代中完成复杂任务。理解了这一点,你就真正吃透了ReAct,也理解了现代Agent的底层工作原理。