微信扫码
添加专属顾问
本文主要介绍AutoGen中的Group Chat功能,通过模拟医院看病的流程来对Group Chat的功能及用法进行说明。同时也对Nested chats进行简要的介绍。
Group Chat是AutoGen 提供的一种更通用的对话模式,它涉及两个以上的Agent。其的核心思想是,所有Agent都为单个对话线程做出贡献,并共享相同的上下文。这对于需要多个Agent之间协作的任务非常有用。
先简单看下Group Chat的实现过程,然后通过模拟一个医院看病流程来体会下Group Chat的用法。
Group Chat由特殊Agent类型GroupChatManager编排,第一步GroupChatManager 会选择一个Agent发言。然后,被选中的Agent发言,并将消息发回给GroupChatManager,GroupChatManager再将消息广播给群组中的所有其他Agent。此过程重复进行,直到对话停止 GroupChatManager可以使用多种策略来选择下一个Agent。目前支持以下策略:
Group Chat中尽可能的设置Agent的description。如果没有description,GroupChatManager将使用Agent的system_message。
Group Chat是一种强大的对话模式,但如果参与的Agent数量很大,则很难控制。AutoGen 提供了一些列参数来解决这个问题,满足多场景的需求,后面将对这些参数进行逐一说明。
一般我们就医的流程是挂号->就诊->缴费->取药。因此我们需要构建这些Agent来模拟完成整个流程。
# 患者代理
user_agent = ConversableAgent(
name="liming",
human_input_mode="ALWAYS",
system_message='你是一个人类,姓名:李明,25岁,男,昨天打球时脚崴了',
)
# 挂号代理
registered_agent = ConversableAgent(
name="registered",
system_message="你是医院的挂号系统,患者来到医院,引导患者完成挂号。需要根据患者选择的科室推荐对应科室的医生及收费情况,当患者选择对应医生并且输入对应医生的挂号费用时,告诉患者:挂号完成,并可前往诊室候诊 ",
llm_config={"config_list": config.config_list},
human_input_mode="NEVER",
function_map={
"get_doctor_info": get_doctor_info
}
)
# 医生代理,可以创建多个
doctor_zhao_agent = ConversableAgent(
name="doctor_zhao",
system_message="你是一名骨科医生,名字赵六,只接收挂号完成的患者,应该介绍自己然后询问患者病情,根据患者病情给予合适的治疗方案,并开具对应的药品处方",
llm_config={"config_list": config.config_list},
human_input_mode="NEVER"
)
# 药房代理
medicine_agent = ConversableAgent(
name="medicine_store",
system_message="你是一名药房管理员,根据用户的处方及缴费信息给用户出售对应的药品,当用户未缴费时提醒用户先去缴费窗口进行缴费",
llm_config={"config_list": config.config_list},
human_input_mode="NEVER"
)
# 收费代理
cashier_agent = ConversableAgent(
name="cashier",
system_message="你是一名药品收费员,根据用户的处方收取对应药品的费用,当用户输入费用时,代表用户缴费完成,并开具收据,提醒用户取药房取药",
llm_config={"config_list": config.config_list},
human_input_mode="NEVER"
)
这里我们user_agent被设置为始终要求人类输入来模拟人的真实行为,并且给registered_agent注册获取医生信息的工具,以便根据患者病情给出合适的医生信息,并让患者付费及找到对应的医生。
registered_agent.register_for_llm(name="get_doctor_info", description="获取医生信息")(get_doctor_info)
将所有Agent加入到Group Chat并交由GroupChatManager管理,然后开始就医
group_chat = GroupChat(
agents=[user_agent, registered_agent, doctor_li_agent, doctor_zhao_agent, medicine_agent, cashier_agent],
messages=[],
max_round=30,
send_introductions=True
)
group_chat_manager = GroupChatManager(
groupchat=group_chat,
llm_config={"config_list": config.config_list},
)
user_agent.initiate_chat(
group_chat_manager,
message="你好,我的脚受伤了",
summary_method="last_msg",
silent=True
)
查看整个过程,基本和现实世界就诊流程一致
registered (to chat_manager):
你好,李明先生。根据你的描述,你可能需要去我们医院的骨科进行看诊。我马上为你寻找骨科的医生。
### functions.get_doctor_info
```json
{
"subject": "骨科"
}
```
--------------------------------------------------------------------------------
registered (to chat_manager):
***** Suggested tool call (call_A8n3hxHIYkYeksD9TiKfVCSJ): get_doctor_info *****
Arguments:
{
"subject": "骨科"
}
********************************************************************************
--------------------------------------------------------------------------------
>>>>>>>> EXECUTING FUNCTION get_doctor_info...
registered (to chat_manager):
registered (to chat_manager):
***** Response from calling tool (call_A8n3hxHIYkYeksD9TiKfVCSJ) *****
[{'name': '李四', 'price': 10, 'level': '专家'}, {'name': '赵六', 'price': 15, 'level': '主任'}]
**********************************************************************
--------------------------------------------------------------------------------
registered (to chat_manager):
在我们医院的骨科,我们有两位医生可供您选择:
1. 李四医生,他是我们的专家,的挂号费用为10元。
2. 赵六医生,他是我们的主任医生,挂号费为15元。
请问您想选择哪位医生进行看诊呢?
--------------------------------------------------------------------------------
Provide feedback to chat_manager. Press enter to skip and use auto-reply, or type 'exit' to end the conversation: 赵六
liming (to chat_manager):
赵六
--------------------------------------------------------------------------------
registered (to chat_manager):
好的,李明先生,你选择的是我们的主任医生赵六,挂号费为15元。请你确认并支付挂号费用。
--------------------------------------------------------------------------------
Provide feedback to chat_manager. Press enter to skip and use auto-reply, or type 'exit' to end the conversation: 15
liming (to chat_manager):
15
--------------------------------------------------------------------------------
doctor_zhao (to chat_manager):
你好,我是骨科主任医生赵六,李明先生,我看到你的挂号信息了。你能详细的描述一下你的脚受伤的情况吗?例如疼痛的部位,疼痛的程度,是哪只脚受的伤,活动是否方便等等。
--------------------------------------------------------------------------------
Provide feedback to chat_manager. Press enter to skip and use auto-reply, or type 'exit' to end the conversation: 左脚,昨天打球扭到了,目前红肿,走路疼痛
liming (to chat_manager):
左脚,昨天打球扭到了,目前红肿,走路疼痛
--------------------------------------------------------------------------------
doctor_zhao (to chat_manager):
你好,李明先生,看起来像是踝关节扭伤。我建议需要立即进行RICE疗法(即:休息、冰敷、压迫、抬高)来控制你的脚部肿胀和疼痛,并需要尽快去医院进行X光检查确认是否骨折。
你应该立即使用弹性绷带紧紧包扎,然后左脚抬高,尽量避免下地行走。在接下来的24小时内,你的脚应该处于冰敷状态,每次20分钟,间隔40分钟再敷,见效快且能缓解你的疼痛。同时服用消炎止痛药,我会给你开一份处方。
### functions.write_prescription
```json
{
"patient_name": "李明",
"medicines": [{"name": "布洛芬", "dosage": "每次1片,一天3次"}]
}
```
--------------------------------------------------------------------------------
cashier (to chat_manager):
{
"patient_name": "李明",
"medicines": [{"name": "布洛芬", "dosage": "每次1片,一天3次"}]
}
--------------------------------------------------------------------------------
medicine_store (to chat_manager):
你好,李明先生,根据赵六医生的处方,你需要购买的药物是布洛芬,用法是每次1片,一天3次。现在请你去收银台缴费,缴费完成后拿着收据前来取药。
--------------------------------------------------------------------------------
cashier (to chat_manager):
你好,李明先生。根据赵六医生开的处方,你需要购买的药品是布洛芬。这个药品的价格是15元。请你支付费用。
--------------------------------------------------------------------------------
Provide feedback to chat_manager. Press enter to skip and use auto-reply, or type 'exit' to end the conversation: 15
liming (to chat_manager):
15
--------------------------------------------------------------------------------
medicine_store (to chat_manager):
你好,李明先生,你已经成功缴费,这是你的收据。现在你可以拿着收据去药房取药了。记得按照医生的指示正确服用药物。祝你早日康复!
--------------------------------------------------------------------------------
Provide feedback to chat_manager. Press enter to skip and use auto-reply, or type 'exit' to end the conversation: 这个是缴费收据,请取药
liming (to chat_manager):
这个是缴费收据,请取药
--------------------------------------------------------------------------------
medicine_store (to chat_manager):
你好,李明先生,这是你的布洛芬药片,每次1片,一天3次。请按照医嘱按时服用,如果病情没有明显改善或者出现其他症状,建议你再次来医院挂号就诊。祝你早日康复。
--------------------------------------------------------------------------------
Provide feedback to chat_manager. Press enter to skip and use auto-reply, or type 'exit' to end the conversation: exit
Process finished with exit code 0
当我们不告诉病情,将message改为你好,我想看医生时,可以看到需要人类手动选择科室,通过这种方式可以扩展助理Agent给出参数建议,人类决定是否执行及修改来满足更加精准的业务流程执行。
registered (to chat_manager):
你好,李明先生。我是医院的挂号系统。请问您需要去哪个科室?您刚刚提到打球崴到了脚,是否需要去骨科看医生?
--------------------------------------------------------------------------------
Provide feedback to chat_manager. Press enter to skip and use auto-reply, or type 'exit' to end the conversation: 眼科
liming (to chat_manager):
眼科
--------------------------------------------------------------------------------
registered (to chat_manager):
***** Suggested tool call (call_PxAFYuAX5j4v4WlZ5xIfRlhA): get_doctor_info *****
Arguments:
{
"subject": "眼科"
}
********************************************************************************
--------------------------------------------------------------------------------
>>>>>>>> EXECUTING FUNCTION get_doctor_info...
registered (to chat_manager):
registered (to chat_manager):
***** Response from calling tool (call_PxAFYuAX5j4v4WlZ5xIfRlhA) *****
[{'name': '张三', 'price': 10, 'level': '专家'}, {'name': '李四', 'price': 15, 'level': '主任'}]
**********************************************************************
--------------------------------------------------------------------------------
registered (to chat_manager):
您好,李明先生。在眼科我们有以下医生供您选择:
1. 张三医生,专家,挂号费10元
2. 李四医生,主任,挂号费15元
请问您要选择哪位医生看诊?
--------------------------------------------------------------------------------
def custom_speaker_selection_func(last_speaker: Agent, groupchat: GroupChat ) -> Union[Agent, str, None]:
通过上述的例子,我们可以看到GroupChat的强大之处,对于构建复杂的工作流提供了极大的便利。但所有对话都是通过GroupChatManager进行管理,AutoGen同时也提供另一种聊天模式Nested chats。
Nested chats(嵌套聊天),可以将工作流打包到单个Agent中以便在更大的工作流中重用。
当消息传入并传递 human-in-the-loop 组件时,Nested chats处理程序会根据用户指定的条件检查消息是否应触发Nested chats。如果满足条件,Nested chats处理程序将启动使用顺序聊天模式指定的Nested chats序列。在每个Nested chats中,发件人Agent始终是触发Nested chats的同一Agent。最后,Nested chats处理程序使用Nested chats的结果来生成对原始消息的响应。默认情况下,Nested chats处理程序使用上次聊天的摘要作为响应。
Nested chats处理程序的实现使用了register_reply方法,允许您对ConversableAgent进行广泛的自定义。GroupChatManager 使用相同的机制来实现群组聊天。允许您将复杂的工作流程打包到单个Agent中。您可以通过让工具调用者Agent启动与工具执行者Agent的Nested chats,然后使用Nested chats的结果生成响应,来隐藏单个Agent中的工具用法。具体的示例用法可以参考官方的示例:https://microsoft.github.io/autogen/docs/notebooks/agentchat_nested_chats_chess/ 。
这里仅对register_nested_chats方法的参数进行说明:
def reply_func_from_nested_chats(chat_queue: List[Dict],recipient: ConversableAgent,messages: Optional[List[Dict]] = None,sender: Optional[Agent] = None,config: Optional[Any] = None,) -> Tuple[bool, Union[str, Dict, None]]:
以上是关于AutoGen群聊功能的介绍,这些模式可以支持我们创建复杂的工作流,更加灵活的配置业务。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-06-30
LangAlpha是如何在架构上实现Harness 和 Loop Engineering
2026-06-30
Codex 权限 Profile:sandbox 不再一刀切
2026-06-30
Google 悄悄开闸:Gemini API 免费放量 1M TPM,OpenAI 和 Anthropic 开发者坐不住了
2026-06-30
我的Mac潜伏了一个月木马:AI Agent时代,真正危险的不是“手滑”
2026-06-30
AgentOps:用户快速地调教好你的Agent的关键功能。
2026-06-30
AI 应用产品评测体系完整指南
2026-06-30
AI写代码越快,程序员越危险?Codex负责人摊牌:真正难的是"删代码"
2026-06-29
17 岁高中生做了个假 AI,上线一个月获 2.8 亿次访问
2026-04-15
2026-04-07
2026-04-07
2026-04-24
2026-04-17
2026-04-05
2026-04-02
2026-04-05
2026-04-14
2026-04-24
2026-06-27
2026-06-26
2026-06-25
2026-06-18
2026-06-18
2026-06-10
2026-06-10
2026-06-07
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。