医疗KBQA系统¶
学习目标¶
- 了解KBQA系统的工作流程
- 掌握KBQA系统实现的过程
系统架构¶
下图为本次项目中,基于医疗知识图谱实现智能问答系统的流程框架(其属于任务型对话机器人),其主要环节依然包括三部分:NLU(自然语言理解),DM(对话管理),NLG(自然语言生成)。
接下来,以用户输入"请问得了糖尿病该怎么办"为例,理解整个问答流程:
NLU模块¶
-
第一步:将用户问题先输入分类模型1,判断是否是闲聊类的意图,主要分为6种类型:greet、goodbye、deny、isbot、accept、 diagnosis:
- 命中前四个意图,那就进入Chitchat_bot,从准备好的回复语料中随机抽取一条返回给用户,对话结束;
- 命中accept,accept意图是在进行**问题澄清**时发挥作用;
- 命中diagnosis,进入Medical_bot;
- 上图例子中,命中的是
diagnosis,进入 Medical_bot
-
第二步:在Medical_bot中,先进入分类模型2进行意图二次识别,这里包括13个医疗类的意图;然后进入NER模型进行实体识别与提取:
-
意图识别类型:
{'confidence': 0.8997645974159241, 'intent': '治疗方法'}
-
实体识别的结果是:
{'entities': [{'type': 'disease', 'word': '糖尿病'}], 'string': '请问得了糖尿病怎么办呢'}
-
- 前面这两步相当于任务型对话机器人中的NLU模块
DM模块¶
DST模块+PL模块组成了任务型对话机器人中的对话管理(DM)模块。
- DST模块(Dialog State Tracking,对话状态跟踪):
- 负责跟踪用户在对话中的意图和状态,记录关键信息,维护对话上下文。它通过实时监测用户输入和系统响应,确保系统能够理解用户的需求并做出相应的回答。
- PL模块(Policy Learning,策略学习):
- 负责根据对话状态和上下文,学习和优化系统的响应策略。PL模块会评估不同策略的效果,通过学习用户反馈,调整系统的响应方式,以提高用户满意度和对话的流畅性。
DST模块¶
- 第三步:得到意图和实体之后,先用实体填充槽位
-
NLU和DST的联系与区别,NLU和DST的关系其实非常紧密,它们都在槽位填充过程中发挥了作用,但是在这个过程中扮演了不同的角色:
- NLU模块是对用户的输入进行意图的分类,同时对输入中的实体进行标注,下面是上面实体识别结果的节选:
{'entities': [{'type': 'disease', 'word': '糖尿病'}], 'string': '请问得了糖尿病怎么办呢'}- 在此项目中,是标出实体的类型,对应知识图谱中的节点,同时标出对应的字段,但是还没有填充,只是把实体找出来而已。
- DST模块则是基于对话历史,为槽位列表中的每一个槽位找到一个槽位值
"治疗方法":{ "slot_list" : ["Disease"], "slot_values":None, "cql_template" : ["MATCH(p:疾病) WHERE p.name='{Disease}' RETURN p.cure_way", "MATCH(p:疾病)-[r:recommand_drug]->(q) WHERE p.name='{Disease}' RETURN q.name", "MATCH(p:疾病)-[r:recommand_recipes]->(q) WHERE p.name='{Disease}' RETURN q.name"], "reply_template" : "'{Disease}' 疾病的治疗方式、可用的药物、推荐菜肴有:\n", "ask_template" : "您问的是疾病 '{Disease}' 的治疗方法吗?", "intent_strategy" : "", "deny_response":"没有理解您说的意思哦~" },- 这是"治疗方法"这个意图的下的信息,槽位列表中只有一个槽位"Disease"。
- 在每一轮对话中,DST模块都会查看截止目前的所有对话历史,然后确定哪个文本可以填充为槽位列表中某个特定槽位的槽位值,这个过程谓之追踪(Dialogue State Tracking)。
- 在这个项目中,这一步是通过遍历**槽位列表**和**实体识别的结果**进行匹配完成的。
PL模块¶
- 第四步:根据意图置信度确定回复策略,这里分了三种简单的情况:
- >=0.8,根据识别到的意图去Neo4j(知识图谱)中查询答案,返回给用户
- 0.4~0.8,反问用户,进行问题澄清
- <0.4,返回兜底话术
- DST模块+PL模块组成了任务型对话机器人中的对话管理(DM)模块,在这个项目中界限并不是特别明显,主要实现逻辑都在
modules.py文件的semantic_parser函数中。
小节总结¶
- 本章节主要讲解了基于医疗知识图谱实现问答系统的工作流程,为后续代码实现提供理论基础。
