自主Agent的详细剖析(自主性是什么意思)

科技巨头最近大举投资几乎保证了自主Agent生态系统即将到来。但什么是“autonomous agent”?

“自主Agent会对环境刺激做出反应,积极主动地追求目标,具有社交互动能力,并能不断学习和改进”。维基百科提供了类似的定义: “自主Agent是存在于某些复杂动态环境中的计算系统,它们在这种环境中自主感知和行动,并通过这样做来实现其设计的一系列目标或任务。”

说完这些,我想谈谈本文的主要重点:自主Agent(以下称为“Agent”)架构是什么样的,它的主要组成部分是什么?需要具备哪些能力才能创建一个能够规划和执行任务的“智能体”?由于没有一个Agent是独立存在的,而是在Agent生态系统中工作,那么Agent如何安全地协作和交互以完成复杂的任务?

或者更简洁地说,是什么让Agent如此成功?这就是本文的主题!在以下部分中,我将讨论几个具体主题:

  • 基础组件,定义Agent的架构和关键组件。
  • 自主Agent作为微服务,解释了为什么微服务是Agent的理想运行时环境,从而允许Agent利用数十年的构建、部署、保护和运营服务方面的专业知识。
  • Agent作为“智能”微服务,展示了当我们将 LLM 附加到这些Agent微服务时,我们如何获得真正智能和自主的Agent。
  • Agent的内存、RAG 和数据,展示Agent如何访问外部数据来完成任务,同时也帮助Agent学习和适应。
  • Agent引导和对话,解释自主Agent如何在Agent生态系统中交互。

自主Agent的剖析

Agent中有什么?

Agent有两个基本支柱:任务管理和智能。任务管理让Agent可以规划和执行操作以实现其目标。Agent将任务分解为多个步骤(任务规划), 将其分解为可操作的步骤,同时识别工具和其他协作Agent以完成任务。顾名思义,任务执行通过调用工具和协作Agent来执行任务计划,以完成任务并实现预期结果。

智能层为Agent的决策和适应性提供支持。大型语言模型 (LLM) 提供通用推理,让Agent能够理解输入、生成计划并预测结果。LLM 是“大脑”,让Agent能够创建任务计划,然后智能地执行该计划。对于某些任务,专业学习模型(SLM) 提供领域专业知识,或者可以访问公司数据或政策,让它们了解可能在其中运营的企业环境。

Agent还可以访问存储过去互动的对话历史记录。这些历史互动是让Agent学习和适应的原始材料,同时还提供Agent操作和任务执行的可见性,以监控和观察Agent行为。

工具是Agent与外部世界的接口。实际上,工具可以是Agent创建者/所有者希望赋予Agent的任何能力。例如,它可能包括从用于与公司系统或文档集成的 API 到用于访问互联网的接口等所有内容。

Agent即微服务

几十年来,企业级系统一直采用微服务架构设计。Agent架构应该利用这一经验,换句话说,站在微服务巨头的肩膀上,为Agent带来企业级功能。

成熟的微服务架构为Agent提供了坚实的基础,原因如下。首先,安全性:企业拥有成熟的技术来控制数据并消除数据泄露。例如,企业使用相互 TLS来确保微服务安全通信,并使用开放标准协议OAUTH2通过角色提供对资源的安全委托访问,以便每个Agent仅在其角色和目的的范围内行事。

第二,可靠性:企业每天都使用众所周知的工具(例如Kubernetes)和环境(例如云?)运行关键任务应用程序。通过将Agent设计为以微服务形式运行,可让Agent在这些完善的可靠运行时环境中运行。

接下来是可部署性:微服务通常部署为 Docker 容器,这使得它们可以在企??业中已建立的常见环境中运行。好处是:通过将Agent设计为微服务,它们可以立即在企业中部署。

最后,可操作性:企业希望所有系统都是可观察和可监控的,当发生错误时发出警报。由于微服务使用企业中常见的可部署单元(如前所述,Docker 容器是可部署单元),因此基于微服务的Agent可以通过流行工具轻松进行检测,以符合企业运营手册,从而利用现有的企业支持和问题诊断流程。

