【通俗易懂】知识图谱增强 RAG 思路 和 实现方案
- 为什么用 知识图谱增强 RAG?
- 对比传统方法
- 3 种实现方式
- 方案一:利用 KG 关系网络,构建问题子图促精准解答
- 地图固定深度
- 整体优化方案
- 方案二:利用 KG 语义关联,提升文档片段间相关性
- 方案三:利用 KG 多阶段,增强和验证问答流程
为什么用 知识图谱增强 RAG?
你是否曾经为AI无法准确回答复杂医学问题而感到困惑?
如果能让AI理解医学信息就像经验丰富的医生一样全面和深入,那会是多么令人振奋的突破!
这正是知识图谱在检索增强生成(RAG)中为医疗领域带来的革命性变革。
假设你问AI一个看似简单的问题——“详细解释心血管疾病与糖尿病之间的关系”。
表面上看起来简单,实则暗藏玄机。
传统的 RAG 方法面对这个问题时,就像一位实习医生在浩如烟海的医学文献中摸索,常常只能捕捉到片面的信息。
为什么会这样?因为相关信息可能散落在数十本医学教科书、数百篇研究论文和无数临床病例报告中!
这就好比在一座庞大的医学图书馆里寻找答案,却发现所需信息被分散在各个角落。
传统的"分割数据,嵌入再向量搜索"方法在这种情况下显得力不从心,它就像是一个戴着近视的图书管理员,只能在有限的几个书架上匆匆一瞥。
这种方法不仅难以获取完整的病理生理学解释,更可能错过关键的临床相关性,导致回答支离破碎,甚至南辕北辙。
那么,在这个复杂的医学知识网络中,有什么方法可以让AI像经验丰富的专科医生一样,全面而准确地回答这个棘手的问题呢?
知识图谱恰如一位经验丰富的主治医师,不仅能精准诊断,还能洞察症状背后错综复杂的关联。
知识图谱不仅能够显著减少基于嵌入的语义搜索所导致的不准确性,更能为医学AI注入"临床智慧"。
在传统的语义搜索中,"心肌梗塞"与"胃溃疡"这两个看似风马牛不相及的疾病,可能因为都与"胸痛"这一症状相关而被错误地联系在一起。
这就好比一个缺乏经验的实习医生,仅凭相似的表象症状就草率地做出诊断。
然而,在大多数临床场景下,这种粗浅的语义相关性往往会导致严重的误诊,进而引发灾难性的"医疗幻觉"。
传统语义搜索方法:
- 输入症状:“胸痛”
- 检索结果:返回所有与"胸痛"相关的疾病,包括心肌梗塞和胃溃疡
- 分析过程:仅基于症状的表面相似性进行匹配
- 可能的结果:将心肌梗塞和胃溃疡错误地等同视之,忽视了它们在病因、严重程度和治疗方法上的巨大差异
知识图谱方法:
- 输入症状:“胸痛”
- 激活相关节点:同时激活"心血管系统"和"消化系统"的相关节点
- 分析过程:
- 追踪症状源头:区分心源性胸痛和非心源性胸痛
- 关联其他症状:如心肌梗塞常伴有冷汗、呼吸困难,而胃溃疡可能伴有反酸、腹胀
- 考虑风险因素:评估患者的年龄、性别、生活方式等
- 权衡严重程度:认识到心肌梗塞是危及生命的紧急情况
- 输出结果:提供一个不同疾病,有优先级的诊断建议列表,同时指出需要进一步检查的方向
在这种情况下,植根于扎实医学知识体系的知识图谱就显得尤为重要。
它就像一位始终保持警惕的专科顾问,能够敏锐地识别出症状背后的真正病因,有效地预防和消除这种潜在的误诊风险。
知识图谱不仅仅是一个静态的信息库,更是一个动态的、多维度的医学知识网络。
它能够精确捕捉疾病之间的微妙关联,理解症状、病因、治疗方法之间的复杂交互,从而为AI提供更全面、更准确的诊断和治疗建议。
对比传统方法
将上下文学习推向了一个全新的高度,提取出细粒度、精确调校、领域特定且互联的医学知识:
-
精细化数据分割与获取
-
传统方法:如同用大网捕鱼,可能会遗漏小鱼或误捕无关鱼类。
-
Graph RAG:犹如精准的显微镜,能捕捉到最微小的数据颗粒。
举例:在分析一个复杂的病例时,Graph RAG 能够精确定位到特定基因突变与某种罕见症状之间的关联,这种细节在传统的文本块分割中很可能被忽略。
-
-
跨篇幅、全局连接的知识提取
-
传统方法:如同在迷宫中独立探索每个房间,难以看到整体路径。
-
Graph RAG:宛如拥有迷宫的全景图,能够轻松找出各个节点间的最短路径。
举例:在研究一种新型传染病时,Graph RAG 能够快速连接病毒学、流行病学、临床症状学等多个领域的知识,绘制出一幅完整的疾病图谱。
-
-
缓解嵌入方法带来的"幻觉"
-
传统方法:如同一个近视眼,容易将相似但本质不同的概念混淆。
-
Graph RAG:犹如配备了高精度望远镜,能清晰辨别语义远近的细微差异。
举例:在处理"类风湿性关节炎"和"骨关节炎"这两种常见的关节疾病时,Graph RAG 能准确识别它们在病因、发病机制和治疗方法上的本质区别,避免因表面症状相似而导致的误诊。
-
3 种实现方式
问题:“糖尿病患者容易出现哪些并发症,如何预防?”
思路1:利用KG多阶段增强,优化大模型问答流程
-
意图识别阶段:
- 识别出关键实体"糖尿病"、“并发症"和"预防”。
- 利用KG,可能会补充"糖尿病"的医学术语如"diabetes mellitus",或者具体类型如"1型糖尿病"和"2型糖尿病"。
-
Prompt组装阶段:
- 从医学KG中查询糖尿病相关的背景知识,如定义、类型、病因等。
- 将这些信息加入到prompt中,为大模型提供专业背景。
-
结果封装阶段:
- 大模型生成答案后,用医学KG进行验证和补充。
- 例如,确认列出的并发症是否完整,预防措施是否符合最新医学指南。
思路2:利用KG关系网络,构建问题子图助力精准答案
-
从问题中提取关键实体"糖尿病"、“并发症"和"预防”。
-
在医学KG中以这些实体为起点,构建一个子图,包含:
- 糖尿病的各种并发症
- 每种并发症的风险因素
- 预防措施及其作用机制
- 糖尿病管理的关键指标(如血糖水平、糖化血红蛋白等)
-
将这个子图转化为文本,作为专业医学上下文提供给大模型。
-
大模型基于这个丰富的医学上下文生成答案。
思路3:利用KG语义关联,提升文档片段间的相关性
-
在医学文档库中找到与"糖尿病"、"并发症"和"预防"相关的文档片段。
-
使用医学KG来建立这些片段之间的语义关联:
- 例如,将描述糖尿病病理的片段与描述各种并发症的片段关联起来。
- 将描述并发症的片段与相应预防措施的片段关联起来。
- 建立不同预防措施之间的关系,如饮食控制、运动therapy和药物治疗等。
-
基于这些关联,为大模型提供一个更有结构的医学文档集合。
-
大模型利用这些结构化的医学信息来生成更全面、更专业的回答。
对比:
-
思路1,侧重于在问答流程的不同阶段使用KG来增强和验证信息。
-
思路2,专注于构建一个与问题高度相关的知识子图,提供丰富的上下文。
适用于需要深度推理和全面分析的场景,如复杂诊断。
需要综合考虑患者的症状、体征、检查结果等多方面信息。
构建的知识子图可以包含可能的诊断、鉴别诊断、以及各种诊断之间的关系。
-
思路3,着重于优化文档检索和组织,使大模型能够访问到更相关、更有结构的信息。
适用于需要治疗方案制定阶段,有助于发现不同治疗方法之间的联系和权衡。
适用于需要大量文献支持和最新指南的场景,如治疗方案制定。
方案一:利用 KG 关系网络,构建问题子图促精准解答
这一过程可以被概括为三个关键步骤,每一步都充分利用了图结构和大模型的优势:
-
实体提取(抓重点)
- 首先,系统会运用LLM或其他专门的自然语言处理模型来分析用户的查询。
- 这一步的目标是从输入的问题中识别并提取出关键实体。这些实体将作为后续步骤的基础,确保系统能够精准定位相关信息。
-
子图构建(画地图)
- 接下来,系统会以第一步提取出的关键实体为起点,在知识图谱中进行有限深度的遍历。
- 通常,这个深度被设定为2,意味着系统会探索与初始实体直接相连的节点,以及与这些节点相连的下一层节点。
- 这个过程实际上是在构建一个与用户查询高度相关的知识子图。
-
上下文增强生成
- 最后,系统将构建好的子图作为丰富的上下文信息,连同原始查询一起输入到大模型中。
- 大模型利用这些精心筛选的上下文信息,生成一个既准确又全面的回答。
首先从用户输入中提取关键实体,然后基于这些实体在知识图谱中构建相关子图,最后将这个子图作为上下文信息送入大模型,完成最终的答案生成。
地图固定深度
把深度设定为 2,这个回答效果不行。
原来的方法(固定深度2):
- 这就像是你站在图书馆门口,然后说"我要看看离我两个书架距离内的所有书"。
- 不管你要找的是什么,你总是只看这么远。
- 有时候可能看得太少,有时候又可能看得太多。
新的方法(3种查路径+查邻居):
- 这更像是一个聪明的图书管理员,他会根据你的问题,用不同的方式帮你找书:
-
直接关系查找:
就像问"感冒、发烧有什么关系",管理员会直接找一条最短的路,把这两种水果连起来。 -
多重关系网络:
比如你问"感冒、发烧和咳嗽有什么联系",管理员会把这三个症状都连起来,画出一个小网络,让你一眼就能看到它们之间的所有关系。 -
多角度查因:
当你问"我最近头疼、肚子疼、还有点晕,这是怎么回事"时,管理员会从每个症状出发,分别去找可能的原因,给你一个全面的解释。 -
查找邻居:
除了找这些直接的关系,管理员还会顺便看看周围closely相关的信息,可能会发现一些意想不到的联系。
对比来看:
-
灵活性:
旧方法就像是用固定尺寸的圆规画圆,而新方法更像是自由作画,能根据需要画出各种形状的"知识地图"。 -
精确性:
旧方法可能会把一些无关的书也拿来,而新方法就像是精准定位,只找最相关的信息。 -
全面性:
新方法不仅能找到直接关系,还能发现潜在的、复杂的联系,就像不仅告诉你怎么走,还会提醒你路上有什么好玩的。 -
效率:
虽然新方法看起来做的事情多,但因为更有针对性,反而可能比旧方法更快找到有用信息。
新方法就像是把一个固定的放大镜,换成了一个能变焦、能拼接的智能望远镜。
它能根据你的问题,灵活地调整"看"的方式和范围,给你一个更全面、更精准的答案。
我目前实现就是到这,下面的整体优化方案还没。
整体优化方案
-
知识图谱召回方法的局限性
a) 子图召回可能引入不相关路径
- 就像我们之前说的"画地图",有时候可能会画出一些实际上并不重要的路。
- 这就像你问路时,别人不仅告诉你怎么去目的地,还说了一堆你根本不需要的弯路。
- 特别是双向的医疗知识图谱,头疼 < – > 康复治疗 < – > 牙疼,因为有一个通用节点(康复治疗),能把头疼和牙疼关联起来
b) 实体识别精度有限- 患者问"我的血压有点高,需要吃降压药吗?"
- 系统可能只识别出"血压"和"药"这两个实体,而忽略了"高"这个关键词。
- 结果可能会返回一些关于测量血压或者各种血压药物的信息,而不是针对高血压的具体建议。
c) 依赖基础知识图谱的质量
- 这就像是我们的"图书管理员"的知识储备。
- 如果图书馆里的书不够多或者不够全面,即使管理员再聪明,给出的信息也可能不够准确或完整。
2. 改进方向:引入路径排序
这个建议就像是在我们的"画地图"步骤后,加入一个"地图筛选"的环节。
这个环节分两步:
a) 粗排:使用LightGBM模型
- 这就像是快速浏览一遍画好的地图,用一些简单的标准(如道路长度、路标数量等)来初步判断哪些路径更可能是有用的。
b) 精排:使用大模型
- 这就像是仔细研究剩下的几条路径,深入理解每条路的含义,最后选出最合适的2-3条。
-
与之前的Graph RAG方法的关联
这些建议实际上是在完善我们之前讨论的Graph RAG的三个步骤:
- "抓重点"阶段:建议改进实体识别方法,不仅仅依赖关键词提取。
- "画地图"阶段:建议在构建子图时就考虑路径的相关性,而不是简单地基于深度。
- 新增"筛选地图"阶段:在生成答案之前,先对构建的子图进行筛选和排序。
-
潜在优势
- 提高准确性:通过排序和筛选,可以大大减少不相关信息的干扰。
- 提高效率:虽然增加了步骤,但通过快速筛选,实际上可能会加快整体处理速度。
- 提高灵活性:这种方法可以更好地适应不同类型和复杂度的问题。
-
需要注意的点
- 模型训练:这种方法需要额外的训练数据来优化排序模型。
- 计算成本:增加了排序步骤可能会增加一些计算成本。
- 平衡问题:需要在召回全面性和精确性之间找到平衡。
方案二:利用 KG 语义关联,提升文档片段间相关性