首页 文章详情

Graph-RAG(1):原理介绍

GonFreecss | 55 2024-05-01 07:26 0 0 0
UniSMS (合一短信)
  • 微软研究院 2024年4月
  • 论文:https://arxiv.org/pdf/2404.16130
  • 油管两分钟介绍:https://youtu.be/jCjyaQL-7mA

如何一步步引出GraphRAG?🤔

首先聊一下问题背景,当前很多所谓RAG应用,实际上无法处理面向整个长文本的全局性问题。针对该问题,作者认为,不能只是“显式的检索任务”,而应该是QFS任务,即对关注Query的文档内容进行摘要总结。摘要的方法很多,大体分类就是抽象式摘要(abstractive)或提取式摘要(extractive),比如:

用户提出的查询是“公司去年的财务状况如何?”为了回答这个问题,系统不仅需要分析去年的年度报告,还可能需要参考公司在不同时间段的财务新闻、市场分析报告以及其他相关的文档。

如果是抽象式,那就直接seq2seq;如果是抽取式,就先确定哪些句子或段落和query更相关,然后打分(比如根据词频、位置、长度、实体等),最后将候选集按照一定规则、逻辑去组合构建。额,要是加上llm做语义连贯生成,不就是navie 的 navie rag?😶反正对于现在的大模型而言,抽象式摘要已经不是什么事了。但是由于上下文窗口限制问题以及长文本中“loss in the middle”问题的存在,针对全局语料的抽象式QFS依然存在挑战。那作者就觉得,即使navie RAG的分块策略无法满足QFS任务,按道理应该有其他专门针对全局摘要的新型RAG,且应该有另一种格式的预索引(pre-indexing)

GraphRAG步骤拆解 🚀

3c7ac5563f50826fa21f6cf7a0145b3f.webp

1. 源文档分块处理

主要还是得关注老问题——文本块大小的权衡。当文本块过长时,单独处理的数量下降了,但由于上下文窗口限制导致无法充分理解和处理大块信息,从而导致召回率下降。后续要做实体抽取,且作者在HotPotQA数据集实验发现,chunk大小在600 tokens时,会比在2400 tokens时,能提取出多1倍的有效实体数量。

2. 实体和关系提取(文中用“元素实例”的概念包含两者)

通过大模型结合提示工程,从每个分块中抽取实体及其关系来构建图谱。作者设计成一个多阶段的迭代过程,要求LLM评估是否所有实体都被提取出来,那这就是一个二分类问题。作者为了让模型有个更明确的判断,加了一个比较大的logit正偏差(100),来调整模型输出的概率分布,使之对特定类别产生偏好。如果LLM响应说遗漏了实体,那么加入一个声明在上次提取中遗漏了“许多”实体,继续鼓励LLM收集这些缺失的实体。

举例:在一些风险敏感应用中,可能更关注模型在负类别(如疾病、欺诈等)上的准确性,那就可以增加负的logit偏差

3. 实体、关系和社区的总结

作者认为,从源文档中“提取”实体、关系和声明的描述,本身已经是一种抽象性摘要的形式。但这还不够,还需要用LLM对这些“元素”做进一步的总结。但这里还需做实体消歧,不然图谱中可能出现很多重复的元素。作者用了社区检测算法(比如Leiden)来检测图中的社区结构,将紧密两联的实体归纳到同一个社区。通过这种方式,即使LLM在提取过程中未能一致地识别实体的所有变体,社区检测也能够帮助识别出这些变体之间的关联性。归纳到一个社区后,意味着变体都指向同一个实体内涵,只是不同表述或异名词罢了。有了这些基础后,就可以对两种粒度的图结构生成描述性文本,一个是元素(实体、关系)摘要,一个是针对社区的摘要。前者是捕捉图中每个元素的详细信息;后者是对图中较大结构单元的整体理解。我给出一个生成社区摘要的伪代码,

      
      Function 生成社区摘要:
  输入:社区, 当前LLM上下文, token数限制长度
  输出:添加社区摘要后LLM上下文
  {
      IF 社区级别 == 叶子级 THEN 
          对社区内元素进行优先级排序
          IF 未添加所有元素 AND 未达到总token数限制 THEN
              1. 按以下要求选择元素
                (1)最高优先级
                (2)添加元素后上下文总长度未超过总token数限制
              2. 将元素摘要添加到LLM上下文窗口
          END
      ELSE {
          // 更高级别社区
          IF 所有元素摘要未超过总token数限制 THEN
              用LLM汇总所有元素进行摘要
          ELSE
              对子社区进行优先级排序
              IF 未添加所有子社区 AND 未达到总token数限制 THEN
                  1. 选择最高优先级的子社区
                  2. 如有必要,用较短的子社区摘要替换较长的元素摘要
                  3. 将子社区摘要添加到LLM上下文窗口
              END
          END
      END
      RETURN 添加社区摘要后的LLM上下文
  }
a2c5c45a0a34b32b0df7463478349ea0.webp

4. 最终LLM生成回复(Global Answer)

基于上述阶段生成的社区摘要,最后再生成一次最终答案。LLM可以使用不同层次的社区摘要进行生成回答。这引出另一个问题,有这么多层级的社区摘要,哪个层次的社区摘要能平衡细节与覆盖面,也就好比售前工程师面对客户的时候,除了要细致讲述核心技术,同时也要以点带面,说说相关的落地场景。但如果说得太细或者太泛,都会让客户觉得不专业。所以论文通过后续的评估,强调了在Graph RAG方法中,社区结构的层次性允许系统根据query的需求,选择最合适的抽象层次来生成摘要,这需要考虑摘要的详细程度和覆盖范围之间的平衡。(评估就不展开了😩)在给定社区级别时,全局性问题生成的流程图如下:dbab9baaa82ce9281dd4ab91b92c3529.webp


good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter