RAG知识库之知识库图谱应用
上篇文章介绍了使用大模型构建生成知识图谱,其实也可不用大模型用其他方式构建生成知识图谱,但RAG要结合知识图谱使用关键还是怎么把图谱的内容查询出来;简单来说可以先查出Chunk集在关联查出每个Chunk所关联的实体Entity再查询出实体之间的的关系集;这里说的RAG结合知识图谱和微软开源的GraphRAG具体实现是不同的,GraphRAG效果提升会更好。
在Neo4j中使用Cypher查询语言可以轻松实现图谱数据的查询,通过Chunk元数据fileName以及Document与Chunk节点的关系PART_OF、Chunk与实体的关系HAS_ENTITY就可查询到了该文档的完整知识图谱。图谱查询的具体流程如下:
1、将问题转为嵌入向量
2、如果选择了Document过滤则会根据Chunk的字段fileName过滤Chunk否则使用问题向量查询匹配vector索引所对应的chunk
3、计算Chunk节点的嵌入embedding字段与问题向量的余弦相似度作为score
4、查找与Chunk节点具有PART_OF关系的Document并使用fileName过滤文档
5、查找与Chunk节点具有HAS_ENTITY关系的Entity实体节点根据fileName过滤实体
6、组装从Chunk节点到实体节点的路径、从实体到实体的路径等
7、返回Chunk节点text内容、所有chunk的平均分score、Chunk元数据(源文档名称、chunkId、余弦相似度分数score等)、实体集、关系集
8、计算问题嵌入向量与返回的图谱文档嵌入向量余弦相似度,根据预设阈值过滤掉相似度较低的图谱文档
9、提交提问问题与经过过滤的图谱文档作为上下文到LLM
示例
海南岛文档其内容如下:
定安县位于海南岛东北部为海南省直辖县,最近的机场是美兰机场距30公里左右。
假如此段文本生成的图谱如上图所示。
提问问题:定安
限定文档:海南岛
在这个知识图谱中查询数据时会发生一下情况:
1、根据海南岛文档名称查询到其文档存在两个Chunk因为两个Chunk存fileName为海南岛的元数据
2、根据Chunk与Doc的Part_of关系溯源到Dunk所属与海南岛文档
3、根据Chunk与Entity的HAS_ENTITY关系查找到《海南省》、《定安县》、《美兰机场》实体
4、根据查找到的实体查找实体间的关系、实体的属性
经过如上4个流程后在图谱中查询到的文档内容如下:
定安县位于海南岛东北部为海南省直辖县,最近的机场是美兰机场距30公里左右。
实体集:行政区划:海南省 县:定安县 机场:美兰机场 关系集:行政区划:海南省 管辖 县:定安县 县:定安县 距离30公里:美兰机场
由于返回的此段文本与提问问题余弦相似度超过阈值所以保留该文档,讲该文档作为提问问题上下文提交到大模型。
当然在这个简单的图谱可能看不出知识图谱的优势,但可以明显的看到经过知识图谱的RAG得到的上下文比普通基于向量的RAG其上下文多了实体集、关系集信息,如图谱质量较高实体与关系的比较精准此时的上下文对于LLM还是会有很大帮助,对于RAG的准确性也会有所提高;