GraphRAG

1,096 阅读9分钟

1. Knowledge Graph

通过图谱的方式存储实体(如人、地点、组织等)及其相互之间的关系。 每个实体是一个节点,而实体之间的关系则通过边(或称为链接)来表示。

community 通常指的是在知识图谱中具有某种相似性或关联性的节点或实体群体。这些节点或实体可能在某些特定的属性、关系或主题上有共同点,因此被归类为一个“社区”。

1.1 Knowledge Graph Creation

与 GenAI 有关的两种图谱:

  1. Domain graph (领域图) 是与您的应用程序相关的世界模型的图形表示。

Untitled.png

  1. Lexical graph (词汇图) 是文档结构的图。最基本的词汇图每个文本块都有一个节点:

Untitled 1.png

通常会扩展它,以包括文本块和文档对象(例如表格)、章节、部分、页码、文档名称/ID、集合、来源等之间的关系。

  1. 还可以将领域图和词汇图结合起来:

Untitled 2.png

创建

创建词汇图很简单,主要是简单的解析和 chunk 策略问题。

创建领域图,有几种不同的路径,具体取决于引入的数据是来自结构化源、非结构化文本,还是两者兼有。

  • 非结构化文本:新的 Neo4j 知识图谱生成器 可以处理 PDF 文档、网页、YouTube 剪辑或维基百科文章,并自动从中创建知识图谱。只需点击几下按钮,就可以可视化(当然也可以查询)输入文本的领域图和词汇图。这既强大又有趣,大大降低了创建知识图谱的门槛。
  • 结构化:对于最常见的情况,即数据存在于关系数据库中,可以使用标准工具,遵循行之有效的关系到图谱映射规则。

1.2 使用 - Working with Knowledge Graphs

一旦拥有了知识图谱,就有越来越多的框架可以用于进行 GraphRAG,例如 LlamaIndex Property Graph IndexLangchain 的 Neo4j 集成 以及 Haystack 等。这一领域发展迅速,现在编程方法变得越来越简便。

在图谱构建方面也是如此,像 Neo4j Importer 这样的工具,提供了一个图形化的用户界面,可以将表格数据映射并导入到图谱中,以及上文提到的 Neo4j 新推出的 v1 版本 LLM Knowledge Graph Builder。下图总结了构建知识图谱的步骤。

Untitled 3.png

使用知识图谱的另一个常见操作是将人类语言的问题映射到图数据库查询中。Neo4j 新推出的开源工具 NeoConverse,旨在帮助实现对图谱的自然语言查询。这是朝着这一目标迈出的重要一步。

尽管开始使用图谱需要一些工作和学习,但好消息是,随着工具的改进,这变得越来越容易了。

GraphRAG:

GraphRAG 使用LLMs基于输入语料库创建知识图谱。这个知识图谱连同 community 中提取的summary 信息以及图机器学习的输出结果来增强查询提示,以提供更全面和准确的回答。

community summary:作为自我记忆用于增强检索;

community answer的并行生成类似于迭代或联邦检索-生成策略。

GraphRAG 能够提供全面而深入的信息检索和分析能力。

2. GraphRAG

2.1 Why GraphRAG?

基于向量的 RAG

它是通过相似性计算获得匹配的chunks。但如果你想理解向量内部的内容,了解它周围的环境,或者理解这些内容在更大背景中的意义,向量这种表示方式就显得不足。缺乏上下文chunks之间的联系。

GraphRAG

从本质上说,GraphRAG 还是 RAG,只不过它的检索路径中加入了知识图谱。

与仅使用向量的 RAG 相比,GraphRAG 主要有三个方面的优势:

  1. 运行/使用中:更高的准确性和更完整的答案

    向量 RAG 的问题:

    • Vector RAG struggles to connect the dots. 当回答一个问题需要通过不同的 chunks 来综合见解时,难以连贯地整合信息。
    • 在全面理解和总结大型数据集或单个大型文档的语义概念时,表现欠佳。
  2. 开发时间:创建知识图后,构建和维护 RAG 应用程序更加容易

    • 图具有高度的迭代性——可以从“最小可行图”开始,逐步扩展。
  3. 管理上:提供更好的可解释性、可追溯性和访问控制

    • 可解释性:图比数字化的向量更好理解。
    • 可追溯性: 大语言模型 (LLMs) 本身并不提供一种好的方法来实现这一点。虽然你可以找到用于决策的文档引用,但这些引用并不能解释决策本身——更不用说大型语言模型有时会编造这些引用!知识图谱则在完全不同的层次上运行,使 Gen AI 管道内的推理逻辑更加清晰,输入数据也更容易解释。
    • 访问控制: 大语言模型 (LLMs) 和向量数据库都无法有效地根据角色限制信息范围。而在知识图谱中,可以通过权限设置来轻松管理这一点,使得任何用户访问数据的能力都由数据库控制,并排除他们无权查看的结果。下面是一个在知识图谱中实现的细粒度访问控制的简单安全策略示例:

