NebulaGraph 的 GraphRAG 进展、实践

文摘   2024-11-09 18:04   北京  

导读 大家好,我是古思为,我们团队主要做 NebulaGraph 这个项目,它是一个很多国内外厂商都在用的开源的分布式图数据库,同时我们也做开源社区。本次分享将介绍我们这一年多来在 GraphRAG 方面的工作。文章将从三个方面展开,首先是去年 8 月提出 GraphRAG 方法时解决的问题、简单的策略与经验以及后面业界产生的新方法,接着分享我们在 GraphRAG 领域的沉淀以及在产品中的应用,最后简单介绍一下对未来工作的规划。

主要内容包括以下几个部分:

1. GraphRAG 背景介绍

2. 我们的方法

3. 未来工作

分享嘉宾|古思为 NebulaGraph GenAI TL 

编辑整理|胡绍阳

内容校对|李瑶

出品社区|DataFun


01

GraphRAG 背景介绍

首先来分享一下提出 GraphRAG 想要解决的问题。

1. RAG 范式

先从 RAG 本身说起,RAG 的范式本质上是利用大模型的推理、学习能力,在归纳任务中,需要了解模型和预训练之外的上下文和领域知识,因此需要做额外的检索环节,最朴素的方法是使用索引算法。首先,使用向量语义化地表示原始数据,并进行深入分析,然后对这些数据建立索引,查询阶段依据相关性来定位所需的上下文信息,进而展开后续的学习过程。

实际上,构建一个 RAG 的 DEMO 是很容易的,挑战在于面向企业进行应用。现在在全生命周期有着各种工作,索引层面的技术包括 Chunk and Embedding / BM25、生成 QA 对、分层块摘要等,查询层面的技术包括 Vector / Hybrid Search、Rewrite Query、递归搜索 / 复合搜索、Agentic、重排等。

2. RAG 挑战

Graph 可以帮助 RAG 面对如下一些挑战:

  • 细粒度检索:碎片化知识的召回

    举个例子,做 chunk 分块是一个很强的对信息浓度的假设,无论是用语义的方式还是固定大小来分块,一旦确定了这个分块,其实对知识被召回的数据的信息浓度做了一个很强的假设,有的时候就存在一些重要而细粒度的分散的信息没办法进行召回,质量就会有些损失。

  • 全局上下文:丢失链接

    这里指的是,索引的知识块中,核心知识点和其他知识点的关联,有些知识有局部性,例如 A 和 B 在一个块关联,B 和 C 在一个块关联,C 和 D 在一个块关联,如果某些任务依赖于全局的上下文,但任务中又只提及 A 和 D,这中间的关联在做 chunk 的 RAG 索引一般是丢失的,无法获取全局上下文的关联。

  • 语义相似度:相关性错配

    传统 RAG 的索引的方法追求的是相似,但是 RAG 捞取上下文学习的目标是相关,相似和相关很大程度是一回事,但他们之间也存在没有交集的一部分,这种情况其实就是相似性召回中产生幻觉的一种来源。

  • 分层摘要:宏观问题挑战

    例如索引了 100 首诗,有一种类型的问题需要回答哪些诗与家国情怀或者自然景观有关,这种情况下用 RAG 就可以,但如果问哪些诗比较奇怪,这属于宏观性的问题,这类问题可以通过上下文总体学习来召回,或者做一定程度的分层摘要来回答,总之必须了解整体诗集讲什么才能回答。
接下来讲解挑战的一些细节。

(1)大海捞针

首先来看细粒度的挑战,我们称其为大海捞针(Needle in Haystack):

  • 分割内容可能会使检索细粒度、分散的知识变得具有挑战

  • 分区可能会在多个片段中稀释关键信息,使其更难捕获完整的上下文。

上图中给出了一个具体的例子,下方是基础 RAG 的流程,上方是对索引到的非结构化数据做 chunk,每一部分算出语义的向量表示并存储起来,在回答的时候根据任务的描述找最相关的信息项。

