链载Ai

标题: AutoGen: 搭建一个医疗系统 [打印本页]

作者: 链载Ai    时间: 昨天 09:37
标题: AutoGen: 搭建一个医疗系统

本文主要介绍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 提供了一些列参数来解决这个问题,满足多场景的需求,后面将对这些参数进行逐一说明。

模拟就医流程,实现Group Chat

一般我们就医的流程是挂号->就诊->缴费->取药。因此我们需要构建这些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(tochat_manager):
你好,李明先生。根据你的描述,你可能需要去我们医院的骨科进行看诊。我马上为你寻找骨科的医生。
###functions.get_doctor_info
```json
{
"subject":"骨科"
}
```
--------------------------------------------------------------------------------
registered(tochat_manager):

*****Suggestedtoolcall(call_A8n3hxHIYkYeksD9TiKfVCSJ):get_doctor_info*****
Arguments:
{
"subject":"骨科"
}
********************************************************************************
--------------------------------------------------------------------------------
>>>>>>>>EXECUTINGFUNCTIONget_doctor_info...
registered(tochat_manager):
registered(tochat_manager):

*****Responsefromcallingtool(call_A8n3hxHIYkYeksD9TiKfVCSJ)*****
[{'name':'李四','price':10,'level':'专家'},{'name':'赵六','price':15,'level':'主任'}]
**********************************************************************
--------------------------------------------------------------------------------
registered(tochat_manager):

在我们医院的骨科,我们有两位医生可供您选择:
1. 李四医生,他是我们的专家,的挂号费用为10元。
2. 赵六医生,他是我们的主任医生,挂号费为15元。
请问您想选择哪位医生进行看诊呢?
--------------------------------------------------------------------------------
Providefeedbacktochat_manager.Pressentertoskipanduseauto-reply,ortype'exit'toendtheconversation:赵六
liming(tochat_manager):
赵六
--------------------------------------------------------------------------------
registered(tochat_manager):
好的,李明先生,你选择的是我们的主任医生赵六,挂号费为15元。请你确认并支付挂号费用。
--------------------------------------------------------------------------------
Providefeedbacktochat_manager.Pressentertoskipanduseauto-reply,ortype'exit'toendtheconversation:15
liming(tochat_manager):
15
--------------------------------------------------------------------------------
doctor_zhao(tochat_manager):
你好,我是骨科主任医生赵六,李明先生,我看到你的挂号信息了。你能详细的描述一下你的脚受伤的情况吗?例如疼痛的部位,疼痛的程度,是哪只脚受的伤,活动是否方便等等。
--------------------------------------------------------------------------------
Providefeedbacktochat_manager.Pressentertoskipanduseauto-reply,ortype'exit'toendtheconversation:左脚,昨天打球扭到了,目前红肿,走路疼痛
liming(tochat_manager):
左脚,昨天打球扭到了,目前红肿,走路疼痛
--------------------------------------------------------------------------------
doctor_zhao(tochat_manager):

你好,李明先生,看起来像是踝关节扭伤。我建议需要立即进行RICE疗法(即:休息、冰敷、压迫、抬高)来控制你的脚部肿胀和疼痛,并需要尽快去医院进行X光检查确认是否骨折。
你应该立即使用弹性绷带紧紧包扎,然后左脚抬高,尽量避免下地行走。在接下来的24小时内,你的脚应该处于冰敷状态,每次20分钟,间隔40分钟再敷,见效快且能缓解你的疼痛。同时服用消炎止痛药,我会给你开一份处方。
###functions.write_prescription
```json
{
"patient_name":"李明",
"medicines":[{"name":"布洛芬","dosage":"每次1片,一天3次"}]
}
```
--------------------------------------------------------------------------------
cashier(tochat_manager):
{
"patient_name":"李明",
"medicines":[{"name":"布洛芬","dosage":"每次1片,一天3次"}]
}
--------------------------------------------------------------------------------
medicine_store(tochat_manager):
你好,李明先生,根据赵六医生的处方,你需要购买的药物是布洛芬,用法是每次1片,一天3次。现在请你去收银台缴费,缴费完成后拿着收据前来取药。
--------------------------------------------------------------------------------
cashier(tochat_manager):
你好,李明先生。根据赵六医生开的处方,你需要购买的药品是布洛芬。这个药品的价格是15元。请你支付费用。
--------------------------------------------------------------------------------
Providefeedbacktochat_manager.Pressentertoskipanduseauto-reply,ortype'exit'toendtheconversation:15
liming(tochat_manager):
15
--------------------------------------------------------------------------------
medicine_store(tochat_manager):
你好,李明先生,你已经成功缴费,这是你的收据。现在你可以拿着收据去药房取药了。记得按照医生的指示正确服用药物。祝你早日康复!
--------------------------------------------------------------------------------
Provide feedback to chat_manager. Press enter to skip and use auto-reply, or type 'exit' to end the conversation:这个是缴费收据,请取药
liming(tochat_manager):
这个是缴费收据,请取药
--------------------------------------------------------------------------------
medicine_store(tochat_manager):
你好,李明先生,这是你的布洛芬药片,每次1片,一天3次。请按照医嘱按时服用,如果病情没有明显改善或者出现其他症状,建议你再次来医院挂号就诊。祝你早日康复。
--------------------------------------------------------------------------------
Providefeedbacktochat_manager.Pressentertoskipanduseauto-reply,ortype'exit'toendtheconversation:exit
Processfinishedwithexitcode0

当我们不告诉病情,将message改为你好,我想看医生时,可以看到需要人类手动选择科室,通过这种方式可以扩展助理Agent给出参数建议,人类决定是否执行及修改来满足更加精准的业务流程执行。

registered(tochat_manager):
你好,李明先生。我是医院的挂号系统。请问您需要去哪个科室?您刚刚提到打球崴到了脚,是否需要去骨科看医生?
--------------------------------------------------------------------------------
Providefeedbacktochat_manager.Pressentertoskipanduseauto-reply,ortype'exit'toendtheconversation:眼科
liming(tochat_manager):
眼科
--------------------------------------------------------------------------------
registered(tochat_manager):
*****Suggestedtoolcall(call_PxAFYuAX5j4v4WlZ5xIfRlhA):get_doctor_info*****
Arguments:
{
"subject":"眼科"
}
********************************************************************************
--------------------------------------------------------------------------------
>>>>>>>>EXECUTINGFUNCTIONget_doctor_info...
registered(tochat_manager):
registered(tochat_manager):
*****Responsefromcallingtool(call_PxAFYuAX5j4v4WlZ5xIfRlhA)*****
[{'name':'张三','price':10,'level':'专家'},{'name':'李四','price':15,'level':'主任'}]
**********************************************************************
--------------------------------------------------------------------------------
registered(tochat_manager):
您好,李明先生。在眼科我们有以下医生供您选择:
1.张三医生,专家,挂号费10元
2.李四医生,主任,挂号费15元
请问您要选择哪位医生看诊?
--------------------------------------------------------------------------------

GroupChat 参数说明

  1. 一个Agent类,它必须是GroupChat中的一个Agent。
  2. 一个字符串,从['auto', 'manual', 'random', 'round_robin']中选择一个默认方法使用。
  3. None,这会优雅地终止对话。








欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5