跳到主要内容

AutoGen — 架构与原理

30 秒导读: AutoGen 是微软开源的多智能体框架——让多个由大模型驱动的 agent 互相对话、调用工具、协作完成任务。它最值得学的不是"又一个 agent 库",而是它把系统切成了两层:底层一个 actor 式的事件驱动运行时(谁给谁发消息、谁订阅了什么),上层一套好用的 agent 与团队 API。读完你能讲清"一条消息从用户到 agent 再到工具是怎么流的",以及"群聊里下一个该谁说话是怎么决定的"。

⚠️ 上游已进入维护模式(README 顶部 Maintenance Mode 徽章),官方建议新项目用后继者 Microsoft Agent Framework。但 AutoGen 的分层设计仍是研究多智能体编排的极佳样本。

1. 这是什么(零基础也能懂)

一句话定义: AutoGen 是一个用大模型搭多智能体应用的框架——你定义几个会说话、会用工具的 agent,把它们组成一个"团队",框架负责让它们轮流发言、协作把任务做完。

解决什么问题: 假设你想让 AI 完成一个复杂任务——比如"查一个 GitHub 仓库有多少贡献者,然后写一段总结"。单个 agent 要么不够专、要么 prompt 太臃肿。

更自然的做法是把它拆给几个专家:一个"网页浏览专家"负责查,一个"写作专家"负责总结,它们像同事一样在一个群里交接。AutoGen 给的就是"定义这些 agent + 决定谁先说谁后说"的基础设施。

给谁用: 给的是要编排多个 LLM agent 协作的工程师。

它能做什么(功能):

  • 定义带工具(function calling)、带记忆、带结构化输出的单个 agent。
  • 把多个 agent 组成团队,用不同策略决定发言顺序:轮流(RoundRobin)、模型选人(Selector)、按交接路由(Swarm)。
  • 工具调用、MCP(Model Context Protocol)服务器接入、代码执行。
  • 一套底层 actor 运行时,支持本地单进程,也支持跨语言(.NET/Python)和分布式。
  • 把整个 agent/团队配置声明式地存成 JSON/YAML再加载回来。

用起来什么样: 最小的两 agent 团队,轮流发言、用终止条件停下来(改编自 _base_group_chat.py 文档串里的真实示例):

# 示意,非源码(浓缩自官方示例)
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import MaxMessageTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_ext.models.openai import OpenAIChatCompletionClient

model_client = OpenAIChatCompletionClient(model="gpt-4o")
agent1 = AssistantAgent("Assistant1", model_client=model_client)
agent2 = AssistantAgent("Assistant2", model_client=model_client)

# 跑满 3 条消息就停
team = RoundRobinGroupChat([agent1, agent2], termination_condition=MaxMessageTermination(3))
result = await team.run(task="Count from 1 to 10, respond one at a time.")
print(result)

一句话直觉/类比: 把 AutoGen 想成一个带调度台的会议室。会议室底层是"对讲系统"(Core 运行时):你可以点对点喊某个人(send_message),也可以广播到一个频道(publish_message),订阅了该频道的人都能听到。上层的"团队"就是会议主持人(group chat manager):每轮结束它决定"下一个请谁发言",然后通过对讲系统把麦克风递过去。

本节不涉及代码细节。记住一件事:AutoGen = 底层一套消息运行时 + 上层一套 agent/团队 API,后面所有内容都在这两层里。

2. 顶层全景(它大概怎么转)

AutoGen 的 Python 端是三个叠起来的包,职责清晰、从下往上依赖:

层 / 包干什么在哪
autogen-core底层运行时:agent 寻址、消息收发、发布订阅、序列化、声明式组件python/packages/autogen-core
autogen-agentchat好用的上层:AssistantAgent、消息类型、团队(GroupChat)与终止条件python/packages/autogen-agentchat
autogen-ext可插拔扩展:具体的模型客户端(OpenAI/Azure…)、代码执行器、MCP 工具python/packages/autogen-ext

