温馨提示
本分享为系列知识分享,预期分为四节:
- GraphRAG是什么
- GraphRAG图谱构建详细步骤
- GraphRAG图谱查询详细步骤
- 微软GraphRAG 代码实战
本分享为第二小节 GraphRAG图谱构建详细步骤 , 大家读完感兴趣可订阅专栏,掌握GraphRAG的技术核心与实战指南~。如果大家对于GraphRAG框架核心思想还不理解的,可以看系列文章第一篇准确率飙升!Graph RAG如何利用知识图谱提升RAG答案质量(一)------GraphRAG是什么?
前言
上篇分享我们已经了解了GraphRAG的核心思想,本篇分享我们一起来学习GraphRAG知识图谱构建的详细步骤。有读者可能会问:"我只要会用GraphRAG就可以了,为什么还要花费大量时间学习GraphRAG的详细步骤呢",主要有如下两点原因:
- 只有了解GraphRAG的详细步骤,我们才能在GraphRAG项目安装部署和使用过程中更加合理的设置相关参数(GraphRAG项目有一定门槛)。
- 遇到目前通用GraphRAG框架无法满足工作需求的情况,往往需要更加进阶的自己手动搭建GraphRAG,这就需要你掌握GraphRAG的详细流程了。
基于以上两点重要原因,大家就赶紧来看看文本被GraphRAG构建为知识图谱的详细步骤吧!
一、GraphRAG整体流程介绍
GraphRAG 利用大模型将原始文本数据转换为知识图谱来满足跨上下文检索的需求。知识图谱将信息表示为实体和关系互连的网络。与简单的文本片段相比,提供更全面的视角。这种结构化表示使 GraphRAG 能够擅长回答需要推理和连接不同信息的复杂问题。
GraphRAG 主要涉及两个主要阶段:知识图谱构建 和索引查询。本期分享我们具体讲述GraphRAG知识图谱构建的完整流程。文本输入GraphRAG后被分为可管理的文本单元,然后大模型从这些文本单元中提取实体、关系和声明,形成知识图谱。具体的流程如下图所示:

