分享

大模型Agent设计原理(1)— 基于大语言模型的规划

 黄爸爸好 2024-05-13 发布于上海

前言

虽然上下文学习和思维链提示方法形式上较为简洁且较为通用,但是在面对诸如几何数学求解、游戏、代码编程以及日常生活任务等复杂任务时仍然表现不佳。为了解决这类复杂任务,可以使用基于大语言模型的规划(Planning)。该方法的核心思想在于将复杂任务分解为若干相关联的子任务,并围绕这些子任务制定包含一系列执行动作(Action)的解决方案,从而将复杂任务的求解转换为一系列更为简单的子任务依次求解,进而简化了任务难度。本文将介绍基于大语言模型的规划方法,这也是后续大语言模型智能体的技术基础。

整体框架

基于大语言模型的规划方法主要由三个组件构成,包括任务规划器(Task Planner)、规划执行器(Plan Executor)以及环境(Environment)。具体来说,大语言模型作为任务规划器,其主要职责是生成目标任务的解决方案。该方案包含一系列执行动作,每个动作通过合适的形式进行表达,例如自然语言描述或代码片段。对于长期任务,任务规划器还可以引入存储机制,用于解决方案与中间执行结果的存储与检索。规划执行器则负责执行解决方案中所涉及到的动作。根据任务性质的不同,规划执行器可以由大语言模型实现,也可以由执行具体物理任务的实体(如机器人)来实现。环境是规划执行器实施动作的具体场景,不同任务对应着不同的执行环境,例如 Web 互联网或像 Minecraft 这样的外部虚拟世界。

图片

Agent架构

在解决复杂任务时,任务规划器首先规划解决方案,既可以一次性生成包含所有子步骤的详尽动作序列,也可以迭代地生成下一步骤所需执行的动作。然后,规划执行器在环境中执行解决方案中所涉及到的动作,并由环境向任务规划器提供反馈信息。任务规划器可以进一步利用这些反馈信息来优化或继续推进当前的解决方案,并通过迭代上述过程完善任务解决方案。下面将详细介绍这两个关键步骤。

方案生成

方案生成主要是基于大语言模型的综合理解与推理能力,通过合适的提示让大语言模型生成目标任务的解决方案。一般来说,解决方案(或者其中包含的中间步骤)可以采用自然语言表达或者代码表达的形式。自然语言的形式较为直观,但由于自然语言的多样性与局限性,不能保证动作被完全正确执行,而代码形式则较为严谨规范,可以使用外部工具如代码解释器等保证动作被正确执行。下图对比展示了采用自然语言表达和代码表达的执行方案。在现有的研究中,任务规划器主要采用两种规划方法:一次性的方案生成和迭代式的方案生成。具体来说,一次性方案生成方法要求任务规划器直接生成完整的解决方案(包含所有子步骤的详尽动作序列),这一方法实现较为简单,但是容错性较低,一旦中间某个步骤出错,就容易导致最终执行结果出错。而迭代式方案生成方法则通过与环境进行交互,逐步地生成下一步动作计划,能够根据环境反馈对中间执行步骤进行修正与调整。下面具体介绍一次性方案生成和迭代式方案生成这两类方法。

图片

方案生成

一次性方案生成

这种方法通过特殊设计的提示方法让大语言模型一次性生成完整的解决方案,生成的方案通常包含一系列供规划执行器执行的动作描述。例如,可以在提示中加入如“*Let’s break down this problem.*”这样的指令,并通过上下文学习的方式提示大语言模型生成目标任务的解决方案。上图 (a) 展示了一个提示询问大语言模型如何制作番茄炒蛋的例子。可以看到,针对这个问题,大语言模型生成了对应的解决方案,并将执行步骤序列表达为自然语言文本形式。此外,还可以使用代码表达的形式来表示具体的执行方案。上图 (b) 所示,输入一个编程问题及对应的提示给大语言模型,大语言模型生成了一个基于代码表达的解决方案。

在实际应用时,需要根据任务特性来选择具体的规划方案形式。一般来说,如果待解决任务需要较强的推理逻辑或数值计算能力,则推荐使用基于代码表达的方案生成。如果待解决任务的形式不固定、难以进行形式化表达,如多跳问答、信息检索或推荐任务,则推荐使用基于自然语言的表达。这一建议对于下面介绍的迭代式动作生成方法同样适用。

迭代式方案生成

