Featured image of post 『Blog』利用图结构实现全局视角的 RAG

『Blog』利用图结构实现全局视角的 RAG

本文介绍了如何通过构建图索引和社区划分来实现全局性的检索式生成(RAG),并在评测中证明其在全面性与多样性上均优于传统 RAG。

关键词:RAG(Retrieval-Augmented Generation)、LLM(Large Language Model)、QFS(Query-Focused Summarization)、知识图谱、图社区划分

在大模型(LLM)飞速发展的当下,如何让模型高效地从海量文本数据中“检索并生成”(Retrieval-Augmented Generation,简称 RAG)令人满意的回答,已经成为自然语言处理和信息检索等领域的重要话题。虽然业界已经出现大量基于向量检索的 RAG 系统,但当问题不再是简单的“某个知识点在哪篇文档里”时,这些系统往往力不从心,尤其是当用户想要对整个语料库进行“全局性”的问题分析,如“这个数据集中涉及哪些关键主题?”或者“核心争论有哪些方面?”等。

对这类“全局性”的问题,人们更倾向将其定义为“面向查询的摘要”(Query-Focused Summarization,QFS)任务。一旦数据规模过大(例如数百万甚至上千万字符),传统的直接摘要或向量检索难以兼顾效率与信息覆盖度。为了解决这一痛点,研究者提出了 Graph RAG(图索引 + RAG)方案,在预处理阶段先通过大模型提取出数据所蕴含的实体、关系等元素,并构建一个“知识图”,再利用社区划分(community detection)将其拆解成若干“小块”信息进行摘要,最终在查询时对这些社区的部分回答进行多轮摘要融合,生成面向全局问题的回答。

下文将带领读者 dive into GraphRAG 的核心思路和技术实现,并以此分析它在全局问题场景下的优势与局限性。


背景与挑战

为什么传统 RAG 难以应对“全局”问题

  • RAG 的优点
    当下主流的 RAG 系统往往将海量文本切分成若干小块,计算向量嵌入后,通过最近邻检索来获取与用户问题最相关的文本,再将检索到的内容拼接到大模型的上下文中,进行回答生成。对“某一事实是否出现于何处”或“给定实体的属性是什么”等问题,RAG 的效果相当不错。

  • RAG 的不足
    当问题面向整个数据集,需要对多个文档或多个主题进行整合归纳对比时,仅仅检索少数局部文段很难得到足够上下文来回答。例如:“该数据集中主要讨论了哪些健康政策?”这种问题往往需要在“横向”上检查大量文本,而不仅仅是聚焦某几段文档。
    因此,这类问题更倾向被认为是“多文档摘要”或“面向查询的摘要”,而“拿几个最相似的文本段来回答”通常无法保证全面性和多样性。

用图结构来做“全局性”摘要

为克服这一问题,一种思路是:在对数据进行索引时,不仅简单做向量嵌入和文本检索,而且要构建出反映实体、关系、事件等关键信息的图结构。之后,利用图的“天然可分块”特性——也就是社区划分,将整个图的节点按照关联度分成彼此紧密关联的社区(community)。对于每个社区,再调用大模型做摘要,以确保对局部有足够的“信息打包”。最后在回答全局性问题时,可以对所有社区的摘要进行二次合并,从而输出“全局视角”的答案。

下图展示了一个简化的 Graph RAG 管线示意:


图 1:Graph RAG 管线示意图。先由 LLM 从文档中提取实体、关系、描述等信息构建图,再对图做社区划分,生成社区摘要。最终回答时对各社区的部分答案进行融合,以获得面向全局的问题解答。


Graph RAG 的核心流程