详细来说GraphRAG知识图谱构建可分为如下流程执行:
-
文本切分(Text Unit Splitting):
- GraphRAG需要处理一大篇文档或语料库,首先它会将这些文档切分为Text Units (文本单元),这些Text Units是输入文档的切片,通常由段落、句子或固定长度文本块切分而来。
- 切分为了便于对文本内容进行分析,尤其是当需要进行实体识别和关系抽取时能准确关联到文档上下文。
-
实体识别 (Entity Extraction):
- 在文本切分后,GraphRAG会使用大模型对每个Text Unit进行处理,提取其中的实体,这些实体通常是指文档中出现的人物、地点、组织、概念等信息。
- 实体识别的目的是构建实体表,将所有实体提取出来后并为后续的关系挖掘和查询做准备。
-
关系挖掘(Relation Extraction):
- 关系挖掘是从文本中识别出实体之间的关系,例如:谁与谁有关联、某个实体与另一个实体之间的关系是"属于"、"合作"、"对立"等。
- 通过关系抽取,GraphRAG可以构建关系表 和实体关系表,这两个表将有助于后续的查询引擎理解和推理。
-
文本嵌入 (Text Embedding)
- 在识别了文本中的实体和关系后,GraphRAG会利用词嵌入Embedding模型将文本和实体表示为向量。这些向量不仅包括了文本的语义信息,还能为后续的检索和查询提供高效表示。
- 这些嵌入向量将保存在向量数据库中,为查询时提供快速的相似度搜索。
-
构建社区和层级结构(Communityand Hierarchical Clustering)
- 通过使用 图谱聚类算法,GraphRAG 会将不同的实体和关系分组,形成多个社区(Community)。这些社区是根据实体之间的相似度或关系的密切程度进行划分的。
- 通过分组GraphRAG会构建社区表, 更好地理解不同知识领域的结构,为查询时提供更具层次性的上下文信息。
大家如果具备知识图谱经验会快速理解以上步骤是标准化的知识图谱处理流程。如果大家不了解可能一头雾水发出疑问:这些流程都是干啥用的呢?不用担心,下面我将通过一个实例带你从0到1细致了解这些流程的执行过程。
二、实战案例
本篇分享通过实战案例详细说明知识图谱构建的各个步骤,案例文本如下:
《大数据时代》是一本由维克托·迈尔-舍恩伯格与肯尼斯·库克耶合著的书籍,讨论了如何在海量数据中挖掘出有价值的信息。这本书深入探讨了数据科学的应用,并阐述了数据分析和预测在各行各业中的影响力。在书中,作者举了许多实际例子,说明大数据如何改变我们的生活,甚至如何预测未来的趋势。
如果我们将该文本输入GraphRAG并构建一个简单的知识图谱,每一步的流程会是什么样的?
2.1 文本切分
假设切分的标准是按50个token(50个词语)进行切分,上述文本经过切分后的结果包含三个文本单元:
- 文本单元1: 《大数据时代》是一本由维克托·迈尔-舍恩伯格与肯尼斯·库克耶合著的书籍,讨论了如何在海量数据中挖掘出有价值的信息。
- 文本单元2: 这本书深入探讨了数据科学的应用,并阐述了数据分析和预测在各行各业中的影响力。
- 文本单元3: 在书中,作者举了许多实际例子,说明大数据如何改变我们的生活甚至如何预测未来的趋势。
以上三个文本单元会被记录在文本块表中,内容如下:
id | human_readable_id | text | n_tokens | document_ids |
---|---|---|---|---|
t1 | text_unit_1 | 《大数据时代》是一本由维克托·迈尔-舍恩伯格与肯尼斯·库克耶合著的书籍,讨论了如何在海量数据中挖掘出有价值的信息。 | 50 | doc_1 |
t2 | text_unit_2 | 这本书深入探讨了数据科学的应用,并阐述了数据分析和预测在各行各业中的影响力。 | 50 | doc_1 |
t3 | text_unit_3 | 在书中,作者举了许多实际例子,说明大数据如何改变我们的生活,甚至如何预测未来的趋势。 | 50 | doc_1 |
表中各列id
和human_readable_id
表示文本块编号,text
表示文本块对应的文本,n_tokens
表示每个文本块包含的token数目,document_ids
表示文本块节选自哪一文件。文本切分流程以图形式表示如下:

2.2 实体识别
段落切分后下一工作就是实体识别,我们先来认识什么是实体? 实体通常指文本中独立存在具有特定意义的对象,通常是一组特定名词,它们代表显示世界中的对象或概念,可以是人、地点、组织、事件、时间等。
知识图谱中每个实体都有其独特的标识和属性, 这些标识和属性帮助我们理解实体在特定领域中的作用和上下文。实体识别是图谱构建的重要步骤之一。实体在知识图谱中被标识为图中的点,不同的实体点通过边(实体间关系)相连构成知识图谱。
还是以我们上面的文本为例,我们从中提取实体并构建如下的实体信息表:
id | human_readable_id | title | type | description | text_unit_ids |
---|---|---|---|---|---|
e1 | 大数据时代 | 大数据时代 | 书籍 | 《大数据时代》是一本关于大数据应用的书籍,作者讨论了数据如何改变世界。 | [0, 1] |
e2 | 维克托·迈尔-舍恩伯格 | 维克托·迈尔-舍恩伯格 | 人物 | 维克托·迈尔-舍恩伯格是大数据领域的专家,他是《大数据时代》的合著者。 | [0, 1] |
e3 | 肯尼斯·库克耶 | 肯尼斯·库克耶 | 人物 | 肯尼斯·库克耶同样是大数据领域的专家,他是《大数据时代》的合著者之一。 | [0, 1] |
e4 | 数据科学 | 数据科学 | 事件 | 《大数据时代》讨论的核心议题,关于如何进行更有效的数据挖掘。 | [1] |
e5 | 数据分析 | 数据分析 | 事件 | 数据科学领域的某一种具体的实践方法,在大数据时代其价值被进一步放大。 | [1, 2] |
表中各列id
和human_readable_id
表示实体编号,title
表示实体名称,type
表示实体类别,description
表示实体的描述。text_unit_ids
表示实体出现在哪些文本块中,这样就把实体和文本块连接起来,所有这些连接关系在之后知识图谱的查询中都会用到。实体识别流程以图形式表示如下:

