GraphRAG 解决了什么问题
在朴素的 RAG(检索增强生成)架构中,我们通常使用向量数据库作为知识库。当用户提出查询时,系统从向量库中匹配 Top-K 个相似片段作为上下文,并将该上下文与提示词和查询一起交给大语言模型(LLM)进行回答。
GraphRAG 通过构建知识图谱解决传统向量检索在宏观查询上的不足。本文介绍其核心原理、环境配置、索引构建及全局与局部检索方法,并分析其在商业落地中的成本与局限性。内容涵盖实体提取、社区检测、配置详解及优化建议,旨在帮助开发者深入理解 GraphRAG 架构并评估适用场景。

在朴素的 RAG(检索增强生成)架构中,我们通常使用向量数据库作为知识库。当用户提出查询时,系统从向量库中匹配 Top-K 个相似片段作为上下文,并将该上下文与提示词和查询一起交给大语言模型(LLM)进行回答。
假设这个向量库指向企业知识,考虑两个示例查询:
对于第一个问题,由于它非常具体,知识库的搜索可能会找到相应的信息块或常见问题解答。对于这种类型的问题,朴素 RAG 通常会表现得很好。
对于第二个问题,这是一个宏观层面的查询,需要将企业知识库中所有与技术团队相关的项目收集起来并进行总结。关键在于找到与技术团队成果相关的各类信息,然后以某种方式关联起来以得出答案。这种方法也被称为'连接点'(connecting the dots)。
在这里,'点'指的是分散在不同地方的关键信息。那么,朴素 RAG 能否有效解决这类问题?虽然我们可以强制使用朴素 RAG 来寻找答案,但其效果很可能不会十分理想,因为它缺乏对实体间关系的理解。
对于这类问题,一种解决策略是预先整理信息。例如,我们首先抽取与技术团队相关的所有信息。当我们提出相关问题时,可以基于这些已经抽取的信息进一步进行总结。这个过程实际上就是构建知识图谱的过程。
举个例子,假设我们有大量文本,其中包含了技术团队执行的各种项目的信息。在我们构建的知识图谱中,我们有多个节点,代表技术团队和项目,并通过关系将它们连接起来。这样,当我们想了解他们完成了哪些工作时,只需关注与这些节点相关的部分,便可获悉技术团队已完成的任务。
这个构建知识图谱的过程通常可以用大型模型来完成,这也是 GraphRAG 模型提出的一个重要思想:预先提取并整理好信息,然后基于这些整理后的信息进行回答。
进一步来说,对于第二个问题,相关的提问方式有很多。例如:
这里呈现的是一个层次结构,因此在 GraphRAG 模型中,做了进一步的操作:创建这种层次结构。我们预先整理出相关的关键信息,这样的层次结构是基于知识图谱获取的。因此,我们对这个知识图进行了类似的聚类,然后将这些实体的信息合并在一起,再对这些合并后的信息进行整理。从知识图谱到这里,GraphRAG 采用了一些社区挖掘算法,这是 GraphRAG 的第二个重要思想。
为了更清晰地理解其运作机制,GraphRAG 主要包含以下关键步骤:
这套方法能否在商业环境中实施呢?目前来看,它更像是一个原型或高级解决方案。
尽管如此,GraphRAG 作为一个新的 RAG 流程还是有必要学习一下的,特别是在需要跨文档推理的场景下。
| 名称 | 安装 | 目的 |
|---|---|---|
| Python 3.10+ | 下载 | 该库基于 Python 开发。 |
| Poetry | 使用说明 | Poetry 用于 Python 代码库的包管理和虚拟环境管理。 |
git clone https://github.com/microsoft/graphrag.git
cd graphrag
poetry install
如果你本地 poetry install 比较慢,可以在项目的 pyproject.toml 文件末尾添加镜像源:
[[tool.poetry.source]]
name = "aliyun"
url = "https://mirrors.aliyun.com/pypi/simple/"
并执行 poetry lock 重新生成 poetry.lock,再执行 poetry install 即可。
首先让我们准备一个示例数据集:
mkdir -p ./ragtest/input
现在让我们从可靠的来源获取查尔斯·狄更斯的《圣诞颂歌》的副本:
curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt > ./ragtest/input/book.txt
在当前目录准备初始化:
poetry run poe index --init --root ./ragtest
它会在当前目录创建 output、prompts 目录,以及 .env 文件和 settings.yaml 配置文件。
output 目录,存储生成的图、以及总结、日志等信息。prompts 目录,存储默认的 4 个提示词文件:claim_extraction.txt、community_report.txt、entity_extraction.txt、summarize_descriptions.txt。.env 文件中只包含一个 GRAPHRAG_API_KEY,用于设置你的 LLM API KEY。settings.yaml 文件较为复杂,配置项目也较多,运行本项目只需要修改两个 llm 和 embeddings,我这里直接使用 OpenAI。接着我们执行一条命令会自动索引数据,构建知识图谱,只是过程比较慢,耐心等待即可:
poetry run poe index --root ./ragtest
在 settings.yaml 中,除了指定 LLM 和 Embedding 模型外,还可以调整以下参数以优化性能:
合理调整这些参数可以在响应速度和检索精度之间取得平衡。
GraphRag 的查询分为两种类型:
poetry run poe query --root ./ragtest --method global '这个故事的主题是什么?'
输出结果如下:
SUCCESS: Global Search Response: ### 故事主题概述
本故事的核心主题围绕着**转变与救赎**,通过 Ebenezer Scrooge 从吝啬鬼到慷慨大方的典范的转变,展现了个人改变的可能性和重要性。
### 人物互动与社会关系
故事通过 Scrooge 与 Cratchit 家庭以及各种鬼魂的互动,强调了慈悲、善良以及个人改变的重要性。这些互动不仅展示了个人改变的可能性,还突出了社会责任感。
### 社会影响与个人行为
Scrooge 的旅程揭示了个体通过善行和慷慨对社区产生的积极影响。故事探讨了希望、韧性和圣诞精神的主题,通过 Tiny Tim 和 Cratchit 家庭的形象,展示了即使在困难中也能体现出圣诞精神的典范。
综上所述,本故事通过 Scrooge 的转变之旅,探讨了救赎、慈悲、社会责任和个人改变的重要性,以及这些主题如何在个人、家庭和更广泛社区中产生深远影响。
poetry run poe query --root ./ragtest --method local 'Scrooge 这个故事的主人公是谁,他的主要关系是什么?'
输出结果如下:
SUCCESS: Local Search Response: # 主人公与主要关系
## 主人公简介
故事的主人公是 Ebenezer Scrooge,他是《A Christmas Carol》中的中心人物。Scrooge 最初被描绘为一个贪婪、吝啬的老人,对圣诞节和周围人的苦难漠不关心。
## 主要关系
### 与 Bob Cratchit 的关系
Bob Cratchit 是 Scrooge 的职员,一个收入微薄但心地善良的人。Scrooge 最初对 Cratchit 的待遇冷酷无情,但在故事的结尾,Scrooge 提高了 Cratchit 的工资,并成为了他家庭的恩人。
### 与 Jacob Marley 的关系
Jacob Marley 是 Scrooge 已故的商业伙伴,他的鬼魂在圣诞夜访问 Scrooge,警告他改变自己的生活方式,以免死后遭受同样的命运。
### 与三个圣诞鬼魂的关系
三个圣诞鬼魂(圣诞节的过去、现在和未来)分别访问 Scrooge,展示了他的过去、现在和可能的未来。这些访问深刻影响了 Scrooge,促使他反思自己的生活并最终改变了他的行为和态度。
### 与 Tiny Tim 的关系
Tiny Tim 是 Bob Cratchit 的儿子,他的健康状况和幸福成为 Scrooge 改变的一个重要动力。
### 与侄子 Fred 的关系
Scrooge 的侄子 Fred 代表了圣诞节的精神和乐观态度,尽管 Scrooge 最初拒绝了 Fred 的圣诞邀请,但最终他接受了 Fred 的善意,并与他和其他家庭成员建立了积极的关系。
## 结论
Ebenezer Scrooge 的故事是一个关于救赎和转变的经典故事。通过与 Bob Cratchit、Jacob Marley、三个圣诞鬼魂、Tiny Tim 和他的侄子 Fred 等关键角色的互动,Scrooge 从一个孤独、冷漠的人变成了一个充满同情和理解的人。
在实际生产环境中部署 GraphRAG 需要考虑以下因素:
本文介绍了 GraphRAG 相比传统的朴素 RAG 的优势以及其在商业落地上的局限性,并讲解了 GraphRAG 的基本使用。在实际操作过程中发现还是比较耗费 token 的,那 token 到底耗费在哪,其内部运行的流程又是怎么样的呢?
GraphRAG 的核心在于将非结构化文本转化为结构化的知识图谱,通过社区报告实现信息的层级化抽象。这使得它在处理需要跨文档推理、汇总类问题时具有显著优势。然而,高昂的计算成本和复杂的维护流程限制了其在小型项目中的普及。
对于开发者而言,理解其底层逻辑有助于更好地调优参数,平衡成本与效果。未来随着模型效率的提升和索引算法的优化,GraphRAG 有望在企业级知识库建设中发挥更大作用。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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