例如基于乔布斯的自传问乔布斯和苹果有哪些事迹,这里的苹果在整句话中具有很重要的权重,其在 chunk 中的分布有两种情况,一种是大部分的 chunk 都在讲苹果,这种情况在 Top n 里是很容易 cover 的。另一种情况是包含苹果的 chunk 是在讲其他主题,关于苹果的内容只有两三句,这种情况下苹果这个语义被稀释在整体的 chunk 里,想要捞取这些被稀释的点将是一大挑战。

(2)穿针引线

第二个挑战叫做穿针引线(Connecting the Dots),这个挑战的关键点在于:

  • 线性分割大块知识可能会导致丢失全局上下文 / 连接;

  • 面向连接的检索在上下文分散在多来源(不具有局部性)时可能有挑战。

(3)相似性 vs 相关性

另一个挑战是语义相似度 ≠ 上下文相关性 (基于嵌入的 RAG),这个挑战的关键点在于:

  • 基础模型通常依赖于常识或字面意义,导致相关性(相关性幻觉)的错误正例;

  • 高相似度(例如,95%)并不保证相关性;上下文无关的片段可能看起来非常相似(例如,虚构的食谱或不存在的情节)。线性分割大块知识可能会导致丢失全局上下文 / 连接面向连接的检索在上下文分散在多来源(不具有局部性)时可能有挑战。

举个“相似但不相关”的例子,上面的图片是保温杯,下面是保温大棚,两者 token 在很大比例上表达共同的语义:“保温”,在一些场景想要了解保温杯的时候召回了保温大棚的信息,这明显是不对的,所以在索引阶段即使设置了比较高置信度,也很可能因为其相似性而得到不相关的信息。

(4)盲人摸象

这个挑战会呼应前面提到的全局宏观的问题,其关键点在于:

  • 难以从多个来源的分散信息中回答广泛、全局的问题;

  • 需要从整个数据集中总体获得洞察,而不是某几个孤立的片段。

举个形象的例子,如果将树比喻成知识,整片森林(所有的树)代表全部知识,如果问这个森林是什么形状的,很明显这是一个宏观的问题,当只召回到一部分的树是无法回答这个问题的。

3. 图结构数据

知识图谱是精炼和简洁的,并且有细粒度的分段和相互连接的结构,直观上感觉这种形式的组织和索引一定是和语义分块的方法形成某种互补的。

4. GraphRAG

GraphRAG 是一种利用图结构数据/知识来辅助检索、重排、合成的 RAG 方法。GraphRAG 中 Retrieval 策略叫做 SubGraph RAG,我们称其为低垂的果实。

在基础的 RAG 流程中,对原始数据除了做向量索引之外,还要用大模型粗略做一个知识图谱的抽取,形成点与边关联的网状结构。在问答的时候,除了做检索、召回之外,还可以针对给定的任务描述在图上抽取关键词或关键实体,从关键词或关键实体出发,在图上按照语义找到最接近的点,从而以某种策略找到关联的知识,然后按照模版形成新的文本片段,再和其它路进行合并。我们将这一策略落地实现在了产品中。

5. GraphRAG Examples

接下来将介绍如何利用 GraphRAG 解决这些挑战:

  • 相关性 vs 相似性

  • 大海捞针

  • 穿针引线

  • 投影 Meta/Domain 知识到 Pipeline

  • Graph Algo:

    Node Importance(HippoRAG)

    Community Detection(MS From Local to Global)

  • 结构化数据 RAG

(1)相关性 vs 相似性

在相关性与相似性这个挑战上,这里比较了 Chunk-Based Baseline RAG 和 GraphRAG 的区别。

  • 在检索方法方面,Chunk-Based Baseline RAG 是基于整体相似性进行语义向量搜索,同时查询与块匹配以寻找相似上下文。而 GraphRAG 从关键实体开始图形检索,同时使用图推理或子图检索通过关系找到相关上下文。

  • 在相关性评估方面,Chunk-Based Baseline RAG 依赖语义相似性,基于概率阈值比较整个查询与块,同时倾向于找到"相似"的上下文,即使它们不相关。而 GraphRAG 从细粒度实体提取开始,遵循高质量关系(手动定义或由大型语言模型定义)进行精确的上下文匹配。

  • 在生成准确性方面,Chunk-Based Baseline RAG 会产生幻觉答案,而 GraphRAG 能够正确识别缺乏相关内容。