2.3 关系挖掘
知识图谱的构建过程中我们不但会记录实体内容,还要记录不同实体间的语义关系。这些关系可以是显式的,也可以是隐式的,通常的表现形式可以理解为"实体A和实体B之间的关系",通过挖掘这些关系,最终构建一个"实体-关系-实体"的三元组,这些三元组就是知识图谱的基本单元。我们把抽取实体及其对应关系的步骤叫做关系挖掘。
举个关系挖掘的例子,对语句"维克托·迈尔-舍恩伯格是《大数据时代》一书的作者"进行关系抽取后可以构建如下三元组:
makefile
实体A:维克托·迈尔-舍恩伯格(人)
实体B:《大数据时代》一书(书籍)
关系:"是....的作者"
仅仅识别出实体间的关系不够,知识图谱的构建还需要判断实体之间的关系"硬不硬"。那如何评价实体间连接关系的重要程度呢?这里简单介绍一些关于图的相关评判标准:
- 度数(Degree): 度数是一个节点(实体)在图中直接相连的边的数量,表示该实体在知识图谱中的连接性,度数越高说明该实体在图中越重要或越活跃。
- 等级(Level): 等级是指实体在知识图谱中的层次或深度,直观理解就是实体位置越在图谱的中心,说明实体层次越深,相关性越强。等级可以通过图的中心性算法(例如PageRank和近邻中心性算法)来衡量。
一个实体如果度数越高,等级越深说明这个实体最重要。
单纯介绍概念还是不好理解的,我们还是通过上面的文本来实际操作一下:
-
首先我们从上述文本中提取如下实体:
- 大数据时代(书籍)
- 维克托·迈尔-舍恩伯格(人名)
- 肯尼斯·库克耶(人名)
- 数据科学(学科领域)
- 数据分析(学科领域)
-
然后从文本中识别出实体之间的关系(以三元组表示)
- 维克托·迈尔-舍恩伯格 与 《大数据时代》 之间的关系:"是作者"
- 肯尼斯·库克耶 与 《大数据时代》 之间的关系:"是作者"
- 《大数据时代》 与 数据科学 之间的关系:"探讨"
- 《大数据时代》 与 数据分析 之间的关系:"阐述"
-
通过以上的实体和关系我们可以构建一个简单的关系图结构:
- 大数据时代<->维克托·迈尔-舍恩伯格(是作者)
- 大数据时代<->肯尼斯·库克耶(是作者)
- 大数据时代<->数据科学 (探讨)
- 大数据时代 <->数据分析(阐述)
-
计算不同实体的度数:
- 大数据时代:度数为 4(它与四个实体都有关系,分别是维克托·迈尔-舍恩伯格、肯尼斯·库克耶、数据科学和数据分析)
- 维克托·迈尔-舍恩伯格:度数为1(它只与《大数据时代》相关)
- 肯尼斯·库克耶:度数为1(它只与《大数据时代》相关)
- 数据科学:度数为1(它只与《大数据时代》相关)
- 数据分析:度数为1(它只与《大数据时代》相关)
-
计算不同实体的等级,这里我就不详细展开等级计算的算法(篇幅会很长且专业性较强),采取直观理解的方法:
- 大数据时代: 在这个简化的示例中,作为一个核心实体,它连接了所有其他实体因此它的等级值(Level)会较高,可以认为它是核心社区的成员,等级为1(核心层级)
- 维克托·迈尔-舍恩伯格、肯尼斯·库克耶、数据科学、数据分析:这些实体与"《大数据时代》"相连接,因此它们在图中的位置相对较边缘,等级值(Level)较低,可以认为它们属于外部社区,等级为 2(外层级)
执行完以上步骤之后我们可以创建一张关系表,表格内容如下:
id | human_readable_id | source | target | description | weight | combined_degree | text_unit_ids |
---|---|---|---|---|---|---|---|
1 | relation_1 | 维克托·迈尔-舍恩伯格 | 《大数据时代》 | 作者 | 0.9 | 1 | [0, 1] |
2 | relation_2 | 肯尼斯·库克耶 | 《大数据时代》 | 作者 | 0.7 | 1 | [1] |
3 | relation_3 | 《大数据时代》 | 数据科学 | 探讨 | 0.65 | 1 | [2] |
4 | relation_4 | 《大数据时代》 | 数据分析 | 阐述 | 0.65 | 1 | [2] |
表中各列id
和human_readable_id
表示关系编号,source
表示实体A,target
表示实体B,description
表示实体间关系的描述。weight
表示的是实体间关系的重要程度(我们没有详细说明weight的计算过程, 大家有疑问可私信),combined_degree
表示关系出现次数,text_unit_ids
表示关系出现的文本块。
现在有了实体表 ,有了关系表 ,我们还需要创建一个合二为一的实体关系表:
id | human_readable_id | title | community | level | degree | x | y |
---|---|---|---|---|---|---|---|
1 | "entity_1" | "大数据时代" | 1 | 1 | 4 | 0.1 | 0.5 |
2 | "entity_2" | "维克托·迈尔-舍恩伯格" | 0 | 2 | 1 | 0.4 | 0.6 |
3 | "entity_3" | "肯尼斯·库克耶" | 0 | 2 | 1 | 0.3 | 0.7 |
4 | "entity_4" | "数据科学" | 0 | 2 | 1 | 0.6 | 0.4 |
5 | "entity_5" | "数据分析" | 0 | 2 | 1 | 0.2 | 0.2 |
相信大家可以快速理解表格中各字段,这里主要说明两个字段:
- community字段: 我们基于每个实体的degree和level特性对实体对象聚类(相似特征分为一类),上述表格 大数据时代 level是1, degree是4 而其它实体degree是1,level是2, 所以把大数据时代看成是社区1,其它看成是社区2。(社区聚类是一个非常复杂的过程,这里只是简单说明),那么社区有什么用呢,我们继续看下节。
- x,y 表示知识图谱绘制过程中点的坐标,是可以随意设置的大家不用关注。
关系挖掘流程以图形式表示如下:

