对话什么时候该停?这是 GroupChat 最容易出 bug 的地方。不停就烧钱,乱停就丢结果。这一节把终止的几种机制讲清,并告诉你停了之后怎么拿到像样的结果。

from autogen import ConversableAgent, GroupChat, GroupChatManager import os cfg = {"model": "gpt-4o-mini", "api_key": os.environ.get("OPENAI_API_KEY")} def stop_on_done(msg): return "完成" in str(msg.get("content","")) coder = ConversableAgent("coder", llm_config=cfg, system_message="你写代码,写完说完成。") group = GroupChat(agents=[coder], messages=[], max_round=10, is_termination_msg=stop_on_done) # 命中就停 mgr = GroupChatManager(group=group, llm_config=cfg)
对话停了,结果在哪?通常在最后一条消息的 content 里。建议终止后显式提取,而不是靠人眼翻历史。
chat = mgr.initiate_chat(coder, message="写快排。", max_turns=10) last = chat.messages[-1] print("最终产出:", str(last.get("content"))[:200]) # 如果结果散在多轮,可让最后一个 Agent 负责"汇总成最终答案"
我们踩过坑:最后一句话看着像结论,其实中间早已跑偏。可靠的做法是加一个评估 Agent,对最终产物打分或给通过/不通过。
evaluator = ConversableAgent("eval", llm_config=cfg, system_message="你只判断最终代码能否运行,给通过或不通过及理由。") # 群聊结束后,单独把产物发给 evaluator 评审
我们主张:max_round 必设兜底,is_termination_msg 提升体验,重要任务再加评估 Agent。
单用一种开关往往顾此失彼,真实项目里我们常把几种叠起来。模式一"双保险":max_round 兜底 + is_termination_msg 体验,既保证一定停,又能优雅停。模式二"人终审":在前两者基础上,关键任务把 human_input_mode 设成需人确认终止——适合出错成本高、不能自动放行的场景,比如自动改生产库。模式三"评估门":群聊结束后把产物交给独立评估 Agent 判通过/不通过,不过再拉回群聊返工一轮;这其实是把"终止"也从单点变成带质量闸的环节。
哪种组合取决于"出错代价"。写个本地脚本的群聊,max_round 足矣;自动执行外部动作的群聊,必须加人工或评估闸,否则一次模型失误就变成一次真实故障。我们用金融来类比:小额自动转账可以设上限自动停,大额必须人工复核——终止条件就是群聊的"到账复核",钱(调用)出去前先确认该停。
还要注意一个隐蔽陷阱:is_termination_msg 依赖模型"记得说终止词"。如果系统提示没强调"做完说完成",模型可能默默继续,直到撞上 max_round 才停。所以终止词要写进角色提示,而不是只指望函数判断。双保险的意义就在于此——即使模型忘了说,max_round 也能兜住。
| 组合 | 适用场景 | 出错代价 | 额外成本 |
|---|---|---|---|
| max_round 单用 | 本地试验 | 低 | 无 |
| max_round + 终止词 | 一般任务 | 中 | 低 |
| + 人工确认 | 外部动作/生产 | 高 | 每轮人工 |
| + 评估 Agent | 质量要求高 | 高 | 一次调用 |
is_termination_msg 依赖模型"说出终止词",所以终止词的设计本身就是工程。经验:用强信号、少歧义的词,比如"完成"或"FINAL",别用"好了""行吧"这种可能出现在普通对话里的词,否则误触发提前停。同时要把终止词写进角色的系统提示,明确要求"做完请说'完成'",而不是只靠函数判断——模型忘了说,函数也拦不住。还可以双词或短语匹配降低误判,比如同时认"完成"和"任务结束"。
还有个和结果质量强相关的点:终止词最好由"负责汇总的角色"说出,而不是任意角色。比如让最后一个 Agent 的职责是"确认无误后说完成",这样停的时候产物已经过汇总,取最后一条消息即得完整结果。如果随便哪个角色都能喊停,可能停在一次中间讨论上,结果残缺。终止条件和角色职责要一起设计,不能各管各的。
⚠️ 终止词太泛(如"好")会误停,太偏(如生僻词)模型记不住,需在提示里明确且实测命中率。
⚠️ 群聊不设任何终止条件,auto 模式会一直聊到账单爆,这是新手最常犯的错。
💡 终止条件是"对话即编排"的刹车——编排再聪明,也得有个能停的阀门。