从高层看,Graph RAG 主要可以分为以下几个阶段:

  1. 文档切分
    将原始文档拆分成较小的文本块(chunks)。过大的文本块会影响在后续的 LLM 提取阶段的“召回率”,过小则会带来大量的调用次数和处理开销,因此需要在效率与质量间做平衡。

  2. 要素提取:实体、关系、协变量
    对每个文本块,编写合适的提示词(prompt)让 LLM 来“抽取”文中的关键信息。典型做法是要求 LLM 找出所有实体及其描述、它们之间的关联关系、以及一些与实体相关的声明(claims)或属性(covariates)。

    多轮 gleanings:作者实验发现,为了让 LLM 多次“回头”检查文本块中可能遗漏的实体,可以通过提示词引导模型不断确认是否有实体被漏报,这种策略能提升提取的全面性。

  3. 要素合并:构建图索引
    将抽取到的实体和关系看作图中的节点和边(node、edge),并对重复或近似的节点做合并处理(如同义词、不同别名等)。理论上这个图可以理解为一个“自定义知识图谱”。

  4. 社区划分并生成社区摘要
    使用图社区检测算法(如 Leiden 或 Louvain)对图进行划分,得到若干互相紧密关联的节点子集,即社区(community)。

    • 对每个社区生成概要性描述,称为“社区摘要”。针对大型数据集还可以做分层(hierarchical)划分,从上层主题到下层细分群组都能获得各自的“报告”。
    • 社区摘要本身可视作一种“预摘要”,在后续回答问题时可以直接引用,而无需去逐块翻原文,这极大地节省了上下文长度和计算开销。
  5. 回答阶段:先分块回答,再全局汇总
    当用户发起类似“全局性”的查询时,可以对每个社区(或每个社区摘要)并行生成一个针对该查询的“部分回答”,再统一进行一次总的“汇总”或“合并摘要”操作(常被称为“map-reduce”风格)。

    • 先让每个社区各自根据摘要回答问题(map);
    • 再将所有回答整合到新的上下文,生成最终答案(reduce)。

通过这种流程,Graph RAG 能在大规模语料库中对“全局”问题给出更全面、更具多样性的信息呈现。


示例与图示

实体抽取与“分块大小”影响

在实际操作中,有一个有趣的现象:如果一次性给 LLM 太大的文本块(例如 2000-3000 Token 以上),那么模型对一些细节(如二级人物、次要事件等)的召回率会显著下降。下面这个图展示了实验人员在 HotPotQA 数据集上调试的发现:


图 2:实体抽取时,不同文本块大小对检测到的实体数量影响。块越大,遗漏的实体越多。

社区划分示例

图结构构造完成后,科研人员应用 Leiden 算法,可以得到如下多级社区结构。以下图为例,颜色各异的圆点代表不同社区,每个社区里聚集了语义和关系上互相紧密联系的实体。


图 3:Leiden 算法在 MultiHop-RAG 数据集上的两层社区划分示意。上图 (a) 表示根社区(level 0),(b) 表示下层子社区(level 1)。

在这个分层社区结构下,若想对“高层次话题”进行快速概览,可以只参考根社区(level 0)的摘要;若想深入某些细分主题,则可以“下钻”(drill-down)到子社区。


实验评估:Graph RAG 与其他方法的对比

评估维度

为比较不同方法在回答“全局性”问题时的效果,常用的自动化度量包括:

  1. Comprehensiveness(全面性):回答对问题的各方面是否有尽量广泛、深入的覆盖?
  2. Diversity(多样性):是否呈现了多元角度或不同子话题?
  3. Empowerment(赋能度):答案能否帮助读者获得更好的理解与判断能力?
  4. Directness(直接性):回答是否简明地正面回应了问题?

由于这些指标带有主观成分,目前有研究者提出利用更强大的 LLM 来进行双回答比对(pairwise head-to-head),在多个维度上判断哪一个回答更优。

对比系统与结果

在这项研究里,作者将 Graph RAG 与以下方法做了对比:

  1. Naive RAG (SS):传统的向量检索 + 拼上下文的做法。
  2. Map-reduce 直接对原文做总结 (TS):将文档拆分后对所有文本段做“map-reduce”摘要,不使用图索引。
  3. Graph RAG 在不同层次社区:从根社区(C0)到低层次社区(C3)分别生成答案。

