当前位置:   article > 正文

GraphRAG:复杂查询的知识图谱新框架

GraphRAG:复杂查询的知识图谱新框架

33d371e29df7962bed5f92490661d3e3.png

微软最近发布了名为 GraphRAG(Graphs + Retrieval Augmented Generation)的创新 RAG 框架,这是一个将文本提取、语义网络分析,与大语言模型(LLM)的提示和总结功能结合在一起的端到端系统,用于深入理解文本数据集。在对私有数据中的复杂文本信息进行文档分析时,GrahRAG 使用 LLM 生成的知识图谱来大幅提高问答性能。这里的私有数据集是指 LLM 没有接受过训练且从未见过的数据,例如企业的专有技术文档、业务文档等。

为什么提出 GraphRAG?

使用检索增强生成从外部知识源中检索相关信息,使大语言模型能够回答关于私有和/或以前未见过的文档集合的问题。然而,RAG 在面对针对整个文本语料库的全局性问题时表现不佳,例如“数据集的主要主题是什么?”因为这本质上是一个面向查询的总结(QFS, Query-Focused Summarization)任务,而不是显式的检索任务。但是,现有的QFS方法无法扩展至典型 RAG 系统索引的海量文本之上。

因此,微软提出了 GraphRAG 方法,代表“基于图谱的检索增强生成”,用于在私有文本语料库上进行问答。GraphRAG 不是简单地查找文本片段,而是构建信息的结构化和层次化关系图谱。它将基于图谱的知识检索与 LLM 相结合,捕获大规模文本信息中的实体、关系和关键声明。与依赖矢量相似性搜索的传统 RAG 方法不同,GraphRAG 可以增强 LLM 理解和综合复杂数据集及其关系的能力,从而产生更准确的响应。

9e70e853be953d40b268ef090fa378fa.png

GraphRAG 如何工作?

GraphRAG 的创新之处在于,它使大型语言模型能够基于整个数据集回答问题。从根本上讲,GraphRAG 是一种新的检索方法,它在基本 RAG 架构中使用知识图谱和向量搜索。因此,它可以整合和理解各种知识,从而提供更广泛、更全面的数据视图。

知识图谱是一种强大的信息组织方式,用于表示和存储实体之间的复杂关系,不仅捕捉到实体本身,还包括定义它们的连接和属性。通过以图结构组织信息,知识图谱能够更深入地理解数据中的关系和层次,从而支持更复杂的推理和推断。

GraphRAG 的工作原理是从索引文档中创建一个知识图谱,这些文档也被称为非结构化数据,例如网页。因此,当 GraphRAG 创建知识图谱时,它实际上是在创建一个“结构化”的表示,表示各种“实体”(如人、地点、概念和事物)之间的关系,使得机器就更容易理解这些关系。

GraphRAG 方法使用 LLM 在两个阶段构建基于图谱的文本索引:首先从源文档中推导出实体知识图谱,基于实体群体间的相关程度,创建称之为“社区”的一般主题(高层次)和更细化的主题(低层次);然后,LLM 会对社区中的每一个主题进行总结,形成一个“数据的分层摘要”。回答问题时,则使用每个社区摘要(Community summary)生成部分回应,之后将所有部分回应再次总结为最终的用户回应。这样,聊天机器人就能够更多地基于知识(即社区摘要)来回答问题,而不是依赖嵌入。

6dd27333e9935213be02e869c9f79b77.png

  1. 提取知识图谱:首先从原始文本创建“知识图谱”。知识图谱就像一个相互连接的内容实体网络,其中每个实体(或“节点”)都以有意义的方式与其他实体相连接。

  2. 建立社区层次结构:接下来,它将这些相互关联的内容实体组织成“社区”,将这些社区视为相关概念的集群。

  3. 生成摘要:对于每个社区,GraphRAG 都会生成摘要来概括要点。这有助于理解关键内容,而不会迷失在细节中。

  4. 利用图谱结构:当您需要执行涉及检索和生成信息的任务时,GraphRAG 会使用这种组织良好的图谱结构。

GraphRAG 核心功能组件

与 RAG 系统类似,整个 GraphRAG 管道可以分为两个核心功能组件:索引和查询。索引过程使用 LLM 来提取节点(如实体)、边(如关系)和协变量(如声明)。然后,它使用社区检测技术对整个知识图谱进行分区,并使用 LLM 进一步形成摘要。对于特定查询,它可以汇总所有相关的社区摘要以生成全局答案。

GraphRAG Indexing 索引

GraphRAG 索引包是一个数据管道和转换套件,旨在使用大语言模型从非结构化文本中提取有意义的结构化数据。索引管道是可配置的,由工作流、标准和自定义步骤、提示模板以及输入/输出适配器组成。索引管道设计用于:

  • 从原始文本中提取实体、关系和声明

  • 在实体中执行社区检测

  • 生成多个粒度级别的社区摘要和报告

  • 将实体嵌入到图谱向量空间中

  • 将文本块嵌入到文本向量空间中

GraphRAG 索引管道建立在开源库 DataShaper 之上。DataShaper 是一个数据处理库,允许用户使用定义良好的模式声明性地表达数据管道、模式和相关资产。DataShaper 中的核心资源类型之一是工作流 Workflow。工作流程以步骤序列表示,我们称之为 Verbs。每个步骤都有一个动词名称(verb)和一个配置对象(configuration object)。

我们能够将数据管道表示为一系列多个相互依赖的工作流。在 GraphRAG 索引管道中,每个工作流可以定义对其他工作流的依赖性,有效地形成工作流的有向无环图(DAG),然后用于调度处理,如下图所示。管道输出可以以多种格式存储,包括 Json 和 Parquet,或者通过 Python APIs 手动处理。

