GraphRAG + GPT-4o-Mini 是 RAG 的天堂
第1部分:GraphRAG简介
图片来源于 DALL-E 3
免责声明: 该 GraphRAG 实现受到 Darren Edge 等人论文 From Local to Global: A Graph RAG Approach to Query-Focused Summarization 的启发。代码与 论文的代码库 并不完全相同,尽管某些任务的提示来自于 论文的代码库 。
这是关于 GraphRAG 的多部分博客系列中的 **第一篇博客**。在这个博客系列中,我们的目标是实现以下内容:
- 理解 GraphRAG 的基础
- GraphRAG 的必要性:GraphRAG 与基于语义/关键词的 RAG 的比较
- 从零开始在 Python 中实现 GraphRAG 组件
- 将 GraphRAG 应用于基于内容的电影推荐:“GraphRAG4Reccomendation”
- 使用 GPT-4o-Mini 创建图形并提供推荐
到这个多部分博客系列结束时,我们将实现以下输出。



作者实现输出
以下是 GraphRAG4Rec 代码库的 GitHub 仓库。
其他部分
- 第2部分:GraphRAG与基于语义/关键字的RAG
- 第3部分:提取 — 实体、关系和声明以构建图 (即将推出)
- 第4部分:批量社区和准备摘要报告 (即将推出)
- 第5部分:通过map-reduce提示进行查询处理和推荐生成 (即将推出)
在本博客中,
我们将通过一个例子来理解GraphRAG的基本原理.
什么是 GraphRAG?
GraphRAG 是一种先进的基于图的检索增强生成(Graph-based Retrieval Augmented Generation,GraphRAG)方法,介绍于 Darren Edge 等人撰写的论文 从局部到整体:一种面向查询的图 RAG 方法。该方法结合了图论、信息检索和 LLMs。
核心概念是,我们文本中的实体被表示为图中的节点,而这些实体之间的关系则表示为节点之间的边。图随后被分层划分为社区,并总结为社区报告。
在查询时,我们需要决定应该多深入探索社区以找到相关社区。探索的深度越大,计算/LLM 调用的次数就越多。
一旦检索到相关社区,我们可以使用这些社区的摘要报告来回答用户查询。
以下图表描绘了整个过程。
GraphRAG 图表由作者提供
GraphRAG的关键组件
如上图所示,我们将GraphRAG过程分为以下三个关键组件。
- Extract
- Embed
- Query
让我们逐个了解这些组件。
提取
在提取组件中,我们进行以下操作,
- 提取实体
- 提取实体之间的关系
- 提取实体的声明
- 提取关系的声明
我们将通过一个例子来理解这一点。
假设我们有以下文本。
电影:《肖申克的救赎》 两名囚犯在多年的监禁中建立了联系,通过共同的体面行为找到安慰和最终的救赎。\n年份:1994\n导演:弗兰克·达拉邦特\n演员:[‘蒂姆·罗宾斯’, ‘摩根·弗里曼’, ‘鲍勃·冈顿’, ‘威廉·萨德勒’]\n证书:A
步骤 1:提取实体
- 肖申克的救赎 (电影)
- 弗兰克·达拉邦特 (人 — 导演)
- 蒂姆·罗宾斯 (人 — 演员)
- 摩根·弗里曼 (人 — 演员)
- 鲍勃·冈顿 (人 — 演员)
- 威廉·萨德勒 (人 — 演员)
- 1994 (年份)
- A (证书)
步骤 2:提取关系
- 肖申克的救赎 — 由…导演 — 弗兰克·达拉邦特
- 肖申克的救赎 — 主演 — 蒂姆·罗宾斯
- 肖申克的救赎 — 主演 — 摩根·弗里曼
- 肖申克的救赎 — 主演 — 鲍勃·冈顿
- 肖申克的救赎 — 主演 — 威廉·萨德勒
- 肖申克的救赎 — 于…上映 — 1994
- 肖申克的救赎 — 拥有证书 — A
步骤 3–4:提取实体和关系的声明
- 肖申克的救赎:“两名囚犯在多年的监禁中建立了联系,通过共同的体面行为找到安慰和最终的救赎。”
- 肖申克的救赎:于1994年上映
- 肖申克的救赎:拥有证书A
中心节点将是电影的名称 — 肖申克的救赎。
如果我们要绘制实体、关系和声明,它将看起来像下面的图像。
提取:节点、边和声明(作者)
嵌入
在处理所有文档的第一个组件——提取——所需步骤后,提取的信息将嵌入到图中。
由于我们需要将电影嵌入到图中,让我们再来看两个电影文本。
“电影:‘盗梦空间’\n类型:[‘科幻’, ‘动作’, ‘惊悚’]\n年份:2010\n导演:克里斯托弗·诺兰\n演员:[‘莱昂纳多·迪卡普里奥’, ‘约瑟夫·高登-莱维特’]\n评级:PG-13”
“电影:‘黑客帝国’\n类型:[‘科幻’, ‘动作’]\n年份:1999\n导演:沃卓斯基兄弟\n演员:[‘基努·里维斯’, ‘劳伦斯·菲什伯恩’]\n评级:R”
盗梦空间的提取输出
步骤 1:提取实体
- 盗梦空间 (电影)
- 克里斯托弗·诺兰 (人物 — 导演)
- 莱昂纳多·迪卡普里奥 (人物 — 演员)
- 约瑟夫·高登-莱维特 (人物 — 演员)
- 2010 (年份)
- PG-13 (评级)
- 科幻 (类型)
- 动作 (类型)
- 惊悚 (类型)
步骤 2:提取关系
- 盗梦空间 — 由…导演 — 克里斯托弗·诺兰
- 盗梦空间 — 主演 — 莱昂纳多·迪卡普里奥
- 盗梦空间 — 主演 — 约瑟夫·高登-莱维特
- 盗梦空间 — 发行于 — 2010
- 盗梦空间 — 评级为 — PG-13
- 盗梦空间 — 类型为 — 科幻
- 盗梦空间 — 类型为 — 动作
- 盗梦空间 — 类型为 — 惊悚
步骤 3–4:提取实体和关系的声明
- 盗梦空间:“一名拥有从人脑中‘提取’信息的稀有能力的熟练小偷被提供一个机会,以此作为报酬来恢复他过去的生活,这个任务被认为是不可能的:‘盗梦’,即将另一个人的想法植入目标的潜意识中。”
- 盗梦空间:发行于2010
- 盗梦空间:评级为PG-13
- 盗梦空间:是一部科幻电影
- 盗梦空间:是一部动作电影
- 盗梦空间:是一部惊悚电影
黑客帝国的提取输出
步骤 1:提取实体
- 黑客帝国 (电影)
- 沃卓斯基兄弟 (人物 — 导演)
- 基努·里维斯 (人物 — 演员)
- 劳伦斯·菲什伯恩 (人物 — 演员)
- 1999 (年份)
- R (评级)
- 科幻 (类型)
- 动作 (类型)
步骤 2:提取关系
- 黑客帝国 — 由…导演 — 沃卓斯基兄弟
- 黑客帝国 — 主演 — 基努·里维斯
- 黑客帝国 — 主演 — 劳伦斯·菲什伯恩
- 黑客帝国 — 发行于 — 1999
- 黑客帝国 — 评级为 — R
- 黑客帝国 — 类型为 — 科幻
- 黑客帝国 — 类型为 — 动作
步骤 3–4:提取实体和关系的声明
- 黑客帝国:“一名计算机程序员发现他所知道的现实是由机器创造的模拟,以压迫人类,并加入反抗军推翻他们。”
- 黑客帝国:发行于1999
- 黑客帝国:评级为R
- 黑客帝国:是一部科幻电影
- 黑客帝国:是一部动作电影
嵌入步骤 1:创建图
现在我们有了所有三部电影的 _实体、关系和声明_,我们可以**嵌入**这些到一个图中,如下所示。
嵌入实体、关系和声明(作者)
嵌入步骤 2–3:检测社区并建立层次结构
我们可以根据类型将图分为以下两个社区。
- 剧情和犯罪社区
- 科幻和动作社区
基于类型的社区(作者)
我们可以使用层次社区检测算法——莱顿算法——将节点聚类到不同的社区中。
首先,让我们看看层次社区的结果。
层次社区(作者)
我们有以下层级。
- C0 — 电影:该社区包含我们数据集中所有的电影。它代表了跨越不同类型、时期和主题的多样化电影。这些电影共享导演、演员、类型和发行年份等共同元素,但在具体内容和风格上有所不同。
- C1 — 剧情和犯罪:该社区专注于以犯罪元素为特色的戏剧性叙事。
- C1 — 科幻和动作:该社区结合了科幻和动作元素。
- C2 — 纯科幻:该子社区以“黑客帝国”为代表,专注于科幻概念,强调动作元素。
- C2 — 科幻惊悚:该子社区以“盗梦空间”为代表,结合了科幻元素和心理惊悚的方面。
通过这个层级结构,我们有了全球和地方的分类。C0和C1集群/组/社区非常广泛——全球——而C2集群/组/社区则非常具体——地方。
嵌入步骤 4:总结社区
- C1 — 剧情和犯罪
- 强烈的人物驱动叙事
- 探索人际关系和情感
- 正义、救赎和毅力的主题
- 对刑事司法系统的现实描绘
2. C1 — 科幻和动作
- 未来或替代现实的背景
- 令人费解的概念和技术
- 智力刺激与视觉盛宴的结合
- 探索现实和意识的本质
3. C2 — 纯科幻动作
- 反乌托邦的未来背景
- 高级技术作为中心情节元素
- 高强度的动作场景
- 人类与机器的主题
4. C2 — 科幻惊悚
- 复杂、层次丰富的叙事
- 心理操控和探索
- 现实与想象之间的模糊界限
- 智力难题和令人费解的概念
总结报告还可以包含奖项、演员表现目录、票房结果等内容。
我们将稍作绕行,了解莱顿算法与电影的例子。
关于莱顿算法
莱顿算法是改进版的洛特万方法,用于社区检测。它通过优化模块度来工作——模块度是衡量社区内部链接密度与社区之间链接的比率。
首先,让我们理解一下 _模块度_。
模块度是衡量网络如何划分为社区的指标。我们可以将其理解为,
- 高模块度意味着社区内部有许多连接,而不同社区之间的连接很少。
- 低模块度意味着连接更均匀分布,没有明显的社区结构。
以我们的电影示例为例,高模块度意味着一个社区内的电影具有许多共享特征,比如科幻和动作社区。低模块度意味着特征共同点较少,比如戏剧和犯罪社区。
层次社区检测步骤
让我们来看一下电影示例的社区检测步骤。
步骤 1:从单个节点开始
每部电影作为自己的社区开始。
- 社区 1:肖申克的救赎
- 社区 2:盗梦空间
- 社区 3:黑客帝国
步骤 1(作者)
步骤 2:将节点合并为社区
查看电影之间的连接,例如共享的类型或主题,并在提高模块度的情况下进行合并。
- 将盗梦空间和黑客帝国合并为一个科幻与动作社区。
- 肖申克的救赎保持在自己的剧情与犯罪社区中。
步骤 2(作者)
步骤 3:创建第一级层次 (C1):
- C1 社区 1:剧情与犯罪(肖申克的救赎)
- C1 社区 2:科幻与动作(盗梦空间,黑客帝国)
步骤 3(作者)
步骤 4:将社区视为节点
现在将社区视为节点。
步骤 4(作者)
步骤 5:在更高层次上重复步骤 1、2 和 3
寻找这些社区节点之间的连接。在这种情况下,社区数量不足以进一步合并,因此我们在 C0 层次停止。
步骤 6:细化较低层次
回到科幻与动作社区,寻找子社区。
- 根据它们更具体的特征拆分盗梦空间和黑客帝国。
步骤 6(作者)
步骤 7:创建第二级层次 (C2)
- C2 社区 1:纯科幻动作(黑客帝国)
- C2 社区 2:科幻惊悚(盗梦空间)
步骤 7(作者)
最后,我们得到了以下层次结构。
最终社区层次结构(作者)
查询
在 查询 部分,我们使用映射-归约方法通过映射操作来查找相关社区。映射输出随后被提供给归约器(reducer)以回答用户查询。
让我们通过一个示例查询来看看查询过程—— 我想看一部犯罪剧。
以下是整个过程的样子。
查询步骤(作者)
映射阶段
我们首先进入映射阶段。在这里,每个社区报告都被传递给映射器,映射器会输出该社区与给定查询的相关性以及相关电影。
查询映射阶段(作者)
映射阶段通过每个社区的输出将如下所示。
- 剧情与犯罪 C1:
1 | { |
- 科幻与动作 C1
1 | { |
- 纯科幻动作 C2
1 | { |
- 科幻惊悚 C2
1 | { |
归约阶段
映射阶段的输出与用户查询一起传递给归约器,以获取相关建议列表以及其他推荐。
查询归约阶段(作者)
以下是归约阶段输出的样子。
1 | { |
此外,我们可以通过提供用户查询和相关社区及电影详情与建议,利用 LLM 来传达此输出。我们可以提示 LLM 根据用户查询和相关电影及额外建议个性化输出。
结论
在本博客中,我们介绍了GrapRAG及其关键组件——提取、嵌入和查询。同时,我们还学习了使用Leiden算法进行层次社区检测。在接下来的博客中,我们将基于这些知识开发一个用于基于内容的电影推荐系统的GraphRAG模块——GraphRAG4Recommendation。
- 标题: GraphRAG + GPT-4o-Mini 是 RAG 的天堂
- 作者: Barry
- 创建于 : 2024-07-22 02:07:52
- 更新于 : 2024-08-31 06:59:45
- 链接: https://wx.role.fun/2024/07/22/e9f4c687fac245ff9c773dbd2143eb82/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。