《Agents: An Open-source Framework for Autonomous Language Agents》一个自主语言智能体的开源框架

分享一篇近期热门的基于LLM的agent方向的论文《Agents: An Open-source Framework for Autonomous Language Agents》一个自主语言智能体的开源框架
文档原址:https://arxiv.org/pdf/2309.07870v1.pdf

Agents: An Open-source Framework for Autonomous Language Agents

摘要

大型语言模型(LLM)的最新进展使研究人员和开发人员能够构建自主语言agents,可以自动解决各种任务,并并与环境,人类和其他代理进行交互 通过自然语言接口。本文发布了AGENTS,一个开源库,其目标是向更广泛的非专业观众开放这些进步。AGENTS经过精心设计,支持重要功能,包括规划,记忆,工具使用,多agents交流和细粒度符号控制。AGENTS是用户友好的,因为它使非专业人员能够构建,自定义,测试,调整和部署最先进的自主智能体,而无需编写太多代码。该图书馆也是研究友好的,因为其模块化设计使其易于扩展的研究人员。详情地址见https://github.com/aiwaves-cn/agents。

1. 引文

LLMs使构建自主代理成为可能,这些代理可以自动解决复杂的任务,并通过感知,推理,规划和在世界中的行动与环境,人类或其他代理交互。是人工智能(AGI)的一个有希望的步骤,可以帮助减少某些角色的人力,如客户服务,咨询,编程,写作,教学等。一些最近的演示,例如AutoGPT和BabyAGI 已经展示了语言代理的潜力,并获得了开发人员,研究人员以及更多非技术受众的巨大兴趣。

但是许多用于定制、微调和部署agnets的demo和库并不友好——展示了语言agents可能性,但无法随着构建定制更大的框架,且大部分开源库只包含agents的小部分能力(任务分解、长短期记忆、网页导航、工具使用、多智能体交流)。此外,现有的语言代理框架仅仅依赖于简短的任务描述,完全依赖于LLM的计划和行动能力。这导致不同运行之间的显著随机性和不一致性,提供不令人满意的用户体验,并且难以定制和调优语言agents。

这些限制影响着广大非专业人士的使用,因此发布了AGENTS,开源语言代理库和框架。理念是使定制、调优和部署语言代理尽可能简单,即使对于非专业人员也是如此,同时对于开发人员和研究人员也保持易于扩展。此外,该库还提供了以下关键功能,使其成为语言代理的通用框架:

  • 长短期记忆: 自主代理和计算机程序(或机器学习模型)之间的一个关键区别是机器学习模型只需要响应单个输入/查询,而自主代理需要随着时间的推移与环境或其他代理交互。因此,维持长短期记忆的能力对于自主智能体来说是非常重要的。AGENTS将存储器组件集成,并使语言代理能够使用VectorDB和语义搜索存储和检索长期记忆,并使用暂存器定期更新短期工作记忆。用户可以通过简单地在配置文件中填写一个字段来选择为代理配备长期记忆、短期记忆或两者。
  • 工具使用和网页导航: 使用外部工具和上网冲浪的能力。这对于语言代理尤其重要,因为它们依赖于语言接口,因此需要使用外部工具与语言通信之外的环境进行交互,并在网络上导航以收集有用的信息。AGENTS支持一些常用的外部API,并提供一个抽象类,使开发人员能够轻松集成其他工具。我们还通过将Web搜索和Web导航定义为专门的API,使代理能够浏览互联网并收集信息。
  • 多agent通信: AGENTS还支持定制多代理系统,这对于诸如游戏的某些应用是有帮助的、社会实验、软件开发等。AGENTS中的多代理通信的一个新特征是“动态调度”特征。代替硬编码调度顺序,动态调度提供了一个选项来定义一个控制器代理,作为“调解人”,并决定哪个代理执行下一个动作考虑到他们的角色和当前历史的代理执行下一个动作。动态调度有可能使多个代理之间的通信更加自然和灵活。开发人员可以通过使用自然语言在配置文件中指定其规则来轻松自定义控制器。
  • 人-agent交互: 目前框架使代理或多代理能够自动解决任务,但人类用户不容易甚至不可能与代理进行交互,特别是在多代理场景中。AGENTS无缝地支持单代理和多代理场景中的人机交互,使一个或多个人与语言代理进行通信和交互成为可能。
  • 控制力: 现有的代理框架通常只使用系统提示来定义和控制代理的行为,然后让代理自己计划和行动。与此相反,AGENT提供了一种新的范例,通过符号计划建立可控agent,也被称为标准操作程序(SOP)。SOP是多个状态的图,其定义了代理在完成任务时可能遇到的不同情况以及状态之间的转换规则。与真实的世界中的SOP类似,AGENTS中的SOP是一套详细记录的分步说明,概述了一个或一组代理应如何执行特定任务或流程。SOP可以由LLM生成,并由用户在定制和调整代理时进行编辑。在部署之后,代理将遵循针对每个状态的指定指令和指南来行动,并且根据其与环境、人类或其他代理的交互来动态地调整其当前状态。符号计划的引入提供了对代理的行为进行细粒度控制的机会,使代理的行为更加稳定/可预测,同时便于调整/优化代理。

