大语言模型(LLM)当前面临的最大挑战,同时也是其最大的机遇,在于如何将其强大的能力扩展到训练数据之外,即便面对从未见过的数据,也能获得同等水准的结果。这一能力为数据探索开辟了全新的可能性,例如根据上下文和数据集本身,自动识别其中的主题和语义概念。
那么,什么是RAG?概括而言,检索增强生成(Retrieval-Augmented Generation,RAG)是一种使大语言模型能够借助外部知识库来提升回答质量的技术。其核心思路是利用外部知识构建索引,从而让LLM能够回答涉及私有文档或训练时未曾接触过的问题。这项技术已成为大多数基于LLM的工具的标配组件。然而,目前主流的RAG方法大多依赖向量相似性进行搜索,我们通常称之为基准RAG(Baseline RAG)。
那么,RAG的优势与短板分别是什么?其优势很明显——能够精准回答文档中的具体细节,例如实体信息提取等任务,表现相当稳定。但短板也同样突出:一旦遇到需要跨段落、跨文档进行总结或摘要的查询,传统RAG便显得力不从心。例如,当用户询问“数据中前5个主题是什么?”这类需要聚合整个数据集信息才能回答的问题时,基准RAG处理起来效果很差。原因在于,它依赖的是语义相似的文本片段进行向量搜索,而查询本身并未提供任何指引其找到正确信息的线索。
正因如此,GraphRAG的价值得以凸显。借助GraphRAG,我们能够回答这类问题,因为由LLM自动生成的知识图谱,其结构本身就揭示了整个数据集的组织方式——主题自然浮现出来。这样一来,私有数据集可以被整理成有意义的语义聚类,并提前生成摘要。再结合全局搜索方法,LLM在响应用户查询时,便能利用这些聚类来总结出主题。
GraphRAG是什么?
简单来说,GraphRAG通过利用LLM生成的知识图谱,显著改进了RAG的“检索”环节。它能够用相关性更高的内容填充上下文窗口,从而给出更优质的答案,同时还能清晰地追溯到证据来源。
GraphRAG的关键概念
Document— 输入系统的原始文档,可以是CSV中的一行数据,也可以是独立的.txt文件。TextUnit— 待分析的文本块。这些块的大小、相互重叠程度以及是否需要遵循某些数据边界,均可通过下游配置进行设置。常见的做法是将CHUNK_BY_COLUMNS设置为id,从而在文档与TextUnit之间建立一对多关系,而非多对多关系。Entity— 从TextUnit中提取出的实体,可以是人物、地点、事件或其他任何类型的实体模型。Relationship— 两个实体之间的关系,由协变量生成。Covariate— 协变量,即提取出的声明信息,包含关于实体的陈述,这些陈述可能随时间变化。Community— 社区,指整个知识图谱中属于同一类别的模块。Community Report— 实体生成后,会进行层次化社区检测,并为层级结构中的每个社区生成报告。这些报告将用于后续的模块检索。Node— 这张表存放经过嵌入和聚类后的实体与文档布局信息,用于最终渲染知识图谱的可视化视图。
GraphRAG的运作逻辑
1. 文本切分,组合TextUnits(文本块大小 1200 token)
首先,将原始文档切分成大小合适的文本块,即TextUnit。
2. 实体和关系抽取
这一步会抽取出命名实体、概念之间的关系以及具体细节描述,用于构建知识图谱。
3. 生成实体和关系的摘要,增强知识图谱
这一步包含两项任务:一是社区检测,采用层次化Leiden算法对知识图谱生成层次化的社区结构。该方法会递归地对图谱进行社区聚类,直至达到预设的社区大小阈值。通过这一步骤,我们能了解整个网络的组织结构,从而在不同粒度上导航和总结知识图谱。二是知识图谱嵌入,使用Node2Vec算法将知识图谱转化为向量表示。这有助于理解图谱的隐含结构,并为后续搜索相关概念提供额外的向量空间。
4. 社区总结
在社区数据的基础上生成报告。这一步使我们能够在更深的层次上理解知识图谱在各个粒度级别上的整体情况。例如,如果社区A是最高层级的社区,我们就能获得关于整个知识图谱的报告;如果社区层级较低,则得到关于局部集群的报告。
具体而言,该过程由大模型生成社区报告,再由大模型对社区报告进行总结,随后生成向量,最终形成结果表格。
5. 文档处理,为知识模型创建表格
首先,将每个文档链接到第一阶段生成的TextUnit上,从而确定哪些文档对应哪些文本单元。接着,利用文档片段的平均嵌入生成文档的向量表示。具体做法是:将文档重新分块(块之间无重叠),为每个块生成一个嵌入,然后按标记数量加权平均,最后用该平均值作为文档嵌入。这有助于理解文档之间的隐含关系,并为生成文档的网络表示奠定基础。最后,将“文档”表发布到知识模型中。
6. 可视化
GraphRAG的查询方法论
全局搜索:数据中前5个主题是什么?
全局搜索方法会根据用户的查询(以及可选的对话历史),从社区层次结构中选取指定级别的社区报告作为上下文数据,然后采用“映射-归约”方式生成响应。在“映射”步骤中,社区报告被分割成预定大小的文本块,每个文本块用来生成一个中期回应,其中包含一系列要点并附带数值评级。在“归约”步骤中,从这些中期回应中筛选出最重要的要点,将其聚合作为上下文,最终生成完整的回复。
需要注意的是,全局搜索的响应质量很大程度上取决于所选社区报告的层级。较低层级且包含更详细报告的情况下,往往能给出更详尽的回答,但代价是处理时间和LLM资源消耗也会相应增加。
本地搜索:洋甘菊的治疗特性是什么?
本地搜索在查询时会将知识图谱的结构化数据与输入文档的非结构化数据结合起来,利用相关的实体信息来增强LLM的上下文。这种方法非常适合回答需要理解具体实体的问题。
具体来说,给定用户查询和可选的对话历史,本地搜索会先从知识图谱中找出一组与用户输入语义相关的实体。这些实体充当进入知识图谱的入口,通过它们可以提取出更多相关细节,例如与之相连的实体、关系、实体协变量以及社区报告。此外,还会从与这些实体相关的原始文档中提取出相关文本块。然后,这些候选数据源会被排序和过滤,最终适配到一个预定大小的上下文窗口中,用于生成对用户查询的最终响应。
