Agent 框架 13:AutoGen——微软多智能体会话编排与代码执行

在探索多智能体系统(Multi-Agent Systems)的众多思潮中,微软研究院开源的 AutoGen(GitHub 仓库:microsoft/autogen)开辟了一个极具代表性的技术流派:将多智能体协作形式化为“多角色群聊对话”(Conversational Multi-Agent)。

在 AutoGen 的设计哲学中,不同的 Agent 拥有各自的专业背景与角色定位,它们不需要依赖僵硬死板的硬编码数据通道,而是像一个真实的软件研发小组一样,在“聊天室”里通过自然语言互相讨论、审查质疑、编写代码并在沙箱中即时执行排错。

[!IMPORTANT]
版本断代特别说明:AutoGen 经历过一次极其彻底的底层重构(从 v0.2 到 v0.4+)。旧版 v0.2 依赖隐式上下文和不可控的同步阻塞调用;而全新的 AutoGen v0.4+(AgentChat 体系) 采用了全异步事件驱动、模块化解耦的现代架构。本文所有代码与原理分析均以全新的 v0.4+ 为准。


核心系统架构与群聊协作拓扑

在 AutoGen v0.4+ 中,所有智能体均被组织进一个受控的 Team(协作团队)中,由消息总线和终止条件(Termination Condition)共同维系生命周期:


核心概念原语

AutoGen v0.4+ 抽象出了一组直观的协作构件:

构件 运行时角色 核心职责
AssistantAgent 纯思考智能体 绑定大模型后端,依据设定的系统角色(System Message)参与群聊对话
CodeExecutorAgent 代码执行智能体 专门监听会话中出现的代码块,提取并发送到安全沙箱(Local / Docker)中运行
UserProxyAgent 人类代理智能体 代表人类用户发言,支持等待控制台输入或在关键环节做人工审批(Human-in-the-loop)
RoundRobinGroupChat 轮询协作模式 参与者按固定的数组顺序依次发言(Agent A -> Agent B -> Agent A)
SelectorGroupChat 智能选择协作模式 由专有的大模型充当“群主”,根据当前聊天进展动态点名下一位最该发言的 Agent
TerminationCondition 终止守卫条件 判定对话何时停止,防止智能体之间无限“客套”或陷入死循环

安装与快速启动

通过 pip 安装现代版 AutoGen 核心与 OpenAI 扩展:

1
pip install autogen-agentchat "autogen-ext[openai]"

最小示例:助手与批评者的双智能体辩论(Assistant + Critic)

在这个模式中,一个负责给方案,另一个负责挑毛病,通过多轮迭代显著提升回答质量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import MaxMessageTermination
from autogen_ext.models.openai import OpenAIChatCompletionClient

async def run_critic_debate():
# 1. 初始化模型客户端
model_client = OpenAIChatCompletionClient(model="gpt-4o-mini")

# 2. 定义方案产出者
drafter = AssistantAgent(
name="Drafter",
model_client=model_client,
system_message="你是一名方案架构师。请针对用户的需求提出系统设计方案。",
)

# 3. 定义挑刺的审查者
critic = AssistantAgent(
name="Critic",
model_client=model_client,
system_message="""你是一名极其严苛的系统可靠性工程师。
审查 Drafter 的方案,重点挑出:单点故障、并发瓶颈与数据一致性隐患,并要求其给出改进对策。""",
)

# 4. 组装为轮询团队,限制最多 4 条消息熔断
team = RoundRobinGroupChat(
participants=[drafter, critic],
termination_condition=MaxMessageTermination(max_messages=4),
)

# 5. 触发任务
result = await team.run(task="设计一个支持每秒 10 万次秒杀请求的分布式库存扣减架构。")

# 打印完整的辩论过程
for msg in result.messages:
print(f"\n💬 【{msg.source} 发言】:")
print(msg.content)

if __name__ == "__main__":
asyncio.run(run_critic_debate())

杀手级能力:原生代码编写与沙箱执行闭环

AutoGen 最强大的工程特色在于将大语言模型与真实操作系统执行环境结合。下面演示 Coder 编写 Python 脚本绘制图表,Executor 真实运行代码并回传图表文件的完整过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import asyncio
from autogen_agentchat.agents import AssistantAgent, CodeExecutorAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import TextMentionTermination
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_ext.code_executors.local import LocalCommandLineCodeExecutor

async def run_code_execution_loop():
model_client = OpenAIChatCompletionClient(model="gpt-4o")

# 1. 编程专家:只输出代码块,完成后附带 TERMINATE 关键词
coder = AssistantAgent(
name="PythonCoder",
model_client=model_client,
system_message="""你是一名资深 Python 数据科学家。
请编写完整的 Python 脚本来解决问题,代码必须包裹在 ```python ... ``` 块中。
确保脚本包含必要的依赖导入,并能独立运行。
当任务成功完成且代码已成功运行后,回复单词 TERMINATE 结束对话。""",
)