2. 相关工作

2.1 自主语言agents

针对特定任务的agents: Generative Agents开发语言agents模拟人类社会行为;WebAgent证明了在真实网页完成任务可能性;ChATDev和MetaGPT用多智能体交流设置软件开发;Recurrentgpt构建交互式写作助手的agents

AutoGPT、BabyAGI、SuperAGI旨在构建任何用户想做的自主agent,也吸引无数专业和非专业人群。

2.2 语言agents框架

Transformers Agents 构建语言代理,可以自动使用工具来解决用自然语言描述的任务; LangChain 支持端到端语言代理,可以自动解决自然语言指定的任务; Camel 和AgentVerse 是为构建多智能体系统而定制的平台; Gentopia 和XLang 4是用于构建工具增强代理的库。我们在表1中说明了这些平台和代理支持的关键特性。我们可以看到AGENTS是唯一同时支持 工具使用、长短期记忆和多智能体通信的框架,且通过SOP提供人机交互可控性。

表1

3. 库设计

在这里插入图片描述

agent和环境是AGENTS框架的两个主要类,还包括符号计划类SOP。这些主类从一个配置文件初始化,可以用纯文本填充。总之,Code1说明了用于初始化和运行具有多个agent系统的典型脚本。配置文件不仅定义核心对象,也将复杂的提示分为模块化的提示组件。提示的因子分解显著降低了用户构建(多)代理系统的专业知识要求和努力。使用一个配置文件来定义agents、计划和基本环境还有助于语言代理的共享(将在Agent Hub一节中讨论)。这三个核心类中的每一个都由标准化的API组成,这些API可以被经验丰富的开发人员和研究人员覆写

3.1 Agent

在这里插入图片描述

