跳到正文
LangChain:Blog·· 2023-04-19精选AI 评分64

LangChain 解析 AutoGPT、BabyAGI、CAMEL、Generative Agents 四个 Agent 项目

Autonomous Agents & Agent Simulations

AI 导读

LangChain 发布技术博客,对比近两周流行的 AutoGPT、BabyAGI、CAMEL 和 Generative Agents 四个 Agent 项目,将其分为自主智能体与智能体模拟两类。

推荐理由

原文对比 AutoGPT、BabyAGI、CAMEL 等项目的新颖点,并说明 LangChain 已复刻哪些部分,读者可据此了解各框架差异与可复用实现。

正文 · AI 翻译

在过去两周里,以代理方式使用 LLM 的情况大幅增加。具体来说,像 AutoGPT、BabyAGI、CAMEL 和 Generative Agents 这样的项目纷纷涌现。LangChain 社区现在已经将这些项目的部分内容实现到了 LangChain 框架中。在研究和实现这些项目的过程中,我们尽力理解它们之间的差异以及各自的新颖之处。这篇博客就是对我们所学内容的解释。

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

TL;DR:

  • “自主代理”项目(BabyAGI、AutoGPT)的新颖之处主要在于其长期目标,这需要新型规划技术和不同的记忆使用方式。
  • “代理模拟”项目(CAMEL、Generative Agents)的新颖之处主要在于其模拟环境和能够根据事件进行反映与调整的长期记忆。

我们还讨论了我们在 LangChain 框架中复现了每个项目的哪些部分,以及为什么选择这些部分。在 LangChain 框架中实现这些内容有以下好处:

背景

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

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

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

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

在 LangChain 中,我们将“Agent”称为决定采取什么行动的 LLM;将“Tools”称为 Agent 可以采取的行动;将“Memory”称为引入先前事件的行为,而 AgentExecutor 则是在 while 循环中运行 Agent 直到满足某些停止条件的逻辑。

典型的 LangChain Agent 基于 Yao 等人在 2022 年 11 月提出的 Reasoning and Acting (ReAct) 框架。这种方法的特点在于以下算法:

  1. 用户给 agent 一个任务
  2. Thought:agent“思考”该做什么
  3. Action/Action Input:agent 决定采取什么行动(即使用什么工具)以及该工具的输入应该是什么
  4. Observation:工具的输出
  5. 重复步骤 2-4,直到 Agent“认为”自己完成了

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

AutoGPT

链接:

这个项目有什么新颖之处?

AutoGPT 项目与传统 LangChain agent 之间的主要差异可以归因于不同的目标。在 AutoGPT 中,目标通常更加开放且运行时间更长。这意味着 AutoGPT 拥有不同的 AgentExecutor 和不同的记忆方式(两者都针对长时间运行的任务进行了更多优化)。此前,LangChain 中 agent 的记忆有两种形式:

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

由于 AutoGPT 运行时间更长,将完整的 agent 步骤列表传递给 LLM 调用不再可行。相反,AutoGPT 在中间 agent 步骤之上添加了基于检索的记忆。在底层,这种基于检索的记忆使用 VectorStore 对 embeddings 进行语义搜索。请注意,LangChain 有这种基于检索的记忆,但它此前应用于 user-agent 交互,而不是 agent-tool 交互。

我们是如何将其整合到 LangChain 中的?

我们在 langchain.experimental 中添加了此功能的一个版本——这是我们放置更多实验性和较新代码的地方,同时我们还在摸索合适的抽象。具体来说,我们实现了所使用的 prompt 模板逻辑,以及用于运行 agent 的 while 循环。我们使其与 LangChain LLM wrappers、LangChain VectorStores 和 LangChain tools 兼容。

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

BabyAGI

链接:

这个项目有什么新颖之处?

BabyAGI 项目在以下方面与传统 LangChain Agents 不同:

  • 与 AutoGPT 类似,它将基于检索的记忆应用于中间 agent-tool 步骤。
  • 它有独立的规划和执行步骤,会一次性规划一系列动作(而不仅仅是下一个动作)

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

让我们展开第二点,因为这是更重要且更实质性的差异之一。在传统的 LangChain Agent 框架(以及 AutoGPT 框架)中,agent 一次只向前思考一步。对于世界的给定状态,它思考下一个立即行动应该是什么,然后执行该行动。

BabyAGI 的不同之处在于,它会明确规划出一系列动作。然后执行第一个动作,再利用该动作的结果进行下一步规划并更新其任务列表。我们的直觉是,这使它能够更好地执行更复杂、更繁重的任务,因为它本质上将规划步骤用作状态跟踪系统。我们(根据经验)观察到,对于需要许多步骤的任务,传统的 LangChain Agent 有时会在几步之后忘记其最初目标,因此提前规划所有步骤可能是有益的。

我们是如何将其整合到 LangChain 中的?

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

Camel

链接:

这个项目有什么新颖之处?

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

两个代理交互的想法并不完全是新的。鉴于 LangChain 的模块化特性,我们长期以来一直支持让代理将其他代理用作工具。然而,这种交互类型的新颖之处在于,两个代理处于平等地位——在之前的 LangChain 实现中,总是一个代理以 “堆叠” 方式将另一个代理作为工具调用。这种让两个代理处于平等地位、而不是让一个将另一个用作工具的想法,特别有趣,因为它能让人看到演化行为的涌现。

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

第二个新颖组成部分是特定的模拟环境。这是一个双向对话,并不是特别复杂,但仍然是我们在研究环境中看到的第一个此类实现。

我们是如何将其整合到 LangChain 中的?

我们添加了一个 notebook,主要反映该模拟环境(让两个代理相互聊天)。未来我们可能会考虑让这个模拟环境更易于开箱即用。

Generative Agents

链接:

这个项目有什么新颖之处?

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

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

  1. 重要性反思步骤,为每个观察赋予一个重要性分数。这个分数可以在后续的检索中用于获取特别重要的记忆,而忽略基本的记忆。
  2. 反思步骤,用于“暂停”并思考智能体学到了哪些泛化知识。这些反思随后可以与普通记忆一起被检索。这个反思步骤可以起到浓缩信息并观察近期记忆中模式的作用。
  3. 一个结合了时近性、与情境的相关性以及重要性的检索器。这可以让那些与当前情境相似、发生在不久前且特别重要的记忆浮现出来。所有这些似乎都是自然反映我们人类如何“检索”记忆的属性。

所有这些记忆组件都相当新颖,令我们极为兴奋。

我们是如何将其整合进 LangChain 的?

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

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

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

结论

所有这些项目都理所当然地获得了大量关注。我们将它们视为两个不同的类别:

我们很兴奋已经开始在 LangChain 生态系统中实现这些项目的部分内容,并期待看到社区如何使用这些、为这些增添内容,以及将它们结合起来 🙂

来源:LangChain:Blog · langchain.com