来源:互联网 更新时间:2026-08-25 14:32
严格来说,微软的 GraphRAG 实际上是 Vector RAG 和 Graph RAG 的结合体,也有人称之为 Hybrid RAG。之前贝莱德资本确实也写过一篇相关的论文,但内容比较浅显,方法也流于表面,有兴致的读者可以自行查阅,这里就不展开讨论了。
那么,微软的 GraphRAG 到底是怎么实现的呢?我们接着往下看。

整个流程图比较长,我们拆解来看。一共分成6个步骤,其实第6步是可选的,可以不执行。

Phase 1 的任务,是将输入的文档转换为 TextUnits(文本单元)。这些文本单元是后续图谱抽取技术的基础文本块,同时也是知识项的来源引用。
具体操作分为几步:首先,文档会被分割成较小的文本块,默认大小约300个token。这个块大小是可以配置的——块太大,输出质量可能下降,因为无法提供足够精细的参考文本;但反过来,块大一些也能提升处理速度。
接着,每个文本块会转换成嵌入表示(embedding),这些向量会捕捉文本块的语义信息,为后续的图谱生成做准备。
最后一步是映射:系统会默认将文本块与文档边界对齐,一个文档可以被拆分成多个 TextUnits,每个 TextUnit 与其源文档形成一对多的关系。在某些特殊情况下,比如短文档,可能需要合并多个文档来构成一个有意义的分析单元。
核心思路其实很简单:通过分块和嵌入的组合,创建基础数据单元,供后续的实体和关系提取使用。这些 TextUnits 是整个流程中非常基础的单位,在接下来的各个阶段都会反复出现。分块大小和策略都可以根据实际需求灵活调整,确保系统能适应不同类型的文档和任务。
生成的 TextUnits 传递到下一阶段后,会进入更深层次的实体和关系提取流程,并通过嵌入模型转化为向量表示,以捕捉语义信息。
TextUnit 作为整个流程中的基本处理单元,后续所有实体和关系提取、知识图谱的生成,都离不开它以及它对应的嵌入信息。
进入第二阶段,系统会对每个 TextUnit 进行分析,提取出图谱的基本元素:
具体来看,首先是实体和关系抽取,系统会处理每个 TextUnit,从原始文本中提取出实体和关系。输出结果中,每个 TextUnit 的子图包含一个实体列表(带有名称、类型和描述)和关系列表(带有源、目标和描述)。系统会自动将名称和类型相同的实体合并,也会将源和目标相同的关系合并。
抽取完成后,系统会对每个实体和关系进行总结,生成简洁的描述。这个总结过程是通过大语言模型(LLM)实现的,它能够从原始描述中提炼出最重要的信息,确保图谱保持简洁且高效。
此外,还有一个可选的步骤——实体消解,但目前不建议打开。它的目标是解决那些代表同一个真实世界实体但名称不同的情况,比如 "IBM" 和 "International Business Machines" 可能指的是同一家公司。当前的实现方式比较“破坏性”,未来可能会通过在实体变体之间创建边来指示它们是同一实体的不同版本,从而实现非破坏性的消解。
与此同时,系统还会作为独立工作流,从 TextUnit 中提取声明。这些声明代表了带有评估状态和时间限制的正向事实陈述,抽取出的声明被称为
这里的关键点在于:实体和关系的提取与总结是核心任务,通过合并相同类型的实体和关系,确保图谱的简洁与有效。实体消解虽未默认启用,但对保证实体一致性非常重要。而声明的提取则独立于实体和关系的处理,提供了关于文本中事实陈述的结构化信息,在后续分析中非常有用。
很多人不理解声明或者说这个“协变量”到底是什么。这里用一个生动的类比来解释:
协变量的功能非常明确:它能够增强事实性,为图谱中的实体和关系提供额外的上下文;引入动态性,使知识图谱从静态信息扩展到动态信息,描述事实随时间的变化;丰富推理信息,影响系统对某些查询的推理过程;解释因果关系,比如特定市场条件可能解释了公司业绩变化;提供额外上下文,使图谱信息更加完整;同时还能增强模型推理能力,帮助模型更精确地推断声明的有效性或适用性。
简单来说,协变量提供了动态图能力和时序处理能力,非常实用。