2.4 社区报告构建
根据社区聚类算法的community字段,我们把实体划分到两个社区:
- 社区1(核心社区): 包括大数据时代
- 社区2(外围社区): 包括 维克托·迈尔-舍恩伯格、肯尼斯·库克耶、数据科学, 数据分析
GraphRAG会基于每个社区的特点生成社区报告,每个社区报告描述该社区的核心内容、关联的实体、关系以及社区的重要性等信息。针对以上数据GraphRAG会生成如下两个报告:
核心社区报告(community 1):
- 社区lD: community
- level: 1(核心社区)
- title: 大数据时代的影响
- summary: 社区围绕《大数据时代》一书展开,书中探讨了数据科学、数据分析的应用,以及它们如何在各行各业产生深远影响。社区中的核心实体包括《大数据时代》,它在知识图谱中扮演着中心角色。
- full_content: 本书通过多个实际案例,分析了大数据的应用场景,重点讲解了如何通过数据预测未来趋势。书中的内容涉及各个领域的应用,尤其是数据科学和数据分析如何推动各行各业的变革。
- rank: 1(该社区在整个知识图谱中的中心位置)
- rank_explanation: 该社区的核心实体是《大数据时代》,它与所有其他实体都有紧密关系,且覆盖了多个领域,重要性极高。
- findings: 该社区显示了大数据与数据科学、数据分析之间的深刻联系,尤其是在未来趋势预测方面的广泛应用。
- full content json: 以JSON格式存储书中的详细分析内容
- period: 2025-06-21(报告生成时间)
- size: 4(涉及的实体数量)
外围社区报告(community 2):
- 社区ID: community_2
- level: 2(外围社区)
- title: 《大数据时代》背后的专家与理论
- summary: 本社区围绕《大数据时代》书籍的作者和相关学科展开,涉及人物维克托·迈尔-舍恩伯格、肯尼斯·库克耶,以及学科领域"数据科学"和"数据分析"这些实体与核心社区《大数据时代》有着紧密的关系,但它们本身在知识图谱中的地位较为外围。
- full content: 社区中包括了书籍的两位作者维克托·迈尔-舍恩伯格和肯尼斯·库克耶,他们在数据科学和数据分析领域有着深远影响。此外,数据科学和数据分析作为学科,也在本社区中占据重要位置。
- rank: 2(该社区在整个知识图谱中的外围位置)
- rank_explanation: 该社区的实体相对来说是《大数据时代》的支持性内容,它们不直接构成图谱的核心,但在提供背景和理论支持方面仍具有重要价值。findings:该社区揭示了《大数据时代》书籍的学术背景,讲解了作者和学科如何影响现代数据科学的发展。
- full content json: 以JSON格式存储该社区中的详细内容和分析。
- period: 2024-11-27(报告生成时间)
- size: 4(涉及的实体数量)
本例中的社区报告其实就是从两个方面出发:一方面是围绕大数据时代这本书的核心内容进行正面讨论,另一方面是围绕大数据时代这本书的作者、关联关系进行侧面讨论。社区报告很好的模拟了人类分析文档的角度,是GraphRAG的创新步骤之一。
社区报告也会形成一张社区报告表:
id | human_readable_id | community | level | title | summary | full_content |
---|---|---|---|---|---|---|
community_1 | 0 | 1 | 1 | 大数据时代的应用及影响 | 社区围绕《大数据时代》一书展开,探讨了数据科学和数据分析的应用及其对各行各业的影响。核心实体是《大数据时代》。 | 本书通过多个实际案例分析了大数据的应用场景,重点讲解了数据如何预测未来趋势,涉及各行业的应用。 |
community_2 | 1 | 2 | 2 | 《大数据时代》的作者与学科背景 | 本社区围绕《大数据时代》的两位作者维克托·迈尔-舍恩伯格、肯尼斯·库克耶以及学科数据科学、数据分析,分析了它们对《大数据时代》的影响。 | 社区包含了书籍的两位作者和学科领域的数据科学、数据分析,探讨了这些领域如何支持《大数据时代》的核心观点。 |
社区报告流程以图形式表示如下:

2.5 知识图谱构建
我们通过以上创建的文本块表 、实体表 、关系表 、实体关系表 和社区报告表,可以画出完整的实体、关系、社区的知识图谱。知识图谱构建完成后,就可以基于它进行检索和查询,从多角度分析我们的文本,大家看到这儿是不是已经理解为什么知识图谱方法要比直接从文本块获取信息全面的多。
我们把上述所有的过程合起来绘制下图,大家可以从这张图中看出知识图谱构建的每一步操作和相应表的构造过程:

结合上图我再来梳理一遍整个知识图谱的构建流程加深印象:
- 首先将示例文本进行文本切分变成短的文本块
- 从短的文本中提取相应的实体
- 围绕原文本进行实体间关系挖掘
- 根据实体和关系构建实体关系图,在实体关系图上进行聚类
- 根据聚类结果创建社区报告
做完以上所有步骤后,GraphRAG就构建好一个完整的知识图谱了。
三、总结
本篇分享详细讲述了GraphRA通过文本切分 、实体识别 、关系挖掘 、社区报告构建生成知识图谱的全过程。同时本篇分享通过列举《大数据时代》图书文本的实例,向大家详细展示了GraphRAG知识图谱生成流程每一步骤的详细细节,也让大家直观感受到知识图谱方法相比简单文本块对照方法可以更全面的从各个角度对文本进行理解分析。
知识图谱构建是GraphRAG的核心优势,本篇笔者花费大量笔墨撰写这一部分工作,建议大家反复阅读,只有真正理解知识图谱构建的全流程才能更快速上手GraphRAG框架使用的相关知识。
知识图谱构建好之后,接下来就是要依据知识图谱对我们提问问题进行检索问答 了,那这一流程又是怎样的呢?我们下一篇分享讲。感兴趣大家可关注笔者掘金账号,更可关注笔者的同名微信公众号:大模型真好玩, 免费获得笔者工作实践中的各种资料~