【RAG】GraphRAG开源:查询聚焦摘要的图RAG方法
前言
传统RAG在处理全局性问题时,其实有点力不从心。比如,当你问“这些数据里,排在前5的主题是什么?”——你会发现,传统的检索方法很难给出一个令人满意的答案。

问题的根源在于,这类查询本质上是
查询聚焦的摘要(QFS)任务
GraphRAG的思路很巧妙:利用LLM来构建一个基于图的文本索引,也就是从源文档里自动生成一张知识图谱。有了这张图,那些复杂的、大规模的数据集,就能被转化成更容易理解和操作的知识结构,实体(像人物、地点、机构)之间的关系也一目了然。
一、方法
1.1 源文档分块
这个步骤是整个GraphRAG流程的基石,直接决定了后续知识图谱构建和摘要生成的质量。其中最关键的决定就是
源文档的分割粒度
块大小的主要影响体现在两方面:
- 文本块越长,调用LLM的次数可以越少,但过长的上下文也可能导致信息提取的召回率下降。
LLM上下文窗口:
- 在提取过程中,需要找到一个平衡点。较长的文本块可能提高召回率,但可能会牺牲精度。
召回率与精度的平衡:
一个实验数据很能说明问题:在HotPotQA数据集上,用不同大小的文本块(600、1200、2400 tokens)配合gpt-4-turbo进行单次提取,结果发现,使用600 tokens的小文本块,提取出的实体引用数量几乎是2400 tokens块的两倍。这个结果,值得深思。
1.2 信息抽取(实例提取)
这一环节是构建图索引的核心,目标是确保从文本中提取出有用的
结构化信息(KG)
方法上主要分为三步:
- 利用LLM和特定的提示(prompt)来识别文本块中的所有实体(名称、类型、描述),然后找出实体之间的关系(源实体、目标实体、关系描述)。
KG构建:
- 除了实体和关系,还可以提取一些额外的协变量,比如默认的提示会提取与实体相关的声明(包括主题、对象、类型、描述等)。
附加协变量提取:
- 为了平衡效率和质量,这里使用了一种“多轮gleanings”方法。它会先让LLM自己评估是否所有实体都已提取,如果发现有遗漏,再用一个专门的提示来鼓励LLM补上这些漏网之鱼。
漏提取兜底:
上图中每个圆圈代表一个实体(比如一个人、一个地点或一个组织),圆圈大小表示该实体关联的关系数量,颜色则把相似的实体归为一组。这个基于图结构的自下而上的聚类方法,正是我们能回答不同抽象层次问题的关键。
1.3 实例提取→实例摘要
用LLM
提取实体、关系和声明的描述
实例摘要能有效避免关键信息在LLM的长上下文中被淹没或丢失。
1.4 实例摘要→图社区
这步是构建图模型的核心:把上一阶段得到的信息组织成一个
同质无向加权图
接着是社区检测:
- 用社区检测算法将图切分成多个社区,社区内部的节点之间连接更紧密。
社区划分:
- 文章特别提到使用Leiden算法,因为它能高效地恢复大规模图的层次结构,提供不同粒度的社区划分。
Leiden算法:
1.5 图社区→社区摘要
这一步是为每个社区创建一份“报告式”摘要。这些摘要彼此独立,但合在一起就能勾勒出整个数据集的全局结构和语义。可以说,社区摘要本身就是一种非常有用的工具,特别适合在没有具体问题时,对整个语料库进行探索和理解。
1.6 社区摘要→社区答案→全局答案
最后的答案生成过程,采用了经典的三步走:
- 先把所有社区摘要随机打乱,切成预定大小的块。这么做是为了避免信息集中在一个上下文窗口里,降低丢失风险。
准备社区摘要:
- 对于每个社区摘要块,并行调用LLM生成中间答案。同时,LLM还要为每个答案生成一个0到100的有用性得分。得分是0的答案,会被直接过滤掉。
生成中间答案(Map社区答案):
- 根据有用性得分,把中间答案从高到低排序,然后逐步添加到新的上下文窗口中,直到达到令牌限制。最终,这个整合后的上下文窗口,被用来生成返回给用户的全局答案。
汇总成全局答案(Reduce到全局答案):
二、实验
为了验证GraphRAG的有效性,原文使用了两个大规模数据集:一个包含1669个文本块的播客转录数据集(约100万token),和一个包含3197个文本块的新闻文章数据集(约170万token)。这个量级,差不多相当于10本小说。
和naive RAG、全局文本摘要方法相比,GraphRAG在
全面性
多样性
还有一个在私有数据集上的实验,
链接如下
参考文献
私有数据集实验:https://www.microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/
paper:From Local to Global: A Graph RAG Approach to Query-Focused Summarization,https://arxiv.org/pdf/2404.16130
代码已开源:https://github.com/microsoft/graphrag
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名