【绝对通俗易懂】知识图谱增强 RAG 思路 和 实现方案
为什么用 知识图谱增强 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,意味着系统会探索与初始实体直接相连的节点,以及与这些节点相连的下一层节点。
- 这个过程实际上是在构建一个与用户查询高度相关的知识子图。
-
上下文增强生成
- 最后,系统将构建好的子图作为丰富的上下文信息,连同原始查询一起输入到大模型中。
- 大模型利用这些精心筛选的上下文信息,生成一个既准确又全面的回答。
首先从用户输入中提取关键实体,然后基于这些实体在知识图谱中构建相关子图,最后将这个子图作为上下文信息送入大模型,完成最终的答案生成。
如何优化固定深度?
问题输入 → 实体识别&链接 → 问题子图 → LLM问答
在画地图时,把深度设定为 2,这个回答效果不行。
原来的方法(固定深度2):
- 这就像是你站在图书馆门口,然后说"我要看看离我两个书架距离内的所有书"。
- 不管你要找的是什么,你总是只看这么远。
- 有时候可能看得太少,有时候又可能看得太多。
新的方法(3种查路径+查邻居):
- 这更像是一个聪明的图书管理员,他会根据你的问题,用不同的方式帮你找书:
-
直接关系查找:
就像问"感冒、发烧有什么关系",管理员会直接找一条最短的路,把这两种水果连起来。 -
多重关系网络:
比如你问"感冒、发烧和咳嗽有什么联系",管理员会把这三个症状都连起来,画出一个小网络,让你一眼就能看到它们之间的所有关系。 -
多角度查因:
当你问"我最近头疼、肚子疼、还有点晕,这是怎么回事"时,管理员会从每个症状出发,分别去找可能的原因,给你一个全面的解释。 -
查找邻居:
除了找这些直接的关系,管理员还会顺便看看周围closely相关的信息,可能会发现一些意想不到的联系。
对比来看:
-
灵活性:
旧方法就像是用固定尺寸的圆规画圆,而新方法更像是自由作画,能根据需要画出各种形状的"知识地图"。 -
精确性:
旧方法可能会把一些无关的书也拿来,而新方法就像是精准定位,只找最相关的信息。 -
全面性:
新方法不仅能找到直接关系,还能发现潜在的、复杂的联系,就像不仅告诉你怎么走,还会提醒你路上有什么好玩的。 -
效率:
虽然新方法看起来做的事情多,但因为更有针对性,反而可能比旧方法更快找到有用信息。
新方法就像是把一个固定的放大镜,换成了一个能变焦、能拼接的智能望远镜。
它能根据你的问题,灵活地调整"看"的方式和范围,给你一个更全面、更精准的答案。
如何避免维度爆炸?
固定深度为 2 的好处是,避免维度爆炸。
这里要怎么解决呢?
相关性筛选:
- 使用余弦相似度匹配实体,设置相似度阈值(0.5)来过滤不相关的实体
- 同时避免重复匹配同一个实体
邻居数量控制:
- 限制返回的邻居数量为5个
- 优先选择某些特定类型的关系(如"常用药品"、“诊断检查”)
多个实体间的路径组合:
- 把同时处理多对关系,变成每对逐步处理,而不是同时处理所有实体组合
- 设置了路径长度的上限,固定最大为5跳
- 每对实体间路径:最多保留4条最短路径
多起点的路径选择:
- 最终返回的路径总数 为 5
- 对于多起点(小于5)的情况,每个起点平均分配路径数量,可能最后一个起点会多得到一条路径
- 对于多起点(大于5)的情况,所有输入的症状(只要能在知识图谱中匹配到)都会参与路径搜索过程。
如何做上下文优化?
上文方法:问题输入 → 实体识别&链接 → 问题子图 → LLM问答
KG_RAG:问题输入 → 实体识别&链接 → 问题子图 → 子图文本化 → 相似度计算 → LLM问答
5Why分析:
Why 1: 为什么将子图转化为自然语句并进行向量化相似度计算能提高系统理解问题意图的能力?
- 原因:这个过程将结构化的图数据转换为非结构化的自然语言,使得系统可以在同一语义空间内比较问题和知识。
Why 2: 为什么在同一语义空间内比较问题和知识能提高理解能力?
- 原因:因为它允许系统捕捉到语义上的相似性,而不仅仅是表面的词语匹配。
Why 3: 为什么捕捉语义相似性比表面词语匹配更有效?
- 原因:语义相似性考虑了词语和概念之间的关系和上下文,能够理解同义词、近义词和相关概念。
Why 4: 为什么考虑词语和概念之间的关系和上下文如此重要?
- 原因:人类语言是复杂和多样的,同一个概念可能有多种表达方式,简单的关键词匹配无法捕捉这种复杂性。
Why 5: 最根本的原因是什么?
- 原因:最根本的原因是人类语言和知识的复杂性与计算机处理信息方式之间的差距。将结构化数据转换为自然语言并进行语义比较,是弥合这一差距的一种方法。
最终目标:创建一个能够像人类专家一样理解问题上下文、灵活运用知识、并提供准确、相关答案的智能问答系统。
如何优化知识图谱排名?
-
知识图谱召回方法的局限性
a) 子图召回可能引入不相关路径
- 就像我们之前说的"画地图",有时候可能会画出一些实际上并不重要的路。
- 这就像你问路时,别人不仅告诉你怎么去目的地,还说了一堆你根本不需要的弯路。
- 特别是双向的医疗知识图谱,头疼 < – > 康复治疗 < – > 牙疼,因为有一个通用节点(康复治疗),能把头疼和牙疼关联起来
b) 实体识别精度有限- 患者问"我的血压有点高,需要吃降压药吗?"
- 系统可能只识别出"血压"和"药"这两个实体,而忽略了"高"这个关键词。
- 结果可能会返回一些关于测量血压或者各种血压药物的信息,而不是针对高血压的具体建议。
c) 依赖基础知识图谱的质量
- 这就像是我们的"图书管理员"的知识储备。
- 如果图书馆里的书不够多或者不够全面,即使管理员再聪明,给出的信息也可能不够准确或完整。
2. 改进方向:引入路径排序
这个建议就像是在我们的"画地图"步骤后,加入一个"地图筛选"的环节。
这个环节分两步:
a) 粗排:使用LightGBM模型
- 这就像是快速浏览一遍画好的地图,用一些简单的标准(如道路长度、路标数量等)来初步判断哪些路径更可能是有用的。
b) 精排:使用大模型
- 这就像是仔细研究剩下的几条路径,深入理解每条路的含义,最后选出最合适的2-3条。
-
与之前的Graph RAG方法的关联
这些建议实际上是在完善我们之前讨论的Graph RAG的三个步骤:
- "抓重点"阶段:建议改进实体识别方法,不仅仅依赖关键词提取。
- "画地图"阶段:建议在构建子图时就考虑路径的相关性,而不是简单地基于深度。
- 新增"筛选地图"阶段:在生成答案之前,先对构建的子图进行筛选和排序。
-
潜在优势
- 提高准确性:通过排序和筛选,可以大大减少不相关信息的干扰。
- 提高效率:虽然增加了步骤,但通过快速筛选,实际上可能会加快整体处理速度。
- 提高灵活性:这种方法可以更好地适应不同类型和复杂度的问题。
解读:KG-Rank:用知识图谱和多级排序(相似度排名、答案扩展排名、MMR排名、重排)增强大模型,解决医疗问答准确性、多样性
上文方法:问题输入 → 实体识别&链接 → 问题子图 → LLM问答
KG_RAG:问题输入 → 实体识别&链接 → 问题子图 → 子图文本化 → 相似度计算 → LLM问答
KG-Rank:问题输入 → 实体识别&链接 → 关系检索 → 三元组排序(相似度、答案扩展、MMR)→ 再排序(交叉编码器) → LLM问答
这个流程展示了KG-Rank的独特之处:
-
问题输入:接收医疗相关的查询。
-
实体识别&链接:从查询中提取关键医学实体并映射到知识图谱。
-
关系检索:使用UMLS数据库检索与识别实体相关的一跳关系。
-
三元组排序:使用三种方法对检索到的三元组进行排序:
- 相似度排序:基于语义相似性
- 答案扩展排序:考虑潜在答案内容
- MMR(最大边际相关性)排序:平衡相关性和多样性
-
再排序:使用医学交叉编码器模型(如MedCPT)对top-k个三元组进行重新评估和排序,选出最相关的top-p个三元组。
-
LLM问答:将原始查询和筛选出的top-p个三元组输入到大语言模型中,生成最终答案。
这个流程强调了KG-Rank在知识选择和优化方面的多层次处理,旨在提供更准确、相关和多样化的医疗问答。
总结
利用 KG 关系网络,构建问题子图促精准解答。
我感觉是最实用的,而且效果也不错。
但如果还想优化,你得结合方式二了。
方式二:利用 KG 语义关联,提升文档片段间相关性
当我们把长文档切成小块(chunks)来处理时,会遇到两个主要问题:
- 这些小块之间失去了原本的联系。
- 当我们搜索相关内容时,常常会得到一些不太相关的结果。
可以利用知识图谱来组织这些文档小块,主要有三个步骤:
-
保存文档结构:
当我们切分文档时,不仅仅是简单地切开,而是记录下每个部分在原文中的位置和关系。就像给书加上了详细的目录,知道每个段落属于哪个章节。 -
使用实体来改进搜索:
我们不仅看文字是否匹配,还看文档中提到的人、地点、概念等是否与问题相关。这就像不仅看书名,还看书中提到的关键概念是否与你的兴趣相符。 -
对长文本进行智能总结:
对于很长的文档,我们使用知识图谱来帮助总结内容,并建立一个层次结构。这就像给一本厚书做了一个带章节的摘要,让你可以快速找到相关部分。
预期效果:
通过这种方法,我们希望能够:
- 更准确地找到与问题相关的文档部分。
- 减少无关信息的干扰。
- 更好地处理长文档,让回答更全面和准确。
这个方法就是试图让计算机更像人类那样理解文档的结构和内容,从而在回答问题时能够更智能地找到和使用相关信息。
Graph-Based Retriever:将文本块映射到图的节点和边,文本单元切分和图谱抽取
解读:知识图谱检索 Graph-Based Retriever:文本块到结构化数据的转换,解决语义检索捕获不了的长尾关系
好处是,得到比传统知识图谱更高质量、更新容易、维护简单、更方便计算的 图谱:
-
知识粒度:
- 传统图谱: 只包含"阿司匹林"这个实体和几个简单的关系。
- 文本块映射图谱: 除了基本信息,还包含了剂量、化学名称等更丰富的细节。
-
信息密度:
- 传统图谱: 每个节点只有一个简单的标签。
- 文本块映射图谱: 每个节点包含多行信息,提供了更多上下文。
-
长尾知识处理:
- 传统图谱: 只包含最常见的信息。
- 文本块映射图谱: 包含了一个"长尾知识"节点,提到阿司匹林可能减少结直肠癌风险,这是一个不太常见但可能很重要的信息。
-
关系复杂度:
- 传统图谱: 关系简单,仅用线条表示。
- 文本块映射图谱: 关系更复杂,包含了作用机制(如COX-1抑制)的信息。
-
与原始文本的联系:
- 传统图谱: 难以追溯到原始信息来源。
- 文本块映射图谱: 每个节点可以链接到原始文本块,便于查看完整上下文。
-
动态性:
- 传统图谱: 看起来较为静态。
- 文本块映射图谱: 设计上更容易添加新的节点或更新现有信息。
文档知识图谱的优势
Why 1: 为什么实体关系图谱对长尾知识的表示和检索能力较弱,而文本块映射的知识图谱能更好地捕获和检索长尾知识?
- 原因是实体关系图谱主要关注高频、常见的知识点和关系,而文本块映射的知识图谱保留了更多原始文本信息。
Why 2: 为什么保留更多原始文本信息能更好地捕获长尾知识?
- 因为长尾知识通常存在于细节和上下文中,而不是简单的实体关系中。文本块能保留这些重要的细节和上下文。
Why 3: 为什么长尾知识更多地存在于细节和上下文中?
- 因为长尾知识往往是复杂的、非标准化的,或者是新兴的研究发现,这些信息难以用简单的实体和关系来完整表达。
Why 4: 为什么复杂、非标准化或新兴的知识难以用简单的实体和关系表达?
- 因为传统的实体关系模型设计时考虑的是常见、稳定的知识结构,而不是为了捕捉不确定、多变或高度专业化的信息。
Why 5: 最根本的原因是什么?
- 最根本的原因是知识表示方法与知识本质之间的不匹配。实体关系图谱基于简化和标准化的假设,而真实世界的知识,尤其是长尾知识,往往是复杂、多样和动态的。
文档知识图谱的问题
问题1:从文档生成图谱,误差很大。
微软graphrag,擅长回答涉及多文档和多段落的总结性问题
但抽取的知识图谱,又有误差,比如 XX 不能 YY,变成了 XX 能 YY
这种只能人工审核吗?
需要再做一个匹配度评分。三元组,原文本块。能解决这种致命错误。
LLM抽取最大的问题是幻觉,甚至需要对LLM进行微调,才能很好完成这种垂直领域任务。
问题2:文档知识图谱,做多跳查询很难。
Knowledge Graph Prompting:在多文档上创建,文档知识图谱
实体知识图谱 对比 文档知识图谱
假设我们有一个问题:“2型糖尿病患者如何通过饮食和运动来控制血糖,同时考虑到可能的并发症风险?”
- 传统实体知识图谱:
节点:
- 2型糖尿病, 饮食, 运动, 血糖控制, 并发症
边:
- (2型糖尿病)-[通过]->(饮食)-[影响]->(血糖控制)
- (2型糖尿病)-[通过]->(运动)-[影响]->(血糖控制)
- (2型糖尿病)-[可能导致]->(并发症)
这种图谱的局限性:
- 缺乏具体的饮食和运动建议
- 没有血糖控制的具体标准
- 并发症风险没有详细说明
- 无法体现个体差异和特殊情况
基本上,现在的医学大模型都是这样:检查项目宽泛模糊,你按照ta推荐的检测,会浪费很多时间。
- 以文档结构单元为节点的知识图谱:
节点1 (段落): “2型糖尿病患者应控制碳水化合物摄入,每餐限制在45-60克。优先选择全谷物、蔬菜和水果作为碳水来源。”
节点2 (表格): [不同运动对血糖的影响表]
列:运动类型、运动时长、血糖下降幅度
节点3 (段落): “每周至少进行150分钟中等强度有氧运动,如快走或游泳。运动前后要监测血糖,避免低血糖风险。”
节点4 (页面): “2型糖尿病常见并发症及预防措施”
节点5 (段落): “长期血糖控制不佳可能导致心血管疾病、肾病和视网膜病变。建议每3-6个月检查一次糖化血红蛋白(HbA1c),目标值应低于7%。”
节点6 (图表): [血糖监测频率与并发症风险关系图]
边: 基于内容相似性和结构关系连接这些节点
这种图谱的优势:
- 提供了具体的饮食和运动建议
- 包含了数据支持的信息(如运动影响表)
- 考虑到了并发症风险和预防措施
- 提供了血糖控制的具体标准
- 可以根据不同患者的情况提供个性化建议
回答过程:
- 系统首先从节点1和节点3获取具体的饮食和运动建议。
- 通过节点2的表格,了解不同运动对血糖的影响,有助于制定个性化运动计划。
- 从节点5获取血糖控制的具体目标和监测建议。
- 通过节点4和节点6,了解并发症风险和预防措施。
- 整合这些信息,系统可以提供一个全面、个性化的建议。
这种方法能够提供更详细、更实用的答案。
它不仅回答了"如何"控制血糖,还提供了具体的数据、建议和风险提示。
这种复杂、多方面的信息整合正是多文档问答在医疗领域的优势所在,可以为患者和医护人员提供更全面、更有价值的信息支持。
为什么以文档的结构单元(段落、页面、表格)作为节点的知识图谱,比以实体的知识图谱,更适合做多文档问答?
5Why 分析:
Why 1: 为什么以文档的结构单元作为节点的知识图谱更适合多文档问答?
- 原因:这种方法保留了原始文档的结构和上下文信息,更接近问答任务的实际需求。
Why 2: 为什么保留原始文档的结构和上下文信息更接近问答任务的需求?
- 原因:多文档问答often需要理解和整合来自不同文档、不同部分的信息,而不仅仅是单一事实。
Why 3: 为什么多文档问答需要整合不同文档、不同部分的信息?
- 原因:复杂问题的答案通常分散在多个文档中,需要系统能够在多个信息源之间建立联系。
Why 4: 为什么复杂问题的答案会分散在多个文档中?
- 原因:现实世界的知识是互联和多面的,单一文档often无法完整覆盖一个复杂主题的所有方面。
Why 5: 为什么现实世界的知识是互联和多面的?
- 原因:知识的本质是复杂和相互关联的,反映了现实世界的复杂性和多样性。
HippoRAG:图增强和社区检测
GRAG:图的拓扑结构
微软版 Graph-RAG:学习前面论文的思路,集大成
解读:https://debroon.blog.csdn.net/article/details/140091599
【graphrag的原理&源码及应用介绍】 https://www.bilibili.com/video/BV1u6iFeAEx9/?p=3&share_source=copy_web&vd_source=933ab3b2817296cf9454ddd8fc4e65e8
适合总结性的问题涉及多个文档、多个段落。
在多文档上创建前置知识图谱,更丰富、更精细
-
原 KG 的知识图谱创建:
- 主要关注:段落和文档结构
- 过程:
a) 将文档分割成段落
b) 创建表示段落的节点
c) 使用文档结构(如章节、小节)创建层次关系 - 结果:
- 节点主要代表文档的结构单元(如段落、章节)
- 边主要表示文档的结构关系(如"属于"、“跟随”)
- 局限性:
- 信息粒度较粗
- 缺乏对文本内容的深入语义分析
- 实体和关系的表示相对简单
-
GraphRAG 的知识图谱创建:
- 主要关注:实体、关系和属性
- 过程:
a) 实体识别:从文本中提取关键实体
b) 关系提取:识别实体间的语义关系
c) 属性提取:捕获实体的特征和属性
d) 实体链接:将提取的实体链接到标准知识库
e) 社区检测:对图结构进行社区分析 - 结果:
- 节点代表具体的实体(如人、地点、概念)
- 边代表实体间的语义关系(如"发明"、“影响”)
- 节点和边都可以包含丰富的属性信息
-
GraphRAG 的"更丰富"体现在:
a) 实体粒度:
- KG Prompting:主要是段落级别的节点
- GraphRAG:精确到具体实体级别(如特定的人、事物、概念)
b) 关系多样性:
- KG Prompting:主要是文档结构关系
- GraphRAG:包含各种语义关系(如因果、从属、交互等)
c) 属性信息:
- KG Prompting:属性信息有限,主要是文档元数据
- GraphRAG:每个实体可以有多个属性(如时间、位置、特征等)
d) 语义深度:
- KG Prompting:主要捕捉显式的文档结构
- GraphRAG:通过NLP技术捕捉隐含的语义信息
e) 跨文档关联:
- KG Prompting:文档间关联相对简单
- GraphRAG:能够识别和表示跨文档的复杂关联
f) 知识整合:
- KG Prompting:主要反映单个文档集的结构
- GraphRAG:可以与外部知识库整合,丰富知识表示
g) 动态性:
- KG Prompting:较为静态的文档表示
- GraphRAG:支持动态更新和知识演化
-
具体例子:
假设我们有多篇关于人工智能在医疗领域应用的文档:
KG Prompting 可能会创建这样的图:
- 节点:文档1、章节1.1、段落1.1.1等
- 边:文档1包含章节1.1,章节1.1包含段落1.1.1
GraphRAG 可能会创建这样的图:
- 节点:
- 实体:机器学习、X射线诊断、深度学习算法
- 具体例子:某医院的AI诊断系统
- 边:
- “机器学习"应用于"X射线诊断”
- “深度学习算法"提高"诊断准确率”
- 属性:
- 机器学习:{类型: 技术, 应用领域: 医疗诊断}
- X射线诊断:{准确率: 95%, 实施时间: 2022年}
- 社区:
- AI技术社区
- 医疗应用社区
- GraphRAG 的额外优势:
- 支持更复杂的查询:可以回答如"哪些深度学习算法最常用于X射线诊断?"
- 提供更丰富的上下文:不仅显示技术应用,还包括效果、时间线等信息
- 跨领域关联:能够显示AI技术如何影响不同的医疗诊断领域
- 趋势分析:通过时间属性可以分析技术应用的演变
GraphRAG 创建的知识图谱在实体粒度、关系多样性、属性丰富度、语义深度、跨文档关联、知识整合和动态性方面都显著优于 KG Prompting。
这种更丰富的图谱结构使得 GraphRAG 能够提供更深入、更全面的知识表示,从而支持更复杂的查询和更精确的信息检索。
它不仅捕捉了文档的内容,还捕捉了内容之间的复杂语义关系,为后续的分析和推理提供了坚实的基础。
上下文生成过程优化:不仅仅是将子图转化为自然语言,而是通过社区结构和多层次摘要,提供了一种更复杂、更丰富的知识表示方式
-
原来的 KG 方案:
- 直接将检索到的子图转化为自然语言描述。
- 通常是对子图中的实体和关系进行一对一的转换,生成类似"实体A与实体B有关系C"的描述。
- 这种方法的优点是保留了子图的直接信息,缺点是可能缺乏更高层次的概括。
-
GraphRAG的方法:
- 生成社区(实体群组)报告和摘要,这是一个更复杂的过程。
- 不仅包含子图的直接信息,还包括更高层次的概括和分析。
- 社区报告可能包含:
a) 社区的整体描述
b) 关键实体和关系的总结
c) 社区内部的模式或趋势
d) 与其他社区的关系 - 摘要则是对社区报告的进一步浓缩,提供更简洁的概览。
关键区别:
- 信息粒度:GraphRAG 提供多层次的信息表示,从详细的图结构到高度概括的摘要。
- 上下文丰富度:GraphRAG 的方法可能提供更丰富的上下文,包括隐含的模式和关系。
- 抽象级别:GraphRAG 通过社区结构提供了更高层次的抽象,而不仅仅是直接的实体-关系描述。
- 灵活性:GraphRAG 的方法允许在不同抽象级别上访问信息,适应不同的查询需求。
更准确的表述应该是:
- 原 KG 方案:将子图直接转化为自然语言描述作为上下文。
- GraphRAG:基于社区结构生成多层次的报告和摘要,提供从详细图结构到高度概括信息的混合表示,作为丰富的上下文信息源。
这种方法允许GraphRAG在需要时提供更详细的图结构信息,同时也能提供高度概括的摘要,从而更灵活地满足不同类型的查询需求。
假设我们有一个查询"苹果公司的最新智能手机技术":
- 子图检索会找到直接相关的实体(如"苹果公司"、“iPhone”、“A16芯片”)和它们之间的关系。
- 社区结构可能显示这些实体属于"科技公司"和"消费电子"社区,提供更广泛的行业背景。
- 结合这两者,GraphRAG可以生成一个包含具体技术细节和行业趋势的综合回答。
总结: 在GraphRAG中,子图检索和社区结构是互补的。
子图检索提供精确、相关的信息,而社区结构提供更广泛的语义上下文和组织框架。
这种结合允许系统在回答查询时既能提供详细的具体信息,又能考虑到更广泛的知识背景,从而产生更全面、更有洞察力的回答。
检索过程优化:从实体直接相连的信息,到通过社区结构扩展到更广泛知识
“帕金森病患者使用左旋多巴治疗可能产生的长期副作用是什么?”
- 原 KG 的处理方式:
这种方法主要基于识别的实体来确定检索的起点。
步骤:
a) 实体识别:识别出"帕金森病"、"左旋多巴"这两个主要实体。
b) 确定检索起点:以这两个实体为起点在知识图谱中进行检索。
c) 检索过程:
- 从"帕金森病"节点出发,寻找与治疗相关的边。
- 从"左旋多巴"节点出发,寻找与副作用相关的边。
- 可能会找到直接相连的信息,如常见副作用。
结果:
- 可能检索到左旋多巴的一般副作用信息。
- 可能找到帕金森病的一些基本治疗信息。
- 但可能难以捕捉到长期使用的特定影响。
- GraphRAG 的处理方式:
GraphRAG 结合实体识别和社区结构来指导检索过程,提供更全面的结果。
步骤:
a) 实体识别:同样识别出"帕金森病"和"左旋多巴"。
b) 社区结构分析:
- 确定这些实体所属的社区,例如"神经退行性疾病"和"多巴胺能药物"社区。
- 分析这些社区的特征和相关实体。
c) 扩展检索范围: - 不仅检索直接相关的实体,还考虑社区内的其他相关实体。
- 例如,可能会考虑"运动障碍"、"多巴胺受体"等相关概念。
d) 多维度检索: - 在"神经退行性疾病"社区中查找长期治疗的常见问题。
- 在"多巴胺能药物"社区中查找类似药物的长期使用效果。
e) 时间因素考虑: - 利用社区结构中的时间相关信息,特别关注长期使用的影响。
结果:
- 检索到左旋多巴的直接副作用。
- 发现长期使用多巴胺能药物的一般模式,如耐受性发展。
- 找到帕金森病长期治疗中的常见并发症,如运动波动。
- 可能发现与其他类似药物(如卡比多巴)结合使用的信息。
- 潜在地发现最新的研究趋势,如关于左旋多巴长期使用对认知功能的影响。
- 关键区别:
-
检索范围:
- Graph-Based Retriever 主要局限于直接相连的信息。
- GraphRAG 通过社区结构扩展到更广泛的相关知识。
-
上下文理解:
- Graph-Based Retriever 可能难以捕捉"长期"这一时间因素。
- GraphRAG 能更好地整合时间维度的信息。
-
关联发现:
- Graph-Based Retriever 可能错过不直接相连但相关的重要信息。
- GraphRAG 能发现潜在的重要关联,如药物相互作用或并发症。
-
结果全面性:
- Graph-Based Retriever 提供更直接但可能不够全面的答案。
- GraphRAG 提供更全面、多角度的信息,包括直接和间接影响。
GraphRAG 通过结合实体识别和社区结构,能够提供更全面、更深入的检索结果。
它不仅能回答直接的问题,还能提供更广泛的上下文信息,包括长期影响、潜在风险和最新研究趋势。
这种方法特别适合处理复杂的医学查询,其中往往需要考虑多个因素和长期影响。
对比上文的 【单对实体路径 + 多实体路径组合 + 多起点路径选择 + 邻居节点相关实体查询】:
提供直接相关的信息,上下文有限,不能包括实体所属的整个知识社区。
通过组合不同路径来整合信息,可能导致信息碎片化;不像社区结构自然地整合相关信息,提供更连贯的知识表示。
结合使用这两种方法可能会产生最佳结果,利用传统方法的精确性和GraphRAG的广度来提供全面而准确的答案。
- 子图检索提供直接相关的实体和关系。
- 社区结构提供这些实体和关系所处的更广泛语义环境。
可以根据需要结合子图的具体信息和社区的概括信息,生成适应不同查询需求的上下文。
图机器学习,捕捉复杂的、隐含的、非线性的关系模式
GraphRAG 引入图机器学习技术,进一步增强了系统捕捉和利用复杂、非线性关系的能力。这是对传统知识图谱方法的重要补充。
GraphRAG方案中的图嵌入增强
-
图增强的目的:
- 理解实体之间的关系结构
- 为图谱添加额外的有用信息
-
主要步骤:
a) 社区检测
b) 图嵌入 -
社区检测:
- 目的:找出图中紧密相连的实体群组
- 方法:使用Leiden算法
- 过程:
- 递归地将图分成越来越小的群组
- 直到群组大小达到预设的阈值
- 好处:可以在不同层次上浏览和总结图的结构
-
图嵌入:
- 目的:将图中的每个节点(实体)转换为一个向量
- 方法:使用Node2Vec算法
- 好处:
- 创造了一个新的向量空间
- 在这个空间中,相似的实体会有相近的向量表示
- 有助于在查询时快速找到相关概念
-
整体效果:
- 得到了一个功能更强大的知识图谱
- 包含了实体间的关系
- 有了实体的社区层次结构
- 每个实体都有了向量表示
让我们精确归纳一下,图嵌入能解决子图和社区方法的哪些问题:
-
稀疏性问题
- 子图和社区方法的局限:对于连接稀疏的节点或小社区,难以提供有意义的关联。
- 图嵌入的解决:通过将节点映射到连续向量空间,即使没有直接连接的节点也能计算相似度。
-
计算效率问题
- 子图和社区方法的局限:在大规模图中进行路径搜索和社区检测可能计算成本高昂。
- 图嵌入的解决:一旦生成嵌入,相似性计算变得非常快速,适合大规模实时查询。
-
隐含关系发现问题
- 子图和社区方法的局限:主要依赖于显式的连接关系,难以发现隐含的模式。
- 图嵌入的解决:通过学习节点的分布式表示,能够捕捉到图结构中的隐含模式。
-
多维关系表示问题
- 子图和社区方法的局限:难以同时考虑多种类型的关系和属性。
- 图嵌入的解决:可以将多种关系和属性编码到同一个向量空间,实现多维度的相似性比较。
-
跨域关联问题
- 子图和社区方法的局限:通常局限于预定义的边和社区边界内。
- 图嵌入的解决:可以发现跨越传统领域或社区边界的相似性和关联。
-
动态更新问题
- 子图和社区方法的局限:随着图的变化,可能需要频繁重新计算整个结构。
- 图嵌入的解决:可以采用增量学习方法,更容易适应图结构的动态变化。
-
相似度度量的灵活性问题
- 子图和社区方法的局限:通常使用固定的相似度度量(如最短路径长度)。
- 图嵌入的解决:允许使用多种向量相似度度量方法,提供更灵活的相似性定义。
-
可解释性与抽象表示的平衡问题
- 子图和社区方法的局限:提供直接可解释的结果,但可能缺乏高层次的抽象。
- 图嵌入的解决:在保持一定可解释性的同时,提供了更高层次的抽象表示。
图嵌入技术通过将离散的图结构转化为连续的向量空间表示,解决了子图和社区方法在处理大规模、复杂、动态变化的图结构时面临的一些根本性挑战。
它提供了一种更灵活、高效、且能捕捉深层次关系的方法,特别适合处理医学知识图谱中复杂的实体关系网络。
牛津版 MedGraph-RAG::学习前面论文的思路,加上医学设计
解读:https://debroon.blog.csdn.net/article/details/141408225