# Agent框架分析 - AutoGen

- URL: https://www.yidoo.xyz/autogen
- 作者: 核动力蜗牛
- 发布时间: 2024-12-03
- 更新时间: 2024-12-03
- 分类: LLM技术内幕
- 标签: agent, llm

# 什么是 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

![44cd7ccba041516ff8e919b2f3f94c09.png](https://www.yidoo.xyz/images/44cd7ccba041516ff8e919b2f3f94c09.png)

常见 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 在使用同一种语言并运行于同一个进程中。 ![d0ae77c0524c42c28c6270697f05bdeb.png](https://www.yidoo.xyz/images/d0ae77c0524c42c28c6270697f05bdeb.png)
- **Distributed Agent Runtime** 适合于多进程应用程序，可以使用多种不同的编程语言，运行在不同的进程中。 ![688ed6abcbea6ca61b073a7502ff9a4e.png](https://www.yidoo.xyz/images/688ed6abcbea6ca61b073a7502ff9a4e.png)

## Agent ID

Agent ID 唯一标识了 Runtime 中的 Agent 实例，相当于一个地址用于接受消息。 Agent ID = (Agent Type, Agent Key)，格式为 Agent_Type/Agent_Key

## Agent Lifecycle

当 Runtime 根据 ID 向 Agent 实例传递消息时，它要么获取已存在的实例，要么在实例不存在时创建一个新的实例。

![de5c9a067f25d1bd36bd112bc0420055.png](https://www.yidoo.xyz/images/de5c9a067f25d1bd36bd112bc0420055.png)

## 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 的映射。 ![09c864c27e3647d4e9753b06d64aba1a.png](https://www.yidoo.xyz/images/09c864c27e3647d4e9753b06d64aba1a.png)

目前 AutoGen 中实现的 Subscription 只有 Type-based Subscription。 Type-based Subscription = Topic Type → Agent Type

Type-based Subscription 有三种场景：

- **Single-Tenant, Single Topic** ![1893aa42d2ddda55cbf70fc32c10e8f3.png](https://www.yidoo.xyz/images/1893aa42d2ddda55cbf70fc32c10e8f3.png)
- **Single-Tenant, Multiple Topics** ![e17056f66321bfec209db724424d7bcd.png](https://www.yidoo.xyz/images/e17056f66321bfec209db724424d7bcd.png)
- **Multi-Tenant Scenarios** ![10d0df05616a523e672dd9dd106425a0.png](https://www.yidoo.xyz/images/10d0df05616a523e672dd9dd106425a0.png)

# 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。

![98701f6ae4060976d5c91ef14848c97c.png](https://www.yidoo.xyz/images/98701f6ae4060976d5c91ef14848c97c.png)

## 核心类

本文不对框架源代码进行过多的赘述，读者可以参考官方文档的[Framework Guide — AutoGen](https://microsoft.github.io/autogen/dev/user-guide/core-user-guide/framework/index.html)章节进行阅读和学习。

# AgentChat

AgentChat 是一个用于构建多智能体应用的高级 API。它建立在 autogen-core 包之上。对于初学者来说，AgentChat 是推荐的起点。对于高级用户，autogen-core 的事件驱动编程模型提供了更大的灵活性和对底层组件的控制。

官方 Tutorials：[Tutorial — AutoGen](https://microsoft.github.io/autogen/dev/user-guide/agentchat-user-guide/tutorial/index.html)  
![9be9bfbd5a487e1c2dcf3a1c8dd53517.png](https://www.yidoo.xyz/images/9be9bfbd5a487e1c2dcf3a1c8dd53517.png)

官方 Examples：[Examples — AutoGen](https://microsoft.github.io/autogen/dev/user-guide/agentchat-user-guide/examples/index.html)  
![60bb49d0a49a9a58f807c5c67d80bf09.png](https://www.yidoo.xyz/images/60bb49d0a49a9a58f807c5c67d80bf09.png)

# Extensions

AutoGen 框架将官方实现和社区实现进行了一些分离，以插件的形式进行。官方维护框架的核心功能，而社区维护生态。

![29cfa3f00dc8c35fa467ae646ad2e1e6.png](https://www.yidoo.xyz/images/29cfa3f00dc8c35fa467ae646ad2e1e6.png)

# 总结

AutoGen 是我在过去半年里接触到的，所有 Agent 框架中实现和设计最为优雅的一款。我一直认为，Agentic 场景天生就适合采用 Actor 模型。AutoGen 项目的组织结构采用了分层设计：包括 Core API、High Level API 和 Extensions，这种方式对于开源项目的构建有着很高的借鉴价值。