微服务为Agent提供了一组端点或 API:

  • Agent规范:OpenAPI 规范定义了微服务Agent的技术细节,并提供了理解和使用Agent所需的信息。通过一些小的扩展,该规范还定义了Agent的用途、功能和操作参数。
  • 任务执行:可用的端点允许Agent启动任务。
  • Agent观察:端点可用于检索Agent指标、状态和其他观察数据。
  • Agent操作:端点支持管理功能,例如更新配置或修改Agent状态。
  • 安全服务:使用各种常见技术(包括相互 TLS (mTLS)、OAUTH2 以及与身份记录簿 (BoR) 系统的集成)确保端点的安全。

Agent使用工具

工具是Agent能力的低级扩展,可让Agent直接与外部系统、互联网和公司服务交互,以及处理数据和执行其固有设计之外的特定功能。工具为Agent提供了标准方法来添加新功能,这些功能对于其特定角色或完成任务很有用。例如,开箱即用的Agent无法访问公司信息,但工具提供了访问这些公司存储库的机制(例如 API)。

每个工具都有特定的功能,并具有类似的界面,可展示:

  • 名称:一个唯一的名称(最有可能的是,这将是一个命名空间与该命名空间中的唯一名称的组合),使得该工具在 Agentic系统中独一无二且可发现。
  • 目的:一份详细的说明,解释该工具的作用和操作方式,以便人们和Agent确定工具是否适合完成任务请求。
  • 参数:工具完成其任务所需的信息。
  • 执行函数:使用提供的参数执行工具目的的可调用函数(这是实现工具特定功能的地方)。

让我们看一个例子。一个“数学”工具可以计算数学表达式(诚然,这是一个简单的例子,即使不是微不足道的例子,但简单的例子所提供的清晰度在这一点上可能非常重要)。根据上述标准,数学工具看起来如下:

  • 名称:brodagroupsoftare:math.tool,其中brodagroupsoftware是命名空间,math.tool是该命名空间内的工具名称。
  • 目的:计算数学表达式的值。
  • 参数:表达式,可以是任何要计算的有效数学表达式。
  • 执行函数:execute(expression) ,它将根据表达式参数执行函数(注意:执行函数的实际签名将由所使用的编程语言决定)

除了属性之外,工具服务还支持Agent工具。配置/数据定义工具的属性、用途和可用接口。系统服务将工具连接到运行时环境或操作系统/基础设施资源。应用服务将工具与应用程序或外部系统集成。

Agent作为工具

我认为Agent只是工具。现在,这确实很重要。与工具交互的方式与与Agent交互的方式相同。Agent只是Agent工具带中的另一种工具。

首先,我们知道Agent使用工具。Agent依靠各种工具来执行任务。这些工具由名称、用途、参数和执行函数等通用属性定义。工具可作为本地函数访问 - 它们被实现为Agent当前进程中可访问的模块。

此外,Agent也是工具。我们调用任何工具的方式与调用Agent的方式相同。因此,当Agent收到请求并制定任务计划时,它会确定可以帮助满足请求的工具列表(常规工具和Agent)。

认识到Agent只是工具,常规工具和其他Agent都位于Agent工具带中,可供使用!所以,如果Agent只是工具,那么Agent就会使用Agent!现在,Agent将其他Agent视为工具的概念使Agent可以协同工作,并且是协作解决问题的基石。这种交互之所以有效,是因为生态系统中的所有Agent都遵循共享的工具接??口标准——无论Agent是使用本地工具还是与Agent协作,它都遵循一致的协议,以确保所有工具和Agent之间的兼容性。

智能Agent作为智能工具

正如我们刚才所说,Agent本质上是工具。但是,当我们将Agent与大型语言模型 (LLM) 集成时,事情会变得更加令人兴奋。LLM 使Agent能够超越简单工具的预定义功能,为Agent提供推理和动态解决问题的能力。借助 LLM,Agent可以将复杂的目标分解为可操作的步骤,为每个步骤确定最合适的工具(或协作Agent)或方法。这将Agent从静态的、特定于任务的实用程序转变为真正的动态工具。

LLM 以一种非常有意义的方式充当了智能体的“超能力”,因为它们实现了自主性。与(根据设计)仅限于固定行为或手动输入的传统工具不同,LLM 让智能体了解背景,并根据广泛的目标制定计划,让它们能够处理范围更广的任务,甚至是那些没有明确编程的任务。