Untitled 4.png

2.2 What GraphRAG?

从本质上说,GraphRAG 还是 RAG,只不过它的检索路径中加入了知识图谱。使得搜索不仅基于文本的向量相似度,还能利用图谱中的结构化信息来优化查询结果。这种模式使得 GraphRAG 在处理复杂查询和提供深入信息时更为有效。

Untitled 5.png

在Retrieval 阶段:可以选择将图和向量分别存储在两个独立的数据库中,也可以使用像 Neo4j 这样同时支持向量搜索的图数据库。

不同的使用案例会有不同的模式,使用 GraphRAG 的一种常见模式如下:

  1. 进行向量或关键字搜索以找到初始节点集。
  2. 遍历图谱以获取相关节点的信息。
  3. 可选地,使用基于图的排序算法(如 PageRank)对文档进行重新排序。

GraphRAG Lifecycle

Untitled 6.png

2.3 The GraphRAG Process

Untitled 7.png

1. index

  • 分 chunk(TextUnits)
  • 使用LLM提取所有entities, relationships, and key claims, 来生成知识图谱。
  • 使用 Leiden 技术对图进行层次聚类。它使我们能够回答不同抽象级别的问题。
  • 自底向上为每个 community 及其组成部分的摘要。这有助于全面理解数据集。

2. query

采用两种查询模式:

全局搜索:利用组摘要(community summaries),针对有关语料库的整体问题进行推理

局部搜索:通过它们的邻居和相关概念,来推理特定实体。

详解 GraphRAG pipeline

Untitled 8.png

  1. 源文档→ 文本块
  2. 文本块 → element instance
    • 目标:从文本块中识别和提取图节点和边。使用 LLM 提示识别实体和关系,输出限定元组。
    • 定制化:可以通过为LLM提供少量领域特定的示例来定制提示,以适应不同的知识领域(如科学、医学、法律等)。
    • 协变量提取:支持二级提取提示,用于提取与提取的实体节点相关的其他协变量,如实体相关的声明、主题、对象、类型、描述、源文本范围以及开始和结束日期。
    • 多轮提取:在不牺牲块大小的情况下检测到更多实体。
  3. 元素实例→元素摘要
    • 摘要:LLM 抽象并总结文本中的实体、关系和声明。
    • 处理重复:LLM可能无法始终以统一的格式提取同一实体的引用,可能会产生重复的实体元素和节点,可能会产生重复的实体元素和节点。但由于检测到密切相关的实体及其摘要,加上LLM可以理解多种名称变体对应的共同实体,只要这些变体与一组密切相关的实体有足够的连接性,整体方法就能够应对这种变体。
  4. 元素摘要 → 图 community
    • 图建模:创建一个无向加权图,其中节点是实体,边是关系。
    • community detection:使用 Leiden 算法将分割成层次化 community,将具有较强内部连接的节点划分为 community,而与图中其他节点的连接较弱。以实现高效的全局摘要。
  5. 图社区→ community摘要
    • 摘要创建:为每个 community 生成报告式摘要。
    • 实用性:摘要有助于理解数据集的全局结构和语义,辅助回答全局查询。用户可以浏览不同层级的 community 摘要,寻找感兴趣的一般主题,然后深入到较低层级的报告以获取更多细节。
  6. community 摘要 → community 回答→全局回答
    • 准备 community 摘要:community 摘要被随机打乱并划分为预设大小的块。这确保相关信息分布在各个块中,而不是集中(并可能丢失)在单个上下文窗口中。
    • community 回答映射:利用 community 摘要并行生成 community 回答,利用LLM 生成有用程度分数。
    • 归纳全局回答:按照有用程度得分降序对中间 community 答案进行排序,并迭代地添加到新的上下文窗口中,直到达到 token 限制。

2.4 Problem

  1. Knowledge Graph Creation: 尽管使用 LLM 来生成知识图谱,但改造出的图谱大概率产生噪声,所以需要人工去做清洗和校正。
  2. 计算:使用 community detection 算法将图谱转为层级化的聚类,一是耗资源;二是如果知识图谱变得很大,计算复杂度会变得很高。
  3. 新数据的加入:可能需要重新构建图谱,重新构造层级化的聚类。

参考:neo4j.com/blog/graphr…