Autonomous Agents & Agent Simulations

自主代理 & 代理模拟

7 分钟阅读

在过去的两个星期里,以代理方式使用 LLM 的情况大幅增加。具体来说,像 AutoGPT, BabyAGI, CAMEL, 和 生成式代理 这样的项目涌现出来。LangChain 社区现在已经在 LangChain 框架中实现了所有这些项目的部分功能。在研究和实现这些项目的过程中,我们试图最好地理解它们之间的区别,以及每个项目的新颖之处。这篇博客是对我们所学到的知识的解释。

注意:这是一篇相当技术性的博客。它假设读者对 LangChain 和这些相关项目有一定的了解。如果您不熟悉这些项目,阅读一篇更入门的文章可能会有所帮助(例如 Sophia Yang 的 这篇精彩文章)。

TL;DR(太长不看)

  • 自主代理”项目(BabyAGI、AutoGPT)主要因其长期目标而具有新颖性,这需要新型的规划技术和不同的内存使用方式。
  • 代理模拟”项目(CAMEL、生成式代理)主要因其模拟环境和反映事件并根据事件进行调整的长期记忆而具有新颖性。

我们还将讨论我们在 LangChain 框架中复制了每个项目的哪些部分,以及我们选择这些部分的原因。在 LangChain 框架中实现这些功能具有以下优点:

背景

首先,让我们从一些背景知识开始。什么是“代理”,为什么它们很重要?在本次讨论中,我们将使用 LangChain 的术语,尽管值得注意的是,这个领域非常新,还没有超级标准的术语。

代理通常指的是使用语言模型作为推理引擎,并将其连接到两个关键组件:工具和记忆的概念。

工具帮助 LLM 连接到其他数据或计算来源。工具的示例包括搜索引擎、API 和其他数据存储。工具很有用,因为 LLM 只了解它们训练的内容。这些知识可能很快就会过时。为了克服这些限制,工具可以获取最新的数据,并将其作为上下文插入到提示中。工具也可以用于执行操作(例如,运行代码、修改文件等),然后 LLM 可以观察到该操作的结果,并将其纳入其下一步行动的决策中。

记忆帮助代理记住之前的交互。这些交互可以是与其他实体(人类或其他代理)或与工具进行的。这些记忆可以是短期的(例如,最近 5 次工具使用的列表)或长期的(过去与当前情况最相似的工具使用)。

在 LangChain 中,我们将“代理”称为决定采取哪些行动的 LLM;“工具”是代理可以采取的行动;“记忆”是提取先前事件的行为;而 AgentExecutor 是在 while 循环中运行代理直到满足某些停止标准的逻辑。

典型的 LangChain 代理基于 Yao 等人在 2022 年 11 月提出的 推理和行动(ReAct)框架。这种方法的特点是以下算法:

  1. 用户给代理一个任务
  2. 思考:代理“思考”要做什么
  3. 行动/行动输入:代理决定要采取什么行动(即要使用什么工具)以及该工具的输入应该是什么
  4. 观察:工具的输出
  5. 重复步骤 2-4,直到代理“认为”它已完成

在讨论其他实现和框架时,我们将把它们与此算法进行比较。

AutoGPT

链接

这个项目的新颖之处是什么?

AutoGPT 项目与传统 LangChain 代理之间的主要区别可以归因于不同的目标。在 AutoGPT 中,目标通常更开放且运行时间更长。这意味着 AutoGPT 具有不同的 AgentExecutor 和不同的内存处理方式(两者都针对长时间运行的任务进行了优化)。以前,LangChain 中代理的内存有两种形式:

  • 代理步骤的记忆:这是通过保留与该任务相关的中间代理步骤列表,并将完整列表传递给 LLM 调用来完成的
  • 系统的记忆:这记住了最终的输入和输出(但忘记了中间代理步骤)

由于 AutoGPT 运行时间更长,因此将完整的代理步骤列表传递给 LLM 调用不再可行。相反,AutoGPT 添加了基于检索的内存来处理中间代理步骤。在底层,这种基于检索的内存正在使用向量数据库对嵌入进行语义搜索。请注意,LangChain 具有这种类型的基于检索的内存,但以前它应用于用户-代理交互,而不是 代理-工具 交互。

我们是如何将其融入 LangChain 的?

我们将其版本添加到了 langchain.experimental 中 - 在这里我们放置更多实验性和更新的代码,同时我们也在研究适当的抽象。具体来说,我们已经实现了所使用的提示模板逻辑,以及用于运行代理的 while 循环。我们使其与 LangChain LLM 包装器、LangChain 向量数据库和 LangChain 工具兼容。

我们还创建了 这个 笔记本,展示了如何使用它。

BabyAGI

链接

这个项目的新颖之处是什么?

