图片来自 Shutterstock 上的 VectorMine。
摘要:
本文探讨了如何通过知识图谱增强检索增强生成(RAG)系统(即GraphRAG),显著提高大型语言模型(LLM)在复杂、互相关联的数据集(如法律文件或技术文档)中的响应准确性和细节,利用文档之间的显式连接,避免幻觉(hallucinations),从而提供更全面的答案。使用有助于检索的知识图谱来增强 RAG 可以使系统更深入地研究数据集以提供详细的响应。
关键要点:
– 标准RAG系统可能在信息分散于多份文档的复杂数据集上表现不佳,导致浅薄或不准确的回复(“幻觉”)。
– 知识图谱通过显式连接相关文本片段,即使它们在向量空间中并不相似,增强了RAG性能。。
– 有效的图谱连接应清晰且富有意义,例如HTML链接、专用关键词和定义术语。, 。
– 文档中的HTML链接提供了建立知识图谱的明确且可用的连接。。
– 专用领域内的关键词也能创造出未被向量嵌入捕获的有意义连接。。
– 将文档片段与知识图谱中的定义相连接,可以提高准确性,特别是在包含术语表或定义的数据集中。。
– 在知识图谱中保留文档结构(如标题、页码和交叉引用),可实现支持上下文的检索
Source:
https://thenewstack.io/boost-llm-results-when-to-use-knowledge-graph-rag/
正文
有时,检索增强生成 (RAG) 系统无法深入到文档集中以找到所需的答案。我们可能会得到笼统或肤浅的回答,或者我们可能会得到 RAG 系统检索低细节,然后用不相关或不正确的信息填补空白的回答——这就是所谓的“幻觉”。
深入的知识库和文档集可能包含我们在 RAG 提示中回答问题所需的所有信息,但 RAG 系统可能无法找到所有信息,特别是当所需信息分布在多个文档和不同的主题或子主题中时。特别是,向量检索通常会生成一组很好的文档,但这些文档中的某些概念需要更多信息才能让系统理解它们,因此检索与这些概念直接相关的其他文档也会有所帮助。
某些类型的数据集可能存在这些问题:
-
经常相互引用的文档集合。
-
包含章节、术语定义和词汇表的文档,其中检查交叉引用是了解给定主题完整图片的唯一方法。
-
大型 Wiki 或知识库,其中几乎每个段落都包含指向其他页面和外部网站的 HTML 链接。
像这样的数据集通常出现在:
-
法律文件
-
医学文献
-
技术文档
-
研究和学术出版物
-
高度互联的网站
如果您的组织拥有由相互关联的文档和其他内容组成的深入而复杂的数据集,则标准 RAG 实施可能无法成功解决一些最常见的使用案例,尤其是当提示要求提供包含广泛和高度具体级别信息的详细解释时。将实现转换为GraphRAG,这意味着使用有助于检索的知识图谱来增强 RAG 系统,可以使系统更深入地研究数据集,从而为请求详细和专业信息的提示提供详细且正确的响应。
让我们探讨一下知识图谱如何提高 RAG 系统性能背后的关键概念、这样的图可能是什么样子,以及如何开始基于您自己的数据构建GraphRAG 系统。
图谱有什么帮助?
简而言之,知识图谱与文档的向量存储相结合,可以提供一种方法来直接连接向量空间中可能彼此不接近或相似的文本块,因此在检索过程中,这些文本块本质上不会被视为彼此“相关”。
典型的 RAG 系统根据向量相似度的度量,从向量存储中检索与提示最相关的文档(或“块”)。如果这些文档包含指向其他文档的链接或引用,那么很明显,文档的作者认为它们有意义地相关。如果这些文件有意义地相关,我们为什么不想使用这些信息来更深入地挖掘并获得更多可能有助于回答提示的细节呢?
重申一下情况:我们有明确且直接相关的文档 – 通过链接或引用 – 我们希望确保我们的 RAG 系统在检索文档时考虑这些联系。构建链接文档网络会产生一个图形结构,我们可以遍历该结构以查找在典型文档检索过程中可能无法找到的相关文档,使用图形来增强 RAG;这称为 Graph RAG。
主要思想是我们已经有一个隐式且高置信度的图谱,它通过直接链接和引用将文档彼此关联起来,我们希望我们的 RAG 系统在依赖不太确定的向量相似性和相关性分数来填充响应中的细节之前,充分利用这些已知的、高度确定性的联系。这将有更高的幻觉反应风险。
我们可以使用哪些类型的连接?
定义图谱的可能性是无限的,但我们发现,在 GraphRAG 中使用的最好和最有效的连接类型是那些定义明确且有意义的连接。也就是说,我们希望明确什么是联系,什么不是,因此我们倾向于避免为一般主题和情感等模糊概念定义联系。我们希望这些连接是有意义的,因为在图中的两个文档之间建立连接使得每个文档中的内容很可能与另一个文档相关。以下是在 Graph RAG 中定义文档之间连接的一些最有用的方法。
HTML 链接
如今,连接文档的最清晰、最明显的方法之一是从一个文档到另一个文档的直接链接,就像基于 Web 的文档中的 HTML 链接一样。从人类的角度来看(而不是 AI 的角度来看),如果我们点击一个文档中的链接并最终进入另一个文档,那么它们之间就会有链接。这可以在软件中使用任意数量的链接提取工具进行定义和实现。通常,文档的作者添加链接是有原因的,因此它们之间存在有意义的联系。通过这种方式,HTML 链接是我们可以在知识图谱中使用的文档之间最明确和最有意义的链接。
从 HTML 链接构建知识图谱在数据集(如技术文档和大型 Wiki 或知识库)上效果非常好。这些类型数据集的互连性质使 graph RAG 特别适用于深入研究仅通过向量搜索可能无法找到的专业细节、定义和子主题。
从 HTML 文档中提取链接的一些示例代码:
有关使用 HTML 链接提取构建图谱的GraphRAG 的端到端示例,请查看最近的文章“Better LLM Integration and Relevancy with Content-Centric Knowledge Graphs”。
关键词和主题
尽管对于GraphRAG 而言,从基于一般主题或情绪的连接构建图形可能过于模糊和不确定,但通常可以有效地使用定义明确且有意义的高度专业化的关键字和主题。特别是,专用域中的关键字可以有效地在图形 RAG 中的文档之间建立连接。专用关键字并不总是在文档的向量嵌入表示中捕获,因此将受益于知识图谱提供的更强大、更深思熟虑的连接。
有一些很好的工具可以提取关键词;以下是如何使用 “keyBERT” 提取关键字的简单示例:
这将提取专用域关键字:
我们如何将这些关键字转换为知识图谱取决于我们的用例和数据模型。一个例子可以在GraphRAG 上的 RAGStack 文档中找到。
构建一个带有有意义的关键字作为节点的图谱,这些节点连接到它们所在的文档可能是一种有效的GraphRAG 策略。请注意,要通过图形将文档彼此连接,我们必须将图形遍历到两个或多个深度:一步从文档到其关键字,第二步到包含这些关键字的其他文档。
术语和定义
在法律文件、学术出版物和研究著作中,我们将术语和定义定义为列表或词汇表,通常位于文档的开头或结尾。在这些情况下,在整个文档中引用这些术语和定义会很有帮助,这样我们就可以始终清楚地了解所说的内容。如果没有这些术语定义,文档的某些部分可能会变得模糊或几乎没有意义。
一个特别贴切的例子是租户和房东之间的大量合同文件;我们将使用我们的 RAG 系统查询它们。文档通常会在加载到数据存储之前进行分块,这意味着出现在文档开头或结尾的任何术语和定义本身都不包含在块本身中。而且,由于不同的租户和房东之间有许多合同,因此任何引用“租户”或“房东”一词的块如果不将其与特定租户和特定房东联系起来,就会产生歧义。
在这种情况下,拥有一个知识图谱,将文档块与文档块中出现的术语的适当定义显式连接起来,将非常有用。提取这些定义和术语并将它们连接到正确的文档块的具体实现将取决于原始文档本身的格式、术语表或定义相对于文档其余部分的结构等。许多文本和文档解析器可用于此目的,并且正在努力在考虑图形 RAG 的情况下标准化该过程。
文档结构 – 章节引用、页码等。
当文档被分块并加载到向量存储中时,除非我们以某种方式捕获它,否则块之外的所有文档结构都会丢失。对于许多 RAG 用例,系统了解每个文档块在文档整体结构中的位置、所有标题和副标题、页码以及哪些块紧跟在给定块之前和之后会很有帮助。
将此信息保存在连接到每个块的知识图谱中,对于图形 RAG 而言,有两个主要优势。首先,知道一个块在文档中的位置,使我们能够提取附近的文本,可以是紧接在前后的块、来自同一页面的文本或来自同一部分的文本——所有这些都可以为初始块中提到的主题提供支持证据和细节。其次,一些文档包括对其他章节编号、标题和页码的交叉引用,因此,拥有一个知识图谱将会很有帮助,允许 RAG 系统直接检索被引用的章节中的块。
我们如何构建此图谱来改进我们的RAG系统?
在这篇关于以内容为中心的知识图谱的文章中,我们列出了更多技术细节,其中我们解释了如何使用 langchain 、 ragstack 、 Cassandra 和相关工具从基于 Web 的技术文档构建知识图谱。我们从文档中出现的 HTML 链接构建知识图谱,这可能是为图 RAG 构建知识图谱的最简单、最有用的方法之一。
要处理 HTML 文档并为GraphRAG 添加适当的元数据,我们可以使用辅助函数,例如:
处理完文档并添加了适当的元数据后,可以将它们加载到图形矢量存储中,如下例所示,该示例使用 Astra DB 作为底层数据存储,并使用 CassandraGraphStore 作为 GraphVectorStore 的实现,它同时用作知识图谱和矢量存储:
了解更多信息
要了解有关优化GraphRAG 知识图谱的构建和使用的更多信息,请阅读最近的文章“通过消除边缘来扩展知识图谱”。这包括对 Langchain 中方便的 “GraphVectorStore” 的介绍。
有关 DataStax 如何帮助您快速开始使用 Graph RAG 且只需最少的代码更改的最新更新,请查看RAG with Vector Graph 上所做的工作。https://www.datastax.com/products/vector-graph
参考文献