# 2. 执行沙箱:在指定的本地隔离工作目录下运行 Shell 命令
executor = CodeExecutorAgent(
name="CodeRunner",
code_executor=LocalCommandLineCodeExecutor(work_dir="./sandbox_tmp"),
)

# 3. 设置终止条件:当消息包含 TERMINATE 时停机
team = RoundRobinGroupChat(
participants=[coder, executor],
termination_condition=TextMentionTermination("TERMINATE"),
)

# 4. 执行任务
task_desc = "计算 2020 年至 2025 年的复合增长率(初始 100,最终 350),并打印计算结果。"
print(f"🚀 启动任务: {task_desc}")

result = await team.run(task=task_desc)

for msg in result.messages:
print(f"\n[{msg.source}]: {msg.content}")

if __name__ == "__main__":
asyncio.run(run_code_execution_loop())

在执行过程中,你会看到:

  1. PythonCoder 输出包含公式计算的 Python 代码块。
  2. CodeRunner 截获代码并在 ./sandbox_tmp 中写入临时文件并运行,将控制台输出(如 复合增长率 CAGR: 28.47%)回传至群聊中。
  3. PythonCoder 读到运行结果后确认无误,输出 TERMINATE,优雅退出。

动态群聊调度:SelectorGroupChat

在包含多个专家(规划、搜索、编写)的场景中,固定顺序发言显得过于死板。SelectorGroupChat 会在每一轮对话结束后,调用一个仲裁模型来判断“下一个最该发言的人是谁”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from autogen_agentchat.teams import SelectorGroupChat
from autogen_agentchat.conditions import MaxMessageTermination

# 多个垂直角色
planner = AssistantAgent(name="Planner", model_client=model_client, system_message="负责大局规划")
researcher = AssistantAgent(name="Researcher", model_client=model_client, system_message="负责收集事实")
writer = AssistantAgent(name="Writer", model_client=model_client, system_message="负责撰写报告")

# 智能群聊:LLM 作为主持人动态指定下一棒
dynamic_team = SelectorGroupChat(
participants=[planner, researcher, writer],
model_client=model_client, # 主持人模型
termination_condition=MaxMessageTermination(max_messages=8),
)

人在回路(Human-in-the-loop):安全审批机制

在涉及高危操作(如线上部署、数据库变更)时,可以通过 UserProxyAgent 挂起执行,等待人类操作员在控制台输入批准指令:

1
2
3
4
5
6
7
from autogen_agentchat.agents import UserProxyAgent

# 注入人工审核节点
human_supervisor = UserProxyAgent(
name="HumanSupervisor",
input_func=input, # 从终端标准输入阻塞读取管理员确认
)

AutoGen v0.2 与 v0.4+ 架构横向对比

架构维度 AutoGen v0.2(旧版) AutoGen v0.4+(现代版 AgentChat)
主要包名 pyautogen / autogen autogen-agentchat + autogen-core
模型注入机制 复杂的字典字典嵌套 llm_config={"config_list": [...]} 显式强类型客户端 OpenAIChatCompletionClient
运行入口 agent.initiate_chat(...) await team.run(task=...)
异步流式设计 同步阻塞为主,异步支持不完整 原生 100% 全异步(Async/Await)与全事件流驱动
组件耦合度 核心逻辑严重耦合在庞大的基类中 核心原语、网络通信、AgentChat 完全正交拆分

优缺点分析与工程选型边界

核心优势

  1. 代码生成与即时执行能力独步业界:在数据科学、代码编写、算法验证等需要“边写边跑边改”的场景中,AutoGen 的协作表现极其出色。
  2. 多角色讨论模式非常直观:自然语言作为通信协议,降低了多 Agent 业务建模的心智负担。
  3. 微软官方全力投入:v0.4 架构完成彻底重构后,代码规范度与异步性能得到了质的飞跃。

现实痛点与妥协

  1. 群聊发散度难以绝对精准掌控:多个 Agent 在自然语言环境下讨论,容易出现互相吹捧、偏离主题或消耗大量 Token 的现象,必须设置严苛的终止条件。
  2. 不适合严格的线性确定性工作流:如果你的业务是“第 1 步绝对到第 2 步,绝不允许偏离”,用图框架(如 LangGraph)远比开放式群聊更可靠。
  3. 代码执行存在安全沙箱要求:在生产环境中运行代码,必须配置严密的 Docker 容器或安全微虚拟机(如 Firecracker),防止恶意代码穿透主机。

关联导航