跳转到主要内容

在过去的两周里,以代理方式使用LLM的人数大幅增加。具体来说,像AutoGPT、BabyAGI、CAMEL和Generative Agents这样的项目已经出现。LangChain社区现在已经在LangChain框架中实施了所有这些项目的一些部分。在研究和实施这些项目时,我们试图最好地了解它们之间的区别以及每个项目的新颖之处。这个博客是对我们所学知识的解释。

注意:这是一个相当技术性的博客。它假设对LangChain和这些相关项目有一定的熟悉程度。如果你不熟悉这些项目,读一篇更具介绍性的文章(比如索菲亚·杨的这篇精彩的文章)可能会有所帮助。

TL;DR:

  • “自主代理”项目(BabyAGI、AutoGPT)的长期目标在很大程度上是新颖的,这需要新型的规划技术和不同的内存使用。
  • “代理模拟”项目(CAMEL,Generative Agents)在很大程度上是新颖的,因为它们的模拟环境和基于事件反映和调整的长期内存。

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

  • 允许在LLM提供商之间轻松切换
  • 允许轻松切换VectorStore提供程序(或其他检索方法)
  • 允许连接到LangChain的工具集合
  • 允许连接到LangChain生态系统

背景

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

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

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

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

在LangChain中,我们将“代理”称为LLM,它决定采取什么行动;“工具”是指代理人可以采取的行动;“内存”是拉入以前事件的行为,而AgentExecutor是在while循环中运行代理直到满足某些停止条件的逻辑。

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

  1. 用户向代理提供任务
  2. 思考:代理人“思考”该做什么
  3. 动作/动作输入:代理决定采取什么动作(也就是使用什么工具)以及该工具的输入应该是什么
  4. 观察:工具的输出
  5. 重复步骤2-4,直到Agent“认为”完成为止
  6. 在讨论其他实现和框架时,我们将把它们与此算法进行比较。

自动GPT

链接:

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

AutoGPT项目与传统LangChain代理之间的主要差异可归因于不同的目标。在AutoGPT中,目标往往更为开放和长期。这意味着AutoGPT有不同的AgentExecutor和不同的内存处理方式(这两种方式都针对长时间运行的任务进行了更优化)。此前,LangChain中代理的记忆有两种形式:

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

由于AutoGPT运行时间更长,将代理步骤的完整列表传递给LLM调用不再可行。相反,AutoGPT在中间代理步骤上添加了一个基于检索的内存。在引擎盖下,这种基于检索的内存正在使用VectorStore对嵌入进行语义搜索。请注意,LangChain具有这种类型的基于检索的内存,但它以前应用于用户-代理交互,而不是代理-工具交互。

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

我们在langchain.experimental中添加了一个版本,在这个地方,我们可以放置更多的实验性和更新的代码,同时找出适当的抽象。具体来说,我们已经实现了所使用的提示模板逻辑,以及用于运行代理的while循环。我们已经使其与LangChain LLM包装器、LangChain VectorStores和LangChain工具兼容。

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

BabyAGI

链接:

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

BabyAGI项目与传统LangChain代理商的不同之处在于:

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

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

让我们进一步讨论第二点,因为这是更重要和实质性的区别之一。在传统的LangChain Agent框架(以及AutoGPT框架)中,Agent一次向前思考一步。对于一个特定的世界状态,它思考下一个即时行动应该是什么,然后采取行动。

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

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

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

Camel

 

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

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

两个代理交互的想法并不是全新的。鉴于LangChain的模块化性质,我们长期以来一直支持让代理使用其他代理作为工具。然而,这种类型的交互的新颖之处在于,两个代理是平等的——在以前的LangChain实现中,总是有一个代理以“堆叠”的方式调用另一个代理作为工具。这种将两个代理置于平等的基础上,而不是让一个代理将另一个代理用作工具的想法,引起了一种特别有趣的共鸣,即看到不断演变的行为出现。

请注意,这些代理可以使用不同的工具,并且可以专门针对这些工具。例如,你可以有一个代理,它配备了编码所需的工具,另一个代理配备了与线性交互所需的刀具,等等。因此,仍然有可能实现“堆叠”效果(你有不同的代理负责不同的事情)。

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

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

我们添加了一个笔记本,在很大程度上反映了模拟环境(有两个代理相互聊天)。我们可能会考虑在未来使这种模拟环境更加现成。

Generative Agents

链接:

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

这个项目有两个新颖(而且相当复杂)的方面。第一个是模拟环境,它由25个不同的代理组成。这看起来相当具体,也非常复杂,所以我们没有过多地探讨。另一个新颖的方面是他们为这些代理创造的长期记忆。

本周早些时候,我们对此进行了深入研究。代理的内存由以下部分组成:

  1. 重要性反思步骤,为每个观察结果打分。这个分数可以用于后续的检索,以获取特别重要的记忆,而忽略基本的记忆
  2. 反思步骤,“暂停”并思考代理人学到了什么概括。然后,这些反射可以与正常记忆一起检索。这个反射步骤可以用来浓缩信息并观察最近记忆中的模式
  3. 一种结合了最近性、与情况的相关性和重要性的检索器。这可以让人们回忆起与不久前发生的情况类似的记忆,尤其重要。所有这些似乎都是自然反映我们人类如何“找回”记忆的属性

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

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

检索器逻辑似乎是可推广的,所以我们将其添加为TimeWeightedVectorStoreRetriever.

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

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

结论

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

  • 自主代理(Autonomous Agents,),具有改进的规划能力
  • Agent Simulations(Agent Simulations),具有新颖的模拟环境和复杂的、不断发展的内存

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