
AI代理释放:比较React和Coact在自主系统中增强问题解决能力
- Rifx.Online
- Machine Learning , AI Applications , AI Research
- 05 Mar, 2025
简介
能够对问题进行推理并对其环境采取行动的 AI 智能体标志着构建更自主系统的重要一步。 传统上,语言模型在“链式思考”提示方面表现出色——本质上是通过文本逐步思考问题——以解决算术、常识问题或符号推理等任务。 然而,在使用链式思考时,该模型完全依赖其内部知识,缺乏与外部世界交互的能力。 另一方面,一些智能体使用语言模型在交互式环境中执行操作(如网络导航、文本游戏或机器人技术),但这些智能体通常会做出反射性行为,而没有深入地推理高级目标或为长期任务保留工作记忆。
这就是 ReAct 和 CoAct 方法发挥作用的地方:
ReAct 是一种开创性的范式,它首先将 AI 的内部推理过程与外部行动交织在一起。 它表明,让语言模型大声思考并在环境中采取行动,比单独执行这两者能更好地解决问题(ReAct:在语言模型中协同推理和行动)。 然而,随着任务变得越来越复杂和冗长,即使是 ReAct 智能体(它使用单个 AI 模型来完成所有事情)也可能在记忆和规划深度方面遇到限制。 CoAct 是一种较新的方法,它通过引入协作的、分层设置来应对这些挑战:CoAct 使用多个智能体,由一个全局规划器引导一个或多个局部执行器,而不是一个智能体完成所有工作(CoAct:自主智能体协作的全局-局部层次结构)。 这种分工受到人类组织复杂项目的启发,并且在长期、复杂的任务上显示出有希望的改进。
在本博客中,我们将详细探讨 ReAct 和 CoAct。我们将讨论每种方法的工作原理、比较它们的推理和行动机制、突出它们的优缺点,并查看揭示其性能的基准。 为了保持趣味性,我们将通过示例来了解这些智能体的实际应用。 最后,您应该清楚地了解为什么这两个智能体框架对 AI 研究人员和工程师来说令人兴奋,以及推理-行动智能体的未来发展方向。
ReAct 概述
ReAct(全称 Reason + Act)是一个框架,它使单个 AI 智能体(通常是一个大型语言模型)能够在环境中将推理与执行动作交织在一起(ReAct: Synergizing Reasoning and Acting in Language Models)。 实际上,ReAct 智能体以循环方式工作:它逐步思考下一步该做什么(以自然语言生成一个推理轨迹),然后根据该推理采取一个动作(如查询数据库、点击按钮或输出答案)。 该动作会产生来自环境的一些观察结果或反馈,智能体可以在下一步对其进行推理。 这个循环会重复,允许智能体将复杂的任务分解为更小的推理-动作步骤,直到它找到解决方案。 关键思想是推理轨迹不会直接改变环境,但有助于模型更新其内部状态或计划,而动作确实会改变外部世界中的某些内容(或查询它)并返回新信息。 通过结合这些,智能体“思考以决定做什么”,然后“做一些事情来告知其思考”,就像人类可能在继续之前进行计划(在脑海中)然后进行实验或查找信息一样。
单个 ReAct 智能体通过迭代推理和执行动作来处理任务,接收来自环境的反馈并更新其思维链。
方法和主要贡献: Yao et al. (2022) 引入了 ReAct 范例,作为一种让大型语言模型解决纯粹推理和纯粹行动都无法很好处理的任务的方法。 从技术上讲,ReAct 通常通过提示来实现:语言模型被提供一个提示格式,其中包含一些示例,这些示例显示了“Thought:”和“Action:”输出交替出现的模式。 例如,模型可能会收到几个示例的提示,其中它首先进行推理(“Thought: 我应该在维基百科上搜索 X…”),然后产生一个动作(“Action: Search[X]”)。 这样,在推理时,模型就知道要重复生成一个思维链和一个动作命令。 ReAct 论文在各种任务上证明了这种方法——从问答和事实核查到基于文本的游戏和网络导航等交互式任务。 ReAct 系统地优于 仅推理(仅思维链)或仅在没有明确推理的情况下采取行动的模型,尤其是在那些同时受益于知识和交互的任务上。 通过让模型在工作时解释其推理,ReAct 还使智能体的决策过程对人类更透明,从而提高了对智能体正在做什么的可解释性和信任度。
实际应用: ReAct 的概念已被证明非常通用。 在知识密集型任务中(例如通过查阅知识库来回答问题),ReAct 智能体可以使用工具,例如搜索引擎或数据库来查找事实,然后对这些事实进行推理以形成答案。 例如,如果被问到一个复杂的问题,ReAct 智能体可能会思考它需要什么(“Thought: 这个问题要求提供一个国家的首都,我应该查找该国家的信息”),然后执行一个动作(“Action: Search[国家名称]”)。 观察结果(搜索结果)反馈到它的下一个想法,依此类推,直到它得出一个有充分支持的答案。 这种即时收集外部信息的能力意味着 ReAct 智能体倾向于比仅依赖其内部知识的智能体产生更准确和最新的答案。 ReAct 也已应用于决策任务和顺序问题。 例如,在基于文本的游戏环境中,ReAct 智能体可以通过推理来规划其行动(“Thought: 门锁着,我需要找一把钥匙…”),然后在游戏中采取行动(“Action: 去厨房找钥匙”),接收一个新的游戏状态,并进行迭代。 研究表明,与不利用语言推理的标准 RL 或规划方法相比,ReAct 提示允许 PaLM(5400 亿个参数)等语言模型在这些交互式环境中实现更高的成功率。
因此,ReAct 的巨大贡献在于协同作用:它将思维链推理的分析能力与工具使用和动作的实用性结合起来。 这带来了一个智能体,它可以在单个统一的模型中动态地制定计划、即时调整计划,并在现实世界中实际执行计划。
CoAct 概述
虽然 ReAct 为单个智能体提供了推理和行动的能力,但 CoAct(我们可以将其理解为协作行动或协同行动)更进一步,引入了一个协同工作的智能体团队。CoAct 由 Hou 等人在 2024 年提出,即*“用于自主智能体协作的全局-局部层次结构”*。CoAct 背后的动机是,通过在专业智能体之间分配工作负载,可以更有效地处理复杂任务:一个智能体在高层次上进行规划,另一个智能体在详细层面上进行执行。这种方法类似于拥有一个项目经理和一个技术人员:经理制定计划,技术人员执行步骤。
CoAct 框架将任务分配给两个智能体:全局规划智能体创建高层计划,并将子任务委托给局部执行智能体,后者与环境交互并在需要时发送反馈以进行重新规划。
方法与方法论: 在 CoAct 中,通常有两个智能体(尽管该框架可以进一步扩展):一个全局规划智能体和一个局部执行智能体。当一个任务进来时,全局规划者的工作是理解任务并将其分解为可管理的子任务或阶段。它为解决问题创建了一种高层次的路线图或计划。例如,如果总体任务是“计划一次旅行并预订所有预订”,全局智能体可能会生成诸如(1)查找航班、(2)预订酒店、(3)预订餐厅等子任务。每个子任务都被描述并传递给局部执行智能体。局部执行智能体在收到子任务后,专注于完成该任务所需的具体行动。它将在环境中采取步骤(例如,点击旅行网站,填写表格)以完成该子任务,同时可能进行自己的小推理以确保其正确地遵循计划。至关重要的是,局部智能体还会向全局智能体提供关于执行情况的反馈。如果子任务成功完成,全局智能体可能会告诉它进入下一阶段。如果出现问题——例如子任务失败或出现意想不到的障碍——局部智能体会报告一个错误或结果,表明失败。然后,全局规划者可以重新评估和重新规划:它可能会调整策略,提出替代子任务,甚至修改任务的顺序。这种反馈循环允许 CoAct 不会陷入单个有缺陷的计划;它可以动态地纠正其路线,这是与 ReAct 的单智能体循环的关键区别。从本质上讲,CoAct 构建了一个推理层次结构:一个智能体进行高层次的战略推理,另一个智能体进行低层次的战术推理,协同工作。
主要贡献: CoAct 框架引入了在层次结构中使用多个基于 LLM 的智能体以获得更好自主性的想法。之前的诸如 ReAct 的方法(以及其他诸如自我反思方法)主要涉及一个处理所有事情的单体智能体,随着任务变得越来越长,这可能会受到 AI 的上下文窗口的限制,并且容易变得困惑或卡住。CoAct 的分层规划从人类组织以及强化学习中的多智能体系统中汲取灵感。通过划分认知劳动,CoAct 可以更可靠地处理长时程任务。在他们的论文中,作者在名为 WebArena 的基准上展示了 CoAct 的有效性,WebArena 是一个复杂的基于 Web 的任务集合(例如,导航网站以完成目标)(GitHub — dxhou/CoAct)。例如,任务包括跨多个网站进行在线购物、填写内容管理表格、导航社交媒体或论坛等等——所有这些都涉及许多步骤和决策。与单智能体方法相比,CoAct 在这些任务上实现了显着更高的成功率。它能够**“在面对失败时重新安排流程轨迹”,这意味着如果某种方法不起作用,全局规划器可以重新组织计划并尝试不同的路径。这种适应性导致了更好的整体性能**,在长序列操作中,在成功完成任务方面,大大优于 ReAct 基线。
因此,CoAct 的贡献在于表明,对于复杂的 AI 任务来说,两个(或更多)头脑可能比一个头脑更好:通过将规划和执行明确地分离到不同的智能体中,我们得到一个 AI 系统,该系统在面对错误时更具鲁棒性,并且能够处理以前对于单个推理-行动循环来说过于具有挑战性的任务。
CoAct 与 ReAct 有何不同?
值得强调的是这两种设计之间的根本区别。ReAct 使用一个同时进行思考和行动的智能体。在每个循环中,该智能体都会决定“这是我的想法……现在这是我的行动”。相比之下,CoAct 引入了一种简单的团队合作形式:一个智能体主要在高层次上思考(规划),另一个智能体主要执行行动和进行执行这些计划所需的低层次思考。CoAct 中的局部智能体仍然使用 LLM,因此它不是盲目地执行——它可以推理子任务,但它只关注该范围。全局智能体可能不会费心于每次点击按钮;它将此委托给局部智能体,并且只关心子任务结果是否适合整体解决方案。这种划分是 CoAct 在非常复杂的任务上具有优势的原因。但是,这也意味着 CoAct 是一个更复杂的系统(您本质上需要运行两个相互对话的 AI 模型),而 ReAct 更简单(一个模型在一个上下文中处理所有事情)。接下来,让我们在各个方面并排比较这些方法。
注意: 如果您来这里是为了了解 React 和 CoAct 的工作原理及其主要区别,那么本概述应该足够了。无需深入研究。但是,如果您有兴趣进行更深入的探索,请随时继续阅读后续部分。
ReAct 和 CoAct 的比较
ReAct 和 CoAct 都旨在创建可以推理和行动的智能体,但它们以不同的方式进行。在本节中,我们将从几个方面比较这两个方面:它们如何处理推理和行动,我们可以如何考虑它们的决策制定公式,它们的优缺点,性能基准以及它们对不同任务的扩展程度。
推理 vs. 行动机制
ReAct: 在 ReAct 智能体中,推理和行动紧密耦合在一个循环中。可以将其想象成一个大脑,在*“思考…”* 和 “行动!” 之间交替。例如,假设任务是通过查找信息来回答问题。一个 ReAct 智能体可能会经历:
- 思考: “嗯,我需要查找关于 X 的信息。让我搜索 X。”
- 行动:
Search[X]
(查询外部资源)。 - 观察: (得到一些结果)。
- 思考: “结果提到了 Y,这可能相关… 我应该查一下。”
- 行动:
Search[Y]
… 依此类推,直到它最终拥有足够的信息,然后可能采取行动Finish[Answer]
来给出最终答案。
从底层来看,这可以被看作是语言模型通过其先前的想法和观察来“提示自己”以决定下一步的行动。ReAct 并没有明确区分规划阶段和执行阶段——规划与这些思考步骤交织在一起。ReAct 中的推理轨迹在其智能体的*自身上下文(记忆)*中被存储,有效地充当了实时的工作记忆。
CoAct: 在 CoAct 中,推理和行动分布在不同的智能体之间。全局规划器执行大部分的高级推理(不直接对环境进行操作),而本地执行器则进行环境交互(以及一些关于执行细节的现场推理)。因此,该机制是分层的:首先,全局智能体产生一个总体计划或下一个子任务(这是宏观层面的推理步骤),然后本地智能体接收该计划并产生一系列行动来实现它(这些行动就像微观层面的操作)。本地智能体可能仍然需要一些推理来精确地决定如何执行子任务,但重要的是,它受到全局智能体提供的计划的指导。执行后,本地智能体可能会说“我完成了这部分,这是发生的事情”或“我遇到了问题”(反馈)。这会触发全局智能体宣布成功或调整后续步骤。本质上,CoAct 的机制是一个双循环系统:一个全局智能体逐个阶段进行规划的外循环,以及一个本地智能体为每个阶段执行行动的内循环。这有点类似于经理如何规划项目阶段,而工人执行每个阶段的任务并报告。
实际差异: 想象这种差异的一种方法是:ReAct 就像一个人独自解决拼图——他们思考一下,移动一下,再次思考,再移动一下。CoAct 就像两个人一起解决拼图——一个人决定“首先,我们应该处理边缘,然后填充中间”,另一个人实际上拿起碎片并将它们组合起来,如果拼图碎片不匹配,他们会告诉规划者,“这块碎片不应该放在这里,也许我们需要一个不同的策略。” CoAct 中的协作增加了开销(智能体之间的通信),但对于棘手的难题可能更有效。ReAct 的单智能体循环对于直接的任务来说更简单,有时也更快,但如果任务需要大的策略转变,它可能会遇到困难(它可能会继续尝试类似的行动或陷入循环)。事实上,研究人员观察到,当单个智能体处理非常复杂的 Web 任务时,会出现诸如观察偏差(智能体会抓住它看到的第一条信息)和行动重复(它会不断执行相同的失败行动)之类的问题。CoAct 的设计通过在全局规划器中设置一个全新的“观察视角”来直接解决这些问题,当执行者报告失败时,它可以退后一步并重新规划。
公式化和理论视角
尽管我们承诺不把事情复杂化,但简要地说明一下如何形式化 ReAct 和 CoAct 之间的区别是值得的:
- ReAct 作为单一策略: 你可以将 ReAct 智能体看作具有一个单一策略 π,该策略将状态(包括到目前为止它所看到和思考的历史)映射到下一个行动。然而,由于智能体也会产生推理文本,因此查看它的一个方法是,该策略的行动空间包括“内部”行动(思考一个想法)和“外部”行动(与环境交互)。在一个简化的数学框架中,在每个时间步 t,智能体都会更新一个轨迹:$(state_t, thought_t, action_t, observation_{t})$ 等等。决定下一步输出什么(一个想法或实际的环境行动)是由同一个模型做出的,该模型试图最大化成功完成任务的机会(可能通过其训练或提示隐式地)。在形式模型中,规划和执行之间没有明确的区分——它都是一个决策序列。这使得 ReAct 策略略显单体,但也很直接:它是一个大的序列决策过程。
- CoAct 作为分层策略: CoAct 可以通过分层强化学习或两层策略的视角来看待。我们有一个高级策略 π_g(全局)和一个低级策略 π_l(本地)。全局策略 π_g 获取整体状态(包括高级目标,可能还有到目前为止的进度总结)并输出一个计划或下一个子任务(称之为 $subtask_i$)。然后,本地策略 π_l 采用*子任务(目标)*和当前环境状态,并输出一系列低级行动 $a_{i1}, a_{i2}, …, a_{in}$,直到该子任务完成(或失败)。如果它失败了,该失败信号将被发送回全局策略,然后全局策略可以更新其计划(即,选择不同的 $subtask_{i}$ 或修改剩余的计划)。形式上,你可以说全局智能体的决策 $subtask = π_g(s)$,本地智能体执行行动直到该子任务终止,产生一些结果状态 $s
$。然后 π\_g 使用 $s
$ 来决定下一个子任务,依此类推。这种层次结构意味着整体策略是半分解的:π_g 和 π_l 针对不同的目的进行训练(或提示)。在 CoAct 的例子中,π_g 和 π_l 都是大型语言模型,可能是相同的基本模型,但针对其角色进行了不同的提示。CoAct 论文没有深入研究新的方程式;相反,它采用了这种在 AI 中已经存在的分层控制概念。新颖之处在于将其应用于基于 LLM 的智能体,并表明它提高了性能。在不涉及方程式的情况下,关键点是:ReAct = 单一控制器,CoAct = 控制器 + 子控制器。这种差异使得 CoAct 可以通过分块规划来覆盖更广的决策范围,而 ReAct 的单一控制器必须自己处理整个决策序列。
优点和缺点
让我们以更直接的方式分解 ReAct 和 CoAct 的优缺点:
- 简单性 vs. 复杂性: ReAct 的优势在于其简单性。 您只需要一个 AI 代理(一个模型流程)和一个提示,引导它在思考和行动之间交替。这使得它更容易实现,并且计算量更小(不需要并行运行两个模型,尽管单个模型每一步要做更多的工作)。 这种简单性也意味着协调中出错的可能性更小——规划者和执行者之间不可能互相误解,因为它们是同一个实体。另一方面,CoAct 更加复杂。 它需要协调两个代理,并可能维护一个用于它们之间通信的协议(本地代理必须报告,全局代理必须生成新的指令等)。 这增加了开销和潜在的故障点(例如,如果本地代理误解了子任务描述怎么办?)。 然而,这种复杂性是专门为了解决更难的问题而设计的。 如果 ReAct 是独奏者,那么 CoAct 就是一个管弦乐队——更难指挥,但对于复杂的作品来说可能更强大。
- 推理深度 vs. 广度: ReAct 代理作为单个模型,具有固定的推理能力。 它以线性序列进行推理,如果序列过长,可能会开始失去跟踪(语言模型有一个上下文窗口限制,并且也可能对非常长的思维链感到困惑)。 CoAct 的分层方法可以通过拆分任务来扩展有效的推理深度。 全局代理可以以粗粒度级别进行推理(“我是否涵盖了任务的所有部分?”),因为它不必记住执行的每一个细节——本地代理一次处理这些细节。 这是 CoAct 的一个优势:它更擅长在长期任务上保持全局一致性。 全局代理本质上在每个阶段都提供了一个新的视角,这可以防止系统陷入重复或不相关的动作(这是单代理方法在长期任务上的一个已知弱点)。 然而,CoAct 的一个潜在弱点是,如果任务不那么复杂,这种两层设置可能矫枉过正——全局代理可能正在进行本地代理无论如何都可以在执行过程中计算出来的规划。 在这种情况下,ReAct 的直接方法就足够了,甚至可能更快,因为它不需要显式的规划步骤。
- 错误处理: ReAct 的一个弱点是它有时会陷入循环或追求错误的假设,而没有一种机制可以轻松重置。 由于推理完全是内部的,如果模型的思维链偏离了轨道,它可能不会意识到这一点,并且没有更高的权威来干预。 CoAct 的设计特意添加了一种纠错机制:如果本地执行遇到障碍,它会明确地将其标记给全局规划器作为“错误”或失败反馈。 然后,全局规划器可以尝试不同的方法。 这使得 CoAct 对故障更具鲁棒性。 事实上,CoAct 框架表明代理可以从错误中恢复,方法是在任务中间重新规划,而单个代理很难优雅地做到这一点。 另一方面是 CoAct 必须检测这些故障并处理它们; 如果任何一个代理未能识别出问题,优势就会丧失。 ReAct 代理也可以在一定程度上处理错误(一个提示良好的 ReAct 代理可能会注意到某个操作不起作用,然后考虑一个替代方案),但这都属于一个思维流,并且可能受到该模型产生幻觉或无法完全回溯自身决策的倾向的限制。
- 透明度和可解释性: ReAct 为代理的思维提供了一个清晰的窗口——您可以看到一个逐步的思考过程。 这对于调试和理解代理为什么做某事很有帮助。 CoAct 也提供了可解释性,但分两层:您可以分别检查全局计划和本地操作序列。 这可能非常有见地(例如,您可以看到计划很好,但执行失败,反之亦然)。 另一方面,协调两层解释可能需要人类观察者解析更多内容。 这两个框架都比端到端黑盒代理更具可解释性,因为它们将推理过程外部化。
- 开发和适应: 从工程师的角度来看,实现 ReAct 代理通常涉及提示工程,并且可能微调模型以遵循 ReAct 格式。 它非常通用:您可以插入不同的工具或 API 作为操作,并且只要您调整提示以显示如何使用这些操作,该模型就可以适应(例如,ReAct 可以通过更改它可以输出的操作从网络浏览代理改编为机器人代理)。 CoAct 较新且更具实验性; 构建 CoAct 代理意味着您需要设计两个代理如何通信(全局代理使用什么格式来描述子任务? 本地代理如何报告结果?)。 它可能需要为每个领域进行更定制的设计。 然而,CoAct 的关注点分离可以使其在团队环境中更具可扩展性——将来,人们可以想象专门针对任务不同方面的代理(不仅仅是两个代理)(一个代理用于视觉,一个用于语言,一个用于规划),而 CoAct 是朝着这个方向迈出的一步。 ReAct 将难以在一个提示中处理太多不同的职责; CoAct 为模块化 AI 系统打开了大门。
总而言之,ReAct 在其简单性和直接性方面很强大,但它可能在非常困难的任务上受到限制。 CoAct 在通过结构和协作来处理复杂性方面很强大,但代价是增加了系统复杂性。 哪个更好可能取决于具体情况:如果任务简短且自包含(例如单个问题解答或简短的网络查找),ReAct 可能就足够了,并且更快。 如果任务是长期、多步的,并且有很多潜在的陷阱(例如复杂的工作流程或多阶段项目),CoAct 的框架通过减少半途而废的可能性而大放异彩。
性能基准
查看经验结果总是有益的。最初的 ReAct 论文和后续研究表明,与非 ReAct 基线相比,ReAct 在各种基准测试中表现出色 (ReAct: Synergizing Reasoning and Acting in Language Models). 例如,在问答基准 (HotpotQA) 和事实核查基准 (FEVER) 中,ReAct 提示实现了更高的准确性,因为代理可以获取证据并对其进行推理,而标准的链式思考(仅使用模型已经“知道”的内容进行推理)则有所不足。在 ALFWorld(基于文本的游戏)和 WebShop(模拟在线购物任务)等交互式环境中,使用大型 LLM 的 ReAct 代理能够实现比甚至在这些任务上接受过训练的某些强化学习代理更好的任务成功率,突出了将推理注入行动策略的力量。这些结果确立了 ReAct 作为一种针对需要知识和交互性的新型问题的最先进方法。
CoAct 是一种较新的方法,可用的基准结果较少,但最初的论文侧重于 WebArena 环境,该环境本质上是一套现实的基于 Web 的任务,旨在测试长时程代理能力 (CoAct: A Global-Local Hierarchy for Autonomous Agent Collaboration). 在 WebArena 中,代理可能需要执行诸如管理在线商店后端 (CMS)、解决 Q&A 论坛(类似 Reddit 的界面)上的问题、使用地图应用程序获取路线或导航 git 存储库界面 (Gitlab) 等任务——这些任务无法仅在两三个步骤内完成;它们可能需要十几个或更多动作以及一些自适应决策。CoAct 在这些任务上与基于 ReAct 的代理(两种情况下都使用 GPT-3.5 作为模型)进行了比较。性能以 成功率 来衡量——基本上是代理在有限的步骤内完成任务目标的频率。ReAct 本身能够完成一些更简单的任务,但在更复杂的任务上遇到了困难,在所有任务中的平均成功率约为 9.4%。CoAct 凭借其全局-局部层次结构,将此成功率平均提高了约 13.8%——这比 ReAct 提高了约 47%。他们还有一个 CoAct 的变体,添加了一个启发式方法来强制停止无限循环,这使成功率提高到 16.0%(比 ReAct 相对提高了 70%)。虽然这些百分比在绝对值上听起来可能很低(即使对于 GPT-3.5 级别的 AI 来说,这些任务也确实很难,即使是浏览不熟悉网站的人类也可能无法 100% 成功),但从 ~9% 到 ~14-16% 的飞跃在 AI 背景下意义重大——它表明 CoAct 的结构化方法让代理解决了许多以前无法通过单代理策略解决的任务实例。特别是,CoAct 擅长于需要不重复错误的任务。例如,如果 ReAct 代理陷入循环,反复点击错误的按钮(动作重复问题),CoAct 的全局规划器会注意到缺乏进展并重定向方法,从而在这些情况下取得更多成功。
同样值得注意的是,CoAct 论文的实验侧重于 Web 导航任务。我们尚未发布 CoAct 在其他领域(如纯 QA 或游戏)上的基准测试。例如,看看 CoAct 的方法是否对冗长的推理难题或多部分问答有所帮助会很有趣——直观地说,它应该有所帮助,但如果单个 LLM 可以处理它,它也可能是不必要的。与此同时,ReAct 已在文献中更广泛的基准测试中进行了测试,并且只要任务涉及中间推理或工具使用,它就会持续显示出优势。
总而言之,ReAct 和 CoAct 都有强大的经验支持。ReAct 通过引入推理+行动在几个任务上设定了性能高点,而 CoAct 通过添加分层规划进一步提高了在非常复杂的多步骤任务上的性能。我们看到的数据表明,对于越来越复杂的任务,CoAct 这种更结构化的方法可以产生明显更好的结果。随着 AI 研究人员推动这些代理做更复杂的事情(如多应用程序工作流程、长对话或多模态任务),我们预计像 CoAct(分层、多代理)这样的框架将在性能方面进一步领先,而 ReAct 仍然是中等复杂任务的出色基线。
可扩展性和适应性
可扩展性可以指几件事:该方法处理不断增加的任务复杂性的能力,它处理更大信息量或更长上下文的能力,以及它适应不同类型的任务或领域的难易程度。我们将针对 ReAct 与 CoAct 分别探讨这些方面:
- 任务复杂度和长度: 如前所述,ReAct 智能体本质上受到一个语言模型上下文和推理能力的限制。随着任务的扩展(例如,解决一个需要 20-30 个步骤的问题或跟踪大量信息),单个模型可能会开始出错。从这个意义上说,CoAct 本质上更具可扩展性,因为全局-局部划分允许系统通过分块来管理更长的任务。这使得 CoAct 在范围方面更具可扩展性。在实验中,CoAct 能够通过部分重新规划来处理长时间的 Web 任务,而这对于可能耗尽上下文窗口或迷失方向的单个智能体来说,扩展性并不好。也有可能将 CoAct 扩展到两个以上的智能体。例如,如果任务具有自然的三级层次结构,则可以想象添加一个中间管理智能体,或者多个局部智能体并行处理不同的子任务(尽管这会带来协调挑战)。ReAct 并没有开箱即用地提供这种灵活性;它是一个模型一次做出一个决策,无法并行或轻松划分(你仍然可以在子问题上独立运行多个 ReAct 智能体,但你就成为手动划分任务的全局规划器)。
- 信息量: ReAct 使用语言模型的上下文来存储其思维链和来自操作的观察结果。这意味着如果它执行了许多操作或看到了大量文本,提示可能会变得非常大,并最终达到限制。CoAct 在上下文方面可以更节省内存,因为全局智能体不需要每个操作的完整细节(它可能会总结或仅跟踪阶段的结果),而局部智能体一次只处理一个阶段。从某种意义上说,CoAct 可以为每个子任务执行重置上下文(每个阶段都可以从一个包含子任务指令和相关信息的全新提示开始,而不是整个历史记录)。这使其适应更大的状态空间。但是,必须仔细设计它,以确保重要信息不会在阶段之间丢失——通常全局智能体充当长期记忆,保留已完成和下一步操作的高级摘要。如果任务在信息复杂性方面进行扩展(例如阅读长文档然后对其进行处理),CoAct 可以分配该工作(一个智能体阅读和总结,另一个使用摘要来操作,等等),而单个 ReAct 模型可能会不堪重负,无法同时容纳整个文档及其推理。
- 对不同任务的适应性: ReAct 和 CoAct 都是通用框架,而不是单任务解决方案。ReAct 已经被广泛采用:对于 AI 可能需要使用工具或执行多步推理的任何场景,都可以应用 ReAct 模式。例如,ReAct 已在 LangChain 和其他库中用作使用工具的智能体的默认方法——你只需定义智能体可以使用哪些操作(工具)(如搜索、计算等),并相应地提示模型。采用 ReAct 提示格式并将其应用于新领域相对容易:只需包含智能体在该领域解决任务的示例,并附带想法和操作,然后就可以开始了。CoAct 作为一个较新的框架,主要在 Web 导航领域得到展示,但这个想法也相当通用。当你的任务自然地分解为子部分时,你将使用 CoAct。例如,可以将 CoAct 应用于机器人场景:让全局智能体规划高级任务(“导航到厨房,然后找到咖啡杯,然后把它给我”),以及局部智能体处理每个片段的低级控制(实际在房间里导航等)。或者在纯文本领域,如果你必须撰写一份研究报告,全局智能体可以概述各部分,而局部智能体可以填写每个部分。调整 CoAct 需要指定如何划分任务以及智能体用来对话的界面。这比调整 ReAct(你主要指定可用的操作)涉及更多。但是,对于许多复杂的任务,提出一个好的分解是解决方案的一部分——CoAct 提供了一种使用 LLM 进行该分解的原则性方法。
- 并行性和多智能体扩展: ReAct 本质上是顺序的(尽管你可以在并行处理的独立问题上运行多个 ReAct 智能体,但一个智能体本身不会分割其工作)。CoAct 为某种并行性打开了大门——在其基本形式中,它仍然是顺序的(规划器然后执行器,然后返回规划器),但可以想象扩展,其中多个局部执行器在单个全局规划器的控制下并行处理不同的子任务。这尚未在文献中得到充分探索,但如果能够管理协调,它具有潜在的可扩展性优势。它反映了在人类组织中,经理可以同时将项目的不同部分委托给不同的团队成员。
总而言之,ReAct 具有高度的适应性,并且对于单个模块来说具有相当的可扩展性,但它最终受到单个智能体性质的限制,无法处理极其复杂的任务。CoAct 专为任务复杂性的可扩展性而设计,虽然适应新任务需要做更多的工作,但它提供了一个可以通过分解来处理更大问题的框架。随着 AI 任务和期望的增长,拥有这种分层智能体可能变得必要,因此 CoAct 代表了一种以结构化方式扩展 AI 问题解决的途径。
示例说明差异
为了使差异更加具体,让我们通过一个说明性示例来演示。 想象一下一个 AI 代理的相当复杂的任务:“在线购买一本特定的书,并在你的日历上安排一个会议,下周讨论它。” 这个任务有两个明确的部分(在线购物和日历安排),并且每个部分都涉及多个步骤。 一个 ReAct 代理与一个 CoAct 代理将如何处理这个问题?
ReAct 代理的方法: ReAct 代理将通过一个单一的推理和行动序列来处理这个问题,而无需事先明确的计划。它可能类似于这样(我们将叙述它的思考-行动序列):
- 思考: “任务是购买一本特定的书,然后安排一个关于它的会议。首先,我应该在线找到这本书。”
- 行动:
Search["<Book Title> buy online"]
– (它搜索这本书)。 - 观察: 它得到一个搜索结果,也许是一个在线书店列出这本书的链接。
- 思考: “我在 BookStore.com 上找到了一个列表。我需要去那里并将这本书添加到购物车。”
- 行动:
OpenPage[BookStore.com/<BookPage>]
– (它点击该书页面的链接)。 - 观察: 页面加载,显示关于这本书的详细信息和一个“添加到购物车”按钮。
- 思考: “现在我应该将这本书添加到购物车。”
- 行动:
Click["Add to Cart"]
– (模拟点击“添加到购物车”按钮)。 - 观察: 网站更新,显示购物车中添加了这本书和一个“结账”按钮。
- 思考: “继续结账。”
- 行动:
Click["Checkout"]
。 - 观察: 它请求付款信息(这本身可能是一个复杂子过程,但让我们假设这已被处理,或者这是一个模拟,其中付款是自动的)。
- 思考: “这本书已购买。接下来,我需要在日历上安排下周的会议来讨论它。”
- 行动:
OpenApp["Calendar"]
– (打开日历应用程序)。 - 观察: 日历界面已打开。
- 思考: “我应该为下周创建一个关于这本书讨论的活动。”
- 行动:
CreateEvent[date="next Monday 10am", title="Discuss <Book Title>"]
。 - 观察: 该活动已在日历中创建。
- 思考: “完成。我已经购买了这本书并安排了会议。”
- 行动:
Finish["Book purchased and meeting scheduled."]
– (输出最终确认)。
请注意,ReAct 代理在进行过程中会确定下一步。 它没有预先计划它会先购物,然后安排日历; 它通过其思维链隐式地决定这样做。 如果发生意外情况——比如这本书缺货——代理将不得不通过额外的思考和行动(例如,搜索另一家商店)来即时处理它。 但所有这些仍然是一个持续的思考→行动→观察→思考→行动……直到完成的流程。 推理(思考)可能包含代理的隐式子目标(“首先做这个,然后做那个”),但它没有外部结构。
CoAct 代理的方法: 现在考虑一个 CoAct 代理处理相同的任务。 我们有一个全局规划器代理和一个本地执行器代理。 交互可能如下所示:
- 全局规划器接收任务“在线购买一本特定的书,并安排一个会议,下周讨论它。” 它会思考大局并制定一个计划:也许它会确定两个主要阶段——阶段 1:购买这本书,阶段 2:安排会议。 它甚至可以将阶段 1 细化为子步骤,例如“a) 在网上商店找到这本书,b) 购买它”,并将阶段 2 细化为“a) 打开日历,b) 创建会议活动。” 然后,全局代理将第一个子任务传达给本地代理:“找到并购买
<Book Title>
在线。” - 本地执行器现在接受子任务“找到并在线购买这本书”并开始行动。 它很可能会经历与 ReAct 代理在该部分所经历的类似的低级步骤序列:搜索这本书,点击商店,添加到购物车,结账。 区别在于,本地代理只专注于这个子任务。 它目前根本不担心会议安排。 假设在此过程中,本地代理遇到了一个问题:它尝试的第一个商店说“缺货”。 然后,本地代理可以向全局规划器报告:“尝试了商店 A,书缺货。” 这是反馈。
- 在收到此反馈后,全局规划器可能会重新规划:“商店 A 缺货。 让我们尝试另一家零售商。” 然后,它指示本地代理执行调整后的子任务:“尝试从另一个网站购买
<Book Title>
。” - 本地执行器执行新计划,也许会转到另一个网站,并这次成功购买了这本书。 然后它向全局代理报告:“书籍购买成功。”
- 现在,全局规划器知道阶段 1 已经完成。 它继续执行其计划的阶段 2:它告诉本地代理,“安排下周的日历会议来讨论这本书。”
- 本地执行器将上下文切换到日历任务(它可能会打开日历应用程序,按照指示创建活动)。 如果一切顺利,它会报告“会议安排在 [日期/时间]。” 如果存在问题(例如日历服务停机),它将报告该问题,全局代理可以考虑另一种方案(也许通过不同的日历安排或在其他地方设置提醒)。
- 一旦所有阶段完成,全局代理可能会编译最终结果,或者简单地得出任务已完成的结论。 最终输出可能是这样的:“成功购买了这本书,并在 [日期] 安排了会议。”
在这种 CoAct 场景中,关于“先购物,然后安排日历”的推理由全局代理预先明确处理。 本地代理不需要计划该序列; 它被告知先购物。 这使得本地代理的工作更容易(它只专注于购物行为)。 全局代理摆脱了点击“添加到购物车”的细节,可以监控高级进度。 如果购物子任务由于任何原因失败,全局代理就有机会决定不同的路线(也许选择不同的商店,或者决定通知用户失败并在购买这本书被证明不可能的情况下跳过会议安排)。 相比之下,ReAct 代理在相同的故障下可能只是继续在同一站点上尝试不同的操作或感到困惑。 CoAct 提供了一个明确的断点来表示“这种方法失败了,让我们重新思考。”
这个例子是假设性的,但它捕捉了两个代理在多步、多目标任务上的差异。 在更简单的任务中(想象一下单独“购买一本书”或单独“安排会议”),你可能不会看到很大的差异——ReAct 可以处理它,而 CoAct 的额外规划器似乎有点过分。 但是,随着任务复杂性的增加(多个阶段,可能需要回溯),CoAct 的结构化方法变得非常有用。
另一个快速的例子:考虑在线排除技术问题(找出你的代码出错的原因
ReAct vs. CoAct:两种LLM Agent架构的比较
在当今的LLM(大型语言模型)领域,Agent架构的设计对于提升模型解决复杂问题的能力至关重要。ReAct和CoAct是两种备受关注的Agent架构,它们在处理任务的方式上有着显著差异。
ReAct Agent
ReAct Agent的核心在于**“行动-思考-行动”**的循环。这种架构允许Agent在采取行动之前,先进行思考,从而更好地理解当前状态和目标。
-
特点:
- 迭代式: ReAct Agent以迭代的方式解决问题,每次循环都包括观察、思考和行动。
- 灵活性: 这种架构赋予Agent在执行过程中根据反馈调整策略的能力。
- 适用性: 适用于需要探索和试错的场景。
-
流程:
- 观察: Agent观察当前环境,获取相关信息。
- 思考: Agent基于观察到的信息,进行推理和思考,制定行动计划。
- 行动: Agent执行行动,改变环境。
CoAct Agent
CoAct Agent则侧重于协作和任务分解。这种架构将复杂任务分解为多个子任务,并由不同的Agent或模块协同完成。
-
特点:
- 任务分解: CoAct Agent擅长将复杂任务分解为更小的、可管理的子任务。
- 协作: 不同的Agent或模块可以并行或串行地执行子任务,实现协作。
- 规划性: 这种架构更强调任务的规划和组织。
-
流程:
- 任务分解: 将大任务分解为子任务。
- 子任务执行: 不同的Agent或模块执行子任务。
- 结果整合: 将子任务的结果整合起来,完成最终目标。
ReAct和CoAct的对比
为了更好地理解ReAct和CoAct之间的差异,我们可以通过一个具体的例子进行对比。假设一个Agent需要解决一个软件错误。
- ReAct Agent: ReAct Agent可能会搜索错误消息,阅读论坛,并以线性的方式尝试解决方案。
- CoAct Agent: CoAct Agent可能会将任务分解为“诊断问题”和“应用修复”两个阶段,如果第一个修复失败,甚至可能分支到多个尝试。在这种情况下,全局规划器可能会决定依次尝试一系列可能的修复方案(每个方案作为局部Agent的子任务),而ReAct Agent则可能将诊断和修复尝试纠缠在一个链条中,并可能偏离主题。
这些场景突出了ReAct通常像一个 直觉的解题者 — 它一步一步地进行,这在大多数情况下都有效 — 而CoAct就像一个 战略问题管理者 — 它规划出一个行动方案并更明确地处理意外情况。两者最终都可以解决问题,但它们实现目标的方式以及处理障碍的方式可能大相径庭。
结论
ReAct 和 CoAct 代表了能够推理和行动的 AI 智能体设计的两个演进步骤。ReAct 带来了强大的理念,即 AI 不必仅仅是思考者或行动者,它可以两者兼顾。通过将链式思考推理与行动执行合并到一个循环中,ReAct 智能体能够处理静态 QA 系统或盲目行动的机器人以前无法完成的任务。我们看到,ReAct 的简单性和通用性使其成为许多应用的首选方法,从使用工具回答复杂问题,到玩基于文本的游戏,再到与网站交互。它以类似人类的方式平衡推理和行动,这不仅提高了性能,还为我们提供了 AI 做出决定的可解释轨迹 (ReAct: Synergizing Reasoning and Acting in Language Models)。
CoAct 在此基础上构建,解决了单个推理循环不足时出现的挑战。通过引入全局规划器和局部执行器的结构化层次结构,CoAct 智能体可以更可靠地处理更长、更复杂的任务。这种关注点分离意味着智能体既能看到森林,也能看到树木:全局智能体牢记大局,而局部智能体则一次处理细节 (CoAct: A Global-Local Hierarchy for Autonomous Agent Collaboration)。这种设计在涉及许多步骤、分支或需要从错误中恢复的场景中展示了明显的优势,这已通过在长期 Web 任务中提高成功率得到证实。从本质上讲,CoAct 正在向人类解决复杂问题的方式——通过委派、专业化和沟通——靠拢,但所有这些都在 AI 框架内进行。
对于研究人员和工程师来说,在 ReAct 和 CoAct(或类似框架)之间的选择可能取决于手头任务的要求。如果您需要一个简单、单一智能体的解决方案,并且任务不太复杂,ReAct 是一种经过验证的方法,它在保持简单性的同时,又能获得动态推理和行动的好处。如果您正在尝试解决让单个智能体束手无策的任务(例如,一个需要数小时工作或需要处理大量子目标的 AI 工作流程),那么投资于 CoAct 风格的架构可能会带来更好的性能和清晰度。也可以混合使用这些想法——例如,全局规划器本身可以是一个 ReAct 智能体(进行一些推理和行动来决定一个计划),反之亦然。该领域发展迅速,我们很可能会看到更多复合智能体架构。诸如 Tree-of-Thought、Self-Refine 和多智能体协作等方法正在积极研究中,以进一步增强推理能力(其中一些甚至与 CoAct 一起被引用。未来可能涉及的智能体不仅可以规划和执行,还可以与其他智能体协商、反思自己的错误,或者随着时间的推移学习和改进其策略。
总之,ReAct 和 CoAct 是通往更自主和智能的 AI 智能体道路上的令人兴奋的里程碑。ReAct 表明,思考和行动之间的协同作用是强大的。CoAct 表明,划分认知劳动可以克服新的挑战。我们看到的叙事与人类组织策略的演进相似,现在在 AI 中得到了反映:首先,一个聪明的个体可以做很多事情;但随后,一个协调的团队可以做得更多。展望未来,这些智能体的潜力是巨大的——从可以为您处理复杂任务的个人数字助理,到管理企业工作流程的 AI 系统,再到协调实现物理目标的机器人。通过在扎实的推理和有效的行动之间保持平衡,并适当地构建这些能力,我们正在逐步接近能够在开放的现实世界环境中真正运作的 AI。旅程才刚刚开始,而 ReAct 和 CoAct 等框架正在为我们指明道路。
参考文献
[## 2. CoAct: A Global-Local Hierarchy for Autonomous Agent Collaboration
Xinming HouZhaopeng Tu 1,2 Mingming Yang 2 Wenxiang Jiao 2 Xing Wang 2 2 Wayne Xin Zhao 1 1 Gaoling School of…
arxiv.org](https://arxiv.org/html/2406.13381v1#bib.bib11)
[## 3. ReAct: Synergizing Reasoning and Acting in Language Models
Posted by Shunyu Yao, Student Researcher, and Yuan Cao, Research Scientist, Google Research, Brain Team Recent advances…
[## 4. ReAct Prompting | Prompt Engineering Guide
A Comprehensive Overview of Prompt Engineering
www.promptingguide.ai](https://www.promptingguide.ai/techniques/react)
[## 5. GitHub — dxhou/CoAct
Contribute to dxhou/CoAct development by creating an account on GitHub.
github.com](https://github.com/dxhou/CoAct)