首页 / 文章

GraphRAG与向量RAG:为何向量搜索在处理大规模数据时会失败

向量RAG在数据块隔离、跨文档推理以及处理大规模数据方面存在缺陷。了解GraphRAG如何通过构建社区和摘要来解决这些问题,以及何时该选择哪种技术。

发布者:REACTAPP.TOP阅读约 8 分钟1893 词

来源: GraphRAG: Why Vector Search Fails at Scale (And How Knowledge Graphs Fix It)

检索增强生成技术使语言模型能够处理其从未训练过的数据。传统版本会将文档拆分成若干片段,将这些片段的嵌入向量存储在向量数据库中,当有查询时再取出与查询最相似的片段并加入提示词中。对于规模较小的简单问答场景,这种方法效果不错。但面对复杂的企业级数据时,就会出现问题。

问题并不出在检索步骤或生成步骤本身,而在于数据被转换为向量后的表示方式。

普通向量RAG的局限性

片段变成孤立个体

一旦文档被分割成多个片段,每个片段都会在向量空间中独立存在。它与周围的段落以及其他文档中的相关内容隔离开来,原本的文档结构也随之消失。在检索时,重要的上下文信息会被遗漏,导致大语言模型可能将部分事实误认为是全部真相。切断这些逻辑联系迫使模型在缺乏原始上下文的情况下对文本进行判断。

无法实现跨文档推理

有些问题无法仅通过某一段文字来解答。比如“我们的所有季度财务报告中都体现了哪些趋势和主题?”或者“员工能否报销入职日期之前产生的Wi-Fi费用?”微软研究院将这类问题称为意义构建型查询。这类问题范围较广,需要一个系统来分析、整合并总结数据集中的各种关联,而非仅仅提取已存在的某个事实。

向量搜索基于局部语义匹配来实现:即那些向量与查询向量距离最近的片段。这种方法非常适合处理局部性问题,但当答案分散在多个片段和文档中时就会失效。假设答案需要将某个文档中的事实A与另一个文档中的事实B,以及第三个文档中的事实C联系起来。由于每个片段都是根据其与查询的相似度独立获取的,因此即使答案依赖于某个相似度较低的中间事实,它也会被忽略,从而导致推理链断裂。

数据量增加时准确性下降

每一个从原型阶段发展到实际应用的RAG系统都会不断扩充其语料库,而这种扩充会暴露出一个问题:检索精度开始下降。更多文档虽然能扩大系统可覆盖的主题范围,但也会降低精确度。当索引中的片段数量从数百个增加到数千个时,对于某个具体问题而言,有用的片段比例会持续缩小。那些相关的片段会被在语义上相似但在具体语境中毫无用处的片段所淹没。更多的文档意味着更广的覆盖范围,但同时也意味着更低的检索精度。

GraphRAG——解决方案

为解决这些缺陷,微软研究院在2024年推出了GraphRAG。它不再使用相互独立的向量,而是通过构建知识图谱来保留文本中隐藏的结构化关系。知识图谱将现实世界的事实表现为节点,这些节点即人物、地点或概念等实体,而连接这些节点的边则体现了它们之间的关联方式。这样的架构使得系统能够对整个数据集进行推理,而不仅仅是进行局部查询。

核心理念

