GraphRAG 最新研究:本体增强 OG-RAG 与 HYBGRAG 实现策略
一、知识图谱本体与 RAG 结合 OG-RAG
关于 RAG 和 Graph 的结合工作,已有许多研究。例如,GraphRAG 在语义聚类方面表现出色,通过组织实体和关系,使得处理复杂查询更加高效。RAPTOR 采用分层结构进行多层次抽象,提高对大型文档的上下文理解。
而将知识图谱本体与 RAG 相结合的工作,可以参考《OG-RAG: ONTOLOGY-GROUNDED RETRIEVAL-AUGMENTED GENERATION FOR LARGE LANGUAGE MODELS》。该工作提出了 OG-RAG(本体引导的检索增强生成),通过将领域特定的本体集成到 LLM 检索过程中,如下图所示。
![本体引导的检索增强生成架构示意图]
其核心包括两个部分:将数据映射的本体形式化为超图,然后使用基于优化的超图检索提取与领域特定查询精确对齐的事实簇,从而生成更准确的上下文响应。
细分步骤如下:
![OG-RAG 具体实施步骤示意图]
1. 超图构建
首先将领域特定的文档映射到给定的本体,并将可用信息转换为可检索的格式。本体是领域内关键实体及其关系的正式表示。
例如,在农业领域,定义了作物、土壤和天气条件等实体,以及'作物在某个地区种植'或'土壤有湿度水平'等关系。通过定义这些实体和关系,本体为组织领域知识提供了一个一致且清晰的框架。不同于分类学或分类,本体允许实体之间存在更丰富的关系,这些关系不必是层次式的。
本体的定义比较重要,可以让大模型来做,如使用以下 Prompt:
![本体定义 Prompt 示例]
具像化一下,看几个例子:
比如,新闻的本体:
![新闻本体示例]
又如,农业的一个本体:
![农业本体示例]
2. 超图转换
由于事实块的嵌套结构,直接处理这些信息并不太友好,所以更好的方式是通过将每个事实块【fact block】转换为一组扁平化的事实块,将信息简化为更容易处理的形式。
这里有一个新概念,定义每个扁平化的事实块为一个超边,超边连接多个超节点。
![超图转换示意图]
需要明确的是:其中,一个超图 H:=(N,E) 由超节点 N 和超边 E 组成,使得每条超边 e∈E 是具有任意长度的节点集。
从本体映射文档 I 中提取的所有扁平化事实块集合可以被视为一个超图,可将其简称为 H(I)。根据这个定义,一个超节点本质上是一个键值对,一条超边是扎根于特定领域数据的真实事实。
而这个事实是两个实体(主体和客体)之间通过一个功能属性进行逻辑断言,该断言可以通过证据验证为真或假。形式上可以被表达为一个逻辑断言,能够验证其值为 True 或 False。
例如,考虑断言:hasCropYield(农场 A)=500 吨,其中 hasCropYield 是一个功能属性,它将一个农场(主体)映射到一个作物产量(值),并且可以通过证据验证为真或假。
因此,在 OG-RAG 中,超边可以被看作是复杂事实的表示。不失一般性,考虑两个超节点,n1(s1⊕a1,v1)=(作物有名称,大豆) 和 n2(p2∈⨁P(S×A),v2)=(作物有生长区,生长区名称为西北方),形成一条超边 e=((作物有名称,大豆(作物具有名为西北的生长区 CropGrowingZone)可以表示为一个简化的事实:具有生长区的大豆(作物名称)=西北,这个事实可以被验证为真或假。
3. 基于超图的检索
利用构建的超图,根据用户查询检索相关上下文。通过贪心算法选择覆盖最多未覆盖节点的超边,形成紧凑的上下文。
![基于超图的检索流程]
在具体实现上:
首先,识别与给定查询相关的超节点集合。一个超节点 n∈N 可以表示为来自集合 S,A,V 的键值对。如果满足以下条件之一,则可以将超节点视为与查询相关:(1) 查询涉及项 s 的属性 a;(2) 查询关注具有特定值 v 的对象。
换句话说,如果键(代表连接的实体和属性)与查询 Q 的相似度高,或者值 v 与查询 Q 的相似度高,则超节点是相关的。
OG-RAG 找出两组与查询相关的超节点:NS(Q) 和 NV(Q),分别代表这两组节点。NS(Q) 表示在向量空间 Z 中,其属性术语,即 s⊕a 与查询 Q 之间相似度最高的 k 个超节点;NV(Q) 表示在向量空间 Z 中,其值 v 与查询 Q 之间相似度最高的 k 个超节点。因此,对于每个查询,提取 2⋅k 个相关超节点。
其次,相关超边作为上下文。将相关上下文构建为最小覆盖相关超节点集合 N(Q)=NS(Q)∪NV(Q) 的超边集合 CH(Q)⊂E。这里是一个优化问题,并以贪婪方式解决。具体来说,维护一个字典,将每个超节点 n∈N 映射到它所属的超边集合,即 E(n),其中 e∈E(n)⟹n∈e。在每次迭代中,将覆盖最多未覆盖节点的超边添加到上下文中,并从进一步考虑中移除这些节点。这个过程重复进行,直到有 L 条超边或所有相关节点都被覆盖。


