GraphRAG + GPT-4o-Mini 是 RAG 的天堂

GraphRAG + GPT-4o-Mini 是 RAG 的天堂

Barry Lv6

第1部分:GraphRAG简介

图片来源于 DALL-E 3

免责声明: 该 GraphRAG 实现受到 Darren Edge 等人论文 From Local to Global: A Graph RAG Approach to Query-Focused Summarization 的启发。代码与 论文的代码库 并不完全相同,尽管某些任务的提示来自于 论文的代码库

这是关于 GraphRAG 的多部分博客系列中的 **第一篇博客**。在这个博客系列中,我们的目标是实现以下内容:

  1. 理解 GraphRAG 的基础
  2. GraphRAG 的必要性:GraphRAG 与基于语义/关键词的 RAG 的比较
  3. 从零开始在 Python 中实现 GraphRAG 组件
  4. 将 GraphRAG 应用于基于内容的电影推荐:“GraphRAG4Reccomendation”
  5. 使用 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过程分为以下三个关键组件。

  1. Extract
  2. Embed
  3. Query

让我们逐个了解这些组件。

提取

在提取组件中,我们进行以下操作,

  1. 提取实体
  2. 提取实体之间的关系
  3. 提取实体的声明
  4. 提取关系的声明

我们将通过一个例子来理解这一点。

假设我们有以下文本。

电影:《肖申克的救赎》 两名囚犯在多年的监禁中建立了联系,通过共同的体面行为找到安慰和最终的救赎。\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:检测社区并建立层次结构

我们可以根据类型将图分为以下两个社区。

  1. 剧情和犯罪社区
  2. 科幻和动作社区

基于类型的社区(作者)

我们可以使用层次社区检测算法——莱顿算法——将节点聚类到不同的社区中。

首先,让我们看看层次社区的结果。

层次社区(作者)

我们有以下层级。

  1. C0 — 电影:该社区包含我们数据集中所有的电影。它代表了跨越不同类型、时期和主题的多样化电影。这些电影共享导演、演员、类型和发行年份等共同元素,但在具体内容和风格上有所不同。
  2. C1 — 剧情和犯罪:该社区专注于以犯罪元素为特色的戏剧性叙事。
  3. C1 — 科幻和动作:该社区结合了科幻和动作元素。
  4. C2 — 纯科幻:该子社区以“黑客帝国”为代表,专注于科幻概念,强调动作元素。
  5. C2 — 科幻惊悚:该子社区以“盗梦空间”为代表,结合了科幻元素和心理惊悚的方面。

通过这个层级结构,我们有了全球和地方的分类。C0和C1集群/组/社区非常广泛——全球——而C2集群/组/社区则非常具体——地方。

嵌入步骤 4:总结社区

  1. 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
2
3
4
5
6
{
"community": "Drama & Crime C1",
"relevance_score": 95,
"movies": ["The Shawshank Redemption"],
"reason": "直接符合犯罪剧类型请求"
}
  • 科幻与动作 C1
1
2
3
4
5
6
{
"community": "Sci-Fi & Action C1",
"relevance_score": 10,
"movies": ["Inception", "The Matrix"],
"reason": "不符合犯罪剧类型请求"
}
  • 纯科幻动作 C2
1
2
3
4
5
6
{
"community": "Pure Sci-Fi Action C2",
"relevance_score": 5,
"movies": ["The Matrix"],
"reason": "不符合犯罪剧类型请求"
}
  • 科幻惊悚 C2
1
2
3
4
5
6
{
"community": "Sci-Fi Thriller C2",
"relevance_score": 15,
"movies": ["Inception"],
"reason": "有一些惊悚元素,但不是犯罪剧"
}

归约阶段

映射阶段的输出与用户查询一起传递给归约器,以获取相关建议列表以及其他推荐。

查询归约阶段(作者)

以下是归约阶段输出的样子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"relevant_communities": [
{
"community": "Drama & Crime C1",
"relevance_score": 95,
"movies": ["The Shawshank Redemption"]
}
],
"other_suggestions": [
{
"community": "Sci-Fi Thriller C2",
"relevance_score": 15,
"movies": ["Inception"]
}
]
}

此外,我们可以通过提供用户查询和相关社区及电影详情与建议,利用 LLM 来传达此输出。我们可以提示 LLM 根据用户查询和相关电影及额外建议个性化输出。

结论

在本博客中,我们介绍了GrapRAG及其关键组件——提取、嵌入和查询。同时,我们还学习了使用Leiden算法进行层次社区检测。在接下来的博客中,我们将基于这些知识开发一个用于基于内容的电影推荐系统的GraphRAG模块——GraphRAG4Recommendation。

第2部分:GraphRAG与基于语义/关键词的RAG 中再见。

  • 标题: 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 进行许可。