增量更新

为什么NodeRAG支持增量更新,以及GraphRAG和LightRAG之间有哪些区别?

在谈到增量更新时,之前的两种方法似乎采取了完全相反的路径。

GraphRAG使用三层Leiden算法在多个层次上抽象原始的同质知识图。Leiden算法的一个主要缺点是,即使只添加几个新节点也可能完全扰乱现有的社区结构。换句话说,尝试更新图可能会迫使你在所有三个层次上重新计算一套全新的社区和摘要。当然,有一些方法可以缓解这个问题,但它们通常会增加显著的复杂性——并浪费宝贵的计算资源。

GraphRAG社区结构

图1. GraphRAG的社区结构——功能强大,但难以高效更新

另一方面,LightRAG采取了一种简单得多的方法。它跳过了整个图摘要的想法,而是依赖于段落级别的结构,使用提取的关键词作为检索索引。这大大减少了处理时间和复杂性——但也意味着失去了GraphRAG提供的丰富的语料级信息增强。

LightRAG简洁性

图2. LightRAG通过依赖关键词简化了流程,但牺牲了上下文丰富的图摘要

NodeRAG旨在通过结合两种方法的优势,利用异质图的力量来取得平衡。首先,它仅使用Leiden算法的一层来识别社区内的高级信息——完全避开了三层复杂性。其次,得益于其在异质图上的浅层PPR算法,新节点可以直接合并到现有图中。这确保了语义相似的高维节点在图空间中保持接近,同时浅层PPR在检索期间帮助浮现最相关的节点。

让我们通过一个例子来说明。假设我们有一个以概念A为中心的社区(在异质图中表示为一个连接到较低级别节点的高级节点)。这个社区是在索引原始语料库时建立的。现在,我们添加新数据。NodeRAG为新语料库构建一个新的异质图——假设它形成了一个新的概念B社区。然后,NodeRAG自动合并新旧图。由于一些低级节点是共享的,概念A和概念B的社区变得相互关联。在检索过程中,当用户查询激活概念A下的节点时,浅层PPR算法在图中传播,可能会到达并突出概念B——特别是如果它的一些节点也是相关的入口点。

NodeRAG增量更新

图3. NodeRAG无缝合并新旧图,实现高效且上下文感知的更新

Last modified April 5, 2025: update reproduce (f23a25c)