GraphRAG源码解读:基于知识图谱构建的检索增强生成系统
1. 引言
GraphRAG是一个微软开源的新系统,在知识图谱构建的基础上实现了检索增强生成(RAG)。该框架旨在通过大型语言模型从非结构化文本中提取结构化数据,并构建具有标签信息的知识图谱来支持包括数据集问题生成与摘要问答等多种应用场景。
GraphRAG 的显著优势在于通过图机器学习算法对数据集实施语义整合和多层次分析技术,从而能够解答一些较为高层级的抽象或综合性质的问题.值得注意的是,这种特性恰恰是传统 RAG 系统所缺乏的能力.
本文重点对GraphRAG源码的相关方面进行深入分析, 也旨在进一步深入理解其系统架构及其中的关键概念和核心工作流等。
此次获取的 GraphRAG 代码库对应的 commit ID 是 a22003c3-... ,并已于 a^{\text{commit ID}} 格式标记。
更新时间为 YYYY.MM.DD 格式下的 "2024-7-5"。
2. 框架概述
2.1 解决了什么问题(What & Why)?
在编写代码之前,在了解GraphRAG项目的开发目标与定位时,在相关论文中
However, RAG struggles with global queries spanning vast textual extents, such as determining the predominant themes within a dataset, because it fundamentally represents a query-focused summarization (QFS) task, whereas traditional retrieval tasks aim to achieve explicit retrieval objectives.
类似于该数据集的核心主题是什么?这本质上属于一种高层次的总结性(QueryFocused Summarization, QFS)任务。单纯只靠数据检索无法完全解决这一挑战。其解决方案已在论文中详细阐述。
Unlike prior studies that leverage the structured retrieval and navigation features of graph indexes (subsection 4.2), our research investigates a unique aspect of networks in this domain: their intrinsic modularity (Newman, 2006) alongside the capabilities of community detection algorithms to segment networks into modular clusters comprising closely interconnected nodes (e.g., methods like Louvain, Blondel et al., 2008; Leiden, Traag et al., 2019). The LLM-generated summaries derived from these community descriptions offer comprehensive representations of the underlying graph index and its corresponding input data. Through an efficient querying mechanism enabled by a map-reduce framework, we achieve not only individual query resolution but also holistic synthesis by aggregating all pertinent partial results into a unified comprehensive answer.
采用Leiden算法等方法对整个知识图谱进行模块化划分工作区(其中包含具有较高相关性的节点),随后基于大模型技术从下往上对各个子社区展开摘要工作;最后采用MapReduce模式实现QFS功能:具体流程是各子社区同时执行查询请求,并在完成后将结果综合形成完整的全局响应。
2.2 实现方式是什么(How)?

以上改写遵循以下原则
3. 源码解析
官方文档中所描述的内容非常清晰明了。然而要深入了解代码的具体实现细节,则需要深入研究源码中的相关内容。下一步则是详细分析代码的具体实现过程。
项目源码结构树如下:


为所有在大模型学习道路上感到迷茫的同学

3.1 Demo
在深入理解具体功能之前,在熟悉使用场景时会更加高效
请注意:虽然只是一个简单的演示文稿(即一个简单的 demo),但 Token 的消耗绝对不容小觑。尽管我们早有预期,并且已经删掉了一半以上的原始内容(即超过一半的内容被删除),但就我们这边而言,在完全运行下来的情况下只花费了大约 3刀 的费用。而官方完整的演示文稿则预计需要消耗 5 刀到10刀不等。
当前实际运行时间仍然存在一定的延迟。大模型实际上是在反复处理整个文档,并且其中有一些比较重要的事项需要特别关注。
目录结构


这个文件中的很多文档都值得仔细研究,后续将结合代码详细说明。
Workflows
此外,在控制台中会产生大量日志记录,在这些记录中较为关键的是完整的 workflows数据流,在此过程中需要合理地组织完整的 pipeline 条件

3.2 Index
索引构建阶段经过全面审视后在整个项目体系中扮演着关键角色,并呈现出高度复杂性
执行 indexing 的语句如下:


深入分析了该程序后发现其运行机制如下:通过查看主程序入口点发现其运行路径为:使用 argparse 库解析输入参数后生成配置文件。该配置文件被传递至 graphrag/index/main.py 文件中的主函数进行处理。
深入解析源码之前,请初步了解相关函数之间的调用关系。如上图所示,在被灰色标注的部分中,请特别关注这些关键函数的作用机制。
cli.py::index_cli() 函数主要依据用户的指定参数--init命令行选项来决定是否需要初始化当前文件夹。这部分功能主要由 cli.py::index_cli() 执行完成。其实现逻辑较为简单:它会检查目录中的配置文件、prompt文件以及.env文件的存在性;如果这些文件均不存在,则会进行创建操作;其中包含上一节目录中展示的settings.yaml以及相关的prompts
当真正执行indexing操作时(即索引操作),该程序实际上会调用一个内部函数 cli.py::index_cli()._run_workflow_async();该操作主要涉及 cli.py::_create_default_config() 和 run.py::run_pipeline_with_config() 两个关键步骤。
鉴于篇幅限制, 我们仅就默认配置流程进行探讨, 大致梳理相关逻辑后, 以便后续可以根据需求进行相应调整.
默认配置生成逻辑主要由 cli.py 中的 _create_default_config() 方法负责。程序首先会扫描根目录以及指定的 settings.yaml 文件。随后会调用 cli.py 中的 _read_config_parameters() 方法来解析这些参数。接下来的操作相当重要——这部分代码的功能相当重要。随后会根据当前获取到的参数构建一个管道(pipeline)的配置结构。具体实现细节则可参考 create_pipeline_config.py 中的 create_pipeline_config() 方法。这一模块绕了一圈又一圈——可以说这是整个项目中逻辑最为复杂的部分之一
通过细致地查看 create_pipeline_config.py::create_pipeline_config() 的代码实现,我们可以明确了解其中最核心的部分。

这段代码的核心机制是通过不同功能来生成完整的workflow序列。值得注意的是,在本实现中无需考虑workflow间的依赖关系,在此基础之上仅根据workflows/v1目录下的各个workflow的模板来生成一系列的工作流程。
- Pipeline 运行流程:run.py 中的 run_pipeline_with_config 函数首先基于 load_pipeline_config.py 中的 load_pipeline_config 函数加载现有 pipeline 的配置文件(这些配置由 cli.py 中的 _create_default_config 方法生成)。接着,在目标文件夹中建立特定子目录如 cache、storage、input 和 output 等(参考上一节目錄结构调整示意圖),随后利用 run.py 中的 run_pipeline 函数依次執行每個工作流並最終输出相應結果
这里有必要进一步详细说明 run.py 中的 run_pipeline() 函数;该函数负责完整执行所有的管道,并且其主要功能包括两个方面:
导入工作流:在Python文件workflows/load.py中定义了load_workflows函数。该函数不仅用于构建基本工作流之外的情况,并且还涉及拓扑排序问题。
- workflows/load.py::create_workflow():利用已有模板,创建不同的工作流
- graphlib::topological_sort():基于 workflow 之间的依赖关系网络, 完成对DAG的拓扑排序计算.
进一步依次执行 inject_workflow_data_dependencies()、write_workflow_stats() 和 emit_workflow_output 等操作。这些操作分别用于依赖注入、数据存储及记录等用途;核心的 workflow.run 操作将在 write_workflow_stats() 前面执行;此处的核心逻辑可参考以下代码:

根据以上信息,我们可以大致梳理出索引环节的完整工作流。
初始化:生成必要的配置文件、缓存,、input/output 目录等
索引:基于配置文件,在 workflow 模板上构建一系列 pipeline,并根据依赖关系安排执行顺序;从而依次执行。
Workflow
到目前为止, 我们尚未真正地对 GraphRAG 内置的一整套编排系统其运作机制进行深入剖析, 只是了解了其基本操作流程.
在此为例, 一起查看这个 workflow 的具体情况是怎样的.
DataShaper
在探讨 workflow 的过程中,在深入学习项目所使用的另一个框架——datashaper 之前
从直观的角度看,在处理过程中 datashaper 可以被视为一个处理流程,在处理过程中每一步都对输入数据施加了一种特定的操作。这些操作类似于 PyTorch 图像变换中所使用的 clip、rotate 和 scale 等功能。如果您仍有疑问,请尝试运行官方文档中的示例程序 examples/single_verb;相信通过实际操作后会豁然开朗。
从功能上来讲,个人感觉有点像Prefect。
知识图谱构建
此工作流程对应的是 create_final_entities.py 文件。查看源码时可发现, 此 workflow 依赖于 workflow:create_base_extracted_entities, 同时定义了 cluster_graph 和 embed_graph 等相关操作, 其中采用莱登策略进行计算, 具体代码位于 index/verbs/graph/clustering/cluster_graph.py 中。

可以看出,实际上就是增添了一个verb装饰器类(或装饰器组件)而已。进一步考察strategy的实现能够发现这里的leiden算法实际上也是源自另一个图算法库https://github.com/graspologic-org/graspologic
Pipeline
深入理解上述 workflow 的具体步骤后,在上一节中提到的记录信息的基础上(或通过 artifacts/stats.json 文件),我们便能够系统地构建完整的 工作流程 了。
官方文档不仅提供了极其详尽的相关说明,并且详细介绍了该方法的基础架构。
但是从源码中提取出来的 pipeline 看起来似乎存在一些差异哦!如果有相关经验的人愿意交流探讨的话,请随时留言。
3.3 Query
查询阶段的 pipeline 相对而言要简单些,执行 query 的语句如下:

这里需要注意的是有两种模式:Global/Local search即全局搜索与局部搜索;或者先构建函数调用关系图以认识整体框架

在graphrag/query/main.py中,主函数根据参数的不同将分别被路由至cli::run_local_search()以及cli::run_global_search()。
Global Search
cli::run_global_search() 主要负责调用 factories.py::get_global_search_engine() 函数以获取相关功能实现,并返回了一个详尽描述的 GlobalSearch 类实例。深入查看该类结构后发现其与 LocalSearch 类具有相似性,并均遵循工厂模式进行对象创建。其中关键方法是 structured_search/global_search/search.py 中的 GlobalSearch.asearch() 函数的具体实现细节采用了分而治之的方法:首先利用大型模型在并行处理下生成每个社区摘要的答案;随后将所有答案整合汇总以形成最终结果。建议参考 map/reduce 相关提示文档以获取更多优化建议,并详细解释了这一过程。
正是由于这种基于map-reduce的机制模式,global search对token的消耗程度显著增加。
Local Search
类似于全局搜索的方法,在 cli::run_local_search() 函数中主要依赖于 factories.py 中的 get_local_search_engine 方法来执行操作,并返回了一个 LocalSearch 对象。其中的 asearch 方法相对而言较为简单,并能够根据上下文内容生成相应的响应。这种模式与传统的 RAG 语义检索策略相似,在运行过程中所消耗的 Token 数量也比较有限。
与全局搜索的主要区别在于,在Local模式下整合了包括nodes在内的多种数据源如community_reports、text_units、relationships、entities及covariates等信息这一官方文件对此进行了详细阐述不再赘述
4. 一些思考
其核心优势体现在一定程度上克服了以查询为核心的摘要(QueryFocused Summarization, QFS)这一挑战,在现有研究中尚属首次提出。相比之下,在现有研究中与之思路最为接近的是 https://github.com/parthsarthi03/raptor 项目
QFS 与 Multi-Hop Q&A 被视为当前阶段 RAG 系统尚未能够有效应对的一个关键难点;然而,在许多应用场景中——尤其是数据分析领域——它们已经被广泛应用并取得了显著成效。尽管 GraphRAG 当前的使用成本仍然较高,并且可能面临技术瓶颈;但其仍为实现高效的信息检索提供了潜在的可能性。
此外,个人认为相较于一般的RAG项目,GraphRAG给我留下了比较深刻的印象:它配备了较为完整的作业流程配置系统,这一特点在其他RAG框架中尚属罕见。这也可能是未来进一步探索的一个方向,通过模板设定大部分作业流程,并提供少量的配置调节自由度,确保每个环节都有迹可循且可追踪管理,而非单纯依赖大模型完成所有操作步骤。
与其相比,在嵌入和检索等环节上无需深入探讨的部分反而显得较为简单明了,并且即便增加了社区检测算法
当然,本项目在知识图谱的处理颗粒度上也做得很细,比如社区检测的 leiden 算法,综合多源数据的 local search 等。一个有意思的点在于:项目中实体抽取相较于常规的一些基于 Pydantic 的思路,目前已经是完全采用大模型实现了,并且在三元组的 schema 方面也未设置任何约束。作者还简单解释了下:因为总是要做相似性聚类的,所以每次大模型抽取即使有些差异,最终社区的生成也不会有很大影响。这一点说实话在鲁棒性方面确实是很大的提升👍。
个人认为目前的GraphRAG系统仍存在诸多可以优化的空间。例如引入了许多令人一头雾水的专业术语如Emit、Claim、Verbs及Reporting等专业术语。此外该系统还附加了一些微软自家较为小众的组件库从而进一步提升了理解难度。另外就模块化设计而言当前的表现尚有提升余地尤其是其中OpenAI那一块由于耦合度过高导致功能分散难以有效整合这在一定程度上限制了系统的扩展性。
从整体上讲
如何学习AI大模型?
在大模型时代浪潮下,主流的大语言模型引发了编程界的一场深刻反思。对于"AI将会取代哪些行业"这一问题持续引发关注与讨论,在技术发展与职业变迁的双重背景下,围绕"哪些行业的从业者将面临失业"这一话题更是引发了广泛争议与深入探讨。
不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!
打算正式进入一些新兴的AI领域,在这过程中不仅需要深入系统学习AI大模型的基础知识和前沿技术。除了需要系统学习之外,还要求能够将现有的技术基础与编程效率提升相结合,并通过实操应用来增强自己的实践能力。
然而LLM的知识内容较为丰富但目前网络上针对LLM的教材或课程资源相对匮乏因此对于初学者而言在学习路径上面临着较大的挑战其学习门槛相对较高
那么针对所有自学能力较弱的同学们, 我致力于帮助大家系统梳理大模型学习脉络, 将这份 LLM大模型资料 免费提供出来:其中包括LLM大模型书籍、640套LLM行业研究报告、LLM学习视频课程、LLM学习路线图以及LLM开源学习教程等精彩内容, 😝觉得有需求的同学, 可以 扫码下方二维码 免费领取🚀 ↓↓↓
👉[大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

学习路线

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 借助于基于大型语言模型的提示词工程以Prompt为工具展开操作研究,则能更好地发挥其功能。
第三阶段的任务是利用阿里云PAI平台来搭建电商领域虚拟试衣系统的应用。
第四阶段: 本阶段主要聚焦于基于大模型的知识库的应用开发,并以LangChain框架为例进行具体实施;通过构建智能问答系统,在物流行业中实现咨询服务的智能化提升。
第五阶段: 大模型的微调开发基于利用大健康、新零售以及新媒体等领域搭建适合当前领域的专业化的大模型
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
进入第七阶段后的主要工作是围绕构建行业应用展开

👉学会后的收获:👈
以大模型技术的全栈开发实践为基础,在前端开发工程师、后端开发工程师等岗位所需的技术与能力方面进行深入学习和实践
在大数据时代背景下,在面对海量数据的需求时
基于企业级数据驱动的AI技术开发, 达成对大型语言模型理论体系的理解, 掌握高性能计算资源的能力, 硬件基础, 以及LangChain生态系统的深度应用; 学习包括数据准备、数据蒸馏及大规模预训练等环节在内的Fine-tuning微调技术的应用, 实现从基础到进阶的系统学习路径.
具备应对当前热门大模型垂直领域建模需求的能力,并能有效提升程序员在代码编写方面的技能:开发大模型应用时需熟悉机器学习算法和深度学习框架等核心技术;掌握这些核心技术能有效提升程序员在代码编写和问题分析方面的综合能力;从而让开发者更熟练地构建高质量的应用程序。

_1.AI技术发展路径
_2.标准化落地方案(共100套)
_3.课程资源包(共100集)
_4.电子化知识库(共2百本)
_5.专业考试题库(LLM领域)
_6.AI行业专家资源包(完整集合)
保证100%免费
保证100%免费
保证100%免费
完全免费!100%免费!
完全免费!100%免费!