BabyAGI 项目在以下方面与传统的 LangChain 代理不同:

  • 与 AutoGPT 类似,它将基于检索的记忆应用于中间代理-工具步骤。
  • 它具有单独的计划和执行步骤,它一次计划一系列操作(而不仅仅是下一个操作)

与 AutoGPT 类似,BabyAGI 专为更长时间运行的任务而设计,这导致了这两个差异。

让我们扩展第二点,因为这是更重要和实质性的区别之一。在传统的 LangChain 代理框架(和 AutoGPT 框架)中,代理一次思考一步。对于给定的世界状态,它会考虑其下一个直接行动应该是什么,然后执行该行动。

BabyAGI 的不同之处在于它显式地计划了一系列操作。然后它执行第一个操作,然后使用该操作的结果进行另一个计划步骤并更新其任务列表。我们的直觉是,这使其能够更好地执行更复杂和涉及的任务,通过使用计划步骤基本上作为状态跟踪系统。我们(非正式地)观察到,对于需要多个步骤的任务,传统的 LangChain 代理有时会在几个步骤后忘记其原始目标,因此提前计划所有步骤可能是有益的。

我们是如何将其融入 LangChain 的?

与 AutoGPT 类似,我们将其添加到了 langchain.experimental 中。具体来说,我们已经实现了所使用的提示模板逻辑,以及用于运行代理的 while 循环。我们使其与 LangChain LLM 包装器、LangChain 向量数据库和 LangChain 工具兼容。

Camel

链接

这个项目的新颖之处是什么?

这个项目的主要新颖之处在于采用两个代理,每个代理都有自己的个性,并让他们相互聊天。从这个意义上讲,有两个新颖的组成部分:让两个代理以协作方式相互交互的想法,以及特定的模拟环境。

两个代理交互的想法并非完全新鲜。鉴于 LangChain 的模块化特性,我们长期以来一直提倡让代理使用其他代理作为工具。然而,这种交互类型的新颖之处在于,这两个代理被定位为平等的 - 在以前的 LangChain 实现中,总是有一个代理将另一个代理作为工具调用,采用 “堆叠” 方法。将两个代理置于平等地位,而不是让一个代理将另一个代理用作工具的想法,引起了人们对观察涌现行为的特别兴趣。

请注意,这些代理可以使用不同的工具,并且可以围绕这些工具进行专门化。例如,您可以拥有一个配备编码所需工具的代理,另一个配备与 Linear 等交互所需工具的代理。因此,仍然有可能实现“堆叠”效果(您有不同的代理负责不同的事情)。

第二个新颖的组成部分是特定的模拟环境。这是一个双边对话,并不是非常复杂,但仍然是我们见过的在研究环境中首次实现的例子。

我们是如何将其融入 LangChain 的?

我们添加了一个笔记本,主要反映了模拟环境(让两个代理相互聊天)。我们将来可能会考虑使这种模拟环境更容易开箱即用。

生成式代理

链接

这个项目的新颖之处是什么?

这个项目有两个新颖(且相当复杂)的方面。第一个是模拟环境,它由 25 个不同的代理组成。这似乎相当具体且非常复杂,因此我们没有深入研究太多。另一个新颖的方面是他们为这些代理创建的长期记忆

我们本周早些时候对此进行了深入探讨。代理的记忆由以下部分组成:

  1. 重要性反思步骤,为每个观察赋予重要性评分。该评分可用于后续检索,以获取特别重要的记忆并忽略基本记忆
  2. 反思步骤,以“暂停”并思考代理已学到的概括。然后可以将这些反思与正常记忆一起检索。此反思步骤可以用于压缩信息并观察最近记忆中的模式
  3. 一个检索器,它结合了时效性、与情况的相关性和重要性。这可以允许浮现与手头情况相似、发生在不久之前且特别重要的记忆。所有这些似乎都是自然反映我们人类如何“检索”记忆的属性

所有这些记忆组件都相当新颖,并且对我们来说非常令人兴奋。

我们是如何将其融入 LangChain 的?

检索器逻辑似乎具有通用性,因此我们将其添加为 TimeWeightedVectorStoreRetriever

我们添加了一个 笔记本,展示了如何使用反思步骤 + 新的检索器来复制论文中描述的部分设置。

模拟环境似乎很复杂且不具有通用性,因此我们没有在那里做任何事情。

结论

所有这些项目都理所当然地受到了很多关注。我们将它们视为两个独立的类别:

  • 自主代理,它们具有改进的规划能力
  • 代理模拟,它们具有新颖的模拟环境和复杂、不断发展的记忆

我们很高兴已经开始在 LangChain 生态系统中实现这些项目的部分功能,并期待看到社区如何使用这些功能、添加这些功能以及组合这些功能 🙂