因此,当 LLM 连接到代理微服务时,我们就会得到新一代“智能体”!

将Agent任务管理为有限状态机

Agent对话可能涉及多个任务,每个任务可能运行时间很长,有时可能需要人工干预(例如,与某人联系以获取缺失数据)。因此,Agent使用异步对话进行通信,这些对话由执行任务的请求和与单个任务状态变化相关的更新组成。

实际上,每个任务都会从一个状态移动到另一个状态,每个状态都表明它当前正在做什么或当前正在等待什么。因此,每个任务的状态都可以建模为有限状态机。

任务状态如下:

  • GROUND:这是任务的初始状态。
  • READY:任务已初始化并准备接受。
  • WORKING:该状态下,任务正在积极执行。
  • PENDING:任务暂停,等待更多信息或资源以继续执行。
  • ERROR:任务在执行过程中遇到错误,处于等待状态,直到错误得到解决
  • COMPLETE:任务已完成(此任务不允许进行进一步的活动)。

任务转换事件描述如下:

  • BOOTSTRAP:此转换初始化系统或任务,将其从非活动的初始状态转变为可用状态(已准备好工作)。
  • TASK-NEW:分配新任务,将系统从可用状态转换为工作状态(Agent正在处理该任务)。
  • TASK-COMPLETE:任务已成功完成。
  • TASK-INFO-REQUIRED:该任务需要额外的信息或资源才能继续。
  • TASK-INFO-PROVIDED:提供所需的信息或资源,使任务能够恢复执行。
  • TASK-TIMEOUT:任务等待所需信息或资源的时间太长。
  • TASK-ERROR:任务执行期间发生错误。
  • TASK-FIXED:错误已解决,任务恢复执行。
  • TASK-RESET:发生错误后重置任务并完成。

管理和跟踪Agent对话

对话分类账”是了解Agent及其任务操作的窗口。每次更新任务或更改状态时,Agent都会将任务活动日志、共享事实和状态发送到对话分类账。用户界面和 API 可供相关方获取有关任务的信息。

交互管理器”负责处理与客户的所有交互。它负责接收来自客户的初始请求,在客户和 Agentic系统之间建立唯一且安全的对话,并支持与客户以及用于满足客户请求的任何代理进行持续交互。

Agent对话的工作方式如下:

  1. 请求发起:当用户或请求发起者提交请求时,对话就开始了,请求通常是需要解决的任务或查询。这可能涉及触发该过程的人类用户或其他系统。
  2. 对话开始:交互管理器通过解释用户的请求并建立初始上下文来启动对话。每个交互都有唯一标识,并且仅包含与此特定交互相关的信息。
  3. 任务开始:启动一项任务,并为该任务分配唯一的标识符。
  4. 任务规划:Agent创建任务计划,将请求分解为更小的步骤。必要时,其他Agent将参与其中。Agent计划将记录到对话分类账中。
  5. 任务执行和记录:当Agent执行计划时,它们会生成对话分类账中反映的瞬时事实、日志和输出。
  6. 任务状态报告:Agent定期使用任务状态更新对话分类账,包括成功、错误或中间结果。
  7. 任务完成:当任务计划中的所有步骤都成功完成后,最终Agent完成工作流。结果记录在账本中,并将任务结果返回给用户。
  8. 对话结束:交互管理器在将任务结果传递给用户后关闭对话。这标志着工作流程的结束,所有相关详细信息都存储在对话分类账中以供将来参考或审核。

Agent记忆和知识

Agent学习、访问数据(内部和外部),并使用提供的数据来完成任务请求。这些数据成为Agent的记忆和知识库,可用于学习和适应,以及提供限制Agent行为的护栏和上下文。

有多种数据源构成了Agent所拥有的“记忆和知识”。可以使用常见技术(RAG、API 等)提取以下所有信息源:

  • 交互,即过去行为的历史数据。通过引用过去的交互、任务和结果作为交互的背景,Agent可以优化新的交互。这些数据还可用于微调 LLM(更可能是特定于Agent的 SLM),但这相当复杂且具有挑战性,但仍然是一个机会。
  • 配置,提供核心信息(其目的和可访问工具),指导Agent完成任务。
  • 通过 API 访问的工具可让Agent扩展其功能范围。这些工具通常使用外部数据并执行专门的任务,例如从公司数据库检索信息、处理大型数据集或连接到企业系统。

工具可以采取多种形式 - 下面提供了一些示例,但可以想到的工具列表确实取决于Agent创建者的想象力:

  • 非结构化文档、数据和工件,例如 PDF、图像、音频、视频,在多模式世界中变得越来越重要。
  • 互联网/网络访问,使Agent能够访问更广泛的互联网(或企业网络)。请注意,如上一节所述,访问工具是Agent创建者和生态系统管理员的特权和设计决策,不应掉以轻心——访问工具,特别是外部或企业网络,既可以启用Agent,也可以很容易地让它们访问可能非常成问题的功能。
  • 公司数据,可通过 API 或 SQL 访问,允许Agent访问企业的数据(当然,要遵守与互联网/网络访问相同的规定和考虑)。
  • 大型和小型语言模型,它们从广泛的数据集中提供固有知识(尽管仅限于其训练数据)。
  • 其他Agent,提供对 Agentic生态系统中所有Agent的功能的访问。

场景:银行开户

现在让我们展示一下它在实践中是如何运作的。

开立银行账户是雇用自主Agent的合理选择,因为它具有高度复杂性,需要电子文档,依赖多个相互依赖的步骤,并且需要遵守政策和法规。Agent非常适合这种情况,因为它们可以独立管理和协调离散任务,处理非结构化文档,并且可以适应正常银行开户过程中所需的交互和不可避免的异常(以及收集缺失信息所需的人工交互)。

但也许更重要的是,对于我们的目的而言,它也是直观且易于理解的(并且我们大多数人可能都曾经经历过这个过程)。

  1. 登录(Auth/Auth):首先,客户提供凭证以访问银行环境。对于现有客户,银行环境将对其进行身份验证和授权。如果他们是银行的新客户,则他们将提供基本信息以建立访客账户(一旦他们成功开立账户,该账户将转换为真实账户)。
  2. 收集信息:要求客户确认所需的银行产品信息,以及其他客户详细信息和所需文件清单,其中可能包括身份证明(驾驶执照等)、地址验证和其他相关数据。此步骤可能需要与客户进行多次互动(全部使用自然语言),以收集所有相关信息。
  3. 发起请求:一旦收集到信息,交互管理器就会创建开设银行账户的正式请求,触发Agent程序开始任务流。
  4. 聘请Agent Proxy:指定Agent代理来管理交互并最终将任务委派给专门Agent。
  5. 创建任务计划:Agent设计一个任务计划,该计划确定将使用哪些Agent和工具来按顺序排列步骤来完成任务。
  6. 执行计划(聘请Agent):聘请专业Agent执行任务计划,各自处理指定职责。在我们的案例中,有几位Agent:身份验证Agent用于验证客户凭证(Agent可以使用与流行的第三方身份验证服务集成的特定工具);验证后,聘请“了解客户”Agent来处理公司政策和监管义务;接下来,根据客户要求的产品选择开立账户;开立银行账户后,可以进行初始存款。
  7. 聘请更多Agent:可以根据需要将更多Agent纳入流程,例如处理初始存款或账户通知的Agent。特别有趣的是处理任务的“递归”方法:一个Agent呼叫另一个Agent,然后又呼叫另一个Agent,依此类推,具体取决于任务的计划。当然,值得注意的是,为Agent提供了保护措施(例如,公司指南和政策规定了开设银行账户所需的步骤,以及对严格控制银行应用程序访问权限的公司 API 的访问权限),以便任务以可重复和可预测的方式运行。
  8. 收集新信息:Agent可以随时请求更多信息,并且可以直接与互动经理联系,向客户索取更多信息。
  9. 记录对话:在整个过程中,对话和互动都记录在对话分类账中,以供审计和合规。

结论

Agent(可以规划和完成任务的自主实体)的出现比我们想象的要快。因此,对于Agent创建者、架构师、工程师和治理专业人员来说,了解Agent的工作原理、构建于哪些组件之上以及它们如何在更广泛的Agent生态系统中交互变得越来越重要。