从知识图谱到 GraphRAG:探索属性图的构建和复杂的数据检索实践

为什么知识图谱+RAG>RAG:https://mp.weixin.qq.com/s?__biz=MzIyOTkzNDczMw==&mid=2247508213&idx=1&sn=a1d3505a55ef8456cdceaea64fb66091&chksm=e8b9f317dfce7a01be4827a834d09141608762ad7109d79a05ae3bf82ebfaf130cfd46df0b6e&scene=21#wechat_redirect

  1. 比如query:感冒了吃什么?db:1、感冒了可能会发烧和头痛。2、对乙酰氨基酚是一种退烧和止疼药物。相似度搜索极难查询到第2个结果,而Graph方法可以将对1和2连接在一起,从而在检索到1结点的时候将相邻结点一起检索出来。
  2. 当你问:“这个数据集的主题是什么?”这类高级别、概括性的问题时,传统的RAG可能就会束手无策。为什么呢?那是因为这本质上是一个聚焦于查询的总结性任务(Query-Focused Summarization,QFS),而不是一个明确的检索任务。

通常来说,具备如下特征的数据和场景更适合使用GraphRAG。

  1. 第一类是有较多相互关联实体与复杂关系,且结构较明确的数据。比如:
    1. 人物关系网络数据:社交网络中的用户关系、历史人物关系、家族图谱等。
    2. 企业级关系数据:公司结构、供应链、客户等之间的关系。
    3. 医学类数据:疾病、症状、治疗、药物、传播、病例等之间复杂关系。
    4. 法律法规数据:法律条款之间的引用关系、解释、判例与适用法律条款的关系。
    5. 推荐系统数据:产品、用户、浏览内容、产品之间的关联、用户之间的关系等。
  2. 第二类是涉及复杂关系、语义推理和多步逻辑关联的查询,比如:
    1. 多跳关系查询:在华东区所有的门店中,哪个导购的消费者客单价最高?
    2. 知识推理查询:根据患者的症状和病史,推断可能的疾病并提供治疗方案。
    3. 聚合统计查询:在《三国演义》中,出场次数最多的人是谁?
    4. 时序关联查询:过去一年都有哪些AI大模型的投资与并购事件?
    5. 跨多文档查询:在《三体3》中,有哪些人物在《三体1》中出现?

本文将探索属性图及其在提升数据表示和检索中的作用,同时借鉴 Ravi Theja(LlamaIndex AI 工程师和布道师)关于属性图的系列内容。通过这篇文章,我们将对如何使用 LlamaIndex 实现 GraphRAG 有一个清晰的理解,并附上一份实践指南,助您入门。

以下为译文:

01 进化:从知识图谱到属性图谱

首先,让我们回顾下知识图谱(KG)的概念。知识图谱使用主体、对象和谓语的三元组结构来定义关系,就像一个基础的家谱。它展示了人与人之间的关系,但没有个人的详细信息。

img

来源:LlamaIndex

每个节点(绿色和蓝色)有“标签”,承载了诸如类别的特定信息。它们就像家庭聚会的姓名标签,告诉你约翰是个人,旧金山是一个城市。谓语(边)定义了这些节点之间的关系(和方向)。

进入属性图(PG):PG 结构不仅包含主体、客体和谓语,还包含了每个实体附加的属性,比如名称/属性值对等。就像是从一个只包含姓名标签的基础家谱,升级为带有每个家庭成员的详细资料的详细版家谱。

img

来源:LlamaIndex

在这个详细版家谱中,约翰不仅仅是一个人,还记录了他今年 30 岁的年龄信息。旧金山也不仅仅是一个城市,是一座人口有 850 万的城市。有趣的是,甚至是谓语也可以有自己的属性,让实体之间的联系都有了细节。比如,约翰与旧金山是什么关系?我们可以添加“约翰从 2006 年就住在旧金山”的信息。这就像是在家谱上添加便签,详细描述所有细节。

OpenSPG 是一个语义增强的可编程知识图谱,GitHub地址如下,欢迎大家Star关注~

https://github.com/OpenSPG/openspg

02 如何构建属性图谱

那么,如何将我们的基础家谱升级为这个信息翔实的网络呢?仅需要两步:PG 构建和查询。下面让我们逐步讲解:

img

来源:LlamaIndex

2.1 第一步:图谱提取(构建阶段)

有三种方法:

1. ImplicitPathExtractor:

这就像整理书架,你不需要阅读每一本书,只是按顺序排列。在下面的图中,大文本 E 被分为小块的文本 A,B 和 C。这三个部分之间的关系定义为 A 在 B 之前,B 又在 C 之前,它们都属于源文本 E。所以,ImplicitPathExtractor 将原始文档分割成一个有序的块(节点)列表,以及它们之间的节点关系,作为词汇图。而且这个过程不需要 LLM 的参与。