在这一类方法中,大语言模型基于历史动作和当前环境的反馈逐步规划下一步的执行动作。一个具有代表性的方法是 ReAct,其核心动机是在让大语言模型在规划动作时模拟人类“先思考*-*再决策”的行为方式。具体来说,该方法首先通过提示让大语言模型思考当前状态下应该采取何种决策,并生成决策理由与相应的执行动作。然后,规划执行器在外部环境中执行动作并将交互信息反馈给任务规划器,然后由任务规划器基于反馈信息生成下一步的决策理由与执行动作。任务规划器通过迭代上述过程,逐步思考并生成新的动作,直至解决任务。但是,在上述过程中,如果某一步动作不是最优解或出现错误,任务规划器也只能继续向前规划直至结束,最终可能导致整个方案只能获得次优结果甚至失败。为了缓解这一问题,可以使用回溯策略(Back-tracing)让任务规划器回退到上一步所对应的状态,从而通过探索其他执行动作来优化最终的解决方案。思维树就采用了类似的回溯策略。

下图展示了 ReAct 解决多跳问答任务的提示设计和完整规划过程。具体来说,在每一步动作规划时,任务规划器基于历史动作及其反馈生成下一步的决策思考和相应的动作,然后规划执行器执行下一步动作并从环境中获得相应的反馈,重复上述过程直至解决问题。例如,在第二步动作规划时,任务规划器基于“动作 1”(搜索“Grown-Ups”的相关信息)和“反馈 1”(“Grown-Ups”的相关信息)生成了下一步的“思考 2”(理解“Grown-Ups”的相关信息)和“动作 2”(搜索“Allo Allo!”的相关信息),然后规划执行器执行“动作 2”,并获得“反馈 2”(“AlloAllo!”的相关信息)。

图片

反馈获取

在任务规划器生成完整的解决方案或下一步动作后,规划执行器在环境中执行对应的动作。在执行动作后,规划执行器会将环境的反馈信号传递任务规划器。这些反馈信号可以用于完善整体解决方案或规划下一步动作。根据任务规划器与环境之间的交互方式,环境反馈可以分为两类,包括外部反馈和内部反馈,下面进行具体介绍。

外部反馈

外部对象可以为任务规划器提供重要的反馈信号。这里以物理工具、人类以及虚拟环境这三种外部对象为例,对他们所提供的反馈信号进行介绍。首先,物理工具,如代码解释器等,在编程或数学任务的解决过程中起到了关键的作用。它们可以直接执行基于代码形式的解决方案或动作,并能够将执行结果反馈给任务规划器,帮助其进行规划改进。例如,当代码执行出现错误时,解释器会迅速将错误信息反馈给任务规划器,使其能够及时修正后续的方案生成。其次,在具身智能场景中,人类成为了任务规划器获取反馈的重要来源。当机器人在物理世界中与人类进行交互时,人类能够根据机器人的询问或动作,提供关于物理世界的实时信息。这些信息对于任务规划器来说至关重要,因为它们能够帮助机器人更好地感知和理解周围的环境。例如,当机器人执行动作“走到抽屉前并询问当前抽屉是否打开?”,人类可以反馈抽屉的实时状态,帮助任务规划器更好地感知和理解物理世界。最后,在游戏领域,虚拟环境能够为任务规划器提供实时的动作执行反馈,从而协助其更加高效地完成后续的游戏任务。

内部反馈

除了外部反馈,大语言模型本身也能够对任务规划器提供反馈信息。首先,大语言模型可以直接判断当前动作是否规划正确。具体来说,可以将历史动作序列以及对应的反馈输入给大语言模型,通过使用类似“*Is the current action step being**taken correct or not?*”的指令,让大语言模型检查当前动作的正确性,并给出反馈结果。在得到完整的解决方案后,规划执行器可以在环境中执行该方案,并且获得相应的外部反馈信息。通常来说,这些外部反馈所传达的信息相对有限,例如只是简单地示意了执行结果错误或异常等。

为了更好地理解执行结果的背后原因,大语言模型可以将简单的环境反馈(例如成功或失败)转换为信息量更为丰富的、自然语言表达的总结反思,帮助任务规划器重新生成改进的解决方案。一个代表性的工作是 Reflexion,该方法旨在借助大语言模型的分析与推理能力,对于当前方案的执行结果给出具体的反思结果,用于改进已有的解决方案。在实现中,需要在提示里包含已执行的任务方案及其环境反馈,还可能需要引入相关的上下文示例。上图 展示了 Reflexion 方法在多跳问答任务中的应用。具体来说,首先将上一轮解决方案及其反馈输入给任务规划器生成反思(如“反思 1”)。然后,将上一轮解决方案、反馈和反思输入给任务规划器,重新生成新一轮的解决方案,以此类推,直至得到成功的反馈。可以看到,在加入“反思 1”后,模型在第二轮第二步动作规划时,将第一轮第二步动作(搜索“Allo Allo!”的相关信息)修正为新的“动作 2”(搜索“Sam Kelly”的相关信息)。

总结

基于大语言模型的规划框架通过智能分解任务、灵活生成并执行动作,以及有效利用内外部反馈,显著提升了处理复杂问题的能力。迭代式规划与反思机制的融入,使得模型能在动态环境中适应性学习,不断优化策略直至达成目标,为构建更强大、泛用性更高的AI系统奠定了基础。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多