基于 GraphRAG 构建知识图谱增强 LLM 检索:以《红楼梦》为例
介绍微软开源的 GraphRAG 项目,通过提取实体和关系构建知识图谱来增强大模型检索能力。内容涵盖环境搭建、配置修改、索引构建流程以及图谱查看方法。文章结合《红楼梦》案例演示了局部检索与全局检索的具体用法,并分享了处理 Token 限制和 Embedding 模型兼容性的实战经验,旨在帮助开发者利用结构化数据提升 LLM 问答质量。

介绍微软开源的 GraphRAG 项目,通过提取实体和关系构建知识图谱来增强大模型检索能力。内容涵盖环境搭建、配置修改、索引构建流程以及图谱查看方法。文章结合《红楼梦》案例演示了局部检索与全局检索的具体用法,并分享了处理 Token 限制和 Embedding 模型兼容性的实战经验,旨在帮助开发者利用结构化数据提升 LLM 问答质量。

最近尝试把《红楼梦》接入大模型(LLM),用于打造知识检索增强的智能体,效果一直不太理想。传统 RAG 主要依赖向量相似度搜索,在处理复杂关系推理时往往力不从心。
今天发现一个 GitHub 高赞项目 - GraphRAG,微软开源。它首先通过 LLM 进行实体提取、关系提取,将知识库构建成知识图谱,然后再基于知识图谱,利用 LLM 回答用户问题。这种结构化数据的方式显著提升了推理能力。
GraphRAG 是一种结构化、分层的检索增强生成 (RAG) 方法,与使用纯文本片段的朴素语义搜索方法不同。GraphRAG 的处理流程包括从原始文本中提取知识图、构建社区层次结构、为这些社区生成摘要,然后在执行基于 RAG 的任务时利用这些结构。
大白话解释一下:GraphRAG 是一个数据转换套件,旨在利用 LLM 从非结构化文本中提取有价值的结构化数据,进而构建成知识图谱。
图谱有两个最重要的概念:节点和边。 比如在知乎:你和猴哥都是一个节点,你关注猴哥就构成一条边,你给猴哥点赞也构成一条边。你我和构成的边,都是图谱的一部分。
发布至今,已有 15.9K Star,并且项目还在持续迭代中。
首先,在 Python 虚拟环境中一键安装:
pip install graphrag
然后,创建一个项目文件夹 graphrag,并在其中新建 input 文件夹,用于存放知识库数据:
mkdir graphrag
mkdir graphrag/input
把你的知识库文件(如 红楼梦.txt)装入 graphrag/input 后,一键初始化项目:
python -m graphrag.index --init --root graphrag/
这一步,如果遇到如下报错:
from past.utils import old_div
ModuleNotFoundError: No module named 'past'
提示缺少 past 模块,future 库提供了向后兼容的接口。安装 future,即可确保程序正常:
pip install future
初始化成功后,项目目录结构如下:
graphrag/
├── .env
├── input
│ └── 红楼梦.txt
├── prompts
│ ├── claim_extraction.txt
│ ├── community_report.txt
│ ├── entity_extraction.txt
│ └── summarize_descriptions.txt
└── settings.yaml
这里主要有两个配置文件需要修改:
.env 中填入要采用的大模型的 api_key。settings.yaml 中主要修改 llm 和 embedding 相关信息,比如大模型名称和 api 地址。注意:这里的 LLM API 需要兼容 OpenAI 格式。如果需要在 Gephi 等软件中查看图谱的 graphml 文件,可以在配置中设置 graphml: true。
prompts 文件夹是整个项目中用到的提示词,非常重要,决定了最终图谱的质量。可以先保持官方的默认值,试试看,不行再来调整!
配置完成后,一键开启构建索引:
python -m graphrag.index --root graphrag/
日志显示,开始切割文本,随后进入实体提取阶段。
注:《红楼梦》共计 73w 字,所以处理时间比较长,大家也可以先用一个简单的例子快速跑通流程。
实际跑的时候,还是踩了一些坑,有必要跟大家分享一下。
踩坑 1:任务中断续传
如果中途因为上游 LLM 速率限制,报错了,可以在环境变量中设置 timestamp,接着之前的任务继续跑,避免重复计算。
踩坑 2:Embedding 模型限速与兼容性
免费版 embedding 限速严重。尝试了多个 embedding 模型,哪怕并发改到 1,依然无法完成任务。
为此尝试了以下两种 embedding 方案:
snowflake-arctic-embed 模型,但 Ollama 的嵌入模型居然不兼容 OpenAI 格式,果断放弃。batch_size 调整为 1,才终于搞定 embedding。耗时数小时,终于把一本《红楼梦》的知识图谱构建完毕,总计完成以下几个任务:
⠧ GraphRAG Indexer
├── Loading Input (text) - 1 files loaded (0 filtered) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00 0:00:00
├── create_final_entities
├── create_final_nodes
├── create_final_communities
├── join_text_units_to_entity_ids
├── create_final_relationships
├── join_text_units_to_relationship_ids
├── create_final_community_reports
├── create_final_text_units
├── create_base_documents
└── create_final_documents
🚀 All workflows completed successfully.
生成结果保存在 artifacts/ 文件夹下,均为 .parquet 文件。
为了在 VSCode 中查看 .parquet,需要先安装一个插件 parquet-viewer,安装成功后,会自动将 .parquet 展示为 JSON,非常方便!
给大家展示一下生成的节点,最终描述都是英文,类型也有不少错误,看来提示词还是得重新搞成中文!
生成的边显示了实体之间的关联关系。这效果,比简单的段落切分,强太多了!
专为《红楼梦》打造的知识图谱,终于搞定了!我们来考考它,GraphRAG 提供了两种检索方式。
此外,基于这个图谱,还可以让 LLM 帮你生成关于该数据集的各种问题,辅助探索性分析。
python -m graphrag.query --root graphrag --method global "红楼梦的主题是什么?"
回答展示:
SUCCESS: Global Search Response:
《红楼梦》的主题涵盖了多个方面,主要包括:
1. **家族衰败**:小说以贾、王、史、薛四大家族的兴衰为背景,展现了封建社会的腐朽和衰落。
2. **人性探讨**:小说深入探讨了人性的复杂性和矛盾,如贾宝玉的叛逆、林黛玉的多愁善感等。
3. **社会批判**:小说对封建礼教、官场腐败、社会不公等进行了深刻的批判。
4. **爱情与婚姻**:小说中的爱情与婚姻关系错综复杂,反映了当时社会的婚姻制度和家庭观念。
5. **哲学思考**:小说还探讨了人生、命运、爱情、婚姻、家族关系等主题。
综上所述,《红楼梦》是一部深刻反映封建社会末期社会矛盾和人物命运的史诗性作品。
python -m graphrag.query --root graphrag --method local "刘姥姥进大观园时带了谁"
回答展示:
SUCCESS: Local Search Response:
刘姥姥进入大观园时,并没有携带其他人。根据提供的数据,我们可以看到与刘姥姥相关的记录中,并没有提及她带了其他人一同进入大观园。
python -m graphrag.query --root graphrag --method global "刘姥姥进大观园时带了谁"
回答展示:
SUCCESS: Global Search Response:
刘姥姥进大观园时,带了她的孙子板儿。这一信息在多份分析师报告中得到了确认,包括报告编号 104、656 和 546。根据这些报告,可以确定板儿是刘姥姥的孙子,且在刘姥姥进入大观园时,孙子板儿与她一同前往。
GraphRAG 的 Token 消费量非常大,尤其是在实体提取和社区报告生成阶段。已实现 Token 自由的小伙伴可无视,但对于普通开发者,建议先在小规模数据上测试成本。
prompts 文件夹中的提示词决定了最终图谱的质量。如果发现生成的节点描述不准确或语言不符合预期(如本例中生成的英文描述),可以尝试修改 entity_extraction.txt 等文件,强制要求输出中文或特定的格式。
生成的 .graphml 文件可以使用 Gephi 等工具进行深度可视化分析,帮助发现数据中的隐藏模式。这对于理解大规模知识库的结构非常有帮助。
不得不说 GraphRAG 是个宝藏项目。本文通过一个简单的案例,带你快速上手 GraphRAG。相比传统 RAG,GraphRAG 通过引入知识图谱结构,显著增强了模型对复杂关系和全局信息的理解能力。
希望给饱受传统 RAG 困扰的小伙伴一点启发,在实际业务场景中,可以根据需求灵活选择局部检索或全局检索策略,以达到最佳的问答效果。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online