你为什么要用GraphGAG?

文摘   2024-08-10 21:51   新加坡  

其实我这个问题不算瞎问。在你的项目里,你是真觉得GraphRAG有用,还是就图个新鲜劲,这个是非常重要的思考。

RAG能干啥,其实不用复杂的解释了

传统的方式就是基于向量余弦近似度的查找,当然BM25其实也是传统RAG(别把它当新东西),常见一点的基本都有向量查找,或者向量+BM25关键字集成查找,为了方便我就画向量的了。

如下图:

通用LLM里不太存在专用领域的知识,RAG可以作为外挂知识库的补充,补充新的知识,另外有些问题,不一定让你回复标准答案(你懂的)

现在举几个场景,比如说,你问一句,肯德基全家桶多少钱一桶,这你问RAG系统指定是没啥问题。

为啥没问题呢?

因为你的问题指向特别具体,SKU====>价格,银货两讫。

那么下一个问题来了,你所在的团队去年有哪些贡献?

这咋答啊?太宏观了

要硬来也不是不行,比如搜索你所在的团队有谁?然后找这些人的各个lead的项目的chunk,最后把所有chunk one by one塞给LLM,让LLM总结,总结的出来的中间态还应该有个外置的memory吧,比如redis存着,最后所有人的贡献全出来,再过一遍LLM 刷总结。早上问的,这一套下来可能都吃中午饭了(夸张的修辞手法),主要是大概率这效果肯定不好,受限于每次生成的结果优劣,就有一个叠加效应,另外也受限于token数的限制,每人总结,再叠加总结可能还好一点,要一股脑的送进LLM让它乱处理,可要了亲命了....

其实,上一段所做的操作,严格来说,可以理解为就是构建知识图谱的一个过程,只是毫无章法而已,而且你必须要把RAG系统Agentic化,否则RAG是做不了这个事的。

那构建知识图谱这事,其实挺费时费力的,GraphRAG这个软件也好,框架也好,主要干得第一件事就是用LLM来构建知识图谱

  1. 原始文档(Source Documents)

  • 系统从原始文档开始,通过文本提取和分块(chunking)将文档拆分成较小的文本片段。

  • 文本片段(Text Chunks)

    • 将这些文本片段经过领域定制的摘要化处理,以提取关键的实体、关系和相关属性。

  • 元素实例(Element Instances)

    • 在这一步,系统识别并提取出图节点(如实体)和边(如关系),这些信息将被进一步处理为元素摘要。

  • 元素摘要(Element Summaries)

    • 系统为每个提取的元素(节点和边)生成独立的摘要,这些摘要提供了每个元素的独立描述。

  • 图社区(Graph Communities)

    • 通过社区检测算法(如Leiden算法),将图划分为多个社区,每个社区包含彼此之间关系紧密的节点和边。

  • 社区摘要(Community Summaries)

    • 为每个社区生成一个综合的摘要,描述该社区内的所有元素及其关系。这些摘要在查询时可以独立使用。

  • 社区回答(Community Answers)

    • 在接到用户查询后,系统会利用这些社区摘要来生成部分回答。每个社区摘要独立处理,并生成与查询相关的回答。

  • 全局回答(Global Answer)

    • 最终,将所有部分回答汇总生成一个综合性的全局回答,来满足用户的查询需求。

    索引时间 vs. 查询时间:

    • 索引时间:在这段时间内,系统构建知识图谱并生成所有相关的社区摘要。这是一个预处理步骤,使得系统能够更快速地响应未来的查询。

    • 查询时间:当用户发出查询时,系统利用预先生成的社区摘要并并行处理,最终生成全局性的答案。这一步是针对用户查询的实时处理。


    这里面LLM都参与了哪几部分呢?

    主要是以下4个部分

    1. 元素实例提取(Element Instances Extraction)

    • 对每个文本片段,使用大语言模型(LLM)来提取图中的元素实例。具体来说,LLM被用来识别和提取以下内容:

      • 实体(Entities):如人、地点、组织等。

      • 关系(Relationships):描述实体之间的连接或关联。

      • 协变量(Covariates):其他相关的描述或声明,例如主语、宾语、关系类型等。

    • 这些元素实例被表示为图的节点和边,形成一个初步的图结构。

    2. 元素摘要生成(Element Summarization)

    • 在提取了元素实例之后,LLM还负责生成这些元素的摘要。每个节点或边的实例被独立地总结为一个描述块,这些描述块提供了对每个图元素的独立理解。

    3. 社区摘要生成(Community Summarization)

    • 对于每个社区,LLM生成一个社区摘要。这些摘要描述了社区内部所有节点和边的关系及其重要性。社区摘要可以用于后续的查询回答生成过程。

    4. 生成回答(Answer Generation)

    • 在查询时间,系统首先根据查询问题选择相关的社区摘要。然后,LLM利用这些社区摘要生成部分回答。

    • 最后,将所有部分回答整合成一个综合性的全局回答,提供给用户。



    左边的图都好理解,就是构建图里的边和节点的过程,一度,二度啥的。

    右边的是干啥的呢?就是层级回答,这是干啥的呢?

    这就是今天要说的题目的重点,你为啥要用graphRAG

    假设有一连串的问题

    1.你去年的工作结果是什么?

    2.你团队的工作贡献有啥?

    3.你们大部门的贡献?

    4.整个公司的产品GTM的状态?

    这灵魂四问,用传统的RAG基本是不太现实的,但是借助Graph RAG的图谱能力和层级化能力则可以提前生成了关于 2,3,4问题的答案和关联性(Summarization

    GraphRAG主要的能力就是干这事的

    所以我们总结一下:

    应用场景

    • 传统RAG:适用于需要从大规模文档库中检索并生成内容的应用,如问答系统、摘要生成等。

    • Graph RAG:由于其对复杂关系的建模能力,更适用于需要理解和生成复杂知识结构的应用,如知识图谱问答、关系推理等。


    而你的应用如果不太涉及下面的业务,我劝你别用GraphRAG

    原因有这么几点:

    1.  钱,我前文中说的要LLM参与的几个点,那没一个是省token的,而且是预加载过程,也就是说只要你想玩GraphRAG,那这钱是省不了的,基于VectorDB和BM25的都没不需要这个。

    2. 新的数据加入,图这玩意儿不同于向量数据库,你愿意新增几条,大可新增几条,只要performance够就行,你每次加新数据,如果和多条边或者节点相关,就会大规模重构图的结构,又是新折腾轮回的开始。

    3. 图谱构建的问题,这个严格说不是GraphRAG的问题,是图系统本身的问题,一个良好的知识图谱构建不太可能靠LLM就全程搞定,所以你图谱构建的鲁棒性和健壮性,对LLM要求极高。这东西出很久了,相信你们测过的也知道,效果是不错,因为你们平常问的问题,往往标准rag cover不住,但是它也仅仅是占这块的便宜而已。其它的针对性问答,关于具体问题,它不会比传统rag有什么特别大的优势。


    最后一点,传统rag不能回答灵魂四问吗?

    1.你去年的工作结果是什么?

    2.你团队的工作贡献有啥?

    3.你们大部门的贡献?

    4.整个公司的产品GTM的状态?

    答案是当然可以,你提前有这个问题不就完了吗?咋么有呢?让LLM生成呗。

    有兄弟会说,你说这不本末倒置吗?哪有先有答案后有问题的?

    我可以负责任的告诉你,这是最基本的RAG 工程手法,那你要是不知道咋玩,看我之前的文章


    熵减AI
    科技类博客