跳转至

医疗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 函数中。

小节总结

  • 本章节主要讲解了基于医疗知识图谱实现问答系统的工作流程,为后续代码实现提供理论基础。