到了图谱增强阶段,系统已经拥有一个可用的实体和关系图谱,接下来需要进一步理解图谱的社区结构,并通过额外信息来增强图谱。这个阶段主要通过社区检测和图谱嵌入两个步骤来完成。
社区检测使用的是 Leiden 层次化社区检测算法,生成图谱中实体的社区层次结构。算法对图谱进行递归的社区聚类,直到达到某个社区规模的阈值。它的作用在于帮助理解图谱的社区结构,让我们能够在不同粒度级别上导航和总结图谱——这种结构是显式的,可以清楚看到哪些节点属于同一个社区,它们如何聚集在一起。
图谱嵌入则通过 Node2Vec 算法实现,将图谱节点映射到向量空间,使得节点和关系能够在高维向量空间中表示。这有助于理解图谱的隐式结构,提供一个额外的向量空间,可以在查询阶段用于搜索相关概念,在语义上更高效地搜索相关节点和关系。
一旦增强步骤完成,系统会输出最终的实体和关系表,这些表格还会进一步进行文本嵌入处理,以便用于后续的查询和推理。
Phase 3 的核心任务就是通过社区检测和图谱嵌入,增强和丰富已构建的实体和关系图谱。社区检测提供显式结构,图谱嵌入提供隐式语义表示,两者相辅相成。
说到 Node2Vec,大家可能有点困惑。Word2Vec 比较好理解,那 Node2Vec 是干什么的呢?其实逻辑是相通的——Word2Vec 是为了找语义相似性,Node2Vec 也一样,相似的节点会在隐空间里距离更近,聚类自然就好做了。说白了就是这么回事,这样理解起来是不是更直观?


第四阶段,社区总结阶段。此时系统已经拥有包含实体、关系和社区层次结构的功能性图谱,并且完成了 Node2Vec 生成的图嵌入。接下来,系统会根据这些社区数据生成社区报告,提供图谱在不同粒度级别上的总结。
首先,通过大语言模型(LLM)生成每个社区的总结报告,提供每个社区内部的关键信息以及对图谱的具体理解。这样,系统可以更好地理解不同社区是如何形成的,并为后续推理或查询提供不同层次的总结视角。位于图谱顶层的社区报告可能会涵盖整个图谱,而较低层级的社区报告则更关注局部簇。
接着,系统会进一步总结这些社区报告,生成简洁版本,同样通过 LLM 来生成,提供对图谱的概览或详细分析,取决于报告所聚焦的社区粒度。这些简洁报告有助于从更高层次理解图谱中的社区,帮助在后续推理或查询过程中快速获取相关信息。
然后,通过对社区报告及其摘要生成向量表示(embedding),系统将这些社区嵌入到向量空间中,为后续查询提供了一个额外的向量空间表示,使得系统能根据社区语义信息更高效地搜索相关内容。这样一来,不仅实体和关系可以被嵌入,社区本身也拥有了向量表示。
最后,系统会进行记录整理,输出社区报告表,包含系统生成的社区报告及其嵌入表示,供后续查询、分析和推理使用。
Phase 4 的关键任务就是生成和总结社区报告,并通过嵌入技术为这些报告生成向量表示。通过这些步骤,系统能在不同社区粒度上提供高层次的理解,增强对复杂查询的响应能力。这一步没有什么歧义,也不需要额外解释。

我之所以说微软的 GraphRAG 不是纯血 GraphRAG,而是 Hybrid,主要就在于这一步。回顾前4步,明明生成图谱的信息已经足够了,但在第五步又要折腾一轮——不过这回操作的对象不是实体级别的,而是文档级别的。
文档处理阶段的任务,是将文档与之前创建的 TextUnits 相关联,生成文档的向量表示,并输出 Documents 表,供知识模型进一步使用。
具体来说,如果系统处理的是 CSV 格式的数据,可以为文档输出配置额外的字段,这些字段需要在输入的 CSV 表格中存在。通过添加额外的字段,系统可以丰富文档的结构化信息,使后续推理或分析能利用更多上下文。
接着,系统将每个文档与之前创建的 TextUnits 链接起来,理解哪些文档与哪些 TextUnits 相关联。这种链接确保了文档的上下文可以通过 TextUnits 扩展,为文档提供更详细的语义信息。
然后生成文档的向量表示:系统将文档重新分块(不重叠的块),为每个块生成嵌入表示,再根据 token 数量对这些块的嵌入进行加权平均,从而得到整个文档的嵌入。
最后输出 Documents 表,包含所有处理过的文档及其嵌入表示,并关联到之前的 TextUnits。
与前几个阶段的关系在于:前几个阶段创建了 TextUnits 并生成了图谱中的实体和关系,而 Phase 5 则将文档与 TextUnits 关联起来,生成文档嵌入表示,为文档提供了更丰富的语义层次,为后续查询和分析奠定基础。
这一步最大的疑惑点在于:为什么要做文档级别的向量化?
原因在于全局语义与局部语义的差异。TextUnits 的嵌入能够捕捉文档的局部信息,但文档作为一个整体,其全局语义可能不同于各个局部语义的简单叠加。生成文档的嵌入表示,可以帮助系统理解文档整体的语义内容。而且,在实际应用中,有些任务如文档分类、主题分析或文档间相似性计算,往往依赖于文档的全局表示,文档嵌入使得这些操作更加方便。
另一个问题是:文档级别向量化,很多大语言模型根本装不下,太大了。解决方法很简单——化整为零,再串起来。虽然文档在 Phase 1 已经被分块为 TextUnits,但在文档嵌入阶段,系统会重新对文档进行分块,这些新块不重叠,然后为每个新块生成嵌入表示。再对这些块的嵌入进行加权平均(通常根据每个块的 token 数量),得到整个文档的向量表示。这样每次进行 embedding 的东西其实不大,合在一起加权就能生成完整的文档向量化,虽然可能丢失一定上下文,但毕竟能用,还省资源。
最后一个值得说的是,微软 GraphRAG 处理 CSV 格式数据时确实很好用。比如你有一个这样的表:

