参考资料
一 RAG
- 大模型挂载知识库核心技术 RAG(Retrieval Augmentation Generation)技术也被称作知识检索增强技术,旨在为大模型灵活的提供外部知Retrieval识库支持,以拓展大模型知识边界。
- 对于大模型来说,知识直接代表其功能水平,合理的挂载外部知识库,不仅能进行更大范围选题的问答同时HF Dataset也有助于大模型构建Agent能力增强。
1.1 RAG技术核心步骤与通用优化方法
- 文档分割:根据关键字符切分或根据字符串长度切分、以及滑动窗口切分等;围绕不同类型文本,可选不同切分策略;文本数据清洗占绝大多数时间,也是本环节提效的关键。
- 文档匹配与输入:根据Embedding进行文本词向量化处理,并根据余弦相似度判断和问题相关的文档;选择更好的Embedding模型、以及匹配后文本增强、重拍等,是优化的关键。
- 模型问答:模灵活判断文档段落内容是否可用、并根据文档进行回答;真实性检验、后处理、用户意图判断是本环节优化的关键。
1.2 传统RAG无法克服的问题
- 检索精度随着文本长度增加而降低
- 匹配度较低的问题无法进行精准问答
- 围绕长文本的综合性问题无法进行有效回答;
- 跨文本段实体信息无法回答
二 GraphRAG
2.1 GraphRAG简介
- GraphRAG(Graph Retrieval-Augmented Generation)是一种结合图数据库和生成模型的技术,旨在通过构建和查询知识图谱来增强自然语言生成(NLG)的能力。它通过利用知识图谱的结构化信息来为生成模型提供更精确和背景丰富的上下文,从而改进生成模型的表现,尤其在复杂问题解答和文本生成方面。
- GraphRAG的核心优势
- GraphRAG不仅回答了问题的直接内容,还能从上下文中提取相关信息进行补充,提升回答的全面性匹配度较低的问题无法进行精准问答。
- GraphRAG在这方面能够提供更多的上下文支持,帮助用户理解回答的背景。
- GraphRAG在多样性上的表现优于传统的RAG,能够提供更多元的视角,这对于复杂问题尤为重要。
- GraphRAG检索特点
- 高精度高消耗。
- 受模型底层性能影响较大。
- 灵活度较高,受知识图谱构建策略影响较大。
2.2 GraphRAG原理
- 在GraphRAG的实现中,首先会进行索引构建阶段,其中包含多个步骤:从原始文本中提取实体和关系、进行文本切分、生成实体的嵌入(embedding),并使用图机器学习算法进行聚类,进而构建一个基于实体、关系和社区报告的知识图谱。具体来说,GraphRAG通过分割文本为多个单元(如句子或段落),利用大语言模型(如GPT)进行实体识别和关系挖掘,并为每个实体分配嵌入向量来描述它们的语义信息。接着,GraphRAG通过计算实体之间的关系,填充关系表,并生成关于实体的社区报告来总结不同实体之间的关联与上下文。
- 完成知识图谱构建后,GraphRAG的查询引擎阶段才得以启动。用户可以通过自然语言查询来请求图谱中的信息,GraphRAG通过搜索相关文本单元、实体、关系以及社区报告来提供高度相关的上下文信息。查询引擎不仅能基于当前输入的查询返回相关实体和信息,还能进一步通过生成模型生成多段文本回答,从而提供对复杂问题的深度理解。
- GraphRAG的创新在于它通过结合传统的图数据库查询和强大的生成模型,能够在多个领域中提供强大的推理能力,尤其是在需要从大规模文本数据中提取知识的应用中,表现出色。通过灵活的查询和语义嵌入,GraphRAG使得自然语言处理(NLP)不再局限于简单的检索,而是实现了更具推理能力的对话和生成。
2.3 GraphRAG整体流程
- GraphRAG通过利用大模型从原始文本数据中提取知识图谱来满足跨上下文检索的需求。该知识图将信息表示为互连实体和关系的网络,与简单的文本片段相比,提供了更丰富的数据表示。这种结构化表示使 GraphRAG 能够擅长回答需要推理和连接不同信息的复杂问题。
- 具体来看,GraphRAG 定义了一个标准化数据模型,整体框架由几个关键组件组成,分别用于表示文档、TextUnit、实体、关系和社区报告等实体。GraphRAG 过程也涉及两个主要阶段:索引和查询。
在索引(Indexing)过程中,输入的文本被分为可管理的块,称为TextUnits 。然后大模型从这些文本单元中提取实体、关系和声明,形成知识图。完整的Indexing流程如下图所示:
三 GraphRAG 索引阶段执行流程
3.1 GraphRAG索引阶段执行抽象流程
- GraphRAG 的 索引阶段 是一个 多步骤 的过程,基本流程是:
- 文本切分(Text Units)
- 实体识别(Entity Extraction)
- 关系挖掘(Relationship Extraction)
- 文本嵌入(Text Embedding)
- 社区划分和层级结构(Clustering)
- 生成索引文件(Indexing)
整个过程的目的是将文档中的原始文本转化为可以进行检索和推理的结构化知识图谱。而 实体识别 和 关系挖掘 通常是在文本切分之后进行的,因为需要先确保文本已经切分成足够小的单元才能进行更精细的分析和抽取。
[原始文本]
↓
[文本切分] → [Text Units]
↓
[实体识别] → [Entities]
↓
[关系挖掘] → [Relationships]
↓
[文本嵌入] → [Vector Embeddings]
↓
[社区聚类] → [Communities]
↓
[索引文件] → [Parquet Files]
↓
[结构化知识图谱]
- 文本切分(Text Unit Splitting):GraphRAG 需要处理的是一大篇文档或语料库。首先,它会将这些文档切分为 Text Units(文本单元),这些 Text Units 是对输入文档的细分,通常是按照段落、句子或固定长度的文本块来进行切分。
- 这样做的目的是为了便于对文本内容进行分析,尤其是当需要进行 实体识别 和 关系抽取 时,能够精准地关联到文档中的具体上下文。
- 实体识别(Entity Extraction):在文本切分之后,GraphRAG 会使用 大模型(如 OpenAI GPT 或其他 LLM) 对每个 Text Unit 进行处理,提取其中的 实体。这些实体通常是指文档中出现的人物、地点、组织、概念等信息。
- 实体识别的目的是构建 实体图谱(Entity Graph),将所有实体提取出来并为后续的关系挖掘和查询做准备。
- 关系挖掘(Relationship Extraction):关系挖掘是从文本中识别出实体之间的 关系,如:实体之间的关联关系、某个实体与另一个实体之间的关系是“属于”、“合作”、“对立”等。
- 通过这种关系提取,GraphRAG 可以构建 关系图谱(Relationship Graph),这些关系将有助于后续的 查询引擎 理解和推理。
- 文本嵌入(Text Embedding):在识别了文本中的实体和关系之后,GraphRAG 会利用 嵌入模型(如 OpenAI 的 Embedding 模型)将文本和实体表示为向量(vectors)。这些向量不仅包括了文本的语义信息,还能为后续的检索和查询提供高效的表示。
- 这些嵌入向量将存储在 **向量数据库(如 LanceDB)**中,为查询时提供快速的相似度搜索。
- 构建社区和层级结构(Community and Hierarchical Clustering):通过使用 图谱聚类算法(如 Leiden 算法),GraphRAG 会将不同的实体和关系分组,形成多个 社区(Community)。这些社区是根据实体之间的相似度或关系的密切程度进行划分的。
- 分组有助于GraphRAG 更好地理解不同知识领域的结构,为查询时提供更具层次性的上下文信息。
- 生成索引文件(Indexing):完成上述步骤后,所有的 实体、关系、社区报告、文本单元等信息都会存储在磁盘上的 Parquet 文件中。
- 索引文件实际上就是构建好的 知识图谱,包括了文本内容、文本中涉及的实体和关系的结构化表示,并且这些文件是为后续的查询引擎和推理过程提供基础。
3.2 GraphRAG索引阶段执行具体流程
Step 0. 原始文本
- 原始文本:《大数据时代》是一本由维克托·迈尔-舍恩伯格与肯尼斯·库克耶合著的书籍,讨论了如何在海量数据中挖掘出有价值的信息。这本书深入探讨了数据科学的应用,并阐述了数据分析和预测在各行各业中的影响力。在书中,作者举了许多实际例子,说明大数据如何改变我们的生活,甚至如何预测未来的趋势。
Step 1. 文本切分
假设的切分结果(按50个token分割)
文本单元1:
- text:《大数据时代》是一本由维克托·迈尔-舍恩伯格与肯尼斯·库克耶合著的书籍,讨论了如何在海量数据中挖掘出有价值的信息。
文本单元2:
- text:这本书深入探讨了数据科学的应用,并阐述了数据分析和预测在各行各业中的影响力。
文本单元3:
- text:在书中,作者举了许多实际例子,说明大数据如何改变我们的生活,甚至如何预测未来的趋势。
然后即可将上述切分结果记录在某张表内,例如我们将其命名为TEXT_UNIT_TABLE
,则表内容如下:
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 |
human_readable_id
:文本单元(Text Unit)的唯一可读标识符,用于在搜索结果或调试信息中直接引用原始文本片段。
Step2. 实体识别
- 在自然语言处理中的实体:实体(Entity)通常指的是文本中具有独立存在、能够被明确识别并且具有特定意义的对象。实体通常是指一些特定的名词,它们代表现实世界中的对象或概念,可以是人、地点、组织、事件、日期、物品、概念等。
- 在知识图谱中的实体:每个实体都有其独特的标识符和属性(例如,姓名、类型、描述等)。这些属性和关系帮助我们理解实体在特定领域中的作用和上下文。
- 在知识图谱中,实体是基础组成单元,它们通过关系(relationship)连接,构成一个图的结构。实体和关系是构建知识图谱的两个基本元素。实体之间的连接关系定义了图谱中的知识和数据。
- 实体识别的作用:实体识别(Entity Recognition)是指从文本中自动识别出这些重要的实体。在GraphRAG的索引阶段中,实体识别是构建知识图谱的第一步,目标是提取出文档中的核心实体,为后续的关系抽取、文本切分等操作打下基础。
- 假设有以下句子:"维克托·迈尔-舍恩伯格是《大数据时代》一书的作者,他是大数据领域的专家。"在这个句子中,实体包括:
- 维克托·迈尔-舍恩伯格(人名)
- 《大数据时代》(书名)
- 大数据领域(概念)
- 这些实体在知识图谱中将被标识为节点,并且可以与其他节点(如其他作者、书籍、领域等)通过关系(如“写书”,“属于领域”)连接,形成知识图谱中的一个网络结构。
- 实体识别的过程通常涉及:
- 命名实体识别(NER,Named Entity Recognition):这是一种自然语言处理(NLP)任务,用来识别文本中具有特定意义的实体,如人名、地点、日期等。
- 实体分类:在识别实体之后,还需要根据其属性对实体进行分类,例如将“维克托·迈尔-舍恩伯格”分类为“人名”,将“大数据”分类为“概念”。
- GraphRAG中的实体识别:在GraphRAG的索引过程中,实体识别是与文本切分和关系挖掘同时进行的。具体来说:
- 实体识别:GraphRAG使用大语言模型(如GPT)识别文本中的实体,并根据其类型为每个实体赋予一个唯一标识符。
- 实体嵌入:GraphRAG为每个实体生成语义嵌入,即一个高维向量,来描述该实体的语义。实体嵌入可以帮助模型理解实体在不同上下文中的意义和关系。
- 关系挖掘:在识别实体之后,GraphRAG还会识别实体之间的关系,例如“作者是”、“属于”等。这些关系构成了知识图谱中的边,实体则是图谱中的节点。
- 根据之前提供的原始文本,可以得到
ENTITY_EMBEDDING_TABLE
内容如下:
id | human_readable_id | title | type | description | text_unit_ids |
---|---|---|---|---|---|
e1 | 大数据时代 | 大数据时代 | 书籍 | 《大数据时代》是一本关于大数据应用的书籍,作者讨论了数据如何改变世界。 | [0, 1] |
e2 | 维克托·迈尔-舍恩伯格 | 维克托·迈尔-舍恩伯格 | 人物 | 维克托·迈尔-舍恩伯格是大数据领域的专家,他是《大数据时代》的合著者。 | [0, 1] |
e3 | 肯尼斯·库克耶 | 肯尼斯·库克耶 | 人物 | 肯尼斯·库克耶同样是大数据领域的专家,他是《大数据时代》的合著者之一。 | [0, 1] |
e4 | 数据科学 | 数据科学 | 事件 | 《大数据时代》讨论的核心议题,关于如何进行更有效的数据挖掘。 | [1] |
e5 | 数据分析 | 数据分析 | 事件 | 数据科学领域的某一种具体的实践方法,在大数据时代其价值被进一步放大。 | [1, 2] |
human_readable_id
:实体的语义化唯一标识,用于直观表示实体(如人物、组织)在知识图谱中的节点。text_unit_ids
:列出了每个实体在TEXT_UNIT_TABLE
中涉及的文本段。由于这两者实体都出现在示例文本的第0段和第1段中,因此都对应[0, 1]
。
- 创建一张名为
ENTITY_TABLE
的表,用于单独记录实体和关系。
id | human_readable_id | title | community | level | degree | x | y |
---|---|---|---|---|---|---|---|
1 | e1 | 大数据时代 | - | - | - | - | - |
2 | e2 | 维克托·迈尔-舍恩伯格 | - | - | - | - | - |
3 | e3 | 肯尼斯·库克耶 | - | - | - | - | - |
4 | e4 | 数据科学 | - | - | - | - | - |
5 | e5 | 数据分析 | - | - | - | - | - |
human_readable_id
: 人类可读的标识符,方便理解。level
: 假设目前所有实体的层级为-
,后续会根据聚类结果填充。degree
: 假设实体之间的初步关系较少,因此度数比较低。x, y
: 假设为虚拟的坐标,用于展示实体位置,后续可以使用图布局算法生成。
Step 3. 关系挖掘
- 关系挖掘(Relationship Extraction)是构建知识图谱过程中的一个关键环节,它旨在识别文本中不同实体之间的关系。关系挖掘的目的是将各个实体连接起来,形成一个有意义的图谱结构。在GraphRAG中,关系挖掘的过程涉及多种技术手段,包括自然语言处理(NLP)、机器学习、深度学习等方法。
- 关系挖掘的目标是从文本中提取出实体之间的语义关系。这些关系可以是显式的,也可以是隐式的,通常关系的形式是“实体A和实体B之间的关系”。通过挖掘这些关系,最终构建起一个实体-关系-实体的三元组(Triple),这是知识图谱的基本构成单元。
- 例如:“维克托·迈尔-舍恩伯格是《大数据时代》一书的作者。”
- 实体A:维克托·迈尔-舍恩伯格(人)
- 实体B:《大数据时代》一书(书籍)
- 关系:“是…的作者”
- 关系挖掘不仅要识别出实体A和实体B,还要准确地抽取出它们之间的语义关系“是…的作者”。这些关系将用于构建知识图谱中的边。示例文本中实体的关系挖掘过程,进一步计算实体的 level 和 degree 值。这两个指标通常用于描述实体在知识图谱中的重要性和连接度。它们的计算依赖于图中的实体和关系结构,通常通过图算法(如图中心性算法)来计算。这些指标可以帮助系统理解每个实体在知识图谱中的角色,从而优化查询和推理。
- 度数 (Degree):度数 (Degree) 是一个节点(实体)在图中直接相连的边的数量,表示该实体在知识图谱中的连接性。度数越高,说明该实体在图中越重要或越活跃。在知识图谱中,通常将度数作为节点的一个重要特征,表示该实体与其他实体之间的关系强度。
- 入度 (In-degree):指向该节点的边的数量。
- 出度 (Out-degree):从该节点发出的边的数量。
- 等级 (Level):等级 (Level) 是指实体在知识图谱中的层次或深度,通常反映了实体在图谱中的“核心性”或“重要性”。这可以通过图的中心性(如PageRank或近邻中心性)算法来计算,或者通过社区发现算法来得出。在GraphRAG中,level可能是指社区发现后实体所属的社区层级或级别,反映了实体的“权重”或在特定网络中的“影响力”。
- 社区检测:实体可以根据其在网络中的连接情况被划分到不同的社区中,通常来说,位于中心的节点会被认为是更为重要的。
- PageRank:类似于网页排名算法,节点的得分与其直接连接的节点的得分有关,重要节点会因为连接到其他重要节点而具有更高的得分。
原始文本的关系挖掘
- 实体识别:从文本中识别出以下实体:大数据时代(书籍)、维克托·迈尔-舍恩伯格(人名)、肯尼斯·库克耶(人名)、数据科学(学科领域)、数据分析(学科领域)。
- 关系抽取:从文本中识别出实体之间的关系(以三元组表示):
- 维克托·迈尔-舍恩伯格 与 《大数据时代》 之间的关系:“是作者”
- 肯尼斯·库克耶 与 《大数据时代》 之间的关系:“是作者”
- 《大数据时代》 与 数据科学 之间的关系:“探讨”
- 《大数据时代》 与 数据分析 之间的关系:“阐述”
- 构建关系图:根据识别出的关系,构建一个简单的图结构(节点表示实体,边表示它们之间的关系。):
- 大数据时代 <-> 维克托·迈尔-舍恩伯格 (是作者)
- 大数据时代 <-> 肯尼斯·库克耶 (是作者)
- 大数据时代 <-> 数据科学 (探讨)
- 大数据时代 <-> 数据分析 (阐述)
- 计算度数 (Degree):度数可以通过计算图中每个节点的边数来获得:
- 大数据时代:度数为 4(它与四个实体都有关系,分别是维克托·迈尔-舍恩伯格、肯尼斯·库克耶、数据科学和数据分析)
- 维克托·迈尔-舍恩伯格:度数为 1(它只与大数据时代代相关)
- 肯尼斯·库克耶:度数为 1(它只与大数据时代相关)
- 数据科学:度数为 1(它只与大数据时代代相关)
- 数据分析:度数为 1(它只与大数据时代代相关)
- 计算等级 (Level):为简化说明,假设“等级(Level)”是根据图中节点的度数和它们所属的社区来计算的。通过社区算法(例如Louvain算法、Girvan-Newman算法等),我们可以将节点划分到不同的社区,并为每个社区分配一个等级值。这里不涉及具体的图算法实现,但可以简化为以下推断:
- 大数据时代:作为一个核心实体,它连接了所有其他实体,因此它的等级值(Level)会较高,可以认为它是核心社区的成员,等级为 1(核心层级)。
- 维克托·迈尔-舍恩伯格、肯尼斯·库克耶、数据科学、数据分析:这些实体与“大数据时代”相连接,因此它们在图中的位置相对较边缘,等级值较低,可以认为它们属于外部社区,等级为 2(外层级)。
- 总结:基于以上计算过程,我们可以得到以下结果。
实体 | Degree | Level |
---|---|---|
大数据时代 | 4 | 1 |
维克托·迈尔-舍恩伯格 | 1 | 2 |
肯尼斯·库克耶 | 1 | 2 |
数据科学 | 1 | 2 |
数据分析 | 1 | 2 |
- 度数(Degree):表示一个实体的连接性。大数据时代作为核心实体,度数较高,而其他实体度数较低。
- 等级(Level):表示实体在图中的重要性或中心性,大数据时代由于连接了所有其他实体,等级较高,而其他实体处于外围,等级较低。
- 根据第三步中识别出的关系,创建
RELATIONSHIP_TABLE
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] |
weight
:表示实体之间关系的权值。
- 更新
ENTITY_TABLE
,将基于关系的统计结果填入实体表格中:
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 |
x,y
:是绘制知识图谱中的坐标,非重要数据。
Step 4. 创建社区报告
- 根据社区算法的结果,我们可以将实体划分到两个社区,并基于每个社区的特点生成社区报告。每个社区报告将描述该社区的核心内容、关联的实体、关系以及社区的重要性等信息。
- 社区报告的基本内容:
- 社区概述(Summary):总结社区的核心主题或共同特征。
- 核心实体(Entities):在该社区中,哪些实体是核心实体,即它们在该社区中的重要性较高。
- 重要关系(Relationships):该社区中的实体之间有哪些重要关系,关系的性质如何。
- 影响力与聚类分析(Influence and Clustering):社区内实体之间的相互影响和聚集情况。
- 社区排名与解释(Rank and Explanation):对社区中实体的排名,以及解释它们在社区中的位置或作用。
- 在示例中,有两个社区:
- 社区 1(核心社区):包括 大数据时代
- 社区 2(外围社区):包括 维克托·迈尔-舍恩伯格、肯尼斯·库克耶、数据科学、数据分析
- 创建社区报告:
id | human_readable_id | community | level | title | summary | full_content | rank | rank_explanation | findings | full_content_json | period | size |
---|---|---|---|---|---|---|---|---|---|---|---|---|
community_1 | 0 | 1 | 1 | 大数据时代的影响 | 社区围绕《大数据时代》一书展开,探讨了数据科学和数据分析的应用及其对各行各业的影响。核心实体是《大数据时代》。 | 本书通过多个实际案例分析了大数据的应用场景,重点讲解了数据如何预测未来趋势,涉及各行业的应用。 | 1 | 该社区的核心实体《大数据时代》具有极高的重要性,涉及领域广泛,中心地位明显。 | 社区展示了大数据与数据科学、数据分析之间的深刻联系,尤其是大数据如何改变未来趋势的预测。 | { “title”: “大数据时代的影响”, “content”:“本书通过多个实际案例分析了大数据的应用场景,重点讲解了数据如何预测未来趋势,涉及各行业的应用。” } | 2024-11-27 | 4 |
community_2 | 1 | 2 | 2 | 《大数据时代》背后的专家与理论 | 本社区围绕《大数据时代》的两位作者维克托·迈尔-舍恩伯格、肯尼斯·库克耶以及学科数据科学和数据分析展开。它们是本书的理论支持,位于外围位置。 | 社区包含了书籍的两位作者和学科领域数据科学、数据分析,分析了它们对《大数据时代》内容的支持和贡献。 | 2 | 该社区的实体位于外围,主要作为《大数据时代》的学术支持,贡献理论背景,重要性次于核心社区。 | 该社区揭示了数据科学和数据分析学科如何影响《大数据时代》一书的内容及其对现代数据科学发展的推动作用。 | { “title”: “《大数据时代》”, “content”:“社区包含了书籍的两位作者和学科领域数据科学、数据分析,分析了它们对《大数据时代》内容的支持和贡献。”} | 2024-11-27 | 4 |
- rank:该社区在整个知识图谱中的外围位置
- full_content_json:以JSON格式存储该社区中的详细内容和分析。
- period:报告生成时间)
- size:涉及的实体数量
四 GraphRAG 查询阶段执行流程
- 在GraphRAG的查询阶段,核心任务是基于构建好的知识图谱来检索相关信息并生成回答。查询阶段会利用之前在 索引阶段 构建的所有实体、关系和社区报告等信息,结合用户的查询请求,自动选择最相关的上下文,并通过大语言模型生成智能化的回答。
- GraphRAG的查询法整体分为局部查询和全局查询。局部查询分析根据相关实体、关系等内容进行整理回答;全局查询根据社区报告中的内容进行分析整理进行回答。
4.1 查询阶段的关键技术点
- 局部搜索(Local Search):通过局部搜索算法,GraphRAG从已有的知识图谱中选择与查询最相关的信息,形成查询上下文。
- 嵌入(Embeddings):对于文本单元、实体和关系,GraphRAG使用嵌入模型将它们转化为向量表示,从而计算相似度,选取最相关的内容。
- 大语言模型(LLM):基于查询上下文,使用LLM生成自然语言回答。
- 查询上下文构建的多样性:在不同的查询中,GraphRAG会根据具体的需求调整上下文的构建方式,例如调整文本单元和社区报告的比例,或者增加对历史对话的考虑。
4.2 查询阶段的具体执行流程
- 用户输入解析(Query Parsing and Understanding)
- 输入:用户通过自然语言提出查询请求,如:“告诉我大数据时代的背景是什么?”
- 处理:系统首先对查询进行自然语言理解(NLU),识别关键实体、意图和语义结构。
- 目的:为后续的图检索提供语义层面的引导,帮助定位知识图谱中的相关实体与关系。
📌 示例:识别“大数据时代”、“背景”等关键词,判断用户可能需要的是背景介绍、定义、历史发展等信息。
- 基于图的上下文构建(Graph-based Context Building)
- 这一阶段是 GraphRAG 的核心特色,其目标是利用知识图谱结构,从多个维度构建上下文,包括文本、实体、关系、社区报告等。
它包含以下子步骤:
a. 实体与关系检索(Entity & Relationship Retrieval)
- 从知识图谱中筛选出与查询关键词匹配或语义相似的实体(如“大数据”、“维克托·迈尔-舍恩伯格”)。
- 同时提取这些实体之间的关系(如“撰写”、“引用”、“影响”等)。
b. 社区报告检索(Community Report Retrieval)
- 如果图谱中存在社区结构(多个实体聚集形成的语义单元),则会检索相关的社区报告,用于增强上下文的语义完整性。
c. 文本单元检索(Text Unit Retrieval)
- 根据实体和关系,从原始文档中检索出与之对应的文本单元(即文档中的段落或句子片段)。
📌 关键机制:所有检索结果会根据预设参数(如最大实体数、文本单元占比、相似度阈值)进行排序与筛选,保留最相关的内容。
- 上下文融合与向量化(Context Fusion & Embedding)
- 为了后续的语义匹配和模型生成,需要将检索到的文本、实体、关系等信息进行统一处理:
a. 文本切分与嵌入(Text Splitting and Embedding)
- 将文本单元按一定长度(如每50个 token)进行切分,以适应模型输入。
- 使用预训练的 embedding 模型(如 OpenAI 的 text-embedding-ada-002)将每个单元转换为向量。
b. 实体与关系的嵌入表示
- 对实体名称和描述进行编码,生成其语义向量。
- 对关系类型和上下文描述也做类似处理,以便与文本进行语义匹配。
📌 作用:使得后续的局部搜索和语义匹配更加高效、准确。
- 局部上下文构建与信息排序(Local Context Construction & Relevance Ranking)
- 在这个阶段,GraphRAG 构建一个“局部上下文窗口”(Local Context Window),用于驱动语言模型生成回答。
a. 构建上下文容器(Context Container)
- 使用
LocalSearchMixedContext
等工具类,将以下内容整合进上下文:- 查询相关的文本单元;
- 相关实体及其描述;
- 实体之间的关系;
- 社区报告摘要。
b. 信息排序与过滤
- 使用语义匹配(如向量相似度)和图结构信息(如节点中心性、社区权重)对内容进行排序。
- 保留 Top-K 条最相关的信息,减少噪声干扰。
📌 目标:为语言模型提供一个结构化、语义丰富的上下文窗口,提升生成质量。
- 大语言模型生成与结果返回(Answer Generation & Response Delivery)
a. 模型生成回答(LLM-based Answer Generation)
- 使用大语言模型(如 GPT、Claude 等)结合构建好的上下文生成自然语言的回答。
- 模型根据问题的复杂度,可能生成:
- 简答(如实体定义、事实陈述);
- 分段详述(如背景、影响、发展趋势);
- 列表或结构化输出(如时间线、要点总结)等。
b. 结果返回(Response Delivery)
- 将生成的回答返回给用户。
- 若启用了调试参数,如
return_candidate_context=True
,则一并返回所有候选实体、关系、文本单元,便于用户验证和进一步分析。
4.3 GraphRAG 查询流程的核心思想
GraphRAG 的查询流程本质上是图驱动的语义搜索 + 上下文增强生成的结合:
- 图结构为先:利用知识图谱的结构化信息,增强检索的语义精度;
- 上下文为基:通过多粒度信息(文本、实体、关系、社区)构建丰富上下文;
- 语义为辅:使用 embedding 和语言模型,实现语义匹配与自然语言生成;
- 可控为要:通过参数控制上下文规模、检索深度,提升系统可控性与可解释性。