Skip to content
🔗 分享本题
查看我的学习进度 →

AutoGen GroupChatManager 动态选择发言者并让不同 Agent 在共享消息流中协商和调用工具

🧠 图解记忆: AutoGen 用对话协商换灵活性,必须用发言选择、终止条件和预算防止失控。

💡 答案要点

AutoGen = 微软开源的对话式多Agent框架

AutoGen核心理念

通过Agent间对话完成复杂任务,而非预定义工作流

传统工作流:
Agent A → Agent B → Agent C (固定顺序)

AutoGen对话式:
Agent A ←→ Agent B
    ↓          ↓
  Agent C ←→ Agent D
(动态协商,类似人类团队讨论)

AutoGen核心组件

组件类型作用
UserProxyAgent代理用户执行代码/收集反馈/与用户交互
AssistantAgentAI助手推理/生成方案/调用工具
GroupChat多Agent管理管理多Agent对话流程
GroupChatManager调度器决定下一个发言的Agent

AutoGen实战: 数据分析任务

场景: 分析销售数据并生成报告

展开 Python 代码示例(83 行)
python
import autogen

# 1. 配置LLM
llm_config = {
    "model": "qwen3.5-plus",
    "api_key": "sk-xxx",
    "temperature": 0.7
}

# 2. 创建UserProxyAgent (执行代码)
user_proxy = autogen.UserProxyAgent(
    name="UserProxy",
    human_input_mode="NEVER",  # 自动执行,不需人工干预
    code_execution_config={
        "work_dir": "coding",
        "use_docker": False  # 本地执行Python代码
    }
)

# 3. 创建AssistantAgent (数据分析师)
data_analyst = autogen.AssistantAgent(
    name="DataAnalyst",
    llm_config=llm_config,
    system_message="""
    你是数据分析专家。
    任务: 分析销售数据,发现趋势,生成Python代码。
    要求: 使用pandas和matplotlib。
    """
)

# 4. 创建AssistantAgent (报告撰写者)
report_writer = autogen.AssistantAgent(
    name="ReportWriter",
    llm_config=llm_config,
    system_message="""
    你是商业报告撰写专家。
    任务: 将数据分析结果写成专业报告。
    要求: 包含关键发现、洞察和建议。
    """
)

# 5. 创建GroupChat
groupchat = autogen.GroupChat(
    agents=[user_proxy, data_analyst, report_writer],
    messages=[],
    max_round=10  # 最多10轮对话
)

# 6. 创建Manager
manager = autogen.GroupChatManager(
    groupchat=groupchat,
    llm_config=llm_config
)

# 7. 启动任务
user_proxy.initiate_chat(
    manager,
    message="""
    分析 sales_data.csv,生成月度销售报告。
    要求:
    1. 计算环比增长率
    2. 找出销售额最高的5个产品
    3. 生成趋势图
    4. 撰写200字分析报告
    """
)

# 8. 对话流程(自动进行)
"""
UserProxy: "分析sales_data.csv..." (发起任务)

DataAnalyst: "我将用pandas读取数据..." (制定计划)

UserProxy: 执行代码: pd.read_csv("sales_data.csv")

DataAnalyst: "数据已读取,发现XX趋势,生成可视化代码..."

UserProxy: 执行代码: plt.plot(...); plt.savefig("trend.png")

ReportWriter: "根据分析结果,我撰写报告如下:..."

UserProxy: "任务完成,报告已生成"
"""

AutoGen高级特性

特性1: 人类在环(Human-in-the-Loop)

python
# 关键决策需人工确认
user_proxy = autogen.UserProxyAgent(
    name="UserProxy",
    human_input_mode="ALWAYS",  # 每步都需确认
    # 或: "TERMINATE" - 只在终止前确认
)

# 对话流程:
"""
DataAnalyst: "我将删除销售额<100的数据"
UserProxy: [等待人工确认] → 输入 "y" 确认
DataAnalyst: "已删除,继续分析..."
"""

特性2: 自定义发言顺序

python
def custom_speaker_selection(last_speaker, groupchat):
    """自定义下一个发言者"""

    # 规则1: DataAnalyst说完,让UserProxy执行代码
    if last_speaker.name == "DataAnalyst":
        return groupchat.agent_by_name("UserProxy")

    # 规则2: UserProxy执行完,检查是否需要报告
    if last_speaker.name == "UserProxy":
        if "数据分析完成" in groupchat.messages[-1]["content"]:
            return groupchat.agent_by_name("ReportWriter")
        else:
            return groupchat.agent_by_name("DataAnalyst")

    # 规则3: ReportWriter写完,终止
    if last_speaker.name == "ReportWriter":
        return None  # 终止对话

    return None

