Skip to content

数据流索引

GraphRAG 知识模型

知识模型是我们数据模型定义的输出规范。您可以在 GraphRAG 仓库的 python/graphrag/graphrag/model 文件夹中找到这些定义。以下是提供的实体类型。这里的字段表示默认情况下进行文本嵌入的字段。

  • Document - 系统中的输入文档。这些文档代表 CSV 中的单行或单个 .txt 文件。
  • TextUnit - 用于分析的文本块。这些块的大小、重叠以及是否遵循任何数据边界可以在下面配置。一个常见的用例是将 CHUNK_BY_COLUMNS 设置为 id,以便文档与 TextUnits 之间存在一对多的关系,而不是多对多。
  • Entity - 从 TextUnit 中提取的实体。这些实体代表人物、地点、事件或您提供的其他实体模型。
  • Relationship - 两个实体之间的关系。这些关系是从协变量中生成的。
  • Covariate - 提取的声明信息,包含关于实体的陈述,这些陈述可能是时间绑定的。
  • Community Report - 生成实体后,我们对它们进行层次社区检测,并为层次结构中的每个社区生成报告。
  • Node - 该表包含已嵌入和聚类的实体和文档的渲染图视图的布局信息。

默认配置工作流程

让我们看看默认配置工作流程如何将文本文档转换为 GraphRAG 知识模型。本页概述了此过程中的主要步骤。要完全配置此工作流程,请查看配置文档。

---
title: 数据流概览
---
flowchart TB
    subgraph phase1[阶段 1: 组合 TextUnits]
    documents[文档] --> chunk[分块]
    chunk --> embed[嵌入] --> textUnits[Text Units]
    end
    subgraph phase2[阶段 2: 图提取]
    textUnits --> graph_extract[实体与关系提取]
    graph_extract --> graph_summarize[实体与关系汇总]
    graph_summarize --> claim_extraction[声明提取]
    claim_extraction --> graph_outputs[图表]
    end
    subgraph phase3[阶段 3: 图增强]
    graph_outputs --> community_detect[社区检测]
    community_detect --> graph_embed[图嵌入]
    graph_embed --> augmented_graph[增强图表]
    end
    subgraph phase4[阶段 4: 社区汇总]
    augmented_graph --> summarized_communities[社区汇总]
    summarized_communities --> embed_communities[社区嵌入]
    embed_communities --> community_outputs[社区表]
    end
    subgraph phase5[阶段 5: 文档处理]
    documents --> link_to_text_units[链接到 TextUnits]
    textUnits --> link_to_text_units
    link_to_text_units --> embed_documents[文档嵌入]
    embed_documents --> document_graph[文档图创建]
    document_graph --> document_outputs[文档表]
    end
    subgraph phase6[阶段 6: 网络可视化]
    document_outputs --> umap_docs[Umap 文档]
    augmented_graph --> umap_entities[Umap 实体]
    umap_docs --> combine_nodes[节点表]
    umap_entities --> combine_nodes
    end

阶段 1: 组合 TextUnits

默认配置工作流程的第一阶段是将输入文档转换为 TextUnitsTextUnit 是用于我们图提取技术的文本块。它们还用作提取知识项的源引用,以便通过概念回溯到其原始源文本,实现面包屑和溯源。

块大小(以标记计)是用户可配置的。默认设置为 300 个标记,尽管我们使用单个“glean”步骤处理 1200 个标记的块时取得了积极的效果。(“glean”步骤是后续提取)。较大的块会导致输出保真度较低,参考文本意义较小;然而,使用较大的块可以大大加快处理时间。

分组配置也是用户可配置的。默认情况下,我们将块与文档边界对齐,这意味着文档与 TextUnits 之间存在严格的一对多关系。在极少数情况下,这可以变成多对多关系。当文档非常短且我们需要多个文档来组成有意义的分析单元时(例如推文或聊天记录),这很有用。

每个文本单元都进行文本嵌入,并传递到管道的下一阶段。

---
title: 文档转换为文本块
---
flowchart LR
    doc1[文档 1] --> tu1[TextUnit 1]
    doc1 --> tu2[TextUnit 2]
    doc2[文档 2] --> tu3[TextUnit 3]
    doc2 --> tu4[TextUnit 4]

阶段 2: 图提取

在此阶段,我们分析每个文本单元并提取图的基本元素:实体关系_和_主张。实体和关系在我们的_entity_extract_动词中一次性提取,而主张则在_claim_extract_动词中提取。然后将结果合并并传递到管道的后续阶段。

---
title: 图提取
---
flowchart LR
    tu[文本单元] --> ge[图提取] --> gs[图汇总]
    tu --> ce[主张提取]

实体与关系提取

在图提取的第一步中,我们处理每个文本单元,以使用LLM从原始文本中提取实体和关系。此步骤的输出是每个文本单元的一个子图,包含一个实体列表,每个实体具有_名称_、类型_和_描述,以及一个关系列表,每个关系具有_源_、目标_和_描述

这些子图被合并在一起——任何具有相同_名称_和_类型_的实体通过创建其描述的数组进行合并。类似地,任何具有相同_源_和_目标_的关系通过创建其描述的数组进行合并。

实体与关系汇总

现在我们有了一个实体和关系的图,每个实体和关系都有一个描述列表,我们可以将这些列表汇总为每个实体和关系的单一描述。这是通过要求LLM提供一个简短的摘要来完成的,该摘要捕捉了每个描述中的所有不同信息。这使得我们所有的实体和关系都有一个简洁的单一描述。

主张提取与发布

最后,作为一个独立的流程,我们从源文本单元中提取主张。这些主张代表具有评估状态和时间界限的正面事实陈述。这些主张作为称为协变量的主要工件发布。

注意:主张提取是_可选的_,默认情况下关闭。这是因为主张提取通常需要提示调整才能有用。

第三阶段:图增强

现在我们有了一个可用的实体和关系图,我们希望理解它们的社区结构并使用附加信息增强图。这是通过两个步骤完成的:社区检测_和_图嵌入。这些为我们提供了显式(社区)和隐式(嵌入)的方式来理解我们图的拓扑结构。

---
title: 图增强
---
flowchart LR
    cd[Leiden层次社区检测] --> ge[Node2Vec图嵌入] --> ag[图表发布]

社区检测

在此步骤中,我们使用层次化Leiden算法生成实体社区的层次结构。该方法将对我们的图应用递归社区聚类,直到达到社区大小阈值。这将使我们能够理解图的社区结构,并提供一种在不同粒度级别上导航和汇总图的方式。

图嵌入

在此步骤中,我们使用Node2Vec算法生成图的向量表示。这将使我们能够理解图的隐式结构,并在查询阶段提供一个额外的向量空间来搜索相关概念。

图表发布

一旦我们的图增强步骤完成,最终的实体关系表在它们的文本字段被文本嵌入后发布。

第四阶段:社区汇总

---
title: 社区汇总
---
flowchart LR
    sc[生成社区报告] --> ss[汇总社区报告] --> ce[社区嵌入] --> co[社区表发布]

此时,我们有了一个功能性的实体和关系图,实体的社区层次结构,以及node2vec嵌入。

现在我们希望基于社区数据构建并生成每个社区的报告。这为我们提供了在图的多个粒度点上对图的高层次理解。例如,如果社区A是顶层社区,我们将获得关于整个图的报告。如果社区是较低层次的,我们将获得关于局部集群的报告。

生成社区报告

在此步骤中,我们使用LLM生成每个社区的摘要。这将使我们能够理解每个社区中包含的不同信息,并从高层次或低层次的角度提供对图的限定理解。这些报告包含执行概述,并引用社区子结构中的关键实体、关系和主张。

汇总社区报告

在此步骤中,每个_社区报告_通过LLM进行汇总,以便于简短使用。

社区嵌入

在此步骤中,我们通过生成社区报告、社区报告摘要和社区报告标题的文本嵌入来生成社区的向量表示。

社区表发布

在此步骤中,我们发布社区表。 此时,会进行一些簿记工作,并生成CommunitiesCommunityReports表。

第五阶段:文档处理

在此工作流程阶段,我们为知识模型创建_Documents_表。

---
title: 文档处理
---
flowchart LR
    aug[增强] --> dp[链接到文本单元] --> de[平均嵌入] --> dg[文档表生成]

增加列(仅限CSV)

如果工作流程处理的是CSV数据,您可以配置工作流程以向文档输出添加额外的字段。这些字段应存在于传入的CSV表中。有关配置的详细信息,请参阅配置文档

链接到文本单元

在此步骤中,我们将每个文档链接到第一阶段创建的文本单元。这使我们能够理解哪些文档与哪些文本单元相关,反之亦然。

文档嵌入

在此步骤中,我们使用文档切片的平均嵌入生成文档的向量表示。我们重新分块文档,不重叠分块,然后为每个分块生成嵌入。我们创建这些分块的加权平均值(按标记计数),并将其用作文档嵌入。这将使我们能够理解文档之间的隐含关系,并帮助我们生成文档的网络表示。

文档表生成

此时,我们可以将Documents表生成到知识模型中。

第六阶段:网络可视化

在此工作流程阶段,我们执行一些步骤以支持在我们的现有图表中对高维向量空间进行网络可视化。此时有两个逻辑图表在起作用:_实体-关系_图表和_文档_图表。

---
title: 网络可视化工作流程
---
flowchart LR
    nv[Umap文档] --> ne[Umap实体] --> ng[节点表生成]

对于每个逻辑图表,我们执行UMAP降维以生成图表的二维表示。这将使我们能够在二维空间中可视化图表,并理解图表中节点之间的关系。UMAP嵌入随后作为_Nodes_表生成。该表的行包括一个区分器,指示节点是文档还是实体,以及UMAP坐标。