Agent 类抽象的语言代理,UML如图1所示。我们可以看到,agent保持其长短期记忆,并有方法观察环境(agent.observe(environment)),根据其当前状态行动((agent.act())并更新其内存(agent._update_memory())。所有这些方法都包装在agent.step()方法中。这种分解使开发人员能够轻松地使用新功能来定制。

不像现有假设代agents必须基于LLM的语言代理框架,我们包括一个“is_human”属性的代理。如果设置为“True”,则(agent._act())将选择向人类用户提供观察和记忆信息,并等待人类用户输入动作。这种设计允许灵活的人与代理的交互,在单代理和多代理系统,允许人类用户采取的一个或多个语言代理的作用。它有助于开发人员构建各种有趣的应用程序,例如允许人类用户在辩论中充当团队成员,并与(代理或基于人类的)队友合作以击败另一个团队,或者在软件公司中充当CTO/工程师并与其他人合作进行软件开发。

3.2 SOP

SOP类包含agents的状态图。当SOP完成对任务描述时,每个状态指定所有agents一个特定子任务或子目标。状态被抽象为State类。状态对象包含对agent模块化提示,以利用LLM和使用各种工具或API。我们将agent在状态中可能用于执行的所有内容抽象到“Component”类中。Component类由两个子类组成,分别对应于提示符和工具或外部API的不同部分,名为“PromptComponent”和“ToolComponent”。PromptComponent包括模块化的提示,这些提示指定了任务/目标、规则/约束、用于上下文学习的step bu step 演示以及输出格式。ToolComponent支持模块化提示之外的更复杂的用法,包括外部工具和API,如Web搜索、知识库等。根据配置文件,工具的结果要么包含在提示中,要么直接返回并在之后进行处理。

一个SOP对象还包括基于LLM的控制函数,来描述不同状态转换和下一个agent的执行。状态转换函数名为sop._ transit(),agent路由函数名为sop。_route().这两个函数都封装在主循环中使用的sop.next()函数中。

3.3 环境

Environment类抽象了agent所处的环境。一个环境由两个主要函数组成:environment._observed() 和 environment.update()。environment._observed() 定义了环境如何影响agents的行动(即,观察时应传递给代理程序的信息),而 environment.update() 定义了代理程序的行动如何影响环境。

基于AGENTS的(多)代理系统的执行逻辑非常直观。如CODE图2所示,在每个迭代中,SOP首先根据agent和环境来决定状态转换,并选择下一个要执行操作的agent。然后agent根据其状态和环境采取行动。接着,环境根据新的行动来更新自身。最后,如果工作流需要根据中间执行结果动态调整计划,可以解析来自一个操作的输出,定义一个新的状态,并将其添加到当前的SOP中。
在这里插入图片描述

3.4 核心功能实施细节

**长短期记忆:**长期记忆是执行历史,由sentence-transformers嵌入,存储在VectorDB中,并通过语义搜索进行查询。短期记忆或工作记忆是自然语言形式,并由LLM通过仔细调整的提示进行更新。

工具使用和网页导航:AGENTS支持通过ToolComponents进行工具使用和网络导航。对于每个外部工具或API,开发人员可以将API调用包装在ToolComponent.func()方法中。对于那些API调用依赖上下文的复杂工具,AGENTS集成了OpenAI的GPT APIs的“函数调用”功能,以便LLMs决定如何使用这些工具。网络导航通过将网络搜索实现为一种专门的工具来实现。

多代理通信: 不同于大多数现有的多代理系统框架,这些框架使用预定义的规则(例如,让每个代理程序按顺序执行操作)来控制代理程序行动的顺序,AGENTS包括一个控制器函数,通过考虑先前的行动、环境和当前状态的目标,动态决定哪个代理程序将执行下一个操作,使用LLM进行决策。这使得多代理通信更加灵活。"

"Human-Agent 交互: AGENTS在多代理系统中支持人-代理互动,允许人类用户将配置文件中某个代理的“is_human”字段更改为“True”。在这种情况下,用户可以自己扮演代理的角色,输入自己的操作,并与环境中的其他语言代理进行互动。

3.5 部署

现有语言agents开源框架集中于构建验证概念的智能体,运行在终端中或Gradio上。相反,AGENT支持使用FastAPI部署语言agents为API,便于开发人员在实际应用中集成agents。

3.6 Agent Hub

AGENTS的目标不仅是促进语言代理系统的开发、测试和调优,而且还使语言代理的分发和共享更容易。为此,我们引入代理中心,一个平台,允许用户分享他们的微调语言代理,以及搜索/下载其他人在平台上共享的有用代理。通过这种方式,可以通过从社区agents开始并对其进行轻微修改来轻松地自定义语言代理。这大大减少了从头开始设计、测试和调优语言代理的工作量。

4. 案例研究

我们提出了几个不同的语言agents案例研究,包括单代理系统,多代理系统,需要人与代理的互动系统。所有演示均可在http://www.aiwaves-agents.com/上获得。

4.1 单代理系统

我们使用 AGENTS 实现了一些单代理系统,其中包括一个闲聊机器人、两个基于知识库和网络搜索引擎的客户服务代理、一个购物助手代理和一个销售代理。这些代理展示了该库的不同特性以及使用 AGENTS 构建不同用例的语言代理的可能性。我们在图 2 和图 3 中分别展示了客户服务代理和销售代理的屏幕截图。

在这里插入图片描述

4.2 多智能体系统

我们选择了三个场景,包括一个小说工作室,一个辩论,和一个软件公司。这些方案包括合作和竞争的情况下,这是两个主要类别的多智能体系统。所有场景包含通过符号计划控制的多个子任务,即SOP。人们可以很容易地观察语言代理在每个子任务中的行为,并设计相应的提示来定制和改进系统。我们在图4中呈现了小说工作室系统的系统屏幕截图。我们还展示了一个案例研究中的人类用户参与辩论的语言代理在图5中的框架的人机交互。

在这里插入图片描述
在这里插入图片描述

5. 结论

LLM和由它们驱动的语言代理在NLP/AI社区和我们的社会中发挥着越来越重要的作用。AGENTS是语言代理的统一框架和开源库。AGENTS旨在帮助开发人员使用语言代理构建应用程序,研究人员进行语言代理研究,以及一般非技术受众构建和定制个性化语言代理。

后续有时间会看看实验源码和网站,继续分享体验效果吧,欢迎大家讨论。

猜你喜欢

转载自blog.csdn.net/weixin_44546100/article/details/133151457