微软开源的GraphRAG解读

微软在7 月 2 日开源了 GraphRAG,一种基于图的检索增强生成 (RAG) 方法,可以对私有或以前未见过的数据集进行问答。通过 LLM 构建知识图谱结合图机器学习,GraphRAG 极大增强 LLM 在处理私有数据时的性能,同时具备连点成线的跨大型数据集的复杂语义问题推理能力,其基于前置的知识图谱、社区分层和语义总结以及图机器学习技术可以大幅度提供此类场景的性能。

GraphRAG 方法可以归结为:利用大型语言模型 (LLMs) 从数据来源中提取知识图谱;将此图谱聚类成不同粒度级别的相关实体社区;对于 RAG 操作,遍历所有社区以创建“社区答案”,并进行缩减以创建最终答案。
在这里插入图片描述

GraphRAG的核心就是两个图,一个是文档图谱,一个是文档内部的实体关系图谱

  1. 文档(Document)表示系统输入的文档。这些可以代表CSV中的单独行或单独的.txt文件;
  2. 文本单元(TextUnit)表示待分析的文本块。这些块的大小、重叠以及是否遵守任何数据边界可以进行配置。
  3. 实体(Entity)表示从文本单元中提取的实体。这些代表人、地点、事件或您提供的其他实体模型;
  4. 关系(Relationship)表示两个实体之间的关系;
  5. 协变量(Covariate)表示提取的声明信息,其中包含可能有时间限制的关于实体的陈述;
  6. 社区报告(Community Report)表示一旦生成实体,会对它们执行层次化的社区检测,并为这个层次结构中的每个社区生成报告;
  7. 节点(Node):包含已嵌入和聚类的实体和文档的渲染图视图的布局信息。

1 索引构建过程

文本文档被转换为GraphRAG知识模型,这个过程包括以下几个主要阶段:

  1. 文本单元切分(Compose TextUnits):输入文档被转换为文本单元,这些文本单元用于图提取技术,并作为提取知识项的源引用。

  2. 图谱抽取(Graph Extraction):分析每个文本单元,提取实体、关系和声明,该阶段包括多个步骤,包括实体&关系抽取、实体&关系总结、实体消歧、声明抽取。其中,实体和关系总结(Entity & Relationship Summarization)将实体及关系这些列表总结成一个实体和关系的单一描述,通过要求LLM提供一个简短的总结来完成,从而实现所有的实体和关系都有一个简洁的单一描述。

  3. 图谱增强(Graph Augmentation):理解实体的社区结构,并通过社区检测和图嵌入来增强图谱。在有了一个可用的实体和关系图之后,希望理解它们的社区结构,并用额外的信息增强这张图,通过两个步骤来完成:社区检测和图嵌入。这些步骤提供了明确(社区)和隐含(嵌入)的方式来理解我们图的拓扑结构。

     - 社区检测这一步,使用层次化的Leiden算法生成实体社区的层次结构,对上一步构建好的图应用递归的社区聚类,直到我们达到社区大小的阈值,可以提供一种在不同粒度级别上导航和总结图的方法。
     - 图嵌入使用Node2Vec算法可以生成向量表示,可以在查询阶段提供一个额外的向量空间,用于搜索相关概念。
    
  4. 社区摘要(Community Summarization):生成每个社区的报告,提供对图的高层次理解。即在社区数据的基础上进一步构建,并为每个社区生成报告。这为在图的不同粒度级别上提供了对图的高层次理解。例如,如果社区A是最高层级的社区,我们将得到一个关于整个图的报告。如果社区是低层级的,将得到一个关于本地集群的报告。

     首先,生成社区报告,在这一步中,使用LLM为每个社区生成摘要,报告包含执行概览,并引用社区子结构中的关键实体、关系和声明。
     
     其次,总结社区报告,每个社区报告随后通过LLM进行总结,以供简写使用。
     
     最后,社区嵌入,通过生成社区报告、社区报告摘要和社区报告标题的文本嵌入来生成社区的向量表示。
    
  5. 文档处理(Document Processing):对文档进行表示,并形成文档图

     首先是链接到文本单元,将每个文档与第一阶段创建的文本单元关联起来,能够理解哪些文档与哪些文本单元相关。
     
     其次是文档嵌入,使用文档切片的平均嵌入来生成文档的向量表示。具体地,重新分块文档,不重叠块,然后为每个块生成嵌入,创建这些块的加权平均值,按token计数加权,并将其用作文档嵌入,然后基于这种文档表示,能够理解文档之间的隐含关系,并帮助生成文档的网络表示。
    