19d89beb2252b7ab2f80e35fbc68e676.png


GraphRAG Query 查询引擎

查询引擎是 GraphRAG 库的检索模块,负责以下任务:

  • 本地搜索

本地搜索方法通过将模型从知识图谱中提取的相关数据与原始文档的文本块相结合,生成准确的答案。这种方法特别适用于需要深入了解文档中提到的特定实体的问题,例如“洋甘菊的治疗特性是什么?”

具体来说,本地搜索方法在给定用户查询和可选的对话历史记录的情况下,从知识图谱中识别出一组与用户输入语义相关的实体。这些实体作为访问知识图谱的切入点,可以进一步提取相关的细节信息,如关联实体、关系、实体协变量以及社区报告。此外,该方法还从与这些识别出的实体相关的原始文档中提取相关的文本块。接着,将这些候选数据源进行优先级排序和筛选,以适应预定义大小的单个上下文窗口,用于生成对用户查询的最终响应。

479a3bd3d2ec473d041870db56dc9d6d.png

  • 全局搜索

全局搜索方法通过以 Map-Reduce 方式搜索所有由 LLM 生成的社区报告来生成答案。这是一种资源密集型的方法,但对于需要了解整个数据集的问题,如“数据中排名前五的主题是什么?”,通常能提供较好的结果。

LLM 生成的知识图谱结构揭示了整个数据集的组织方式和主题分布。这使得我们能够将私有数据集组织成预先总结的、有意义的语义集群。通过全局搜索方法,LLM 能够在响应用户查询时,利用这些集群来总结相关主题。

具体而言,当接收到用户查询和(可选的)对话历史记录时,全局搜索方法使用从知识图谱社区层次结构中指定级别获取的社区报告集合作为上下文数据,以 Map-Reduce 方式生成响应。在 Map 步骤中,社区报告被分割成预定义大小的文本块。每个文本块用于生成包含要点列表的中间响应,并为每个要点附加表示其重要性的数字评分。在 Reduce 步骤中,筛选出的最重要要点被聚合,并用作生成最终响应的上下文。

f452349d6ff4d0fe0f0b26a27508cecc.png

全局搜索的响应质量可能会受到选择的社区层次结构级别的显著影响。较低级别的层次结构及其详细报告往往能够生成更全面的响应,但由于报告量大,也可能增加生成最终响应所需的时间和 LLM 资源。

  • 问题生成

基于实体的问题生成方法将知识图谱中的结构化数据与输入文档中的非结构化数据相结合,以生成与特定实体相关的候选问题。

详细来说,给定先前用户问题的列表,问题生成方法使用与本地搜索相同的上下文构建方法,以提取和优先处理相关的结构化和非结构化数据,包括实体、关系、协变量、社区报告和原始文本块。然后,这些数据记录被合并至单个 LLM 提示中,以生成代表数据中最重要或最紧急的信息内容或主题的候选后续问题。这对于在对话中生成后续问题或生成问题列表非常有用,以便调查人员深入研究数据集。

GraphRAG 实践


GraphRAG 项目

基于 Python 的 GraphRAG 开源实现请参考 GitHub 项目:https://github.com/microsoft/graphrag。

安装 GraphRAG

pip install graphrag

初始化设置

现在我们需要设置数据项目和初始配置。我们使用默认配置模式,您可以根据需要使用配置文件或环境变量进行自定义。

首先,我们需要一个样本数据集:

  1. mkdir -p ./ragtest/input
  2. # 以查尔斯·狄更斯的《圣诞颂歌》为例
  3. curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt > ./ragtest/input/A_Christmas_Carol.txt

接下来,我们需要设置工作区环境变量。

运行 graphrag.index --init 命令进行工作区初始化。

python -m graphrag.index --init --root ./ragtest

这将在 ./ragtest 目录中创建两个文件:.env 和 settings.yaml

  • .env 包含运行 GraphRAG 管道所需的环境变量。如果查看该文件,您将看到定义的单个环境变量,GRAPHRAG_API_KEY=<API_KEY>。这是 OpenAI API 或 Azure OpenAI 端点借口的 API 密钥。你需要替换为自己的 API 密钥。

  • settings.yaml 包含管道的设置。Azure OpenAI 用户应在 settings.yaml 文件中设置以下变量:搜索 “llm:” 配置,您应该会看到两个部分,一个用于聊天端点,一个用于嵌入端点。以下是如何配置聊天端点的示例:

    1. type: azure_openai_chat # Or azure_openai_embedding for embeddings
    2. api_base: https://<instance>.openai.azure.com
    3. api_version: 2024-02-15-preview # You can customize this for other versions
    4. deployment_name: <azure_model_deployment_name>

构建索引

现在,我们将开始运行索引管道。

python -m graphrag.index --root ./ragtest

控制台将打印许多运行时日志,例如完整的索引管道编排工作流:

  1. ⠼ GraphRAG Indexer
  2. ├── Loading Input (InputFileType.text) - 1 files loaded (0 filtered) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00 0:00:00
  3. ├── create_base_text_units
  4. ├── create_base_extracted_entities
  5. ├── create_summarized_entities
  6. ├── create_base_entity_graph
  7. ├── create_final_entities
  8. ├── create_final_nodes
  9. ├── create_final_communities
  10. ├── join_text_units_to_entity_ids
  11. ├── create_final_relationships
  12. ├── join_text_units_to_relationship_ids
  13. ├── create_final_community_reports
  14. ├── create_final_text_units
  15. ├── create_base_documents
  16. └── create_final_documents
  17. 声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/987046
    推荐阅读
    相关标签