AutoGen:基于对话的多智能体协作框架

FreeGuideOnline 最新 2026-06-14

AutoGen 对话代理:基于对话的多智能体协作框架

AutoGen 是由微软开源的编程框架,专为构建基于对话的智能体(Agent)而设计。它允许多个 AI 智能体通过消息传递协同工作,完成复杂任务。本教程将带你从零开始,了解核心概念并上手创建自己的对话代理。


为什么要用 AutoGen?

传统单智能体系统在处理多步骤、需要分工协作的任务时容易出错。AutoGen 通过以下几个特性解决了这些问题:

  • 对话即编程:代理之间通过自然语言或结构化消息协作,可读性强、调试方便。
  • 动态多代理协调:轻松构建包含不同角色(如助手、用户代理、工具执行器)的对话组。
  • 人机协作回路:支持将人类纳入对话,在关键决策点请求输入。
  • 工具与代码执行集成:代理可以生成并执行 Python 代码,或调用外部 API。
  • 可扩展性:基于简单的接口,你可以自定义代理行为、记忆和对话模式。

核心概念速览

在动手编码前,先理解几个关键抽象:

概念 说明
Agent(代理) 一个能发送和接收消息、执行动作的实体。例如 AssistantAgentUserProxyAgent
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 通过 GroupChatGroupChatManager 实现多智能体对话。

场景示例:代码审查与优化

创建三个代理:提问者编码员审核员

# 提问者(用户代理)
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)

之后像普通代理一样使用它。这种灵活性允许你融入业务规则、记忆控制、权限检查等。


常用模式与场景

  1. 协作编程:助手写代码,用户代理执行并反馈错误,自动迭代直至成功。
  2. 任务分解与委派:使用嵌套群聊,一个管理者将子任务分发给专业代理。
  3. 模拟对话与辩论:让两个助手相互质疑,最终得出更可靠结论。
  4. 持续交互式应用:结合 WebSocket/UI,持续接收用户消息并调动代理群。

常见问题与排错

  • API 限流或模型错误:检查 config_list 中的 API key 和模型名称,可配置重试策略。
  • 代码执行失败:确保执行环境已安装所需的 Python 包,可在 system_message 中告知助手使用特定版本。
  • GroupChat 发言无限循环:设置 max_round 或使用 auto 选择 + 明确的终止条件(如审核员回复 APPROVE)。
  • 输出管控:在 system message 中明确指示代理的输出格式,避免无用兜底。

下一步学习

AutoGen 将对话从单调的问答变成可编排的智能体协作流程。现在你可以用上面学到的内容,开始构建属于你自己的多智能体系统了。