(2)大海捞针

针对大海捞针(Needle in Haystack)这一挑战,这里比较了 Baseline RAG 和 GraphRAG && VectorRAG 的区别。

  • 在检索方法方面,Baseline RAG 依赖向量搜索基于查询的整体相似性检索块,而 GraphRAG && VectorRAG 是结合向量搜索和基于图的索引,以实现更全面的上下文检索。

  • 在细粒度检索方面,Baseline RAG 能成功检索出包含⾼浓度 NASA 相关内容的块,然而⼀些细粒度的信息可能在聚焦于其他主题的块中被稀释。GraphRAG && VectorRAG 能有效捕获高浓度 NASA 块和较小的、分散的相关信息片段,同时图索引有助于连接分散的知识。

  • 在上下文完整性方面,Baseline RAG 由于稀释而存在遗漏关键小段的风险,同时可能导致答案不完整。GraphRAG && VectorRAG 能通过合并向量和图方法实现最佳性能,同时通过链接相关实体确保更完整和连贯的问题相关知识检索。

(3)穿针引线

在穿针引线(Connect the Dots)这个挑战上,这里比较了 Baseline RAG 和 GraphRAG。

  • 在检索方法方面,Baseline RAG 利用语义向量搜索基于整体相似性匹配查询与整个知识库块,但对于需要多跳推理和理解复杂互连的查询效果不佳。GraphRAG 采用基于图的检索,从关键实体开始,跨多个跳跃遍历关系。同时利用知识图谱来连接实体并追踪相关路径,以全面收集信息。

  • 在多跳查询方面,Baseline RAG 在处理多跳查询时遇到困难,因为无法有效地跟踪分段块之间的关系,除非信息在同⼀块内(这并不总是如此),否则无法连接分散的信息片段。GraphRAG 通过遵循知识图谱中的关系,高效管理多跳查询。同时可以从(全球金融危机)无缝导航到(监管变化),然后到(银行 X 的信贷政策)。

  • 在关系捞取方面,Baseline RAG 捕捉分布在不同块中的实体之间复杂相互关系的能力有限,同时可能忽视对全面理解至关重要的关键连接。GraphRAG 擅长识别和利用实体之间的相互关系,同时能整合来自各种相互连接节点的信息,提供全面和准确的响应。

(4)领域知识、数据的理解到 RAG Pipeline 的投射

在领域知识、数据的理解到 RAG Pipline 的投射这个挑战上,这里比较了 Traditional RAG 和 GraphRAG 的区别。

  • 在索引策略方面,Traditional RAG 采用树状结构,硬编码检索,而GraphRAG 具有灵活查询策略的图索引。

  • 在知识集成方面,Traditional RAG 知识集成能力有限,缺乏深度推理,而 GraphRAG 具备封装元知识和推理的能力。

  • 在检索效率方面,Traditional RAG 比较僵化,需要自定义逻辑。GraphRAG 比较灵活,实用现有查询语言(Cypher)和/或 GraphRAG 策略。

  • 在泛化能力方面,Traditional RAG 适应性有限,而 GraphRAG 除图建模本身外,广泛适用于各个领域。

(5)Node Importance And Community Detection

从广义来说只要在 RAG 的全周期中涉及到图的结构、图的算法、图的属性等都叫 GraphRAG。这里给大家分享 2 篇很有名的涉及图属性的论文。

第一篇论文是讲节点的重要性,其实在一张图中不是每个点都是平等的,有些点就是比其它点更加重要,重要性的依据可以在图上利用属性使用不同的算法,例如 Page RANK 或者中心性的重要性算法。这篇论文叫 HippoRAG,它是由人脑科学启发去构建 RAG。类似于人脑中的记忆结构,HippoRAG 是一个网状图状,它修改了 Page RANK 去设定被索引的知识点或者是知识文档结构块的重要性,这个重要性的权重就会影响到 Query 时候的选择。

