索引数据流
GraphRAG 知识模型
知识模型是符合我们数据模型定义的数据输出规范。您可以在 GraphRAG 存储库内的 python/graphrag/graphrag/model 文件夹中找到这些定义。提供以下实体类型。此处的字段表示默认情况下文本嵌入的字段。
Document
- 系统中的输入文档。 这些代表 CSV 中的单个行或单个 .txt 文件。TextUnit
- 要分析的文本块。 这些块的大小、它们的重叠以及它们是否遵守任何数据边界都可以在下面配置。 一个常见的用例是将CHUNK_BY_COLUMNS
设置为id
,以便文档和 TextUnit 之间存在一对多的关系,而不是多对多的关系。Entity
- 从 TextUnit 提取的实体。 这些代表人员、地点、事件或您提供的其他实体模型。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:组合 TextUnit
默认配置工作流程的第一阶段是将输入文档转换为 TextUnit。 TextUnit 是一块用于我们的图提取技术的文本。 它们也用作提取的知识项的来源参考,以便通过概念将面包屑和出处授权回其原始来源文本。
块大小(以令牌计数)是用户可配置的。 默认情况下,这设置为 300 个令牌,尽管我们在使用单个“glean”步骤(“glean”步骤是后续提取)时获得了积极的经验(使用 1200 个令牌块)。 较大的块会导致较低保真度的输出和不太有意义的参考文本;但是,使用较大的块可以大大缩短处理时间。
分组配置也是用户可配置的。 默认情况下,我们将块与文档边界对齐,这意味着文档和 TextUnit 之间存在严格的一对多关系。 在极少数情况下,这可以变成多对多的关系。 当文档非常短且我们需要其中几个来组成有意义的分析单元时,这非常有用(例如,推文或聊天记录)
---
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 从原始文本中提取实体和关系。 此步骤的输出是每个 TextUnit 的子图,其中包含一个实体列表,其中包含标题、类型和描述,以及一个包含来源、目标和描述的关系列表。
这些子图被合并在一起 - 任何具有相同标题和类型的实体都通过创建其描述数组来合并。 类似地,任何具有相同来源和目标的关系都通过创建其描述数组来合并。
实体与关系概括
现在我们有了一个实体和关系的图,每个都有一个描述列表,我们可以将这些列表总结成每个实体和关系的单个描述。 这是通过要求 LLM 提供一个简短的摘要,该摘要捕获每个描述中的所有不同信息来完成的。 这允许我们所有的实体和关系都有一个简洁的描述。
声明提取(可选)
最后,作为一个独立的工作流程,我们从源 TextUnit 中提取声明。 这些声明代表具有评估状态和时间范围的积极事实陈述。 这些作为名为 Covariates 的主要工件导出。
注意:声明提取是可选的,默认情况下处于关闭状态。 这是因为声明提取通常需要提示调整才能有用。
阶段 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 表中。 有关配置此项的详细信息,请参见配置文档。
链接到 TextUnit
在此步骤中,我们将每个文档链接到第一阶段中创建的文本单元。 这使我们能够了解哪些文档与哪些文本单元相关,反之亦然。
文档表
此时,我们可以将 文档 表导出到知识模型中。
阶段 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]