【三个月 AI Agent 实战学习】Day 48:AutoGen GroupChat —— 多 Agent 群聊协作机制
Day 48AutoGen GroupChat —— 多 Agent 群聊协作机制欢迎来到第四十八天前两天我们掌握了 AutoGen 的基本对话和人类介入机制。今天我们将学习 AutoGen 最强大的功能之一GroupChat群聊。它允许多个 Agent 在同一个会议室里自由讨论由GroupChatManager负责管理发言顺序和对话流程。这是构建投资辩论赛、方案评审会等多智能体协作场景的核心机制。一、今日学习目标理解 GroupChat 的核心概念多 Agent 共享一个消息池按规则轮流发言。掌握GroupChat和GroupChatManager的创建与配置方法。学会控制发言顺序auto、round_robin、random、manual四种模式。通过实验观察 GroupChatManager 如何动态选择下一个发言者。构建一个三人圆桌讨论示例体验多 Agent 群聊的协作流程。二、详细实现步骤步骤 1理解 GroupChat 的架构核心组件┌─────────────────────────────────────────────────┐ │ GroupChat │ │ ┌─────────────────────────────────────────────┐│ │ │ 共享消息池 (messages) ││ │ │ 用户: 请讨论AI对教育的影响 ││ │ │ AgentA: 我认为... ││ │ │ AgentB: 我补充... ││ │ │ AgentC: 我反对... ││ │ └─────────────────────────────────────────────┘│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Agent A │ │ Agent B │ │ Agent C │ │ │ └──────────┘ └──────────┘ └──────────┘ │ └─────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────┐ │ GroupChatManager │ │ (决定下一个发言者) │ └─────────────────────────┘工作机制所有 Agent 共享一个消息列表messages。每次需要某个 Agent 发言时GroupChatManager根据规则选择下一个发言者。被选中的 Agent 读取完整消息历史生成回复追加到消息池。重复上述过程直到对话终止。与 CrewAI 的核心区别CrewAI 是任务驱动Agent 按预定义任务顺序工作。AutoGen GroupChat 是对话驱动Agent 根据上下文动态发言更接近真实讨论。步骤 2环境准备确保已安装pyautogen。新建autogen_groupchat.py配置 DeepSeekimportosfromdotenvimportload_dotenvimportautogen load_dotenv()config_list[{model:deepseek-chat,api_key:os.getenv(DEEPSEEK_API_KEY),base_url:https://api.deepseek.com,}]llm_config{config_list:config_list,temperature:0.7,}步骤 3创建多个 Agent我们创建三个角色模拟一场关于AI 对教育影响的圆桌讨论# 乐观派专家optimistautogen.AssistantAgent(name乐观派专家,llm_configllm_config,system_message你是一位对 AI 教育持乐观态度的专家。 你认为 AI 能够个性化教学、解放教师生产力、让优质教育资源普惠。 发言时要观点鲜明用具体案例支撑每次发言控制在 100 字以内。)# 悲观派专家pessimistautogen.AssistantAgent(name悲观派专家,llm_configllm_config,system_message你是一位对 AI 教育持谨慎态度的专家。 你担心 AI 会加剧教育不平等、削弱师生情感连接、导致学生过度依赖技术。 发言时要观点鲜明指出潜在风险每次发言控制在 100 字以内。)# 中立主持人moderatorautogen.AssistantAgent(name主持人,llm_configllm_config,system_message你是一场圆桌讨论的主持人。 你的职责是引导讨论、总结双方观点、提出关键问题。 当讨论充分时请输出讨论结束并给出总结。 每次发言控制在 80 字以内。)步骤 4创建 UserProxyAgent 发起讨论user_proxyautogen.UserProxyAgent(name用户,human_input_modeNEVER,max_consecutive_auto_reply10,code_execution_configFalse,is_termination_msglambdamsg:讨论结束inmsg.get(content,),)注意is_termination_msg自定义终止条件——当任何消息包含讨论结束时对话终止。步骤 5创建 GroupChat 和 GroupChatManager# 创建群聊指定参与者groupchatautogen.GroupChat(agents[user_proxy,optimist,pessimist,moderator],messages[],max_round12,# 最多 12 轮发言speaker_selection_methodauto,# 由 LLM 决定下一个发言者)# 创建群聊管理器managerautogen.GroupChatManager(groupchatgroupchat,llm_configllm_config,)# 发起讨论user_proxy.initiate_chat(manager,message请讨论人工智能对教育行业是利大于弊还是弊大于利请各方发表观点主持人最后总结。)运行脚本python autogen_groupchat.py你会看到四个 Agent 轮流发言讨论逐步深入最终主持人总结并输出讨论结束。步骤 6理解四种发言选择模式speaker_selection_method控制 GroupChatManager 如何选择下一个发言者模式行为适用场景auto由 LLM 根据上下文决定下一个发言者自由讨论、辩论round_robin按agents列表顺序轮流发言结构化会议random随机选择发言者头脑风暴manual每次由人类指定发言者教学演示、精细控制6.1 体验round_robingroupchatautogen.GroupChat(agents[user_proxy,optimist,pessimist,moderator],messages[],max_round8,speaker_selection_methodround_robin,# 按顺序轮流)运行后发言顺序严格为用户 → 乐观派 → 悲观派 → 主持人 → 用户 → …6.2 体验manualgroupchatautogen.GroupChat(agents[user_proxy,optimist,pessimist,moderator],messages[],max_round8,speaker_selection_methodmanual,# 人类指定)运行后每轮都会提示你选择下一个发言者输入 Agent 名称。适合教学演示。6.3 体验auto的动态选择在auto模式下GroupChatManager会调用 LLM 分析当前对话决定谁最应该发言。例如用户提问后乐观派先发言。悲观派反驳。主持人介入调解。如此循环。你可以通过verboseTrue观察 Manager 的选择理由。步骤 7自定义发言选择函数进阶如果四种内置模式不满足需求可以传入自定义函数defcustom_speaker_selection(last_speaker,groupchat):自定义发言顺序乐观派和悲观派交替主持人每 4 轮介入一次messagesgroupchat.messages round_numlen(messages)ifround_num%40:returnmoderatoreliflast_speakeroptimist:returnpessimisteliflast_speakerpessimist:returnoptimistelse:returnoptimist groupchatautogen.GroupChat(agents[user_proxy,optimist,pessimist,moderator],messages[],max_round12,speaker_selection_methodcustom_speaker_selection,)步骤 8观察 GroupChat 的消息结构运行结束后可以查看groupchat.messages了解完整对话历史fori,msginenumerate(groupchat.messages):print(f[{i}]{msg[name]}:{msg[content][:80]}...)每条消息包含name发言者、content内容、role角色等字段。三、常见问题与调试Q1GroupChat 报错 “max_round exceeded”对话未终止。→ 增加max_round或在system_message中要求某个 Agent 在讨论充分后输出终止关键词并配合is_termination_msg。Q2auto模式下发言顺序混乱某个 Agent 一直发言。→ 可以在system_message中明确各 Agent 的发言时机如仅在主持人点名后发言。也可以改用round_robin或自定义选择函数。Q3GroupChatManager 选择发言者时 Token 消耗大。→ Manager 每次选择都要调用 LLM。可以使用round_robin避免额外 LLM 调用。使用更小的模型做 Manager。减少max_round。Q4人类用户如何加入群聊发言→ 将UserProxyAgent加入agents列表设置human_input_modeALWAYS并在speaker_selection_method中允许选择它。但要注意人类发言可能打乱节奏建议用manual模式或设置发言规则。Q5对话内容太长超出上下文窗口。→ 减少max_round或在system_message中要求 Agent 发言简洁。AutoGen 也支持消息裁剪但需要手动配置。Q6如何保存群聊记录→groupchat.messages是完整记录可以序列化为 JSON 保存importjsonwithopen(groupchat_log.json,w,encodingutf-8)asf:json.dump(groupchat.messages,f,ensure_asciiFalse,indent2)Q7GroupChat 和 CrewAI 的 Hierarchical 模式有什么区别→ CrewAI 的 Hierarchical 是经理分配任务给员工任务驱动AutoGen GroupChat 是多人自由讨论对话驱动。前者适合明确分工的流水线后者适合需要观点碰撞的讨论。四、今日总结与作业今天你完成了✅ 理解了 GroupChat 的架构共享消息池 GroupChatManager。✅ 掌握了GroupChat和GroupChatManager的创建方法。✅ 学习了四种发言选择模式auto、round_robin、random、manual。✅ 通过三人圆桌讨论示例体验了多 Agent 群聊的协作流程。✅ 学会了自定义发言选择函数和保存群聊记录。今日作业必做将圆桌讨论的角色改为产品经理、“程序员”、“测试员”讨论主题为如何设计一个高可用的登录系统。使用auto模式运行观察发言顺序是否合理。将speaker_selection_method改为round_robin运行同一个讨论对比两种模式的差异发言顺序、讨论深度、总轮数。实现一个自定义发言选择函数让产品经理先发言程序员和测试员交替发言每 4 轮由产品经理总结一次。测试效果。思考题在 GroupChat 中如果两个 Agent 陷入互相反驳的死循环你会如何设计机制让讨论回到正轨请描述你的方案。明日预告我们将进入第四阶段的第二个项目——“投资辩论赛”。你将使用 GroupChat 构建一个包含死多头、大空头和裁判的多智能体系统让它们就某只股票展开辩论最终由裁判给出综合意见。这是 AutoGen 辩论模式的经典应用。有任何问题欢迎随时评论交流