第二篇论文是微软的 GraphRAG:From Local to Global,其中做了非常多细节的工作,例如定义了什么是 Local 问题,什么是 Global 问题,其中特别有意思的一个点是,当他们想解决 Global 问题的时候,例如几百个诗集里哪些最奇怪和特别,这篇论文将所有的数据做了一个图索引,构建好图之后在上面跑了一个社区发现的算子,这个算子能找出哪些节点更具有聚合性,通过颜色来反映不同的簇,然后直接拿所有社区的总结来回答哪些主题比较奇怪。

(6)结构化数据 RAG

这里讲的是 text-to-SQL 的案例在 text-to-GraphQuery 时可能更高效。例如构建一个风控图谱,来回答面向连接、路径的查询,用图的查询语言是非常简洁的。

6. GraphRAG 常见问题

接下来讨论一些常见的问题。

(1)GraphRAG 昂贵吗?

我们的答案是既贵又不贵。说不贵的原因是如下:

  • GraphRAG 将上下文学习转移到索引阶段

    推理成本最多约为原始知识的 20 倍 token

    存在权衡取舍,有多种可选策略

    这是一种馈赠而非负担,我们可以选择哪些知识进行开卷考试的预先学习

  • 索引阶段的优势:

    批量 API 使用

    微调的小型模型

  • 有 NER-Link 模型可以利用:

    模型的大小要小很多,可以用来辅助做图的索引。

(2)何时/为何使用 GraphRAG?

  • 大海捞针(Needle in a Haystack):

    当需要细粒度检索或连接分散信息时,Graph Index 和 Retrieval 提供最佳解决方案。

  • 分层索引与摘要:

    当需要分层索引和摘要时,将 RAPTOR/Tree-RAG 集成到 Graph DB 中可以将检索转化为灵活的查询模式模板。

  • 全局搜索:

    当需要全局上下文或全面理解时,GraphRAG 中的社区检测摘要优于传统方法。预先学习的整体知识表现更好,而等效查询时间的(不使用 GraphRAG 的)RAG 需要将所有知识传递给 LLM。

  • 领域知识集成:

    当将领域知识嵌入到流程中时,将这些知识投影和抽象到图模式中是元方法,能够实现稳健的推理和高效的检索。

(3)GraphRAG 和 KG-RAG 对比

二者的主要区别点如下:

  • GraphRAG:

    一个更广泛的概念,具有灵活的图形索引结构。

    对图结构的要求较低;更具成本效益。

    检索通常涉及对图的较少严格推理,对图索引质量的依赖性较低。

  • KG-RAG:

    GraphRAG 的一个特殊(更理想)情况。

    图索引涉及完整的知识图谱构建。

    将现有或公共知识图谱集成到 RAG 流程中,利用其结构化、高质量的数据进行精确推理和检索。

(4)GraphRAG 分类

我们尝试将 GraphRAG 进行分类,横轴的维度包括:特定领域和通用领域;纵轴包括知识型、分析型。这几种情况对应 GraphRAG 的策略是不一样的,策略涉及三个方面:Schema、编排(Orchestration)、检索(Retrieval)。

  • Schema 有以下 3 种方法:

    无 Schema 知识图谱 (Knowledge Graph Schema-less)

    有 Schema 知识图谱 (Knowledge Graph Schema-full)

    图索引中的元知识 (Meta Knowledge in Graph Index)

  • 编排 (Orchestration)有以下3种方法:

    与其他 RAG 检索结果重新排序 (Rerank with other RAG retrieval results)

    代理式图查询模板 (Agentic Graph Query Template)

    全图处理 (All in Graph)

  • 检索 (Retrieval)有以下 5 种方法:

    子图检索 (SubGraph Retrieval)

    路径检索 (Path Retrieval)

    基于模板的复杂查询 (Template based Complex Query)

    文本到图查询 (Text-to-Graph Query)

    基于规划的图检索 (Planning based Graph Retrieval)

02

我们的工作