README 把这层关系说得很直白:Core 实现消息传递与事件驱动 agent;AgentChat 是"更简单但有主见"的 API,建在 Core 之上;Ext 提供第一方/第三方扩展(见 README.md 的 "Why AutoGen?" 一节)。

一张顶层图(从上到下是抽象层,箭头是"建立在……之上"):

你的应用 / Magentic-One / AutoGen Studio
│ 用

┌───────────────────────────────────────────┐
│ AgentChat 层 (好用、有主见) │
│ · AssistantAgent (LLM→工具→反思 的循环) │
│ · Team / GroupChat (主持人选下一个发言人) │
│ · 消息类型 / 终止条件 │
└───────────────────────────────────────────┘
│ 映射到(topic / subscription)

┌───────────────────────────────────────────┐
│ Core 层 (actor 式事件驱动运行时) │
│ · AgentRuntime: send_message / publish │
│ · 订阅路由: topic → 哪些 agent 收 │
│ · 序列化 / 声明式 Component 配置 │
└───────────────────────────────────────────┘
│ 适配

┌───────────────────────────────────────────┐
│ Ext 层: OpenAI 客户端 / 代码执行 / MCP 工具 │
└───────────────────────────────────────────┘

主线走一遍(高层,不进代码)——以"两 agent 轮流发言"为例:

  1. 你调用 team.run(task=...)。团队在 Core 运行时上注册好每个参与者和一个"主持人"(group chat manager),给每人分配一个专属频道(topic)
  2. 团队把起始任务作为一条 GroupChatStart 消息点对点发给主持人
  3. 主持人广播任务给所有参与者(让大家都有上下文),然后选出下一个发言人,朝那个人的频道发一条"请你发言"(GroupChatRequestPublish)。
  4. 被点到的参与者(其实是一个容器 agent 包着你的 AssistantAgent)跑自己的 LLM/工具循环,把回复广播回主持人频道
  5. 主持人把回复并入消息线,检查终止条件;没停就回到第 3 步选下一个人。
  6. 终止条件命中,主持人发出终止信号,run() 把收集到的全部消息作为 TaskResult 返回。

这条主线横跨两层:第 1、3、4 步的"发/广播"全是 Core 运行时的活;"选谁发言""跑工具循环"是 AgentChat 的活。后面四章就按这条主线由底向上展开。

3. 阅读地图(建议顺序)

这是个大项目,拆成四章。按顺序读最顺,但每章都能独立查:

  1. 01-core-runtime.md — 先懂底座。 Core 的 actor 运行时:AgentId 怎么寻址、send_message(点对点、要回复)和 publish_message(广播、不要回复)的区别、一条消息在内部队列里怎么被处理、订阅(subscription)怎么把广播路由到具体 agent。所有上层都站在这上面。
  2. 02-assistant-agent.md — 单个 agent 的心脏。 AssistantAgent.on_messages_stream 的完整循环:加上下文 → 注入记忆 → 调 LLM → 执行工具(可多轮)→ 反思或总结。工具调用循环、handoff、结构化输出都在这。
  3. 03-teams-groupchat.md — 多 agent 编排。 团队怎么把 AgentChat 的 agent"摆"到 Core 运行时上(topic/subscription 全景)、主持人的事件循环、三种选人策略(RoundRobin / Selector 用模型选 / Swarm 按 handoff 路由)。
  4. 04-clever-and-boundaries.md — 精华与边界。 声明式 Component 配置(存成 JSON 再加载)、SequentialRoutedAgent 的串行保序、可组合的终止条件、边界与维护模式、横向对比、代码地图。

给 AI agent 的提示: 想改"消息怎么路由"看第 1 章;想改"单 agent 行为/工具循环"看第 2 章;想改"谁先发言/团队结构"看第 3 章;想了解"配置序列化/局限"看第 4 章。每章末尾或第 4 章有按符号名索引的代码地图。