什么是 AutoGen?
AutoGen 是一个开源框架,用于构建 AI Agent。它简化了事件驱动、分布式、可扩展和弹性的 Agent 应用程序的创建。它使您能够快速构建系统,其中 AI Agent 可以自主或在人工监督下协作并执行任务。框架共分为三层:
- Core API (autogen-core):基于 Actor 模型,支持 Agent 之间的异步消息传递和事件驱动的工作流。
- AgentChat API (autogen-agentchat):任务驱动的 High Level API,允许定义对话 Agent、将它们组成团队并用于解决任务。
- Extensions (autogen-ext):包含使用第三方系统(如 OpenAI 模型客户端和 Azure 代码执行器)实现的核心接口。
核心概念
Agent
Agent 是具备以下特点的计算单元:
- 自主性:Agent 能够自主地感知环境、做出决策,并采取行动,而不需要人工干预。
- 状态保持:Agent 能记住其当前的状态,并基于该状态作出反应。
- 通信能力:Agent 可以通过消息交换与其他 Agent 或系统进行沟通。
- 响应性:Agent 会根据接收到的信息或环境变化执行行动,可能影响系统状态或触发后续任务。
Multi-Agent 应用
Multi-Agent 应用指的是由多个相互独立的 Agent 组成的软件系统。这些代理通过互相通信与协调,完成某些任务或目标。每个 Agent 通常都有自己的功能,并能够与其他 Agent 协作或竞争来实现某种集体目标。
Actor Model
Actor Model 是一种用于并发计算的抽象模型,最早由计算机科学家 Carl Hewitt 在 1973 年提出。它为并发系统的设计和实现提供了一种高层次的框架,特别适用于分布式和并行系统的开发。
在 Actor 模型中,Actor 是一个计算实体,具备以下特点:
- 消息传递:每个 Actor 都是独立的,它们通过异步消息传递进行通信。Actor 不会直接访问其他 Actor 的状态,而是通过发送消息来请求行为。
- 封闭的状态:每个 Actor 都有自己的私有状态,外部无法直接修改或访问这些状态。Actor 只能通过处理消息来改变自己的状态。
- 并发执行:多个 Actor 可以并行执行,每个 Actor 在其自己的线程或计算单元中独立运行,不同的 Actor 之间的消息传递通常是异步的。
- 行为:Actor
处理消息的方式是通过“行为”来定义的。当一个 Actor
接收到消息时,它会做出相应的反应,通常是:
- 发送消息给其他 Actor
- 改变自身的状态
- 创建新的 Actor
常见 Actor 实现:
- Erlang:Erlang 语言采用了 Actor 模型,并广泛应用于电信领域,具有高容错和高并发的特性。
- Akka:Akka 是一个基于 Actor 模型的库,主要用于 JVM 平台,支持分布式、并行和容错系统的构建。
- Microsoft Orleans:Orleans 是微软开发的一个分布式虚拟演员模型(Virtual Actor Model)实现,主要用于大规模分布式应用的构建。
Agent Runtime Environments
Runtime Environment 是一个底层组件,用于 Agent 间通信,管理身份和生命周期,并执行安全和隐私边界控制。框架关于 Runtime 有两个实现:
- Standalone Agent Runtime 适合单进程应用,所有 agent 在使用同一种语言并运行于同一个进程中。
- Distributed Agent Runtime 适合于多进程应用程序,可以使用多种不同的编程语言,运行在不同的进程中。
Agent ID
Agent ID 唯一标识了 Runtime 中的 Agent 实例,相当于一个地址用于接受消息。 Agent ID = (Agent Type, Agent Key),格式为 Agent_Type/Agent_Key
Agent Lifecycle
当 Runtime 根据 ID 向 Agent 实例传递消息时,它要么获取已存在的实例,要么在实例不存在时创建一个新的实例。
Topic 和 Subscription
AutoGen 有两种传递消息的方式:
- 点对点(1 对 1):发送方必须提供接收方的 agent ID。
- 广播(1 对多):发送方无需知道接收方的 agent ID。
Topic
Topic 定义了广播消息的范围。本质上,Agent Runtime 通过其广播 API 实现了一个发布-订阅模型:发布消息时必须指定 Topic。它是 Agent ID 之上的一层间接引用。
一个 Topic 由两个组件组成:Topic 类型和 Topic 来源。 Topic = (Topic Type, Topic Source),格式为 Topic_Type/Topic_Source
Subscription
Subscription 即为 Topic 到 Agent ID 的映射。
目前 AutoGen 中实现的 Subscription 只有 Type-based Subscription。 Type-based Subscription = Topic Type → Agent Type
Type-based Subscription 有三种场景:
- Single-Tenant, Single Topic
- Single-Tenant, Multiple Topics
- Multi-Tenant Scenarios
AutoGen Core
API Layers
Core API 分为三层:
autogen_core.base:定义了 Agent、Message 和 Runtime
时的核心接口和基础类。这个层次是框架的基础,其他层次会依赖于它。
autogen_core.application:提供了 Runtime 的具体实现以及
Multi-Agent 应用程序所需的工具,如日志记录等。
autogen_core.components:提供了构建 Agent
的可重用组件,包括 type-routed agent、model
client、tools、代码运行沙箱和 memory。
核心类
本文不对框架源代码进行过多的赘述,读者可以参考官方文档的Framework Guide — AutoGen章节进行阅读和学习。
AgentChat
AgentChat 是一个用于构建多智能体应用的高级 API。它建立在 autogen-core 包之上。对于初学者来说,AgentChat 是推荐的起点。对于高级用户,autogen-core 的事件驱动编程模型提供了更大的灵活性和对底层组件的控制。
官方 Tutorials:Tutorial
— AutoGen
官方 Examples:Examples
— AutoGen
Extensions
AutoGen 框架将官方实现和社区实现进行了一些分离,以插件的形式进行。官方维护框架的核心功能,而社区维护生态。
总结
AutoGen 是我在过去半年里接触到的,所有 Agent 框架中实现和设计最为优雅的一款。我一直认为,Agentic 场景天生就适合采用 Actor 模型。AutoGen 项目的组织结构采用了分层设计:包括 Core API、High Level API 和 Extensions,这种方式对于开源项目的构建有着很高的借鉴价值。