在上一篇 《为什么说知识图谱 \+ RAG > 传统 RAG?》的文章中,我们已经对GraphRAG 的数据结构有了基本的了解。这篇文章,让我们深入研究如何在实践中实现这些概念。

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

以下为译文:

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

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

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

来源:LlamaIndex

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

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

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

来源:LlamaIndex

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

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

 https://github.com/OpenSPG/openspg

02 如何构建属性图谱

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

从知识图谱到 GraphRAG:探索属性图的构建和复杂的数据检索实践_全局查询_03

来源:LlamaIndex

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

有三种方法:

1\. ImplicitPathExtractor:

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

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

2\. SimpleLLMExtractor:

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

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

来源:LlamaIndex

3.SchemaLLMPathExtractor:

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

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

来源:LlamaIndex

2.2 幕后英雄:实体消歧

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

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

来源:Neo4j

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

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

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

来源:LlamaIndex

1.LLMSynonymRetriever:

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

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

2.VectorContextRetriever:

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

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

来源:LlamaIndex

3.Text2Cypher:

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

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

来源:LlamaIndex

4.CypherTemplateRetriever:

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

从知识图谱到 GraphRAG:探索属性图的构建和复杂的数据检索实践_全局查询_12

来源: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

从知识图谱到 GraphRAG:探索属性图的构建和复杂的数据检索实践_全局查询_13

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

END

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

文章推荐

 为什么说知识图谱 \+ RAG > 传统 RAG?

 手把手教程,改造 GraphRAG 支持自定义 LLM

 OpenSPG v0.0.3 发布,新增大模型统一知识抽取&图谱可视化