2 两个应用场景

  1. 全局搜索:通过利用社区摘要,对整个语料库进行整体问题的推理,利用大型语言模型(LLM)生成的知识图谱来组织和聚合信息,以回答需要跨数据集聚合信息的查询。

    传统的RAG模型在处理需要跨数据集聚合信息的查询时表现不佳,例如“数据中的前5个主题是什么?”这类问题。这是因为传统RAG模型依赖于向量搜索来找到语义上相似的文本内容,而没有明确的查询来指导它找到正确的信息。GraphRAG可以回答这类问题,因为由LLM生成的知识图谱的结构告诉我们整个数据集的结构(以及主题)。这允许私有数据集被组织成有意义的语义集群,这些集群是预先总结过的。

    全局搜索方法使用LLM生成的社区报告集合作为上下文数据,以map-reduce方式生成响应。在map步骤中,社区报告被分割成预定义大小的文本块。每个文本块用于生成包含点列表的中间响应,每个点都有相应的数值评分,表示该点的重要性。在reduce步骤中,从中间响应中筛选出最重要的点,并将它们聚合起来,作为生成最终响应的上下文。

  2. 局部搜索:通过扩展到特定实体的邻居和相关概念,对特定实体进行推理。

    这种场景旨在通过结合知识图谱中的结构化数据和输入文档中的非结构化数据,增强大型语言模型(LLM)在查询时的上下文,从而更好地回答涉及输入文档中特定实体的问题。即用的图谱数据跟非结构化文本进行的增强,做的基于实体的推理,利用知识图谱中的结构化数据和输入文档中的非结构化数据,以在查询时为LLM提供与查询相关的实体信息。

    GraphRAG首先识别与用户输入语义相关的知识图谱中的实体集合。这些实体作为访问知识图谱的入口,可以提取更多相关信息,如相关实体、关系、实体协变量和社区报告。此外,还从原始输入文档中提取与已识别实体相关联的相关文本块。然后,这些候选数据源将被优先排序和过滤,以适应预定义大小的单个上下文窗口,用于生成对用户查询的响应。

3 结语

GraphRAG的核心就是围绕全局搜索跟局部搜索两个应用场景做的优化,但串联了实体识别、实体关系抽取、社区聚类等算法,会存在误差传播,为了做这种图谱可能需要花费很大精力,也不一定会奏效。不过其通过文档内部,文档外部做图谱的思路,以及基于此做的嵌入作为补充也是值得借鉴的方法。

论文题目:From Local to Global: A Graph RAG Approach to Query-Focused Summarization

论文链接:https://arxiv.org/pdf/2404.16130

项目链接:https://github.com/microsoft/graphrag

PS: 欢迎大家扫码关注公众号_,我们一起在AI的世界中探索前行,期待共同进步!
在这里插入图片描述

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 02:02:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 02:02:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 02:02:02       57 阅读
  4. Python语言-面向对象

    2024-07-10 02:02:02       68 阅读

热门阅读

  1. LeetCode --- 2103. Rings and Rods 解题报告

    2024-07-10 02:02:02       17 阅读
  2. 重定向(Redirect)和转发(Forward)

    2024-07-10 02:02:02       23 阅读
  3. Git:现代软件开发的基石

    2024-07-10 02:02:02       26 阅读
  4. uni-app-H5页面调用设备摄像头扫描二维码

    2024-07-10 02:02:02       24 阅读
  5. docker

    2024-07-10 02:02:02       19 阅读
  6. 【Oracle】Oracle数据库中的数据类型

    2024-07-10 02:02:02       17 阅读