《探索 AI 智能体工作流设计模式》

欢迎关注公众号 柏企阅文

由大语言模型(LLM)驱动的智能体是利用 LLM 进行问题推理、制定可行计划并使用一组工具执行这些计划的系统。简单来说,这些智能体融合了高级推理能力、记忆力和任务执行能力。

基于 LLM 的 AI 智能体工作流设计模式自 2022 年末开始演变,并且一直在不断发展和创新。

一、2022 年 10 月发布的 ReAct 模式

本文首先介绍了 2022 年 10 月发布的 ReAct 模式。这种模式通过整合工具的使用,极大地增强了智能体的能力。

它是关于 LLM 智能体的最早的论文之一。虽然以如今的标准来看可能显得比较基础,但在当时,ChatGPT 尚未发布,教 LLM 使用工具的想法可谓具有开创性。

二、工作流设计模式分类

目前存在众多工作流设计,为了根据其重点进行总结,我们将目前所学的工作流设计模式分为两类:以反思为重点和以规划为重点。

(一)以反思为重点

反思使智能体能够从经验中学习,提高适应性和弹性。这些智能体强调内省和从过去的经验中学习。它们分析之前的行动和结果以改进未来的行为。通过评估自身表现,它们识别错误和成功之处,从而实现持续改进。这种反思过程使智能体能够随着时间的推移调整其策略,从而更有效地解决问题。[LangChain 博客]

  1. 基本反思:从步骤中反思和学习。
  2. 反射(Reflexion):通过强化学习增强智能体的后续步骤。
  3. 树搜索:基于 TOT + 强化学习的反思。
  4. 自我发现:在任务内进行推理。

(二)以规划为重点