结果概览(下表和下图摘要了主要结论):

  • 在“全面性”和“多样性”指标上,所有“全局”方法(包括 TS 以及 Graph RAG 的不同层次版本)都显著优于 Naive RAG。
  • Graph RAG 越往深层社区(如 C2、C3)通常能包含的信息越多,带来更好的全面性和多样性,但也更消耗 Token。
  • 根社区级别(C0)在信息覆盖上略逊于更深层社区,但 Token 消耗是最小的,可谓“性价比”极高的查询方式。
  • 在“直接性”上,Naive RAG 往往更胜一筹,因为它检索到的信息更集中。但这往往是以牺牲全面性和多样性为代价。


图 4:不同方法在两个数据集上的四个指标(全面性、多样性、赋能度和直接性)对比结果示意。行表示某方法相对列方法的胜率(越高越好)。可以看到,Graph RAG 在前两项指标明显优于 Naive RAG。


深度剖析与实践建议

为什么“图索引”有价值

  • 社区划分让摘要更高效:对于一个文本量高达上百万字的语料库,如果都把原文做多文档摘要,可能要调用海量 Token,计算成本高。而 Graph RAG 通过社区划分的一级或多级摘要,大幅减少不必要的重复内容,在回答全局问题时只需引用这些浓缩过的“社区摘要”即可。
  • 多轮问题场景的优势:如果用户需要对同一批数据集进行多次全局问题查询,Graph RAG 只需构建一次社区摘要,后续每个问题都可以直接利用已生成的社区报告,显著提升交互效率。

可能的局限与改进

  • 构建图索引的初始成本:在实体提取和社区划分阶段,需要额外的计算和令牌花费。如果语料库仅偶尔查询一次,直接用 map-reduce 原文本也许就足够。
  • 对细节的保留:部分社区摘要可能丢失了关键的引文、引用原始文本证据,进而在“赋能度”或“可证实性”上略显不足。今后可通过调整提取 Prompt 或在摘要中强制保留引用链接、时间、人物名等关键信息,以便提供更多可追溯的例证。
  • 错误或重复的实体识别:对同一个实体,LLM 可能会抽取出不同的名称。理论上可以在图后处理阶段进行合并,但如果处理不彻底,也可能产生重复的实体节点。好在社区划分和后续的总结机制在一定程度上容忍此类噪声。

未来方向

  • 分层索引 + 混合检索:除了基于图的社区摘要,也可结合向量检索来快速找到最相关的社区,从而实现更灵活和高效的查询流程。
  • 信息“下钻”(drill down)或“上卷”(roll-up):在实际的人机交互场景中,用户或许先浏览根社区的高层摘要,然后再下钻到更小的子社区。反之,用户也可能想从细节回溯到主题概览。Graph RAG 的分层社区天生适合这种多维导航。
  • 测评维度的细化:目前主要关注“全面性、多样性、赋能度、直接性”等主观性指标,未来也可以引入更多“ hallucination/fabrication 检测”或基于事实的一致性衡量。

Conclusion

Graph RAG 通过在预处理阶段构建一个“可被大模型摘要的知识图”,再借助图社区划分和多级摘要,成功地将 RAG 扩展到全局型问题的应用场景。相对于传统只做“向量召回”的检索式 RAG,它在全面性多样性方面具有显著优势,并且在多次迭代查询的场景中具备较高的性价比

对于追求全局主题洞察、跨文档多视角总结的用户,Graph RAG 提供了一个值得深入探索的解决方案。目前的开源实现(详见官方地址)将会进一步开放更多功能,包括本地化处理和多种社区划分算法,方便开发者在不同领域做二次定制。在以后的研发中,如何最大化保留信息细节、减少上下文丢失,并在大规模语料上高效地维护图索引,将成为 Graph RAG 进一步研究和优化的重要方向。

References

comments powered by Disqus
You will to enjoy grander sight / By climing to a greater height.