GraphRAG论文阅读笔记
GraphRAG论文阅读笔记
尝试了一阵在B站以视频讲解的形式来记录好的论文。发现自己讲的时候总是脑子跟不上嘴,讲得不清楚,思路理得也不清楚,于是打算还是恢复以博客的形式来记录自己看的论文,我感觉这样还能更清楚的记录自己的绝大多数想法。
摘要
感觉这个摘要还是写得比较符合传统的审美的。
第一句:RAG产生了很广泛的应用(大家普遍认可)
第二句:但是呢,RAG解决不了一类问题。什么问题呢,Query-Focused Summarization(QFS),这类问题比如说问一个Dataset的主题. 因为它不是一个清楚的知识提取的任务。但是传统的QFS系统又无法使用RAG来提升能力(都是大家认可,而且重要的问题)
第三句:所以呢,作者提出了GraphRAG来解决这个问题。
第四句:开始介绍方法了,开始是用LLM来构造一个基于文本的图,第一步是基于文档来提取一个知识图谱,第二步是为每一个community提取一个summary。这样的话,给定一个问题,每一个community summary都能够用于生成一个回答,每一个回答又可以再进行合并,得到一个总的回答。
第五句:实验证明了有效性。
一、引言
用一句流行的话来说,就是我容易被这种以人类智慧为目标的引言击中。
第一段起的很大,就是说人类智慧是可以能够得到一个比文本直接给出的句子所更高级别的结论的(比如问一个Dataset的主题,这个主题很有可能dataset没有一句话直接阐述)。所以呢,在询问一个有关全局的问题的时候,需要一个能够模拟人类心理去给出回答的一个模型。
第二段:虽然RAG很好,但是它要求答案在文本里。但是QFS要求的是给出一个summary而不是给出一些概念。虽然之前专门做summary任务做得很好,但是对于大模型而言,这个还是很难的(因为上下文长度有限制)
第三段:所以QFS在大规模数据集还是很有问题的。(其实我想到了一个事情,就是虽然作者提出了一个很nb的,看起来什么都适用的东西,但是还是找到了QFS这么一个场景,确实多nb的东西都得接一下地气)。然后就开始介绍challenge,比如说因为LLM上下文的原因,所以可能会丢失重要信息。而且呢,如果是直接使用RAG可能不是那么好,做一个更好的index可能会更利于总结。
第四段:所以呢,本篇文章提出了Graph RAG。然后它强调了一些它关注图的模块性(modularity),以及community detection算法去将联系紧密的图划分为一个一个模块的能力。这样的话,LLM生成的基于每一个社区的回答就会有一个比较好的覆盖。这样的话,给定一个问题,每一个community summary都能够用于生成一个回答,每一个回答又可以再进行合并,得到一个总的回答。
第五段:就是设计了一些实验的方法,取得了很好的结果。
二、方法
其实上面这个图已经把流程讲得很清楚了,我就再按照论文简单梳理一下。
2.1 Source Documents → Text Chunks
第一步就是要把原文档切割成一个一个的块(以便大模型能够输入)。作者在这里提到了虽然比较大的块能够加快速度,但是也会让performance有一些下降。
2.2 Text Chunks → Element Instances
第二步当然就是从块里识别出实体与联系了,包括我们想构建的graph的node edge。作者在这里使用了一个多阶段的LLM prompt方法,首先先识别的是所有的实体 including their name, type, and description,接着就是识别联系,也就是 clearly-related entities, including the source and target entities and a description of their relationship。
紧接着这里还提到了few-shot prompt的重要性,虽然直接让llm提取实体很好,但是对于一些专有的词语,可能直接提取不会被认为是实体,所以用few-shot提示一下也挺好。
接着作者还提出了一个gleaning的思想,大概就是让llm多看几轮,防止有遗漏。
2.3 Element Instances → Element Summaries
这一部分就是给每一个实体生成一个对应的描述。这里作者说得比较绕,意思大概是虽然上一轮在提取实体的时候已经有一个描述性文本了,但是为了方便后面的聚类,可能还是要再生成一轮描述,因为在提取的时候,大家的描述可能不是很统一。
2.4 Element Summaries → Graph Communities
这一步就是把图分割为许多个community,作者用了一个叫leiden的算法。
2.5 Graph Communities → Community Summaries
这一步就是给每一个community生成一个summary。作者是这么生成的:第一步:给比较偏leaf的community生成summary。具体是先将起点、终点、以及相关关系,边的描述连成一段话,然后按边的度数排序,拿LLM的token limit数所能承担的最多的边数作为输入,生成leaf的summary。第二步:生成高层次的summary。这一步是如果leaf的summary能够在llm的token limit数内进行总结,就直接总结。否则就按照summary的token长度不断做替换,直到符合token limit的限制。
2.6 Community Summaries → Community Answers → Global Answer
现在就是讲怎么回答问题了!
首先,community summary先被随机排序,然后分割成固定大小的块。接着,同时基于每个块生成一个答案,并且会问llm这个答案对于回答原本的问题的帮助程度。帮助程度为0的就剔除。再根据这些子答案来生成最终的答案。这里也有一个按照帮助程度排序的,如果超过token limit的也剔除。
三、实验与之后的内容
因为好像感觉对我来说启发不大,就不讲了,就留个代码链接吧: https://aka*.*ms/graphrag