ReAct:一种将推理与行动相结合的语言模型新范式
大型语言模型(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的顺序)以及推理-行动协同的策略。当提示之后实际提出新问题时,模型就会模仿示例的格式和思路来作答。...