前文已对构建GraphRAG的初衷与基础架构做了简要介绍。GraphRAG的架构源于经典RAG的向量化转换:
我们已经演示了如何将结构化数据如关系型数据库中的知识转化为知识图谱,并用于RAG查询。现在,我们将深入探讨非结构化数据,以一个自然语言文本实例为出发点,理解如何借助LLM开发框架构建GraphRAG应用。
生成基于Graph的知识图谱
对于非结构化数据的GraphRAG应用来说,首要任务是将其转换为图结构表示的知识图谱,并存储于如Neo4j这样的GraphDB中,为后续的检索与生成提供基础。将非结构化文本转化为知识图谱,LLM是一种常用且高效的方法。
利用LLM强大的语义理解与推理能力,我们可以从非结构化文本中抽取出大量的实体-关系-实体三元组。借助必要的接口(如GraphDB支持的查询语言),我们可以将这些三元组导入到GraphDB中,创建对应的实体、关系与属性,从而形成知识图谱。大致流程如下:
代码中已经详细注释了各部分功能。需要注意的是,此过程中的关键工具是LLM及其对应的提示词。适当选择和使用提示词模式(few-shot prompt)可优化不同语言的需求。
借助PropertyGraphIndex组件,我们可以快速基于文档与抽取器生成知识图谱,并将其存储到图数据库中(通过Property_graph_store指定)。
在生成知识图谱时,我们需要指定嵌入模型,以便在生成Graph的节点时对节点内容或名称生成向量,用于后续的向量检索。
完成代码运行后,登录Neo4j后端控制台,即可看到基于该文本生成的知识图谱。
基于Graph知识图谱的检索与生成
我们已经将非结构化文本转换为基于Graph的知识图谱进行存储,并建立了必要的索引。接下来,我们将探讨如何基于这个知识图谱完成检索与生成。
这里介绍三种常见的知识图谱检索方法:
- Text-to-Cypher(或其他Graph查询语言),用于将自然语言转化为GraphDB能理解的查询语言进行检索。
- Vector Search,需要Graph数据库支持向量检索技术。
- Keywords Search,借助LLM从自然语言输入中提取关键词或同义词进行检索。
在LlamaIndex框架中,我们可以构建RAG检索与生成阶段的程序。首先创建一个基于关键词的检索器,其参数包括使用的大模型、提取关键词的提示词等。
再创建一个向量的检索器,注意此类型检索器需指定嵌入模型。
在LlamaIndex中,可以通过融合多种子检索器来形成更丰富的上下文。借助PGRetriever组件即可实现这一过程。
测试并观察检索器的效果,可以看到知识图谱检索器的结果是一些相关的"三元组",并可能带出生成这些三元组的原始文本。
通过查看LLM调用信息,可以验证检索与生成过程的正确性。
这就是一个基于非结构化文本的GraphRAG构建过程的概述。借助大模型,我们可以更快速地抽取实体与关系以生成知识图谱,并结合多种技术进行检索与生成。
在实际应用中,结合传统向量检索技术可以实现更多样的应用场景。在下一篇中,我们将进一步探索与实践微软最新开源的GraphRAG项目。