正常向量化,要么只把 content 部分向量化,要么把后面字段一起放进来。但仔细想想,作者、日期、分类这些字段本身信息量很小,在语义上基本没有区分度。不过,它们在某些特定任务(比如分类)里又非常有用。微软 GraphRAG 就提供了突出它们能力的方法。
具体增强方式是这样的:在字段增强步骤中,系统会读取 CSV 中的额外字段(如作者、日期、类别等),并将这些元数据与文档的内容关联起来。这个过程不是简单地将 CSV 文件直接嵌入,而是将这些字段的信息纳入文档的整体表示中,使系统能在语义推理和分析时利用这些额外信息。
元数据的使用方式有两种:某些情况下,额外字段可以直接作为特征使用,比如文档的类别标签可以作为文档分类的一个输入特征;如果额外字段的信息不是简单的类别标签,而是像文本数据一样可以表示语义(如作者名、标题等),系统可能会对这些字段进行嵌入,然后将这些嵌入与文档内容的嵌入结合,形成文档的整体表示。
增强的具体过程是:系统首先读取 CSV 文件中的额外字段,然后将元数据结合到文档中。对于已经是结构化信息的字段(如类别标签),可以直接用作特征;对于需要语义处理的字段(如作者名或描述性信息),可以将这些字段与文档内容一起嵌入,然后整合形成文档的最终表示。
嵌入方法有多种,包括拼接、加权平均和注意力机制。如果元数据非常重要,可以使用注意力机制来强调元数据对文档嵌入的贡献,这尤其能体现强调特定字段的 attention 优先级,其他方法的效果则可能有限。
增强后的应用范围很广:通过将这些额外字段信息结合到文档嵌入中,系统可以更好地进行分类、推荐和个性化分析,比如基于作者信息的文档推荐,或基于发布时间的时间序列分析。这些增强后的嵌入还能在查询时提供更多上下文信息,使查询结果更加精准。
举个例子:假设一个文档的 Category 字段表示类别为“Finance”。这个字段可以作为简单的分类标签直接使用,也可以通过嵌入表示与文档内容结合。如果 Category 字段是文本类型,可以对“Finance”进行嵌入,然后与文档内容的嵌入结合,这样在查询时就能考虑类别信息了。

这一步就是一个可视化,没什么可多说的。用 UMAP 做降维,降成2维坐标,其实也可以3维展示 node 和 relationship 之间的关系。

总的来说,微软 GraphRAG 通过6个阶段的处理,将传统 RAG 与知识图谱的优势结合起来,实现了从文档到结构化知识、再到语义查询的完整流程。其中很多设计都体现了工程上的巧妙权衡——比如文档级别向量化的“化整为零”策略,以及社区结构的层次化总结。对于处理结构化与非结构化混合数据的场景,这套方案确实提供了不少值得借鉴的思路。
腾讯ima怎么把微信内容一键导入知识库?
腾讯ima怎么创建共享知识库?
Celestia价格预测2026-2032:TIA币能否引领山寨币上涨行情?历史价格回顾
新浪互联网热点小时报丨2026年07月26日16时_今日实时互联网热点速递
比特币(BTC)核心周期指标复刻历史走势 价格或跌破5.8万美元关键支撑位
比特币 2025 年价格预测:BTC 的未来走势
新浪机器学习热点小时报丨2026年07月25日18时_今日实时机器学习热点速递
WorkBuddy微信版怎么获得积分?
新浪人工智能热点小时报丨2026年07月30日18时_今日实时人工智能热点速递
短剧《史上最强洪荒修为》剧情介绍
海尔消毒柜自动消毒如何中止
5000元起的鼠标哪个最值得入手?
男生高性价比充电头?
博世壁挂炉关闭暖气怎么操作
腾讯ima知识库怎么分类管理?
车载冰箱重置到出厂设置几步?
Windy卫星云图怎么看?云层变化识别技巧
5000-6000元鼠标有什么推荐?
管线机怎么接云米净水器
笔记本移动电源推荐哪款?
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc