温馨提示
本分享为系列知识分享,分为五节(实战内容加餐一节):
- GraphRAG是什么
- GraphRAG图谱构建详细步骤
- GraphRAG检索查询详细步骤
- 微软GraphRAG 代码实战
- 大文本数据下GraphRAG执行流程实战
本分享是我们GraphRAG系列最后一节 大文本数据下GraphRAG代码执行流程实战。本系列分享在CSDN、知乎、掘金和微信公众号收获超高点击,是笔者结合学习工作认真撰写的系列文章,也是目前公开资料中介绍GraphRAG 理论和实战较详尽的资料之一。大家读完感兴趣可订阅专栏,掌握GraphRAG的技术核心与实战指南~。
前言
前四篇文章我们详细介绍了GraphRAG知识图谱构建、检索查询理论知识,并通过GraphRAG框架的代码实战将这些理论融会贯通。然而,前四篇文章我们只是通过一个几百字的《大数据时代》文本作为实战案例。不止一次有粉丝私信笔者:
- "GraphRAG在大规模数据集下的表现怎么样呀?"
- "我想把GraphRAG应用到日常工作中,GraphRAG适合在工作中大数据量的场景下工作吗?"
为感谢大家支持,笔者特地加餐一节。通过探究在本地大规模数据集下GraphRAG的问答实战,让大家在巩固GraphRAG实战指南的同时,掌握将GraphRAG快速应用于工作实际的技巧。
一、环境准备
1.1 数据准备
本次笔者实战项目使用的是名为 《机器学习决策树算法详解》 的公开文档,该文档包含58099个字符。

1.2 创建检索文件夹
在命令行输入mkdir -p ./openl_big/input
命令创建检索文件夹,将准备好的**《机器学习决策树算法详解》** 文档上传到openl_big/input
文件夹中。
特别注意: 虽然这里演示的只有一个文档,但GraphRAG本身支持多文档, 大家既可以把多个文档合成一个文档上传,也可以直接把多个文档放入input
文件夹中。


1.3 初始化项目文件
在命令行输入graphrag init --root ./openl_big
命令初始化项目文件,初始化完成后会在openl_big
文件夹下新增三个文件和文件夹:prompts
, .env
和settings.yaml
。
prompts
包含了知识图谱不同表构建阶段的不同提示词,大家可以修改相应的提示词进行调优。.env
是GraphRAG的环境变量settings.yaml
是GraphRAG的配置文件。

1.4 修改配置文件
GraphRAG依赖大模型进行知识图谱构建和检索查询。GraphRAG默认接入OpenAI相关模型。因为网络限制,我们本次使用 硅基流动提供的大模型服务,对硅基流动API使用不熟悉的可以参考我的文章 全网免费接入DeepSeek-R1平台清单,包含网站和API使用。修改settings.yaml
配置文件中的models部分内容如下, chat
模型使用Qwen3-8B
,embedding
模型选择BAAI/bge-m3
:
yaml
models:
default_chat_model:
type: openai_chat # or azure_openai_chat
api_base: https://api.siliconflow.cn/v1/
# api_version: 2024-05-01-preview
auth_type: api_key # or azure_managed_identity
api_key: 你注册的硅基流动api key # set this in the generated .env file
# audience: "https://cognitiveservices.azure.com/.default"
# organization: <organization_id>
model: Qwen/Qwen3-8B
# deployment_name: <azure_model_deployment_name>
encoding_model: cl100k_base # automatically set by tiktoken if left undefined
model_supports_json: true # recommended if this is available for your model.
concurrent_requests: 25 # max number of simultaneous LLM requests allowed
async_mode: threaded # or asyncio
retry_strategy: native
max_retries: 10
tokens_per_minute: auto # set to null to disable rate limiting
requests_per_minute: auto # set to null to disable rate limiting
default_embedding_model:
type: openai_embedding # or azure_openai_embedding
api_base: https://api.siliconflow.cn/v1/
# api_version: 2024-05-01-preview
auth_type: api_key # or azure_managed_identity
api_key: 你注册的硅基流动api key
# audience: "https://cognitiveservices.azure.com/.default"
# organization: <organization_id>
model: BAAI/bge-m3
# deployment_name: <azure_model_deployment_name>
encoding_model: cl100k_base # automatically set by tiktoken if left undefined
model_supports_json: true # recommended if this is available for your model.
concurrent_requests: 25 # max number of simultaneous LLM requests allowed
async_mode: threaded # or asyncio
retry_strategy: native
max_retries: 10
tokens_per_minute: auto # set to null to disable rate limiting
requests_per_minute: auto # set to null to disable rate limiting
二、知识图谱构建
2.1 执行知识图谱构建过程
命令行输入graphrag index --root ./openl_big
构建知识图谱,可以看到GraphRAG不断执行建表过程。

大家最关心的还是GraphRAG在大规模数据下的性能问题,这里以笔者的实际运行时间给大家参考:使用硅基流动Qwen3-8B模型,在提示词中加入no_think, 电脑配置 M2 PRO 芯片上处理完该文档运行了大概30多分钟。
2.2 读取知识图谱相关表
知识图谱以数据表的形式存储在openl_big\output
文件夹中,我们可以通过pandas
库读取这些表,具体代码我这里就不展示了,大家可参考:微软GraphRAG 代码实战。

这里挑选其中的实体表 , 关系表 和报告表进行展示:
实体表:

关系表:

报告表:

三、检索查询
3.1 GraphRAG查询模式详解
GraphRAG包含三种查询模式:
- Local模式的匹配机制是使用提问问题中的实体去实体表中进行匹配,找到与问题中实体有关系的其它实体,并根据所有实体进一步找到相应的文本块,依据这些文本块内容进行回答。
- Global模式把问题和社区报告进行匹配,如果匹配到某个社区里讨论的问题恰恰包含了提问,GraphRAG会将这个社区文档进行提纯总结,总结完成后再根据告匹配实体和关系以及关联文本块代入问答。全局搜索会调用两次大模型,第一次进行社区报告的提纯,第二次是执行查询,所以会消耗更多的token。
- Drift模式把问题中的实体与图谱中实体匹配,匹配到实体后会根据当前文本进一步扩散去周边找一找有没有层级关联实体,把这些实体关联文本代入到问答中
3.2 全局模式和本地模式差别
上一篇分享微软GraphRAG 代码实战中我们使用同样的问题进行全局模式和本地模式的提问,其实全局模式和本地模式还是有很大区别的,我这里总结出三种不适合本地模式的场景:
3.2.1 总结性质问题的提问
我们选取问题:请问文档中总共介绍了几种决策树算法
命令行输入 graphrag query --root openl_big --method local --query "请问文档中总共介绍了几种决策树算法?"
进行本地模式查询。 本地模式下无法回答(原因是当前问题中没有实体表中的核心实体单元,本地模式无法根据实体表关联文本):

命令行输入 graphrag query --root openl_big --method global --query "请问文档中总共介绍了几种决策树算法?"
进行全局模式查询。 全局模式下可以回答,并在最后列出了相关的社区报告,大家可以从社区表中读取这些社区报告进行查看。

3.2.2 综合评价类提问
我们选取问题:你觉得文档中介绍的决策树算法,哪个算法最有应用前景
命令行输入graphrag query --root openl_big --method local --query "你觉得文档中介绍的决策树算法,哪个算法最有应用前景"
。该问题在原始文档中并没有,所以它没办法关联到任何一个实体,本地模式自然无法回答。

命令行输入graphrag query --root openl_big --method global --query "你觉得文档中介绍的决策树算法,哪个算法最有应用前景"
,可以看到全局模式给出了回答并同样在文本中列出了关联的社区报告。

3.2.3 主观评价类问题:
我们选取问题:你觉得这个文档写的如何
命令行输入graphrag query --root openl_big --method local --query "你觉得这个文档写的如何"
。该问题在原始文档中并没有出现,没办法关联到任何一个实体。

命令行输入graphrag query --root openl_big --method global --query "你觉得这个文档写的如何"
。可以看到全局模式可以回答。

3.3 全局模式和本地模式使用经验
在非上面介绍的三类问题的情况下,我们可以选取本地模式进行尝试,本地模式的性能比传统RAG的性能稍好,速度也想读较快。
对于上面介绍三类主观问题的情况下,我们需要选取全局模式进行尝试,全局模式可以通过社区报告更加全面的关联不同的实体关系产生回答。
总结
本篇分享我们使用GraphRAG对几万字的文档进行知识图谱的构建,并分析了长文本下GraphRAG的构建效率。本篇文章进一步对比了全局模式和本地模式查询的差异,总结了三种不适合使用本地模式的场景。
通过笔者日常的工作实践,GraphRAG已经基本可以满足精度较高的RAG需求,然而对于超过20G以上的文本GraphRAG还是有检索缓慢等缺点,目前也出现了大量的改进项目包括LightRAG 、NANO-GraphRAG等,大家可以自行尝试~
本篇是GraphRAG系列分享的完结篇,之后我会分享更多各种工作实际中的包括大模型应用开发、大模型原理在内的知识,大家感兴趣可以关注笔者掘金账号,更可关注笔者同名微信公众号: 大模型真好玩,免费获得笔者工作实践中的各种资料,还可私信笔者交流任何大模型问题!