跳到内容

索引数据流

GraphRAG 知识模型

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

  • Document - 输入到系统的文档。这些文档代表 CSV 中的单个行或单个 .txt 文件。
  • TextUnit - 要分析的文本块。这些块的大小、它们的重叠以及它们是否遵守任何数据边界可以在下面配置。一个常见的用例是将 CHUNK_BY_COLUMNS 设置为 id,这样文档和文本单元之间就是一对多关系而不是多对多关系。
  • Entity - 从文本单元中提取的实体。这些实体代表人、地点、事件或您提供的其他实体模型。
  • Relationship - 两个实体之间的关系。
  • Covariate - 提取的声明信息,其中包含关于实体可能有时效性的语句。
  • Community - 一旦实体和关系图谱建立起来,我们就会对其执行分层社区检测以创建聚类结构。
  • Community Report - 每个社区的内容都被总结成一份生成的报告,便于人工阅读和下游搜索。

默认配置工作流

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

---
title: Dataflow Overview
---
flowchart TB
    subgraph phase1[Phase 1: Compose TextUnits]
    documents[Documents] --> chunk[Chunk]
    chunk --> textUnits[Text Units]
    end
    subgraph phase2[Phase 2: Graph Extraction]
    textUnits --> graph_extract[Entity & Relationship Extraction]
    graph_extract --> graph_summarize[Entity & Relationship Summarization]
    graph_summarize --> claim_extraction[Claim Extraction]
    claim_extraction --> graph_outputs[Graph Tables]
    end
    subgraph phase3[Phase 3: Graph Augmentation]
    graph_outputs --> community_detect[Community Detection]
    community_detect --> community_outputs[Communities Table]
    end
    subgraph phase4[Phase 4: Community Summarization]
    community_outputs --> summarized_communities[Community Summarization]
    summarized_communities --> community_report_outputs[Community Reports Table]
    end
    subgraph phase5[Phase 5: Document Processing]
    documents --> link_to_text_units[Link to TextUnits]
    textUnits --> link_to_text_units
    link_to_text_units --> document_outputs[Documents Table]
    end
    subgraph phase6[Phase 6: Network Visualization]
    graph_outputs --> graph_embed[Graph Embedding]
    graph_embed --> umap_entities[Umap Entities]
    umap_entities --> combine_nodes[Final Entities]
    end
    subgraph phase7[Phase 7: Text Embeddings]
    textUnits --> text_embed[Text Embedding]
    graph_outputs --> description_embed[Description Embedding]
    community_report_outputs --> content_embed[Content Embedding]
    end

阶段 1:组合文本单元

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

块大小(以令牌计数)是用户可配置的。默认情况下,它设置为 300 个令牌,尽管我们使用单个“glean”步骤(“glean”步骤是后续提取)对 1200 个令牌的块有积极的经验。较大的块会导致输出保真度较低,参考文本意义不大;但是,使用较大的块可以显著加快处理时间。

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

---
title: Documents into Text Chunks
---
flowchart LR
    doc1[Document 1] --> tu1[TextUnit 1]
    doc1 --> tu2[TextUnit 2]
    doc2[Document 2] --> tu3[TextUnit 3]
    doc2 --> tu4[TextUnit 4]

阶段 2:图谱提取

在此阶段,我们分析每个文本单元并提取我们的图元:实体关系声明。实体和关系在我们的 entity_extract 动词中一次性提取,而声明在我们的 claim_extract 动词中提取。然后将结果合并并传递到管道的后续阶段。

---
title: Graph Extraction
---
flowchart LR
    tu[TextUnit] --> ge[Graph Extraction] --> gs[Graph Summarization]
    tu --> ce[Claim Extraction]

实体和关系提取

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

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

实体和关系摘要

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

声明提取(可选)

最后,作为一个独立的工作流,我们从源文本单元中提取声明。这些声明代表具有评估状态和时间限制的积极事实陈述。这些声明作为主要工件导出,称为 **协变量**。

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

阶段 3:图谱增强

现在我们有一个可用的实体和关系图谱,我们希望了解它们的社区结构。这些为我们提供了理解图谱拓扑结构的明确方法。

---
title: Graph Augmentation
---
flowchart LR
    cd[Leiden Hierarchical Community Detection] --> ag[Graph Tables]

社区检测

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

图谱表

一旦我们的图谱增强步骤完成,最终的实体关系社区表将被导出。

阶段 4:社区摘要

---
title: Community Summarization
---
flowchart LR
    sc[Generate Community Reports] --> ss[Summarize Community Reports] --> co[Community Reports Table]

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

现在我们想在社区数据的基础上,为每个社区生成报告。这使我们能够在图谱的多个粒度点上对图谱有一个高层次的理解。例如,如果社区 A 是顶层社区,我们将获得关于整个图谱的报告。如果社区是较低层次的,我们将获得关于局部聚类的报告。

生成社区报告

在此步骤中,我们使用 LLM 生成每个社区的摘要。这将使我们能够理解每个社区中包含的独特信息,并从高层次或低层次的角度提供对图谱的范围化理解。这些报告包含执行概览,并引用社区子结构中的关键实体、关系和声明。

总结社区报告

在此步骤中,每个*社区报告*随后通过 LLM 进行摘要,以供简写使用。

社区报告表

此时,进行一些记账工作,并导出社区报告表。

阶段 5:文档处理

在此工作流阶段,我们为知识模型创建“文档”表。

---
title: Document Processing
---
flowchart LR
    aug[Augment] --> dp[Link to TextUnits] --> dg[Documents Table]

添加列(仅限 CSV)

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

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

文档表

此时,我们可以将“文档”表导出到知识模型中。

阶段 6:网络可视化(可选)

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

---
title: Network Visualization Workflows
---
flowchart LR
    ag[Graph Table] --> ge[Node2Vec Graph Embedding] --> ne[Umap Entities] --> ng[Entities Table]

图谱嵌入

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

降维

对于每个逻辑图谱,我们执行 UMAP 降维以生成图谱的 2D 表示。这将使我们能够在 2D 空间中可视化图谱并理解图谱中节点之间的关系。UMAP 嵌入被降维为 x/y 坐标的两个维度。

阶段 7:文本嵌入

对于所有需要下游向量搜索的工件,我们生成文本嵌入作为最后一步。这些嵌入直接写入配置的向量存储。默认情况下,我们嵌入实体描述、文本单元文本和社区报告文本。

---
title: Text Embedding Workflows
---
flowchart LR
    textUnits[Text Units] --> text_embed[Text Embedding]
    graph_outputs[Graph Tables] --> description_embed[Description Embedding]
    community_report_outputs[Community Reports] --> content_embed[Content Embedding]