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 轮流发言"为例:
- 你调用
team.run(task=...)。团队在 Core 运行时上注册好每个参与者和一个"主持人"(group chat manager),给每人分配一个专属频道(topic)。 - 团队把起始任务作为一条
GroupChatStart消息点对点发给主持人。 - 主持人广播任务给所有参与者(让大家都有上下文),然后选出下一个发言人,朝那个人的频道发一条"请你发言"(
GroupChatRequestPublish)。 - 被点到的参与者(其实是一个容器 agent 包着你的
AssistantAgent)跑自己的 LLM/工具循环,把回复广播回主持人频道。 - 主持人把回复并入消息线,检查终止条件;没停就回到第 3 步选下一个人。
- 终止条件命中,主持人发出终止信号,
run()把收集到的全部消息作为TaskResult返 回。
这条主线横跨两层:第 1、3、4 步的"发/广播"全是 Core 运行时的活;"选谁发言""跑工具循环"是 AgentChat 的活。后面四章就按这条主线由底向上展开。
3. 阅读地图(建议顺序)
这是个大项目,拆成四章。按顺序读最顺,但每章都能独立查:
01-core-runtime.md— 先懂底座。 Core 的 actor 运行时:AgentId怎么寻址、send_message(点对点、要回复)和publish_message(广播、不要回复)的区别、一条消息在内部队列里怎么被处理、订阅(subscription)怎么把广播路由到具体 agent。所有上层都站在这上面。02-assistant-agent.md— 单个 agent 的心脏。AssistantAgent.on_messages_stream的完整循环:加上下文 → 注入记忆 → 调 LLM → 执行工具(可多轮)→ 反思或总结。工具调用循环、handoff、结构化输出都在这。03-teams-groupchat.md— 多 agent 编排。 团队怎么把 AgentChat 的 agent"摆"到 Core 运行时上(topic/subscription 全景)、主持人的事件循环、三种选人策略(RoundRobin / Selector 用模型选 / Swarm 按 handoff 路由)。04-clever-and-boundaries.md— 精华与边界。 声明式Component配置(存成 JSON 再加载)、SequentialRoutedAgent的串行保序、可组合的终止条件、边界与维护模式、横向对比、代码地图。
给 AI agent 的提示: 想改"消息怎么路由"看第 1 章;想改"单 agent 行为/工具循环"看第 2 章;想改"谁先发言/团队结构"看第 3 章;想了解"配置序列化/局限"看第 4 章。每章末尾或第 4 章有按符号名索引的代码地图。