规划使智能体能够有条不紊地处理任务,提高效率和效果。这些智能体在采取行动之前优先制定结构化计划。它们将复杂任务分解为可管理的子任务,并按逻辑顺序排列以实现特定目标。通过制定详细计划,这些智能体可以预测潜在挑战并有效分配资源,从而产生更有条理和目标导向的行为。[https://arxiv.org/pdf/2402.02716]

  1. 计划与解决:计划 → 任务列表 → 重新规划。
  2. LLM 编译器:计划 → 并行行动 → 联合执行。
  3. REWOO:计划(包括依赖关系)→ 行动(取决于上一步)。
  4. Storm:搜索大纲 → 搜索大纲中的每个主题 → 总结为长文本。

在审视这些设计模式时,我们将工作流视为协调者。每个节点可以代表一个 LLM 任务、一个函数调用以及其他任务,如检索增强生成(RAG)任务,我们通常将其视为另一种类型的函数调用。这个概念是我们开发自己的智能体的主要驱动力之一。我们将工作流设计为一个灵活的任务协调器,允许开发人员创建各种工作流来解决不同的问题。

三、ReAct 模式详解

ReAct 原则很简单,反映了人类智能的一个核心方面:“由言语推理引导的行动”。在每次行动之后,会有一个内部的“观察”或自我反思:“我刚刚做了什么?我实现目标了吗?”这使智能体能够保留短期记忆。在 ReAct 之前,推理和行动被视为独立的过程。

例如,想象你让某人在你的桌子上找一支笔,并且你给出逐步的指示(类似于思维链提示策略):

  • 首先,检查笔筒。
  • 然后,查看抽屉。
  • 最后,检查电脑显示器后面。

如果没有 ReAct,无论在哪里找到笔,这个人都会执行所有步骤,检查每个位置(行动)。

有了 ReAct,过程会是这样的:

  • 行动 1:首先,检查笔筒;
  • 观察 1:笔筒里没有笔,所以进行下一步;
  • 行动 2:然后,查看抽屉;
  • 观察 2:笔在抽屉里;
  • 行动 3:从抽屉里拿出笔。

在查看了几个开源代码后,让我们关注最简单的一个进行分析。从本质上讲,所有智能体设计模式都围绕着将人类思维和管理策略转化为结构化提示。这些提示引导大型模型进行规划、调用工具执行并通过迭代不断改进其方法。

代码逻辑如下图所示(仔细看):

  • 生成提示:首先,将预定义的 ReAct 提示模板(格式为问题 -> 思考 -> 行动 -> 观察)与用户的问题合并。生成的提示如下所示。

  • 调用大型模型生成思考 + 行动:接下来,将少量示例提示发送给大型模型。如果直接发送,模型会生成思考、行动和观察响应。然而,由于行动尚未完全定义,我们使用 Stop.Observation 阻止模型生成观察,确保它在生成思考和行动后停止。

  • 调用外部工具:一旦获得行动,模型可以调用外部工具。首先,检查行动是否为“完成”。如果不是,模型使用其函数调用功能将行动转换为与 API 兼容的格式。这对模型进行了语言到 API 转换的微调,尽管并非所有大型模型都支持函数调用。
  • 生成观察:在 API 接口返回结果后,将其转换为自然语言输出以生成观察。然后将观察与之前生成的思考和行动一起重新输入模型,重复步骤 2 和 3,直到行动为“完成”。
  • 最终输出:将最终观察转换为自然语言并输出给用户。

由此可见,在特定场景下实现一个智能体需要定制两个关键组件:

  • 提示模板中的少量示例
  • 用于函数调用的外部工具的定义

少量示例本质上反映了结构化的人类思维模式。查看不同设计模式的提示模板是理解智能体设计的好方法。一旦掌握了这种方法,就可以类似地应用于其他设计模式。

四、计划与解决模式

顾名思义,这种设计模式涉及先规划然后执行。如果说 ReAct 更适合于“从桌子上拿笔”这样的任务,那么计划与解决模式则更适合于“制作一杯馥芮白咖啡”这样的任务。你需要进行规划,并且在过程中计划可能会改变(例如,如果你打开冰箱发现没有牛奶,你会在计划中添加“买牛奶”作为新步骤)。

关于提示模板

其架构如下:

  • 规划器:负责使 LLM 生成一个多步计划来完成一项大型任务。在代码中,既有规划器也有重新规划器。规划器负责最初生成计划;重新规划器则在每个单独任务完成后发挥作用,根据当前进度调整计划。因此,重新规划器的提示不仅包括零样本输入,还包括目标、原始计划和已完成步骤的状态。
  • 执行器:接收用户的查询和计划中的步骤,然后调用一个或多个工具来完成任务。

五、其他工作流设计模式

下面我们简要介绍上述列出的其他设计模式。

(一)无观察推理(REWOO)

REWOO(无观察推理)是 ReAct 中观察过程的一种变体。ReAct 遵循的结构是:思考 → 行动 → 观察,而 REWOO 通过移除明确的观察步骤简化了这一过程。相反,它将观察隐式地嵌入到下一个执行单元中。在实践中,下一个执行器会自动观察上一步的结果,简化了流程。

(二)LLM 编译器

在计算机科学中,编译器是指为优化计算效率而对任务进行的编排。原论文中概述的用于并行函数调用的 LLM 编译器背后的概念简单而有效:它旨在通过启用并行函数调用来提高效率。例如,如果用户问:“AWS Glue 和 MWAA 之间的区别是什么?”,编译器会同时搜索 AWS 服务定义并合并结果,而不是按顺序处理每个查询。

(三)基本反思

基本反思可以比作学生(生成器)和教师(反射器)之间的反馈循环。学生完成作业,教师提供反馈,学生根据反馈修改作业,重复这个循环直到任务圆满完成。

(四)反射(Reflexion)

反射(Reflexion)建立在基本反思的基础上,结合了强化学习的原理。在论文《反射:具有言语强化学习的语言智能体》中描述,这种方法超越了简单的反馈。它使用外部数据评估响应,并迫使模型解决任何冗余或遗漏问题,使反思过程更强大,输出更精细。

(五)语言智能体树搜索(LATS)

LATS 在论文《语言智能体树搜索:统一语言模型中的推理、行动和规划》{https://arxiv.org/abs/2310.04406}中有详细介绍。它结合了多种技术,包括树搜索、ReAct 和计划与解决。LATS 使用树搜索来评估结果(借鉴强化学习),同时也整合了反思以实现最优结果。从本质上讲,LATS 可以用以下公式表示:
LATS = 树搜索 + ReAct + 计划与解决 + 反思 + 强化学习。

在提示设计方面,LATS 与早期方法如反思、计划与解决和 ReAct 的差异很小。关键的新增部分是树搜索评估步骤以及在任务上下文中返回这些评估结果。在架构上,LATS 涉及多轮基本反思,有多个生成器和反射器协同工作。

(六)自我发现

自我发现的核心是允许大型模型在更细粒度上进行反思。虽然计划与解决侧重于任务是否需要额外步骤或调整,但自我发现更进一步,鼓励对任务本身进行反思。这涉及评估任务的每个组件以及这些组件的执行情况。

(七)Storm

Storm 在论文《Assisted in Writing Wikipedia-like Articles From Scratch with Large Language Models 》中有所概述,它引入了一种从零开始生成全面文章的工作流,类似于维基百科条目。智能体首先使用外部工具搜索信息并生成大纲。然后,它根据大纲为每个部分生成内容,使过程结构化且高效。