大型语言模型(LLM)在许多任务上表现出惊人的能力。一方面,通过“链式思维”提示(Chain-of-Thought, CoT)让模型在给出答案前先生成一系列逐步推理,可以大幅提升模型在数学推导、常识推理等方面的表现。但仅靠内部推理的模型缺乏对外部世界的连接:模型只能依据内部存储的知识进行推理,无法动态获取新信息或校正认知偏差。另一方面,近期也有工作探索让预训练语言模型用于规划和执行动作,例如在文本游戏、网页导航、机器人控制等交互环境中让模型输出动作序列。这种“行动”范式侧重于从文本上下文映射到操作命令,却缺乏高层次的抽象推理和长期规划,模型也没有显式的工作记忆去支持长序列决策。
现实中,人类解决复杂问题时往往将内在思考与外在行动交替进行:我们会一边在脑海中思考步骤、一边与环境互动获取所需信息或实施方案。例如做菜时,我们会在每个步骤之间用语言自我提醒下一步计划,必要时查阅食谱或网上搜索信息,然后继续动手实践。受此启发,谷歌大脑团队提出了一种新方法 ReAct(Reason + Act),希望让语言模型也能像人类一样边“想”边“做”。简单来说,ReAct 让模型在解决问题时同时产生推理轨迹(reasoning traces,即链式思考过程)和动作指令(actions,用于查询工具或与环境交互),二者交替进行,互相协作。这种推理与行动的紧密融合被称为“ReAct”范式,它显著区别于传统只推理或只行动的提示方法,展现出更强的决策能力和可解释性。
ReAct 的核心思想与传统提示方法的区别
ReAct 方法的核心思想在于:将“推理”(Reasoning)和“行动”(Acting)这两种能力融合到同一个语言模型的输出序列中。模型不再只是给出最终答案或纯粹的一串动作命令,而是以交替的方式生成**“思考”和“行动”**两种内容。例如,模型面对一个问题时,可能先输出:“我需要先查找相关信息”(这是推理的一部分),接着输出一个具体行动如“搜索[X]”,然后根据检索到的结果继续推理,接着再执行下一个行动,如此反复,直到得到答案。
这一范式与传统提示方法有显著区别:
区别一:链式思维提示 vs ReAct:传统的链式思维(CoT)提示让模型在回答前生成一段隐藏的推理过程,但这个推理只是内部文字,不会与外部交互。模型只能依据已有知识推理,一旦遇到知识盲点可能产生谬误或幻觉内容。相比之下,ReAct 会在推理过程中引入动作,允许模型在需要时主动查询外部知识库或环境,获取最新的信息来支撑后续推理。这样模型的思考过程不再是闭门造车,而是可以实时查证和更新。
区别二:动作规划提示 vs ReAct:以往让模型执行动作的方案(例如让模型直接输出操作序列去玩游戏或控制机器人)通常没有显式的推理过程。模型根据当前观察直接产出下一个动作,缺少对全局目标的抽象思考,也没有记录“为什么”采取某行动的理由。这容易导致模型在复杂任务中迷失方向或无法长期规划。ReAct 则在动作之间插入推理步骤,模型会用自然语言总结现状、规划策略,并将这些中间思路保留下来作为“内在记忆”,指导后续行动。因此,ReAct 既有链式推理的深度思考,又有动作执行的环境交互,两者相辅相成。
简而言之,传统提示要么让模型闷头“想”(CoT),要么让模型不加思索地“做”(直接行动),而 ReAct 让模型一边“想”一边“做”,形成闭环。这种协同带来的好处是明显的:研究表明,将推理与行动相结合的 ReAct 模型往往优于仅有推理或仅有行动的模型,在各种任务上取得更好的效果。
图1:传统方法 vs ReAct 的对比。上方两图:仅推理(左)和仅行动(右)的模式。下方:ReAct 模式中,语言模型(LM)既产生推理轨迹又发出动作指令,与外部环境(Env)交互,形成一个闭环。推理过程更新模型内部状态,行动则引入环境反馈,两者协同工作。
推理与行动如何在 ReAct 中结合
那么,ReAct 是如何实现推理和行动的交替结合的呢?其关键在于对语言模型的输出格式和推理流程进行了精心设计。具体来说,ReAct 将模型解决任务的过程表示为一个由**“Thought”(思考)、“Action”(行动)和“Observation”(观察结果)交替组成的序列**。模型通过Few-shot提示学习,在同一段对话中按照这种格式进行推理和操作:
思考(Thought):模型用自然语言描述当前它对任务的理解、下一步计划或需要的信息。例如面对一个疑问,模型可能在Thought中自问:“现在我需要找出X的出生年份,或许可以先搜索X的维基百科页面。”这些推理文字不会直接影响外部环境,但会更新模型内部的工作记忆,帮助模型理清思路和规划后续动作。
行动(Action):基于上一步的思考,模型决定执行一个具体动作。动作通常以特殊格式表示,例如
Search[...]
表示搜索查询,Lookup[...]
表示在当前文档中查找关键词,Goto[...]
表示导航到某处,或者Finish[...]
用于给出最后答案等。这一步会提交给外部环境或工具执行,比如调用一个知识库API、浏览网页或与游戏环境交互。可以把Action看作模型对外部的指令输出。观察(Observation):外部环境根据模型的Action返回结果,这成为模型可以“看到”的新信息。比如调用维基百科API后,会返回相应条目的内容摘要;在游戏环境中执行动作,会返回环境的新描述状态。Observation相当于模型从外部获取到的反馈,这会被附加到模型的上下文中。
模型会重复交替产生Thought → Action → Observation的步骤,直到达到解决任务的条件。最终,模型会通过一个特殊的Finish[答案]
动作来结束任务并给出答案。
在这个过程中,推理和行动互相促进:
**推理指导行动:**模型通过Thought总结当前需要什么信息或下一步怎么做,然后据此选择合适的Action。这避免了盲目动作,使每一步操作都有明确的目的。例如模型可能推理出“要回答这个问题,我需要先找人物X的出生年份”,于是执行
Search[X 出生年份]
的动作。**行动反馈丰富推理:**每次Action得到Observation后,模型会在随后的Thought中消化这条新信息,更新自己的知识和计划。例如当搜索结果返回某人物出生于“1980年”,模型在下一个Thought中会记下这一点,并进一步推理下一步需要的信息。如果发现搜索结果不相关,模型也可以在Thought中反思并调整策略。
通过这种循环,模型可以一边获取新信息一边调整推理,就像人类在解决问题时不断地“边查边想”一样。值得一提的是,在ReAct中推理内容不会直接对环境生效,因此模型可以放心地进行假设和中间推演;而只有明确标记为Action的内容才会执行,确保与外部交互的操作是经过思考决定的。这一机制让模型能够处理更长的推理链和复杂的目标,因为它可以随时通过行动获取所需的信息,并通过推理整合这些信息。
结合推理和行动带来的能力提升
融合推理与行动的ReAct方法,为语言模型带来了多方面的能力提升:
检索外部知识,减少幻想和错误:纯粹依赖训练记忆的模型在回答超出其知识范围的问题时,容易编造不准确的内容(即“幻觉”现象)。ReAct 通过引入检索行动,让模型能够实时查阅权威资料,从而显著降低了幻觉和推理链错误传递的问题。例如在回答需要多跳推理的问答任务时(如HotpotQA),仅有链式思维的模型可能基于不完整的内部知识产生错误中间结论,最终答案也偏离事实。而使用ReAct,模型可以调用维基百科API获取真实信息,不确定的推断可以及时被查证修正,其推理过程更加基于事实而非凭空想象。
复杂决策能力与环境交互:对于需要多步骤决策的任务(如解谜游戏、机器人操作),ReAct 提升了模型的规划和决策能力。由于模型在行动前可以用Thought考虑整体目标、分解子任务,它更擅长长程规划和在意外情况下调整策略。同时,每一步动作的观察反馈让模型对环境变化做出反应,避免一条路走到黑。例如,在ALFWorld这样交互式文本游戏中,纯“行动”模型往往缺乏全局观,可能在复杂任务中漏掉关键步骤。而ReAct模型会在关键节点插入推理,总结当前进展和下步目标,使得成功率大幅提高。
工具使用灵活性:ReAct 框架下,动作可以视作调用外部工具的接口。这意味着模型不仅限于检索知识,还可以执行各种操作,例如计算、API查询、数据库检索、网页点击等等。通过Few-shot示例教会模型不同的动作语法,LLM能够灵活地调用多种工具来完成任务。这种能力拓展使得语言模型可以解决更广泛的问题,例如在WebShop任务中,模型需要像用户一样浏览购物网站查找商品并做出购买决策。ReAct 提供了结构化的方式让模型运用工具:推理步骤决定何时用何种工具,行动步骤实际执行工具操作。这种设计相比黑箱式的工具使用更透明可控,也更高效。
过程可解释性与可控性:由于ReAct让模型显式地输出思考过程,每一步推理和决策都有据可循,整个任务求解轨迹对人类来说是透明的。这种可解释性带来两个好处:一是增加了可信度,因为我们可以看到模型依据哪些事实和逻辑得到最终答案,而不是凭直觉直接给出结果。二是便于诊断和纠偏:如果模型中途走偏,人类可以检查其Thought发现问题所在,并及时干预。例如研究者展示,在模型解ALFWorld任务时,只需人工修改两处错误的思考文字,模型后续的行为就能被纠正并成功完成任务。这种人类在环的干预在传统模型中难以实现,因为大多数模型没有显式的中间决策可供检查。借助ReAct,我们可以把人类的常识和监督直接融入模型的推理过程中,实现更高程度的人机协作。
综上,ReAct 将LLM的推理优势和工具交互能力融为一体,使模型在准确性、决策力、灵活性和可解释性等方面都得到提升。这种综合能力在很多任务中转化为了性能上的领先。
提示设计的技术细节与示例
要让语言模型学会ReAct的模式,关键在于设计合适的提示(prompt)。研究中采用的方法是提供**少数几个示例(few-shot)**来演示如何同时进行推理和行动。一个ReAct提示通常包括如下要素:
任务示例:首先展示1-2个完整的任务求解案例,每个案例从问题到答案的全过程都用Thought/Action/Observation的形式写出。
人工示范的推理与动作:在这些示例中,研究人员手工编写了合理的思考过程和相应的动作序列。例如在一个问答示例中,Thought可能写道“这个问题涉及人物X的生平,我需要查找X出生于哪一年”,接着Action示范
Search[X]
去搜索X,Observation则列出搜索结果的一部分,然后下一个Thought分析结果是否包含所需信息,如没有则决定换个关键词搜索,依此类推,直到Action给出Finish[答案]
。环境反馈的体现:示例中每次Action之后,都紧跟着展示该动作的结果(Observation)。这教会模型在产生下一步思考时,要将新获取的信息纳入考虑。例如:“Observation: ‘X出生于1980年。’”然后Thought可以利用这一事实继续推理。
通过上述few-shot示例,模型在提示中学习到输出格式(Thought、Action、Observation的顺序)以及推理-行动协同的策略。当提示之后实际提出新问题时,模型就会模仿示例的格式和思路来作答。
举一个简化的例子来说明ReAct提示如何工作。假设我们向模型提问:“The Simpsons动画中角色Milhouse的名字来源于谁?(米尔豪斯这个角色的名字是源自谁?)” 在ReAct框架下,模型可能生成如下的思路和动作:
- Thought 1:“这个问题在问米尔豪斯这个辛普森里的角色名字是谁的名字命名的。我需要找到相关资料。”(模型在思考要查找Milhouse的名字由谁而来)
- Action 1:
Search[Milhouse Simpsons 名字 来历]
(模型决定去搜索米尔豪斯名字的来源) - **Observation 1:**返回的结果可能包含:“米尔豪斯的全名是Milhouse Mussolini Van Houten,其名Milhouse来自美国总统理查德·尼克松的中间名。”
- Thought 2:“搜索结果显示米尔豪斯这个名字来源于理查德·尼克松的中间名,那么问题问‘…名字是谁的名字命名的’,答案应是理查德·尼克松。”(模型根据观察到的信息进行推理,得到答案)
- Action 2:
Finish[理查德·尼克松]
(模型输出最终答案并结束)
在实际论文的附录中,作者提供了更复杂的示例,包括多跳推理的问答、需要排除干扰项的检索,以及交互式环境中的动作序列等。通过精巧设计的Prompt,ReAct让模型在看到新问题时可以自发地产生类似的推理和行动序列。值得注意的是,ReAct 提示的设计不依赖额外训练——这些few-shot示例本身就是对模型的引导,利用预训练模型的强大学习能力即可实现复杂行为。在实验中,研究者使用一个5400亿参数的PaLM模型通过少量示例就成功学会了ReAct模式,并将其泛化到不同任务中。这展示了大型预训练模型强大的即时学习能力:只要提示得当,模型能够临时“扮演”问题求解代理的角色。
在基准任务中的表现
ReAct 方法在多项任务基准上都展示了出色的性能和优势。以下是论文中提及的几个典型基准任务及ReAct的表现:
多跳问答(HotpotQA)与事实核查(FEVER):这两个任务要求模型检索多个证据来回答问题或验证陈述的真伪。实验采用ReAct让模型可以与维基百科API交互检索信息。结果显示,ReAct 有效缓解了链式思维提示中出现的幻觉和错误:它比仅有动作而无推理的模型取得更高的准确率,并且表现接近仅用链式思维推理的模型。更有意思的是,研究者发现结合ReAct与链式思维的策略效果最佳——也就是说,在推理过程中同时利用模型内部知识和外部检索信息,可以取得比单纯依赖任一来源更好的结果。虽然直接Few-shot提示的成绩仍略低于有大规模监督数据训练的顶尖模型,但考虑到ReAct未使用任何额外训练数据,其表现已相当亮眼。例如,在HotpotQA的实验中,ReAct提示的PaLM模型准确率达到27.4%,接近纯链式思维的29.4%,而远超仅行动策略的25.7%;在FEVER验证任务上,ReAct达到60.9%的准确率,超过链式思维的56.3%和仅行动的58.9%。由此可见,ReAct 有助于模型更可靠地获取证据并推理,相比单纯内部推理的CoT更少受错误引导。
交互式决策任务(ALFWorld 与 WebShop):ALFWorld是一个文本版的室内任务游戏,要求模型根据描述完成物品操作等复杂任务;WebShop则是一个模拟在购物网站上浏览和购买商品的环境。这类任务需要模型执行一系列行动来达成目标,同时环境会不断变化。传统上往往用强化学习或模仿学习在大量交互数据上训练代理。令人惊讶的是,使用ReAct的预训练语言模型在只给出一两个示例的情况下,就大幅超越了这些经过上百任务示例训练的传统方法!在ALFWorld上,ReAct提示的PaLM模型成功率达到71%,而先前最好的模仿学习代理只有37%,提升了绝对34个百分点。在WebShop网上购物任务中,ReAct模型成功率为40%,也比最好的训练代理(约29%)高出约10个百分点。不仅如此,即便与只执行动作不显示推理过程的LM代理相比,ReAct也有明显优势(例如71% vs 45%的成功率)。通过分析模型轨迹发现,ReAct模型能够在遇到障碍时通过插入思考步骤来调整策略、记忆长远目标,因此完成任务的连贯性和效率更高。这证明了在复杂交互任务中,引入推理的模型更善于规划和纠错,而不仅仅是一味尝试动作。
总体而言,在从知识问答到交互决策的不同类型任务中,ReAct都取得了比单一策略更优的效果。这说明将“思考”和“行动”融合对于提升通用智能代理的能力是非常有前景的方向。
意义与未来展望
作为一种新范式,ReAct 的出现具有重要意义:
首先,ReAct 桥接了两个原本独立的研究方向——推理型提示和行动型代理,为构建更强大的通用智能体提供了思路。以前,我们需要分别研究如何让模型更好地思考(例如改进Chain-of-Thought),以及如何让模型更好地使用工具或执行操作(例如强化学习代理)。现在,通过ReAct,我们看到了二者并非对立,而是可以协同:模型的推理过程可以实时指导行动,行动获取的新信息又反过来丰富推理。这种正反馈循环让模型在开放环境中表现出更强的适应和决策能力。
其次,ReAct 提供了更高的可解释性和可控性。这一点对于构建可信任的AI系统至关重要。在ReAct框架下,我们能够记录模型解决问题时每一步的所思所为,这相当于为黑箱的神经网络决策过程提供了一份逐步注解。研究者已经展示了利用这一点进行人类干预和校正的前景:只需人工编辑模型的一两步思考,就能引导模型走向正确的解决路径。未来,这种思路或可发展为人机协作的新范式:人类不再只是给定指令和被动接收结果,而是可以参与模型的决策过程,与模型共同完成任务。这对于提高AI系统的可靠性和符合人类意图的程度具有深远意义。
第三,ReAct 展现出让大模型“零样本学会使用工具”的潜力。通过几条文本示例就能赋予模型调用API、执行操作的能力,这意味着在许多需要外部接口支持的应用场景下,我们或许不必训练专门的模型,只要设计好提示,大模型就能胜任。这大大降低了实现复杂AI行为的门槛。当然,为了让这套方法普及,我们需要解决一些实际挑战,比如上下文窗口限制(推理-行动序列可能很长)以及提示的鲁棒性(模型有时可能偏离预期格式)。近期的研究表明,可以通过在ReAct格式的数据上微调模型来巩固这项能力。论文作者的初步实验显示,用ReAct风格的数据微调后,小规模的模型甚至可以超越未微调的大模型在同一任务上的表现。这暗示未来我们可以训练出内置“边想边做”能力的模型,使其在更广泛场景下发挥作用。
最后,ReAct 诞生仅仅一年多,就已经对社区产生了影响。许多开源的框架(如LangChain等)和后续研究都借鉴了ReAct的思想,为大型语言模型接入各种工具、API提供模板。可以预见,随着模型能力的提升和工具接口的丰富,ReAct范式将成为通用AI代理的重要基础。未来的数字助理、机器人,可能在内部都运行着类似ReAct的机制:它们既能自主推理,又能与外部世界交互,不断校正自己,最终更加可靠地完成我们交给它们的任务。
总而言之,ReAct 将“思考”和“行动”这两种智能要素有机地融合,使语言模型向着更像人类的问题求解者迈进了一大步。它不仅在多个基准任务上取得了优异成绩,也为构建可解释、更强大的AI系统提供了新途径。随着研究的深入,我们有理由期待ReAct在更多领域的应用,以及围绕这一理念出现的改进和创新,为人工智能的发展带来持续的动力。