数据流索引
GraphRAG知识模型
知识模型是符合我们数据模型定义的数据输出规范。您可以在GraphRAG代码库的python/graphrag/graphrag/model文件夹中找到这些定义。以下是提供的实体类型。此处列出的字段代表默认进行文本嵌入的字段。
Document
- 输入系统的文档。这些文档代表CSV中的单行或单个.txt文件。TextUnit
- 待分析的文本块。这些块的大小、重叠程度以及是否遵循任何数据边界都可以在下方配置。常见用例是将CHUNK_BY_COLUMNS
设置为id
,这样文档和TextUnit之间就形成一对多关系,而不是多对多关系。Entity
- 从TextUnit中提取的实体。这些实体代表人、地点、事件或您提供的其他实体模型。Relationship
- 两个实体之间的关系。Covariate
- 提取的声明信息,包含可能有时限的关于实体的陈述。Community
- 一旦构建了实体和关系图,我们对其执行层次化社区检测以创建聚类结构。Community Report
- 每个社区的内容被汇总成生成的报告,便于人类阅读和下游搜索。
默认配置工作流
让我们看看默认配置工作流如何将文本文档转换为_GraphRAG知识模型_。本页概述了此过程中的主要步骤。要完全配置此工作流,请查看配置文档。
---
title: 数据流概览
---
flowchart TB
subgraph phase1[阶段1:组成TextUnits]
documents[文档] --> chunk[分块]
chunk --> textUnits[文本单元]
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 --> community_outputs[社区表]
end
subgraph phase4[阶段4:社区汇总]
community_outputs --> summarized_communities[社区汇总]
summarized_communities --> community_report_outputs[社区报告表]
end
subgraph phase5[阶段5:文档处理]
documents --> link_to_text_units[链接到TextUnits]
textUnits --> link_to_text_units
link_to_text_units --> document_outputs[文档表]
end
subgraph phase6[阶段6:网络可视化]
graph_outputs --> graph_embed[图嵌入]
graph_embed --> umap_entities[Umap实体]
umap_entities --> combine_nodes[最终实体]
end
subgraph phase7[阶段7:文本嵌入]
textUnits --> text_embed[文本嵌入]
graph_outputs --> description_embed[描述嵌入]
community_report_outputs --> content_embed[内容嵌入]
end
阶段1:组成TextUnits
默认配置工作流的第一阶段是将输入文档转换为_TextUnits_。_TextUnit_是用于我们图提取技术的文本块。它们也被提取的知识项用作源引用,以便通过概念将面包屑和来源追溯到原始源文本。
块大小(以token计数)可由用户配置。默认设置为300个token,尽管我们使用单次"收集"步骤(即后续提取步骤)处理1200-token的块时也有良好体验。较大的块会导致输出保真度较低且参考文本意义较小;然而,使用较大的块可以显著缩短处理时间。
分组配置也可由用户配置。默认情况下,我们将块与文档边界对齐,这意味着文档和TextUnit之间存在严格的一对多关系。在极少数情况下,这可以转变为多对多关系。当文档非常短且我们需要多个文档组成一个有意义的分析单元(例如推文或聊天记录)时,这很有用。
---
title: 文档分块
---
flowchart LR
doc1[文档1] --> tu1[TextUnit 1]
doc1 --> tu2[TextUnit 2]
doc2[文档2] --> tu3[TextUnit 3]
doc2 --> tu4[TextUnit 4]
阶段2:图提取
在此阶段,我们分析每个文本单元并提取图的基本元素:Entities、Relationships_和_Claims。 实体和关系在我们的_entity_extract_动词中一次性提取,声明在我们的_claim_extract_动词中提取。结果随后被合并并传递到管道的后续阶段。
---
title: 图提取
---
flowchart LR
tu[TextUnit] --> ge[图提取] --> gs[图汇总]
tu --> ce[声明提取]
实体与关系提取
在图提取的第一步中,我们处理每个文本单元,以便使用LLM从原始文本中提取实体和关系。此步骤的输出是每个TextUnit的子图,包含具有_title_、type_和_description_的实体列表,以及具有_source、_target_和_description_的关系列表。
这些子图被合并在一起 - 任何具有相同_title_和_type_的实体通过创建其描述数组来合并。类似地,任何具有相同_source_和_target_的关系通过创建其描述数组来合并。
实体与关系汇总
现在我们有了一个实体和关系图,每个实体和关系都有一个描述列表,我们可以将这些列表汇总为每个实体和关系的单一描述。这是通过要求LLM提供一个简短摘要来实现的,该摘要捕获每个描述中的所有不同信息。这使我们所有的实体和关系都有一个简洁的描述。
声明提取(可选)
最后,作为一个独立的工作流,我们从源TextUnits中提取声明。这些声明代表具有评估状态和时间界限的正面事实陈述。这些被导出为一个称为Covariates的主要工件。
注意:声明提取是_可选的_,默认情况下关闭。这是因为声明提取通常需要提示调整才能有用。
阶段3:图增强
现在我们有了一个可用的实体和关系图,我们想了解它们的社区结构。这些为我们提供了理解图拓扑结构的明确方法。
---
title: 图增强
---
flowchart LR
cd[Leiden层次社区检测] --> ag[图表]
社区检测
在此步骤中,我们使用层次Leiden算法生成实体社区的层次结构。此方法将对我们的图应用递归社区聚类,直到达到社区大小阈值。这将使我们能够理解图的社区结构,并提供在不同粒度级别上导航和汇总图的方法。
图表
一旦我们的图增强步骤完成,最终的Entities、Relationships和Communities表将被导出。
阶段4:社区汇总
---
title: 社区汇总
---
flowchart LR
sc[生成社区报告] --> ss[汇总社区报告] --> co[社区报告表]
此时,我们有了一个功能性的实体和关系图以及实体的社区层次结构。
现在我们希望在社区数据的基础上为每个社区生成报告。这使我们在图的多个粒度点上对图有高层次的理解。例如,如果社区A是顶级社区,我们将获得关于整个图的报告。如果社区是较低级别的,我们将获得关于本地集群的报告。
生成社区报告
在此步骤中,我们使用LLM生成每个社区的摘要。这将使我们能够理解每个社区中包含的不同信息,并提供从高层次或低层次角度对图的范围理解。这些报告包含执行概述,并引用社区子结构中的关键实体、关系和声明。
汇总社区报告
在此步骤中,每个_社区报告_随后通过LLM进行汇总,以便简写使用。
社区报告表
此时,执行一些簿记工作,我们导出Community Reports表。
阶段5:文档处理
在此工作流阶段,我们为知识模型创建_Documents_表。
---
title: 文档处理
---
flowchart LR
aug[增强] --> dp[链接到TextUnits] --> dg[文档表]
列增强(仅限CSV)
如果工作流操作的是CSV数据,您可以配置工作流以向Documents输出添加额外字段。这些字段应存在于传入的CSV表中。有关配置此功能的详细信息,请参阅配置文档。
链接到TextUnits
在此步骤中,我们将每个文档链接到第一阶段创建的文本单元。这使我们能够理解哪些文档与哪些文本单元相关,反之亦然。
文档表
此时,我们可以将Documents表导出到知识模型中。
阶段6:网络可视化(可选)
在此工作流阶段,我们执行一些步骤来支持在我们的现有图中对高维向量空间进行网络可视化。此时有两个逻辑图在起作用:_实体-关系_图和_文档_图。
---
title: 网络可视化工作流
---
flowchart LR
ag[图表] --> ge[Node2Vec图嵌入] --> ne[Umap实体] --> ng[实体表]
图嵌入
在此步骤中,我们使用Node2Vec算法生成图的向量表示。这将使我们能够理解图的隐式结构,并在查询阶段提供额外的向量空间来搜索相关概念。
维度缩减
对于每个逻辑图,我们执行UMAP维度缩减以生成图的2D表示。这将使我们能够在2D空间中可视化图,并理解图中节点之间的关系。UMAP嵌入被缩减为x/y坐标的两个维度。
阶段7:文本嵌入
对于所有需要下游向量搜索的工件,我们生成文本嵌入作为最后一步。这些嵌入直接写入配置的向量存储。默认情况下,我们嵌入实体描述、文本单元文本和社区报告文本。
---
title: 文本嵌入工作流
---
flowchart LR
textUnits[文本单元] --> text_embed[文本嵌入]
graph_outputs[图表] --> description_embed[描述嵌入]
community_report_outputs[社区报告] --> content_embed[内容嵌入]
`
`