img

2. SimpleLLMExtractor:

使用一个 LLM 从文本片段中提取实体和关系,这就像是,你有一个非常聪明的朋友阅读一本书,然后告诉你书中所有的人物及其关系。在下面的例子中,我们使用 LLM 从文本片段中抽取出 4 个实体(太阳、猫、窗户和垫子),以及它们之间的关系。这里的 LLM 可以是像 Llama3 这样的开源版本,因为我们不需要调用原生函数。请注意,所有节点都使用相同的节点标签,每个文本片段都通过“提及”关系与其它实体相关联,这些实体之间还可以有进一步的关系。

img

来源:LlamaIndex

3.SchemaLLMPathExtractor:

SchemaLLMPathExtractor 和 SimpleLLMExtractor 类似,但它使用预定义的 Schema,可以提前定义待提取的实体、节点标签和关系。这就像是给你的“聪明朋友”提供了一份在书中查找特定内容的问题清单,比如“告诉我这本书中的主角、反派和背景设定”等问题。还是以之前的文本片段为例,如果把问题限定在“垫子”这个实体及其关系中,属性图将被截断,如下所示。还有一点不同在于,SchemaLLMPathExtractor 最适合配合 LLM 使用,支持函数调用,且节点可以有不同的节点标签。

img

来源:LlamaIndex

2.2 幕后英雄:实体消歧

创建属性图后,下一个步骤应该是检索,其实中间还有一个经常被忽视的重要步骤,就是“实体消歧”。这一步骤类似于 ETL (Extract-Transform-Load) 流程中的数据清洗,通过文本嵌入相似度和词汇距离来移除潜在的重复项。再拿家谱的例子来说,这个步骤可以确保你不会混淆家谱中两个同名的人。比如,约翰叔叔和堂兄弟约翰是同一个人吗?这个步骤有助于澄清这一点。

img

来源:Neo4j

2.3 第二步:图检索器(查询阶段)

现在我们已经建好了这个详细的家谱,如何在里面查找信息呢?我们有四种工具:

img

来源:LlamaIndex

1.LLMSynonymRetriever:

顾名思义,它根据用户的查询生成同义词和关键词,以找到最近的节点及其邻居。唯一的缺点是,它使用关键词搜索,不太可靠。这就像是向你的姨妈询问家族历史,她可能会跑题,但你也会得到一些有趣的相关信息。

img

2.VectorContextRetriever:

这个检索器使用嵌入和余弦相似性,进行向量相似性搜索,以检索相关的节点。它可以直接用于图数据库,或者是图和向量数据库的组合。值得注意的是,它不适合需要聚合响应的全局查询,更像是用于你的家谱的搜索引擎。适合特定问题,但不适用于“告诉我关于家族的历史”的查询。

img

来源:LlamaIndex

3.Text2Cypher:

这里使用 LLM 根据用户查询生成 Cypher 语句,然后从图数据库中获取数据。Text2Cypher 适用于需要聚合的全局查询。这就像是有一个翻译,他可以把你的问题转化为你的家谱能理解的语言。当然 LLM 生成的 Cypher 语句并不总是准确,但我们正在以准确度换取灵活性,所以在这里建议使用微调的本地模型。

img

来源:LlamaIndex

4.CypherTemplateRetriever:

在此,我们可以使用带有特定参数的 Cypher 模板。对于用户查询,我们会使用 LLM 来填充这些参数,以创建用于检索的 Cypher 查询。这在很大程度上解决了 LLM 生成错误 Cypher 语句的问题,就像预先写好问题的框架,你只需要填空就好了,降低了提出家谱无法理解的问题的可能性。

img

来源:LlamaIndex

03 整合:GraphRAG 开始工作

实际上,GraphRAG 就好比把你家详细的家谱,交给一个超级智能的家族历史学家。传统的 RAG(检索增强生成)系统经常在回答宽泛主题的问题上遇到困难。这是因为这类问题需要对整个数据集有全面的理解,而不仅仅是检索特定信息。

所以,GraphRAG 在以下场景中表现出色:

  • 在大型数据集中识别核心主题
  • 理解不同主题之间的关联
  • 全面了解复杂的信息架构

感谢 Ravi Theja,我们现在有了使用 LlamaIndex 实现 GraphRAG 的教程。

教程链接:https://github.com/run-llama/llama_index/blob/main/docs/docs/examples/cookbooks/GraphRAG_v1.ipynb

img

从知识图谱到属性图谱,再到 GraphRAG 的发展,标志着我们对数据的理解和交互方式发生了重大转变。GraphRAG 在揭示隐藏模式和回答开放性问题方面展现出潜力,但也只是我们工具箱中的众多工具之一,其真正的价值要通过实际应用和持续研究来确定。