GraphRAG简介

GraphRAG的定义

        GraphRAG(Graph-based Retrieval-Augmented Generation)是一种结合知识图谱与检索增强生成 (RAG)的技术框架,旨在通过图结构数据增强大语言模型(LLMs)的推理能力和回答准确性。

(1)知识图谱构建

• 节点与边:节点表示实体(如人物、概念),边表示关系(如“影响”“属于”)。

• 自动化构建:通过LLM从非结构化文本中抽取实体和关系(如“莫奈→创作→《睡莲》”),并存 储于图数据库(Neo4j等)。

• 社区检测:使用Leiden算法将图谱聚类为主题社区(如“艺术运动”“科技公司”),并为每个社 区生成摘要。

(2)图检索与推理

• 检索机制:结合图遍历(如广度优先搜索)和向量相似度,定位相关子图。

• 多跳推理:沿图谱边路径推导答案(如“供应链中断→芯片短缺→汽车减产”)。

(3)生成优化

• 图增强生成:LLM结合检索到的子图结构和文本片段生成回答,提升逻辑性和可解释性

GraphRAG和传统RAG的区别

        基于00000000000000语义块检索的`RAG`技术,最大的一个问题是很难去检索到全局的信息。比如我们问的问题散落在不同的语义块中,那么基于语义块检索的`RAG`技术就很难去检索到全局的信息。关键词匹配局限就在于如果用户查询“哪些动物吃食物?”,传统方法可能只能检索到“Dog eats Food”或“Cat eats Food”中的一个,而无法同时获取所有相关信息。        

        图结构的优势就在于:可以在图谱中建立实体之间的关系,从而可以更全面的检索到全局的信息。 如此一来在进行检索时,就可以从图谱中检索到与问题相关的所有信息,从而可以更全面的检索到全局的信息。

        这种创新方法是由NebulaGraph率先提出的概念,所以本质上,GraphRAG技术就是对传统RAG技术的一种增强,其目的是将知识图谱与大语言模型结合起来,以增强信息检索和生成能力。与将纯文本文档块发送到大模型不同,GraphRAG还可以向大模型提供结构化实体信息,将实体文本描述与其属性和关系相结合,借助 GraphRAG中的每个记录更加丰富的上下文表示,从而提高了特定术语/用户意图的可理解性。

        GraphRAG是一种技术范式,其目的是将知识图谱与大语言模型结合起来,以增强信息检索和生成能力。在这一技术范式下,衍生出非常多的开源项目、框架或工具会去实现这一流程。比较受欢迎的工具和项目主要如下:

GraphRAG索引流程

安装graphRAG

pip install graphrag

安装完成后,我们可以通过以下命令验证是否安装成功:

pip show graphrag

GraphRAG的CLI基本使用方法

        通过graphrag --help 命令返回的参数信息主要设计的就是GraphRAG的构建和检索功能,具体来看:

- init: 初始化`GraphRAG` 的配置文件;

- index: 构建`GraphRAG` 索引,即`Indexing`过程;

- query: 检索`GraphRAG` 的查询,即`Querying`过程;

- update: 更新`GraphRAG` 的索引,即增量更新;

初始化配置文件(init)

构建索引的第一步,就是先执行`graphrag --init` 命令来生成默认的配置文件。即执行命令如下:

graphrag init --root ./

其中 `--root` 参数用于指定生成的配置文件的存储路径,`./` 表示当前目录。

当执行`graphrag --init --root ./` 命令后,会生成两个配置文件及一个文件夹,分别是:

settings.yaml:主配置文件,包含 `GraphRAG` 从索引构建到检索的设置;

.env:环境变量文件。里面主要存储的是`API_KEY`密钥等敏感信息,在`settings.yaml`文件中引用;

prompts/: 提示词文件夹。它包含 `GraphRAG` 使用的默认提示;

.env文件配置说明

        .env文件中主要存储的是API_KEY密钥等敏感信息,作为环境变量会在settings.yaml文件中被引用。默认的.env文件中只有一个GRAPHRA_API_KEY,用来存储用于GraphRAG构建过程中使用的大模型的有效API_KEY。 我这里使用通义千问

settings.yaml文件配置说明

settings.yaml文件是GraphRAG 的CLI工具的主配置文件,里面主要存储的是GraphRAG的索引构建流程的配置信息。默认的settings.yaml文件中的配置信息非常多,涉及到了GraphRAG的索引构建Pipeline的各个环节中策略的控制。将如下信息改为自己的配置

数据准备

        GraphRAG`的索引构建流程中,仅支持 .txt和 .csv两种格式的数据文件,因此如何不是这两种格式的数据文件,是无法直接进行索引构建的。加载文件的方法也非常简单,只需要在graphrag 初始化配置的同级目录下,新建一个input文件夹,然后把.txt或者 .csv文件放入其中即可。

GraphRAG构建索引完整流程(index)

        在配置好了.env文件和settings.yaml文件后,同时又准备好了数据文件,接下来我们就可以执行索引的构建了。通过GraphRAG 的CLI工具,执行命令如下:

graphrag index --root ./

        这条命令指的是在当前目录下执行索引的构建。当执行后,会看到GraphRAG的索引构建流程开始执行。下图是构建索引的完整流程:

        GraphRAG 整个Indexing过程可以通过以下简单的方式来理解:

1. 类似于 Baseline RAG,将源文档分块为较小的子文档;

2. 执行两个并行提取:实体提取用于识别人名、地名、组织名等实体,关系提取:查找不同数据块中实体之间的关系,比如朋友、同事,员工等;

3. 创建知识图谱,其中节点表示实体,边表示它们之间的关系,比如张三是李四的朋友, 张三是王五的同事;

4. 通过识别密切相关的实体来构建社区;

5. 生成不同社区级别的分层摘要;

6. 使用 reduce-map 方法通过逐步组合块来创建摘要,直到实现整体概览;

        在构建索引结束后会分别生成cache、logs和output三个文件夹,分别存储了构建索引过程中的缓存文件、日志文件和输出文件。其中output文件夹中会生成很多个xxx.parquet文件,这些文件就是GraphRAG的索引文件,也是我们后续进行检索的依据。

检索

graphrag query --root ./  --method global --query "黑悟空是什么"

        Microsoft GraphRAG 提供local 和global 两种查询方式,分别对应local search 和global search。是 源于不同的粒度级别而构建出来用于处理不同类型问题的Pipeline, 其中:

• Local Search 是基于实体的检索。

• Global Search 则是基于社区的检索。

        Microsoft GraphRAG 在查询阶段构建的流程,相较于构建索引阶段会更为直观。核心的具体步骤包 括:

• 接收用户的查询请求。

• 根据查询所需的详细程度,选择合适的社区级别进行分析。

• 在选定的社区级别进行信息检索。

• 依据社区摘要生成初步的响应。

• 将多个相关社区的初步响应进行整合,形成一个全面的最终答案。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