GraphRAG将分散的文档转化为相互关联的思想地图,并从宏观主题逐步总结出详细信息。由于这些关联关系是预先构建好的,大语言模型既能获得对整个语料库的宏观视角,又能获取细致的上下文信息。整个过程分为四个阶段:

  1. 构建知识图谱。大型语言模型会构建一个知识图谱,其中节点代表语料库中的关键实体,边则表示这些实体之间的关联。
  2. 识别社群。该知识图谱会被划分为多层嵌套的群组,从小范围的局部群体到覆盖整个数据集的主题不等。社群是指彼此之间紧密相连、而与网络中其他节点联系较弱的节点集合。
  3. 自下而上进行总结。大型语言模型会为每个社群撰写总结,涵盖其中的实体、事实及关联关系。总结是按照层级结构生成的,上层社群会整合下层社群的总结内容,从而形成对整个数据集的结构化概览。
  • 使用 map-reduce 方式回答。在查询时,社区摘要会并行处理为部分答案(map阶段),随后这些部分答案会被合并为一个全局答案(reduce阶段)。
  • 详细工作流程

    与传统的 RAG 一样,GraphRAG 也分为索引和查询两个阶段。

    离线进行的索引阶段

    将文档分割成块。该过程首先将文档拆分成若干块,通常每块约 600 个标记,这一大小选择是为了尽可能多地识别出实体。

    从块中提取实体与关系。大语言模型会依次读取每个块,提取其中重要的实体及其相互关系,同时为每个实体提供简短描述。它还可以提取关于实体的重要事实,如日期、事件以及与其他实体的交互情况。

    构建知识图谱。所有提取的信息会被整合在一起。实体成为节点,而关系则成为边。为减少冗余,相同实体的不同表现形式会被合并,其描述也会被浓缩为一条记录。当某条关系被反复提及时,该边的权重就会增加,以此表明两者之间的联系更为紧密,同时各种陈述也会被附加到相关的节点和边上。

    从图谱到社群。通常采用莱顿算法这种分层社群检测算法,将网络划分为由紧密相连的节点构成的群组。最终会形成多层级的结构,最底层是规模较小、细节丰富的群组,而最顶层则是覆盖整个领域的较大群组。

    从社区到摘要。大型语言模型从最小、最详细的集群开始,逐层为层级结构中的每一层撰写摘要。这有助于回答宏观问题,同时让用户能够从广泛的主题逐步深入到细节层面。为避免超出上下文限制,最低层级的摘要是通过按重要性对原始图数据排序,并将连接最紧密的实体、关系和陈述填入提示词中,直到空间用尽为止。更高层级的摘要则是直接基于其下层的摘要生成的,即层层汇总的结果。

    运行时查询

    标准RAG对每个提示都采用相同的相似度查询方式。GraphRAG则根据意图通过两条路径中的一条来发送查询。全局搜索用于处理涉及整个数据集的广泛推理任务,而局部搜索则用于处理需要多步推理的、以特定实体为中心的查询。对于有报销政策的公司,全局查询可能会询问所有报销项目中的主要合规风险及审批规则,而局部查询则可能询问员工是否可以报销在正式入职日期之前产生的网络费用。

    全局查询。系统不会扫描数百万条原始文本片段,而是通过映射归约流程来查询预先计算好的社区摘要。

    1. 根据所需答案的范围,选择合适的层次结构级别,从范围较广的超级社区到较为精细的局部群组(0级、1级、2级等等)。
    2. 映射:将问题同时发送到该层级下的每个社区摘要。大型语言模型会独立评估每个摘要,并生成带有0到100分相关度评分的中间社区答案。
    3. 过滤与排序:剔除相关度较低的答案,将剩余答案按优先级排序。
    4. 整合:将排名最高的见解一次性传递给大型语言模型,使其在同一个上下文窗口中将这些见解综合为一份完整且无重复内容的答案,并附上引用依据。

    本地查询。GraphRAG不会丢弃向量,只是改变它们的用途。在本地搜索中,向量仅用于在图中定位锚定实体。一旦找到这些入口点,向量搜索就会停止,转而由图遍历来完成搜索。为此,必须先为实体描述生成嵌入向量,并将其存储在向量数据库中。

    这确实带来了显著差异。在传统的RAG系统中,向量相似度是获取原始文本片段的主要方式;而在GraphRAG中,则是通过有针对性的查找将问题映射到相关实体,这些实体仅作为进入图的入口。根据配置不同,局部搜索还可以以文本单元或陈述内容作为切入点进行嵌入和检索。

    1. 通过对实体描述向量进行相似度搜索来找到切入点。
    2. 将这些实体映射到其来源文档和文本片段,沿着图结构收集相邻节点及边描述,获取陈述内容、URL和日期等关联信息,同时汇总这些实体所属的局部社区总结,从而补充一些周边上下文。
    3. 让大语言模型根据这些映射与问题的相关性对它们进行排序,剔除相关性较低的项。
  • 将排序后的上下文添加到提示词中,从而生成有依据的答案。
  • 如何选择

    并非在所有情况下哪种方法都更优。它们适用于不同类型的问题和数据。选择哪种方法取决于数据集的复杂程度、需要支持的查询类型以及可投入的资源。

    当需要从独立文档中快速、低成本地检索孤立事实,且答案位于单个段落或页面内时,可选择向量RAG。当数据源彼此紧密关联,问题需要跨文档综合分析、对整个数据集进行趋势分析,或追踪法律、科研和政策等领域中实体之间的关系时,应选择GraphRAG。

    一个简单的记忆方法:向量RAG如同在干草堆中寻找针,而GraphRAG则是先绘制出整个干草堆的地图,然后再进行搜索。

    Vector RAG改变了大型语言模型处理外部知识的方式,但要处理复杂的企业级数据,仅靠语义相似度检索远远不够。GraphRAG通过将文本组织成带有分层社区摘要的知识图谱,实现了针对特定内容的检索与对整个数据集的推理功能。

    如需进一步阅读,相关论文可在https://arxiv.org/abs/2404.16130找到,而本地搜索设计的相关文档则位于https://microsoft.github.io/graphrag/query/local_search/。