# 应用自定义策略
manager = autogen.GroupChatManager(
    groupchat=groupchat,
    llm_config=llm_config,
    speaker_selection_method=custom_speaker_selection
)

特性3: 工具调用集成

python
# 定义工具函数
def query_database(sql: str) -> str:
    """查询数据库"""
    conn = sqlite3.connect("sales.db")
    df = pd.read_sql(sql, conn)
    return df.to_string()

def send_email(to: str, subject: str, body: str) -> str:
    """发送邮件"""
    # 实际发送逻辑...
    return f"邮件已发送给{to}"

# 注册工具到AssistantAgent
data_analyst.register_function(
    function_map={
        "query_database": query_database,
        "send_email": send_email
    }
)

# Agent会自动选择工具
"""
DataAnalyst: "我需要查询数据库"
→ 自动调用 query_database("SELECT * FROM sales")
→ 获取结果后继续分析
"""

AutoGen vs CrewAI vs MetaGPT

框架核心理念优势适用场景
AutoGen对话式协作灵活,迭代细化需要讨论的任务(代码debug/数据分析)
CrewAI角色驱动结构清晰类团队协作(研究→撰写→审核)
MetaGPT软件开发专注代码生成自动化软件开发

AutoGen实战案例: 自动化代码Review

展开 Python 代码示例(44 行)
python
# 场景: 自动审查Pull Request

# 1. CodeReviewer Agent
reviewer = autogen.AssistantAgent(
    name="CodeReviewer",
    system_message="""
    你是高级代码审查专家。
    任务: 审查代码质量、安全性、性能问题。
    标准: PEP8规范、无SQL注入风险、时间复杂度合理。
    """
)

# 2. CodeRefactorer Agent
refactorer = autogen.AssistantAgent(
    name="CodeRefactorer",
    system_message="""
    你是代码重构专家。
    任务: 根据CodeReviewer的建议优化代码。
    要求: 保持功能不变,提升可读性和性能。
    """
)

# 3. Tester Agent
tester = autogen.AssistantAgent(
    name="Tester",
    system_message="""
    你是测试工程师。
    任务: 为重构后的代码生成单元测试。
    要求: 覆盖率>80%,包含边界情况。
    """
)

# 4. GroupChat
groupchat = autogen.GroupChat(
    agents=[user_proxy, reviewer, refactorer, tester],
    messages=[],
    max_round=15
)

# 5. 启动Review
user_proxy.initiate_chat(
    manager,
    message="""
    审查以下代码:
    ```python
def process_user_input(data): query = f"SELECT * FROM users WHERE name='{data}'" return db.execute(query) ``` """ )

6. 对话流程

""" UserProxy: "审查以下代码..." (提交代码) ↓ CodeReviewer: "发现问题:

  1. SQL注入风险 - 直接拼接用户输入
  2. 缺少异常处理
  3. 变量名不规范" ↓ CodeRefactorer: "我将重构代码:
python
def process_user_input(user_data: str) -> List[Dict]:
    try:
        query = \"SELECT * FROM users WHERE name = ?\"
        return db.execute(query, (user_data,))
    except DatabaseError as e:
        logger.error(f\"Query failed: {e}\")
        raise
```"

UserProxy: 执行代码(保存重构版本)

Tester:
"我将生成测试:
```python
def test_process_user_input():
    # 正常情况
    assert process_user_input(\"John\") == [...]

    # SQL注入测试
    assert process_user_input(\"'; DROP TABLE users--\") 不会执行危险操作

    # 异常处理
    with pytest.raises(DatabaseError):
        process_user_input(invalid_data)
```"

UserProxy: "Review完成,代码已优化并附带测试"
"""

AutoGen调试技巧

python
# 1. 打印对话历史
for msg in groupchat.messages:
    print(f"{msg['name']}: {msg['content'][:100]}...")

# 2. 限制单Agent发言次数
autogen.ConversableAgent(
    max_consecutive_auto_reply=3  # 最多连续说3次
)

# 3. 设置超时
user_proxy.initiate_chat(
    manager,
    message="...",
    clear_history=True,  # 清除历史
    silent=False,        # 打印对话
    timeout=300          # 5分钟超时
)

面试话术:

"AutoGen的核心是对话式协作,不同于固定工作流。我用AutoGen做过代码Review:3个Agent(Reviewer审查/Refactorer重构/Tester测试)通过对话迭代优化代码。关键是定义好每个Agent的system_message,让它们有明确分工。AutoGen优势是灵活,Agent可以讨论来回,类似真实团队;缺点是可控性不如固定工作流。实战中我用自定义speaker_selection控制发言顺序,避免无限循环。"