接下来分享我们在过去一年多时间中所做的尝试与探索,主要介绍两款产品:NebulaGraph GenAI Suite 和 NebulaGraph RAG。

1. NebulaGraph GenAI Suite

NebulaGraph GenAI Suite 这个套件以 SDK 的形式呈现,使得客户可以不用关心 GraphRAG 中的复杂机制,直接引用到自己的 pipeline 中。该产品主要实现了 4 个工作:Graph Indexing、Text-to-Query、KG-Reasoning 和 GraphRAG Pipeline。

(1)Graph Indexing

第一个工作是 Graph Indexing,主要包括以下几个方面:

  • CoT based Prompting

  • Predefined General Schema

  • Remote Callable Extractor

  • Schema Auto-Templating(WIP)

(2)Text to Query

第二个工作是 Text to Query,适合于对分析型的图的问题,做了很多优化工作,包括:

  • Rule based Correction

  • Agentic Self-Reflection(Optional)

  • AST based Correction(WIP)

(3)Chain of Exploration

第三个工作是 Chain of Exploration,这是 KG-RAG 做的工作,这个方法是模仿领域专家拿着高质量图谱来逐步探索的过程。

(4)GraphRAG 编排

第四个工作是 GraphRAG 编排,就是在 RAG pipeline 中引入 GraphRAG 的策略,主要包含下面几个策略:

  • SubGraphRAG(less invasive)

  • Existing KG-RAG with CoE

  • Doc-Aware

  • Doc-Aware with Community Summary

  • Doc-Aware with Community Summary + CoE

2. NebulaGraph RAG

NebulaGraph RAG 是我们做的第二个产品。因为我们发现只给用户提供 SDK 实际用起来并不太容易,因此需要一个开箱即用的产品,目标是让不了解编程的领域专家也能利用到这种技术。这个产品做的是企业级的知识管理,按照范式和目的分成不同的集合,形成不同模态的知识,可选择不同的索引,有向量的索引、有 Graph 的索引。

03

未来工作

未来规划中的工作包括:

  • Memory: 高级 Graph-Based Memory,以应对长期问题。其中包括多个不同层级的summary,可以按不同主题找到之前升华的结论。

    DAG Store: 建立元知识持久化层。将元数据以图的形式持久化下来,使部分用户可以 online地进行优化。

    原生向量存储: 构建大规模统一知识层。

    微调工具包/微调模型用于 GraphRAG 索引/检索。

回顾本次分享,主要探讨了 3 方面内容,从一开始对 RAG 的理解和对 Graph 的积累,促使我们提出了 GraphRAG 的方法和实现;然后随着问题的深入发现更多的挑战,以及如何融合其他好的方法,例如微软和其他学界做的工作;接着又介绍了我们的产品的一些细节;最后分享了我们未来想做的工作。

最后,欢迎大家继续关注我们的工作。

以上就是本次分享的内容,谢谢大家。


分享嘉宾

INTRODUCTION


古思为

NebulaGraph

GenAI TL

NebulaGraph 团队 GenAI 总监

NebulaGraph 社区 Commiter、LlamaIndex top 贡献者

NebulaGraph AI Suite 项目作者

Microsoft MVP Python&AI

GraphRAG 技术最初提出与开源(LlamaIndex)实现作者

往期推荐


AIGC 在蚂蚁保保险领域的应用探索

腾讯大数据实时湖仓智能优化实践

百川智能:深度学习大模型推理性能优化策略

统一元数据管理 - Gravitino 在 B 站的最佳实践

大模型与行业融合:推动钢铁、医疗、教育领域的智能化变革

多模态大语言模型领域进展分享

智能驾驶技术趋势及成熟应用场景

面向生成式 AI 的向量数据库:架构,性能与未来趋势

360在图文多模态大模型领域的突破与实践

西门子利用 LLM 打造通用公司智能助理的实践

点个在看你最好看

SPRING HAS ARRIVED

DataFunSummit
DataFun社区旗下账号,专注于分享大数据、人工智能领域行业峰会信息和嘉宾演讲内容,定期提供资料合集下载。
 最新文章