单Agent对话往往受限于一个角色视角,答案容易单一化。AutoGen提供的群聊(GroupChat)机制允许把多个具备不同职责的Agent放进同一个对话房间,由一个管理者协调发言顺序,Agent之间可以互相补充、质疑甚至辩论,最终收敛出更全面可靠的结论。本文将从核心概念、代码实战、发言控制策略、辩论设计到常见问题,系统讲解AutoGen群聊的搭建方法。
一、GroupChat的核心组成与工作原理
AutoGen的群聊由两类对象构成:一组UserProxyAgent或AssistantAgent实例,以及一个GroupChatManager管理者。所有Agent共享同一个消息列表,管理者负责在每一轮决定下一个该由谁发言,并把消息广播给房间里的所有人。
理解群聊的关键在于区分两个层面:GroupChat对象本身保存了agent列表、消息历史和发言选择策略;GroupChatManager则是一个特殊的UserProxyAgent,它接管了消息的发送与回放逻辑,充当群聊的主持人。当你调用管理者的initiate_chat方法时,对话就进入群聊模式,不再是一对一的往复。
每条消息发出后,管理者会调用GroupChat中配置的selection_method来挑选下一位发言者,同时检查终止条件(max_round或is_termination_msg)。如果没有满足终止条件,管理者会把消息追加到群聊历史中,通知选中的Agent继续发言,如此循环直到对话结束。
二、搭建一个最基本的多Agent群聊
下面用两个AssistantAgent加一个UserProxyAgent搭建一个简单的三人群聊。代码使用OpenAI的GPT模型,需要提前设置好环境变量OPENAI_API_KEY。
import autogen
config_list = autogen.config_list_from_json(
"OAI_CONFIG_LIST",
filter_dict={"model": ["gpt-4o"]}
)
# 负责提出方案的Agent
planner = autogen.AssistantAgent(
name="Planner",
system_message="你是一名方案设计师,负责针对问题提出具体的解决方案,并回应他人的质疑。",
llm_config={"config_list": config_list},
)
# 负责质疑与把关的Agent
critic = autogen.AssistantAgent(
name="Critic",
system_message="你是一名严格的评审,负责指出方案中的漏洞和风险,要求对方改进。",
llm_config={"config_list": config_list},
)
# 用户代理,代表人类执行操作
user_proxy = autogen.UserProxyAgent(
name="User",
human_input_mode="NEVER",
max_consecutive_auto_reply=10,
code_execution_config=False,
)
groupchat = autogen.GroupChat(
agents=[user_proxy, planner, critic],
messages=[],
max_round=12,
speaker_selection_method="auto",
)
manager = autogen.GroupChatManager(
groupchat=groupchat,
llm_config={"config_list": config_list},
)
user_proxy.initiate_chat(
manager,
message="请讨论一下:一个电商系统的高峰期秒杀模块应该如何设计?",
)运行后你会看到三个Agent轮流发言,Planner提出方案,Critic提出质疑,User则在需要时总结。整个过程的 transcripts 会完整打印在控制台中。
这里有几个细节值得注意:max_round控制的是群聊的总轮数,防止对话无限进行;human_input_mode设置为NEVER表示用户代理全自动参与;如果希望某个Agent只发一次言,可以在其system_message中明确说明发言后要加上终止提示词。
三、发言顺序控制的四种策略
speaker_selection_method是群聊调度的核心参数,AutoGen提供了四种取值,适用场景各不相同。
- auto:由大模型根据上下文自动判断下一个发言者,灵活但会额外消耗一次LLM调用,适合开放式讨论。
- round_robin:按照agents列表的顺序轮流发言,行为完全可预测,适合固定流程如需求分析、开发、测试的流水线。
- random:随机选择发言者,多用于模拟头脑风暴。
- 手动传入函数:传入一个自定义函数,签名为(last_speaker, groupchat) -> next_agent,可以实现任意复杂的选择逻辑。
自定义函数是最强大的方式。比如你希望Planner发完言后必定由Critic回应,而Critic发完言后由管理者决定,可以这样写:
def custom_speaker(last_speaker, groupchat):
if last_speaker is planner:
return critic
# 其余情况交给auto模式
return None
groupchat = autogen.GroupChat(
agents=[user_proxy, planner, critic],
messages=[],
max_round=10,
speaker_selection_method=custom_speaker,
)返回None时AutoGen会回退到默认的auto选择逻辑,这种混合模式在实际项目中非常实用:既保证了关键环节的确定性,又保留了LLM的灵活调度能力。
四、通过角色设定引导Agent辩论
辩论式群聊是提升答案质量的有效手段。核心思路是给Agent分配对立立场,并在system_message中要求他们坚持立场、给出论据。下面的例子让一个Agent支持微服务架构,另一个坚持单体架构,由第三个Agent担任裁判。
pro = autogen.AssistantAgent(
name="ProMicroservice",
system_message=(
"你坚定支持微服务架构。每次发言必须提出至少一个具体论据,"
"并针对反方的观点进行反驳。发言不超过150字。"
),
llm_config={"config_list": config_list},
)
con = autogen.AssistantAgent(
name="ProMonolith",
system_message=(
"你坚定支持单体架构。每次发言必须提出至少一个具体论据,"
"并针对反方的观点进行反驳。发言不超过150字。"
),
llm_config={"config_list": config_list},
)
judge = autogen.AssistantAgent(
name="Judge",
system_message=(
"你是裁判。在双方各发言三轮后进行总结,"
"给出平衡的结论,并在结论末尾加上APPROVE表示结束。"
),
llm_config={"config_list": config_list},
)
groupchat = autogen.GroupChat(
agents=[user_proxy, pro, con, judge],
messages=[],
max_round=10,
speaker_selection_method="round_robin",
)
manager = autogen.GroupChatManager(
groupchat=groupchat,
llm_config={"config_list": config_list},
is_termination_msg=lambda x: "APPROVE" in x.get("content", ""),
)
user_proxy.initiate_chat(manager, message="辩题:中小团队该选微服务还是单体架构?")使用round_robin可以保证双方发言机会均等,避免某一方被LLM调度器冷落。裁判Agent的总结以APPROVE结尾,配合is_termination_msg即可优雅地结束群聊,这是控制辩论轮次的常用技巧。
五、常见问题与调优建议
第一类常见问题是Agent互相附和、缺乏真正的观点碰撞。原因通常是system_message写得太温和,可以在提示词中明确要求必须指出对方观点的不足,甚至规定每次发言必须包含一个反驳点。
第二类问题是发言权分配失衡。auto模式下LLM可能反复选择同一个Agent,可以通过自定义speaker选择函数、或改用round_robin来规避。如果Agent数量较多,建议控制在一到六个之间,人数越多,上下文越长,成本和延迟都会显著上升。
第三类问题是群聊迟迟不结束。除了max_round兜底外,建议始终配置is_termination_msg,让某个指定的总结者Agent在收尾时输出特定关键词,这样既能拿到结构化结论,又能及时止损。另外,对于长对话可以启用GroupChatManager的cache机制,在重试时节省大量token开销。
掌握这些要点后,你可以进一步尝试嵌套群聊(群聊作为外层对话的一个Agent参与)、带人类审批节点的混合群聊等高级玩法,把多Agent协作真正落地到实际的业务流程中。