你想要的GraphRAG的内容都在这了
最近微软终于开源了他的GraphRAG,短短7天就集齐了6.7K Star。那GraphRAG到底是个啥???
图片
GraphRAG的论文实际上要比代码开源早很多,论文应是今年4月份在Arxiv上发表的,但是代码是这个月1号才正式上传开源。
图片
项目开源地址:https://github.com/microsoft/graphrag
项目帮助文档:https://microsoft.github.io/graphrag/posts/get_started/
1. 为什么要提出GraphRAG?
RAG,又称检索增强生成(Retrieval Augumented Generation)。RAG目前已经成为大语言模型应用的核心组件之一,利用检索到的内容,无论是相似度检索,还是传统搜索、搜索引擎来增强大语言模型的外部知识。凭借这一能力,RAG在帮助LLM处理私有化数据集上发挥了巨大的潜力、取得了不俗的表现,这些私有化数据集对于LLM来说是全新的,比如企业内部文档、商业文件、用户对话记录等。即使如此,传统RAG仍然存在很多问题,比如:
- • 在处理多信息点时存在困难,比如某个问题的回答需要整合多个文档、多个片段的信息,提供全新的见解时,传统RAG往往在回答的全面性方面存在不足。
2. 什么是GraphRAG
图片
如上图所示,GraphRAG包括两个处理阶段,分别是:索引阶段和查询阶段。索引阶段利用LLM来自动化构建知识图谱,提取出对应的节点(如实体)、边(如关系)和协变量(如主张,claim),然后利用社区发现技术(如Leiden算法)对整个知识图谱进行子图划分,然后自底而上对子图利用LLM进行摘要、总结。针对特定查询,“全局答案(Global Search)”汇总所有与之相关的社区摘要最后汇总生成答案。
图片
图片
2.1 源文档生成文本片段
与传统RAG一样,GraphRAG也需要将源文档转化为文本片段(TextUnits),这个片段既会被用于图谱抽取,也会作为知识的引用源,以便追溯回最初的原始文本内容。
图片
在最新开源的GraphRAG代码里,文本切分大小(以Token数计算)是可以根据用户需求调整的。默认是300个Token,尽管,作者发现1200个token大小的文本单元能取得更好效果。但是,越大的文本块大小会导致输出精度降低、召回率降低、并且降低参考文本的可读性;不过文本块尺寸越大,可以减少LLM调用次数,整个处理过程速度可以更快。
下图展示了,在相同的提取循环次数下,提取的实体数会随着文档片段的大小增加。
图片
文本单元的分组设置同样可以根据用户需求定制。默认GraphRAG会按照文档边界来对齐单元,确保文档与文本单元之间保持严格的一对一关联。在少数情况下(特别是非常短的文档),比如推文、聊天记录这些情况下,会组合多个文档构成一个有意义的分析单元。
2.2 知识图谱构建
接下来的步骤就是对于每一段文本片段,利用LLM从中提取实体、关系、主张(Claim)。下图是GraphRAG里面用于知识图谱构建的提示词。
图片
因为篇幅原因,这里不展示全部提示词,大家可以自行参考链接:
./prompt_tune/template/entity_extraction.py
2.3 元素实例转化为元素摘要
通过LLM对文档中的实体、关系、主张进行提取,本质上是对文档的一种抽象式摘要。同名同类型的实体将通过整合它们的描述形成统一的数组;同样的,相同起点和终点的关系也将通过整合描述后进行合并。
图谱抽取的最后一步是对代表同一现实世界实体但名称不同的实体进行辨识。由于此过程通过LLM执行,希望在不丢失信息的前提下,采取一种审慎且非破坏性的方法。
不过,目前的实体辨识实现是具有破坏性的。将一系列实体提供给LLM,并要求其判断哪些实体应该合并。然后,这些实体将被合并为单一实体,并且它们的关系也会相应更新。
GraphRAG正在积极探索其他实体辨识技术。在不久的将来,实体辨识将通过在不同实体变体间建立一条边来执行,表明这些实体已经被索引引擎辨识。这将使用户能够撤销索引端的辨识,并采用类似过程添加自己的非破坏性辨识。
2.4 元素概要至图谱社群
上一步骤所构建的索引可以视作一个均匀无向加权图,实体节点通过关系边相连,边的权重反映了所检测到关系实例的归一化数量。基于此类图,可以应用多种社群发现算法,将图递归划分为多个社群,这些社群内的节点间的联系比与图外其他节点更为紧密。在GraphRAG中,作者选用了Leiden算法,原因在于其能够有效地挖掘大规模图谱的层级社群结构。
图片
该层级结构的每一层都提供了一种划分方式,以互斥且全面覆盖的方式呈现图中所有节点,为全局性摘要的分治策略提供了可能。
2.5 图谱社群至社群概要
接下来利用社群(知识图谱子图)数据,利用LLM为每个社群总结为一个摘要式报告。这有助于在图谱的不同细节层次上获得宏观的理解。比如,若社区A属于最顶层,将获得整个图谱的综合报告;若社区属于较低层次,则报告将聚焦于一个特定的局部群体。
图片
可以通过提示词里的示例,看一下这个知识图谱报告长什么样子:
图片
通过LLM对社区报告进行浓缩、精简,然后将这些报告内容通过embedding模型进行向量化,这里与传统的RAG类似。
所以小编认为,在整个GraphRAG里面,知识图谱提取和这一步图谱子图摘要式总结是最为重要和特殊的。
2.6 社群概要至社群解答,再到全局解答
针对用户的提问,社群的层接结构特性意味着可以利用不同层级的社群摘要来回答问题。在特定的社群中,用户的提问全局答复按以下过程生成:
- • 准备社群概要。将社群概要随机混洗,并划分为预设的令牌大小的区块。这样做确保了相关信息均匀分布,而不是聚集(可能遗失)在单一的上下文窗口中。
- • 映射社群解答。并行生成每个区块的中间答案。同时要求LLM为生成的答案打分,分数范围从0到100,以指示答案对目标问题的帮助程度。得分为0的答案将被排除。
- • 汇总为全局答案。根据有用性得分,将中间社群答案降序排列,并逐步整合进新的上下文窗口,直至达到令牌限制。这一最终上下文将用于生成并返回给用户的全局答案。
3. 对比分析
作者对比了六种配置的RAG,包括利用四层图社群结构的GraphRAG(C0、C1、C2、C3),以及将Map-Reduce应用于原始文本的文本摘要方法(TS)、语义搜索RAG(SS)。
C0:利用根层级的社群概要来响应用户查询,数量最为稀少。
C1:利用高级别社群概要解答问题,这些是C0的子社群,如果存在的话;否则是C0社群的下投影。
C2:利用中层级社群概要来解答问题,这些是C1的子社群,如果存在的话;否则是C1社群的下投影。
C3:利用底层社群概要来解答问题,数量最多,这些是C2的子社群,如果存在的话;否则是C2社群的下投影。
TS:与GraphRAG方法相似,只是将原始文本(而非社群概要)随机分配并分块,用于map-reduce摘要阶段。
SS:一种朴素RAG的实现,检索文本块并添加至上下文窗口,直至达到设定的令牌限制。
3.1 全局方法相较于朴素RAG
图片
如上图,四种度量标准下每组125个问题(每组问题均重复五次并取平均值)的胜率对比图。每一行代表的条件与每一列的条件相比较,胜者以粗体字标出。自我胜率未作计算,以预期的50%作为参考线。
在全面性和多样性上,GraphRAG的所有条件均超越了朴素RAG。特别是条件C1至C3,在答案的全面性和多样性方面相较于TS(不依赖图索引的全局文本摘要)显示出了小幅提升。
全局方法在全面性和多样性两个指标上,无论是播客还是新闻数据集,均持续超越了朴素RAG(SS)方法。具体来说,全局方法在播客文稿的全面性胜率介于72%到83%之间,在新闻文章上的胜率则在72%到80%之间,多样性胜率分别为75%到82%和62%到71%。此外,我们以直接性作为有效性的检验,结果符合预期,即朴素RAG在所有对比中提供了最直接的回答。
3.2 社群摘要与原始文本的对比
对比社区概要和原始文本,社区概要在提升答案的全面性和多样性方面,普遍带来了虽小但稳定的改进,根级概要不在此列。
- • 在播客数据集中,中级社区概要的全面性胜率为57%
- • 新闻数据集中,低级社区概要的全面性胜率为64%
多样性方面:
- • 播客中级社区概要的胜率为57%,新闻低级社区概要则为60%。
图片
上表展示了GraphRAG相较于原始文本摘要在可扩展性上的优势:针对低级社区概要(C3),GraphRAG所需的上下文Token数减少了26-33%;而针对根级社区概要(C0),令牌需求量更是减少了97%以上。
与其它全局方法相比,尽管性能略有降低,根级GraphRAG依然是进行迭代问答的高效方法,这种问答是感知活动的特点,同时在全面性(胜率72%)和多样性(胜率62%)上仍超越了朴素RAG。
3.3 回答效果展示
图片
上图第二、三行分别展示了GraphRAG和朴素RAG回答的效果对比,第四行展示了使用LLM对这两个回答做出的评估结果(四个评估维度)。
本文转载自大语言模型论文跟踪,作者:HuggingAGI