AutoGen:基于对话的多智能体协作框架
AutoGen 对话代理:基于对话的多智能体协作框架
AutoGen 是由微软开源的编程框架,专为构建基于对话的智能体(Agent)而设计。它允许多个 AI 智能体通过消息传递协同工作,完成复杂任务。本教程将带你从零开始,了解核心概念并上手创建自己的对话代理。
为什么要用 AutoGen?
传统单智能体系统在处理多步骤、需要分工协作的任务时容易出错。AutoGen 通过以下几个特性解决了这些问题:
- 对话即编程:代理之间通过自然语言或结构化消息协作,可读性强、调试方便。
- 动态多代理协调:轻松构建包含不同角色(如助手、用户代理、工具执行器)的对话组。
- 人机协作回路:支持将人类纳入对话,在关键决策点请求输入。
- 工具与代码执行集成:代理可以生成并执行 Python 代码,或调用外部 API。
- 可扩展性:基于简单的接口,你可以自定义代理行为、记忆和对话模式。
核心概念速览
在动手编码前,先理解几个关键抽象:
| 概念 | 说明 |
|---|---|
| Agent(代理) | 一个能发送和接收消息、执行动作的实体。例如 AssistantAgent 或 UserProxyAgent。 |
| ConversableAgent | 所有代理的基类,提供消息收发、对话记录管理等能力。 |
| 消息(Message) | 一个 Python 字典,通常包含 content 字段,表示对话中的一条发言。 |
| 对话(Conversation) | 两个或多个代理之间的一系列消息流。 |
| 工具(Tool) | 代理可调用的函数,用于获取外部信息或执行操作。 |
| 代码执行器(Code Executor) | 安全执行 Python 代码的环境,支持本地、Docker 或命令行执行。 |
环境安装与设置
pip install pyautogen
推荐使用 Python 3.9 及以上版本。如果需要代码执行功能,建议安装 Docker(更安全),也可使用本地执行模式。
创建一个 Python 文件并导入基础模块:
import autogen
from autogen import AssistantAgent, UserProxyAgent
配置 LLM 参数(例如使用 OpenAI API):
config_list = [
{
"model": "gpt-4",
"api_key": "YOUR_API_KEY"
}
]
你也可以使用本地部署的模型,AutoGen 支持多种推理后端。
第一个对话代理:助手与用户代理
我们从最简单的双智能体对话开始:一个 AssistantAgent 充当 AI 助手,一个 UserProxyAgent 代表人类用户(或模拟用户请求)。
# 创建助手代理
assistant = AssistantAgent(
name="assistant",
llm_config={"config_list": config_list},
system_message="你是一个有帮助的AI助手。请用中文回答。"
)
# 创建用户代理(设置人类输入模式为“NEVER”自动模拟,也可“ALWAYS”每次询问真人)
user_proxy = UserProxyAgent(
name="user_proxy",
human_input_mode="NEVER",
max_consecutive_auto_reply=10,
code_execution_config={
"work_dir": "coding",
"use_docker": False # 若未安装Docker可设为False
}
)
启动对话,让用户代理发送初始任务:
task = "请写一个Python函数计算斐波那契数列前20项,并打印结果。"
user_proxy.initiate_chat(assistant, message=task)
运行后观察输出:助手生成代码并发送给用户代理,用户代理执行代码并将结果返回给助手,助手最后总结回答。这就是 AutoGen 的核心协作模式——双方通过消息交互,直至任务完成。
多智能体协作:构建一个团队
现实任务往往需要不同角色分工。AutoGen 通过 GroupChat 与 GroupChatManager 实现多智能体对话。
场景示例:代码审查与优化
创建三个代理:提问者、编码员、审核员。
# 提问者(用户代理)
questioner = UserProxyAgent(
name="questioner",
human_input_mode="NEVER",
max_consecutive_auto_reply=10,
code_execution_config={"work_dir": "group_work", "use_docker": False}
)
# 编码员
coder = AssistantAgent(
name="coder",
system_message="你是Python专家。根据需求编写清晰、可运行的代码,必要时添加注释。直接输出代码,不要多余解释。",
llm_config={"config_list": config_list}
)
# 审核员
reviewer = AssistantAgent(
name="reviewer",
system_message="你是资深代码审查者。检查coder给出的代码,指出潜在错误、性能问题,并建议改进。如果没有问题,只需回复‘APPROVE’。",
llm_config={"config_list": config_list}
)
定义允许发言顺序的规则,并创建 GroupChat:
from autogen import GroupChat, GroupChatManager
groupchat = GroupChat(
agents=[questioner, coder, reviewer],
messages=[],
max_round=10,
speaker_selection_method="round_robin" # 轮流发言或使用other策略
)
manager = GroupChatManager(groupchat=groupchat, llm_config={"config_list": config_list})
发起群聊:
task = "我需要一个函数,输入URL,返回网页标题。要用requests和BeautifulSoup。"
questioner.initiate_chat(manager, message=task)
这种方式让不同代理按顺序协作,但更高级的用法是使用 auto 发言选择,由 GPT 根据上下文自动决定下一个发言的代理:
groupchat.speaker_selection_method = "auto"
工具集成:让代理使用外部函数
代理可以通过函数调用(Function Calling)扩展能力。定义一个工具并注册给代理。
# 定义工具函数
def get_stock_price(symbol: str) -> float:
"""获取指定股票的最新价格(模拟)。"""
# 实际应调用API
mock_prices = {"AAPL": 178.5, "MSFT": 334.2}
return mock_prices.get(symbol, 0.0)
# 创建使用工具的助手
assistant = AssistantAgent(
name="stock_assistant",
system_message="你是金融助手。用到get_stock_price工具回答股票价格。",
llm_config={
"config_list": config_list,
"tools": [ # 旧版本写法,新版本推荐直接在llm_config中设置functions
{
"type": "function",
"function": {
"name": "get_stock_price",
"description": "获取给定股票的实时价格",
"parameters": {
"type": "object",
"properties": {
"symbol": {"type": "string", "description": "股票代码,如AAPL"}
},
"required": ["symbol"]
}
}
}
]
}
)
# 用户代理需要能够执行工具调用
user_proxy = UserProxyAgent(
name="user_proxy",
human_input_mode="NEVER",
code_execution_config=False
)
# 注册实际的可执行函数
from autogen import register_function
register_function(
get_stock_price,
caller=assistant,
executor=user_proxy,
description="获取股票价格"
)
现在用户提问“AAPL现在多少钱?”,助手将自动生成工具调用,用户代理执行函数并返回结果,助手据此回答。
注:新版(>=0.2)推荐直接在
llm_config中设置functions,并配合register_function使用,能简化工具定义。
代码执行与沙盒安全
AutoGen 一大亮点是能够自动生成并执行代码。默认支持本地命令执行和 Docker 执行两种模式。本地模式快捷,但需要注意安全性;Docker 模式提供了隔离环境。
配置代码执行器示例:
from autogen.coding import LocalCommandLineCodeExecutor, DockerCommandLineCodeExecutor
# 本地执行器
local_executor = LocalCommandLineCodeExecutor(work_dir="exec_output")
user_proxy = UserProxyAgent(
name="user_proxy",
code_execution_config={"executor": local_executor}
)
若使用 Docker,确保本地已安装并运行 Docker,然后:
docker_executor = DockerCommandLineCodeExecutor(image="python:3.11-slim", timeout=60)
user_proxy = UserProxyAgent(
name="user_proxy",
code_execution_config={"executor": docker_executor}
)
助手在回复中包含代码块(python ... )时,用户代理会自动提取并执行,输出结果作为下一条消息返回。
人类参与回路(Human-in-the-Loop)
在生产场景中,有时需要在最终执行前让人工审核。设置 human_input_mode 控制:
"ALWAYS":每次用户代理收到消息后,都会请求真人输入。"NEVER":完全自动。"TERMINATE":仅在对话结束时征求真人意见是否终止。
也可动态调整。例如在代码执行前要求人工批准:
user_proxy = UserProxyAgent(
name="approver",
human_input_mode="ALWAYS" # 收到代码执行提议时,真人可以拒绝或修改
)
真实交互中,终端会等待输入,你可以在 AutoGen 的 Run 环境或 Web UI 中与之互动。
自定义代理:扩展 ConversableAgent
你可以继承 ConversableAgent 实现特定行为的代理。例如一个记录每次对话长度并拒绝过长消息的代理:
class LimitedLengthAgent(autogen.ConversableAgent):
def __init__(self, max_length=500, *args, **kwargs):
super().__init__(*args, **kwargs)
self.max_length = max_length
self.history_length = []
def process_message(self, message, sender):
content = message.get("content", "")
if len(content) > self.max_length:
return {"content": f"消息过长({len(content)}字符),请精简。", "role": "user"}
self.history_length.append(len(content))
return super().process_message(message, sender)
之后像普通代理一样使用它。这种灵活性允许你融入业务规则、记忆控制、权限检查等。
常用模式与场景
- 协作编程:助手写代码,用户代理执行并反馈错误,自动迭代直至成功。
- 任务分解与委派:使用嵌套群聊,一个管理者将子任务分发给专业代理。
- 模拟对话与辩论:让两个助手相互质疑,最终得出更可靠结论。
- 持续交互式应用:结合 WebSocket/UI,持续接收用户消息并调动代理群。
常见问题与排错
- API 限流或模型错误:检查
config_list中的 API key 和模型名称,可配置重试策略。 - 代码执行失败:确保执行环境已安装所需的 Python 包,可在
system_message中告知助手使用特定版本。 - GroupChat 发言无限循环:设置
max_round或使用auto选择 + 明确的终止条件(如审核员回复APPROVE)。 - 输出管控:在 system message 中明确指示代理的输出格式,避免无用兜底。
下一步学习
- 阅读官方文档:https://microsoft.github.io/autogen/
- 查看示例库 GitHub: microsoft/autogen
- 实验不同的发言选择策略和记忆管理机制(如向量数据库集成)。
AutoGen 将对话从单调的问答变成可编排的智能体协作流程。现在你可以用上面学到的内容,开始构建属于你自己的多智能体系统了。