大家好,本篇博文我将结合这段时间,为了探究RAG 的核心概念、关键技术在构建 AI Agent 中的应用,看的一些文献和文章做全面细致的总结,将从 RAG 基础、检索技术演进、多模态处理、结构化索引等维度展开总结讲解

一、RAG 基础入门𝜗𝜚🍒ᝰ.ᐟ

1.1 RAG 核心概念𝜗𝜚🍒ᝰ.ᐟ

RAG,即检索增强生成(Retrieval-Augmented Generation),是一种创新的技术框架。它的核心思想是打破传统大模型仅依赖训练数据的局限,通过实时检索外部知识库,为生成模型提供最新、最相关的信息,从而显著提升生成内容的准确性和时效性。

想象一下,传统的大模型就像是一个知识储备固定的学者,其知识仅限于过去学习(训练)的内容。而 RAG 技术则为这个学者配备了一个随时可以查阅最新资料的图书馆,当遇到问题时,能够快速检索并整合最新信息,给出更准确、更全面的回答。这种方式不仅解决了大模型知识滞后性的问题,还能让其在处理各种复杂问题时更加得心应手。

1.2 RAG 系统架构𝜗𝜚🍒ᝰ.ᐟ

一个典型的 RAG 系统包含两个核心组件:检索器(Retriever)和生成器(Generator)。这两个组件相互协作,共同完成从问题到答案的生成过程。

检索器的主要任务是在海量的知识库中,根据用户的查询快速、准确地检索出最相关的信息片段。它就像是图书馆的索引系统,能够根据关键词或语义匹配,从众多书籍中找到与问题相关的资料。检索器的性能直接影响到 RAG 系统的准确性和效率,因此选择合适的检索算法至关重要。

生成器则是 RAG 系统的 “大脑”,通常由大型语言模型担任。它接收检索器提供的相关信息和用户的原始查询,利用自身强大的语言理解和生成能力,将这些信息整合生成最终的回答。生成器不仅要保证回答的语言流畅、逻辑连贯,还要确保回答内容准确、完整地回答了用户的问题。

二、构建高效检索器之稠密嵌入𝜗𝜚🍒ᝰ.ᐟ

2.1 技术演进:从 Word2Vec 到上下文感知𝜗𝜚🍒ᝰ.ᐟ

2.1.1 Word2Vec 模型𝜗𝜚🍒ᝰ.ᐟ

Word2Vec 模型主要包含两种训练模式:连续词袋模型(CBOW)和跳字模型(Skip-Gram)CBOW 模型通过一个单词的上下文(即周围的单词)来预测这个单词。例如,对于句子 “我喜欢吃苹果”,CBOW 模型会利用 “我”“喜欢”“吃” 这些上下文单词的向量,通过特定的神经网络计算,来预测 “苹果” 这个单词。而 Skip-Gram 模型则与 CBOW 相反,它使用一个单词来预测其上下文。还是以上述句子为例,Skip-Gram 模型会根据 “苹果” 这个单词的向量,去预测它周围可能出现的 “我”“喜欢”“吃” 等单词。

Word2Vec 使用了一种叫做负采样的技术来提高训练速度和改善结果。这种方法不是尝试更新所有上下文单词的权重,而是只更新一小部分(通常是 5 到 20 个)。通过大量文本的训练,Word2Vec 能够学习到每个单词的向量表示,这些向量包含了丰富的语义信息。在向量空间中,语义相似的单词,它们的向量也会比较接近。例如,“国王” 和 “王后” 这两个单词的向量就会比较靠近,因为它们在语义上都与皇室相关。更神奇的是,Word2Vec 还能捕捉到词汇之间的语义关系和类比关系,就像我们熟知的 “king” - “man” + “woman” ≈ “queen” ,这种向量运算的结果体现了模型对语义关系的深刻理解。

2.1.2 上下文感知模型优势𝜗𝜚🍒ᝰ.ᐟ

但 Word2Vec 存在一个明显的局限性 —— 无法处理一词多义的问题。由于 Word2Vec 生成的是静态词向量,每个单词只有一个固定的向量表示,不随上下文的变化而改变。例如,“bank” 这个单词,在 “river bank”(河岸)和 “investment bank”(投资银行)这两个短语中,虽然含义截然不同,但 Word2Vec 会为它们赋予完全相同的向量,这显然不符合实际语义理解的需求。

为了解决这一问题,上下文感知的嵌入模型应运而生,其中 BERT(Bidirectional Encoder Representations from Transformers)和 BGE-M3(BAAI General Embedding-Multilingual-Multifunctional)是这类模型的典型代表。BERT 模型采用了 Transformer 架构,其核心创新点在于引入了双向注意力机制(Bidirectional Attention),能够同时关注一个单词的前文和后文信息,从而在生成词向量时充分考虑上下文的影响。例如,当 BERT 处理 “bank” 这个单词时,如果它处于 “river bank” 的上下文中,模型会根据 “river” 等周围单词的信息,生成与 “河岸” 语义相关的向量;而当它处于 “investment bank” 的上下文中,模型则会结合 “investment” 等单词,生成与 “投资银行” 语义对应的向量。

BGE-M3 则是一种更为先进的模型,它在 BERT 的基础上进行了扩展和优化,注重通过多功能性(Multi-Functionality)、多语言性(Multi-Linguisticity)和多粒度性(Multi-Granularity)增强文本表示。BGE-M3 不仅可以处理更长的上下文,还能生成高质量的多语言嵌入向量,支持超过 100 种语言,并且能够处理长达 8192 个 token 的上下文。这使得它在跨语言语义搜索和长文本理解等任务中表现出色。在一个包含多种语言的文档集合中,BGE-M3 能够准确地理解不同语言文本的语义,并将它们映射到统一的向量空间中,实现高效的跨语言检索。

2.2 ANN 索引算法比较𝜗𝜚🍒ᝰ.ᐟ

为了深入了解稠密嵌入在实际应用中的性能表现,通过 dense-embedding 项目搭建了一个向量相似性搜索服务,以此来对比不同近似最近邻(Approximate Nearest Neighbor, ANN)索引算法的性能和资源使用情况。该项目的核心亮点在于其可配置的双索引后端,即 ANNOY(Approximate Nearest Neighbors Oh Yeah)和 HNSW(Hierarchical Navigable Small World),这两种算法代表了 ANN 领域的两种主流思想。

ANNOY 是一种基于树的索引结构。它通过构建多个二叉树来划分向量空间,在搜索时,通过遍历这些树来找到近似最近邻。ANNOY 的优势在于索引构建速度快,内存占用低,非常适合处理静态的、变化不频繁的大规模数据集。我们在实验中准备了一个包含数百万条文本数据的数据集,使用 ANNOY 构建索引时,能够在较短的时间内完成,并且占用的内存资源相对较少。

HNSW 是一种基于图的索引结构,它通过构建一个层次化的、可导航的小世界网络来实现高效的相似性搜索。HNSW 在查询精度和召回率方面表现出色,并且支持增量更新和软删除,这使得它非常适合处理动态变化的数据集。在实验中,我们不断向数据集中添加新的文本数据,HNSW 能够快速地将这些新数据纳入索引,并且在查询时依然能够保持较高的准确性。

2.2.2 实验结果分析𝜗𝜚🍒ᝰ.ᐟ

在实验过程中,对 ANNOY 和 HNSW 在索引构建速度、内存占用、查询精度、召回率以及更新能力等方面进行了详细的测试和分析。

从索引构建速度来看,ANNOY 明显快于 HNSW。在处理大规模数据集时,ANNOY 能够在数分钟内完成索引构建,而 HNSW 则可能需要数十分钟甚至更长时间。这是因为 ANNOY 的树状结构相对简单,构建过程较为直接。

内存占用方面,ANNOY 也具有优势,它占用的内存空间通常比 HNSW 小。这使得 ANNOY 在内存资源有限的环境中更具竞争力。然而,在查询精度和召回率上,HNSW 则表现得更为出色。HNSW 的图结构能够更好地捕捉向量之间的相似性,从而在查询时能够返回更准确、更相关的结果。在一个包含大量科技论文的数据集上进行查询时,HNSW 能够准确地找到与查询内容最相关的论文,而 ANNOY 可能会遗漏一些相关度较高的论文。

在数据更新方面,ANNOY 存在明显的短板。一旦索引构建完成,ANNOY 无法进行增量更新,任何文档的删除或修改都需要完全重建索引,这在实际应用中会带来很大的不便。而 HNSW 则支持增量更新和软删除,能够实时地反映数据的变化,保持索引的时效性。

结合实际应用场景来看,对于读密集型、数据不常变的应用场景,如一些历史文献检索系统,ANNOY 可能是更经济高效的选择。它的快速索引构建和低内存占用能够在有限的资源下提供稳定的检索服务。而对于一个需要实时索引新信息、保证高精度查询的问答系统,HNSW 则是更可靠的方案。它能够及时将新的知识纳入索引,并且在回答用户问题时提供更准确的答案。

三、构建高效检索器之稀疏嵌入𝜗𝜚🍒ᝰ.ᐟ

3.1 算法发展:从 TF-IDF 到 BM25𝜗𝜚🍒ᝰ.ᐟ

3.1.1 TF-IDF 算法原理𝜗𝜚🍒ᝰ.ᐟ

在稀疏嵌入技术中,TF-IDF 的核心思想是通过综合考虑词频(TF)和逆文档频率(IDF)来衡量一个词在文档中的重要程度。

词频(TF)表示一个词在文档中出现的频率,它反映了该词在文档中的活跃程度。其计算方式非常直观,就是统计某个词在文档中出现的次数。在一篇关于苹果的科技文章中,“苹果” 这个词出现的次数越多,它在该文档中的词频就越高,也就意味着它与这篇文档的内容关联越紧密。但单纯的词频并不能完全体现一个词的重要性,因为像 “的”“是”“和” 等常见词,它们在几乎所有文档中都会频繁出现,但实际上对于区分文档的主题并没有太大的帮助。

为了解决这个问题,逆文档频率(IDF)的概念应运而生。IDF 反映的是一个词在整个文档集合中的稀有程度。其计算方法是通过对文档总数与包含该词的文档数的比值取对数得到。一个词在整个文档集合中出现的文档数越少,它的 IDF 值就越高,也就说明这个词越稀有,越能代表文档的独特主题。在一个包含大量文档的语料库中,“量子计算” 这个词可能只在少数关于前沿科技的文档中出现,所以它的 IDF 值会比较高;而 “的” 这样的常用词,几乎在每篇文档中都会出现,其 IDF 值就会非常低。

将 TF 和 IDF 结合起来,就得到了 TF-IDF 值。TF-IDF = TF × IDF,这个公式能够综合考量一个词在文档内的活跃程度和在整个文档集合中的稀有程度,从而更准确地衡量词对文档的重要性。在信息检索中,当用户输入查询词时,系统会计算每个文档中与查询词相关的 TF-IDF 值,然后根据这些值对文档进行排序,将 TF-IDF 值较高的文档排在前面,认为它们与查询的相关性更高。

3.1.2 BM25 算法改进𝜗𝜚🍒ᝰ.ᐟ

尽管 TF-IDF 算法在信息检索中取得了一定的成果,但它仍然存在一些明显的局限性。其中最主要的问题有两个:一是没有考虑文档长度的影响,二是词频对相关性的贡献是线性的,这与实际情况不符。

对于文档长度的问题,举个例子,假设有一篇 1000 字的长文档和一篇 100 字的短文档,在长文档中 “苹果” 这个词出现了 10 次,在短文档中也出现了 10 次。按照 TF-IDF 算法计算,它们的词频(TF)是相同的,但实际上短文档中 “苹果” 的出现密度更高,应该与 “苹果” 这个主题更相关,然而 TF-IDF 却无法体现这种差异。

另外,词频对相关性的贡献并非线性关系。比如,一个词在文档中从出现 1 次增加到 10 次,可能会显著提升文档与该词的相关性;但如果从 100 次增加到 110 次,实际上对相关性的提升已经微乎其微,因为此时文档的主题已经非常明确与该词相关,再多的出现次数也难以提供更多有价值的信息。

为了解决这些问题,BM25(Best Matching 25)算法应运而生,它在 TF-IDF 的基础上进行了重要改进,成为了现代搜索引擎中不可或缺的核心算法之一。BM25 算法引入了两个关键的调节参数:k1 和 b。

参数 k1 用于控制词频的 “饱和度”,它使得词频对相关性得分的贡献不再是线性增长,而是随着词频的增加逐渐趋于平缓。当一个词的词频较低时,增加词频会显著提高文档的相关性得分;但当词频达到一定程度后,继续增加词频对得分的提升效果会越来越小,从而避免了某些高频词过度主导文档的相关性得分。

参数 b 则用于控制文档长度的归一化程度。BM25 算法会先计算所有文档的平均长度,然后根据当前文档的长度与平均长度的比较来调整文档的得分。如果文档长度大于平均长度,其得分会被适当降低;如果文档长度小于平均长度,其得分则会被适当提高。这样就有效地解决了 TF-IDF 算法中没有考虑文档长度的问题,使得不同长度的文档在相关性比较上更加公平。

BM25 算法通过对词频和文档长度的合理调整,使得它在衡量文档与查询的相关性时更加精准和鲁棒,能够为用户提供更符合需求的搜索结果。在实际应用中,像 Elasticsearch 等流行的搜索引擎都采用了 BM25 算法作为默认的相关性评分算法,通过对 k1 和 b 等参数的合理配置,能够在不同的应用场景中发挥出良好的性能。

3.2 实践操作:从零实现 BM25 搜索引擎𝜗𝜚🍒ᝰ.ᐟ

3.2.1 实现步骤𝜗𝜚🍒ᝰ.ᐟ

为了更深入地理解 BM25 算法的工作原理,我们通过 sparse-embedding 项目来从零实现一个基于 BM25 算法的稀疏向量搜索引擎。这个过程不仅能够让我们掌握 BM25 算法的具体实现细节,还能帮助我们更好地理解搜索引擎的内部工作机制。

首先是文本预处理阶段。在这个阶段,我们需要对原始文本进行一系列的处理,以便后续的算法能够更有效地处理这些文本。我们会使用分词工具将文本分割成一个个单独的词语,例如使用 jieba 分词工具对中文文本进行分词。我们还会去除停用词,这些词通常是一些没有实际意义的常见词,如 “的”“是”“和” 等,它们在文本中频繁出现,但对文本的主题和内容并没有实质性的贡献,去除它们可以减少数据量,提高算法的效率。对于一些英文文本,还可能需要进行词干提取或词形还原等操作,以确保同一个词的不同形式能够被统一处理。

接下来是构建倒排索引(Inverted Index),这是稀疏检索的核心数据结构倒排索引的作用是将每个词映射到包含该词的文档列表。具体来说,我们会遍历所有经过预处理的文档,对于每个文档中的每个词,记录下这个词所在的文档 ID 以及在文档中的位置等信息。这样,当我们需要查询某个词时,就可以通过倒排索引快速定位到包含该词的所有文档,大大提高了检索的速度。如果我们查询 “苹果” 这个词,通过倒排索引可以迅速找到所有包含 “苹果” 的文档,而不需要遍历整个文档集合。

最后是计算每个词的 TF 和 IDF 值。根据前面介绍的 TF 和 IDF 的计算方法,我们在已经构建好的倒排索引基础上,统计每个词在各个文档中的出现次数,从而计算出词频(TF)。同时,通过统计包含每个词的文档数,结合文档总数,计算出逆文档频率(IDF)。有了 TF 和 IDF 值,就可以根据 BM25 算法的公式,进一步计算每个文档与查询之间的相关性得分。

3.2.2 𝜗𝜚🍒ᝰ.ᐟ

通过实现基于 BM25 算法的稀疏向量搜索引擎,可以进行一系列实验来观察 BM25 算法在不同场景下的表现。

在查询包含 “HTTP-403” 或人名 “Alexander Humphrey” 这样的特定关键词时,BM25 算法能够凭借其精确的词匹配能力取得极佳的效果。因为这些关键词具有很强的独特性,在文档中出现的频率相对较低,一旦出现,就能够很好地标识出与该关键词相关的文档。当查询 “HTTP-403” 时,BM25 算法能够快速定位到包含该错误代码的文档,这些文档可能是关于网络故障排查、服务器配置等方面的内容,与查询的相关性非常高。

然而,当查询是像 “kitty behavior” 这样的概念性短语时,稀疏检索便暴露出了它的局限性。因为文档中可能只包含 “feline” 或 “cat” 等与 “kitty” 语义相近的词,而没有直接出现 “kitty” 这个词。由于 BM25 算法主要依赖于关键词的精确匹配,无法理解这些词之间的语义关系,所以在这种情况下,它可能无法准确地检索到与查询相关的文档,导致检索结果不理想。

可以清晰地看到稀疏检索的优势和劣势。其优势在于对于精确关键词的匹配非常高效,能够快速准确地找到包含特定关键词的文档,适用于一些对关键词匹配要求较高的场景,如代码搜索、人名查询等。但它的劣势也很明显,缺乏对语义的理解能力,无法处理语义相近但关键词不同的查询,在处理需要语义理解的复杂查询时表现不佳。在实际应用中,我们需要根据具体的需求和场景,合理地选择检索算法,或者将多种检索算法结合起来,以提高检索的准确性和效率。

四、混合检索:融合优势的最佳实践𝜗𝜚🍒ᝰ.ᐟ

4.1 混合检索原理与流程𝜗𝜚🍒ᝰ.ᐟ

4.1.1 并行检索𝜗𝜚🍒ᝰ.ᐟ

在实际应用中,稠密检索和稀疏检索各有优劣。为了充分发挥两者的优势,混合检索应运而生。混合检索的核心流程包括并行检索、结果融合和神经重排序三个关键阶段。

并行检索是混合检索的第一步。当用户输入查询时,系统会同时向稠密检索引擎和稀疏检索引擎发送查询请求。稠密检索引擎利用其语义理解能力,通过计算查询与文档向量之间的相似度,召回语义相关的文档。稀疏检索引擎则依据关键词匹配,在文档中查找与查询关键词精确匹配的内容,召回包含这些关键词的文档。通过并行执行这两种检索方式,可以快速获取大量潜在相关的文档,为后续的处理提供丰富的信息基础。在一个包含大量医学文献的知识库中,当用户查询 “糖尿病的治疗方法” 时,稠密检索引擎可能会召回一些讨论糖尿病治疗的文献,这些文献虽然没有直接出现 “糖尿病的治疗方法” 这样的精确表述,但在语义上与该查询相关,如讨论了糖尿病的药物治疗、饮食治疗等方面。而稀疏检索引擎则会召回那些直接包含 “糖尿病”“治疗方法” 等关键词的文献,这些文献可能更直接地回答了用户的问题。

4.1.2 结果融合𝜗𝜚🍒ᝰ.ᐟ

并行检索完成后,系统会得到来自稠密检索和稀疏检索的两组结果。接下来需要将这两组结果进行初步融合,以便进行后续的筛选和排序。结果融合的方法有多种,其中倒数排名融合(RRF,Reciprocal Rank Fusion)是一种常用的启发式算法

RRF 算法的核心思想是根据文档在不同检索结果列表中的排名来计算一个融合分数。具体来说,对于每个文档,它会计算该文档在稠密检索结果列表中的排名倒数和在稀疏检索结果列表中的排名倒数,然后将这两个倒数相加,得到该文档的融合分数。最后,系统会根据融合分数对所有文档进行重新排序,将融合分数较高的文档排在前面。假设有一篇文档在稠密检索结果中排名第 3,在稀疏检索结果中排名第 5,那么根据 RRF 算法,它的融合分数就是 1/3 + 1/5 = 8/15。通过这种方式,RRF 算法能够综合考虑文档在不同检索结果中的表现,将两组结果进行有效的融合。

然而,RRF 算法也存在一定的局限性。它只利用了文档的排名信息,而丢失了原始得分中蕴含的丰富相关性信号。在某些情况下,这种方式可能无法准确地反映文档与查询的真实相关性。

4.1.3 神经重排序𝜗𝜚🍒ᝰ.ᐟ

为了弥补 RRF 等简单融合算法的不足,提升检索结果的质量,混合检索引入了神经重排序(Neural Reranking)阶段。神经重排序采用跨编码器(Cross-Encoder)对融合后的结果进行精细筛选。

跨编码器与检索阶段常用的双编码器(Bi-Encoder)有着显著的区别。双编码器为查询和文档独立生成向量,然后通过简单的向量运算(如点积、余弦相似度)来计算它们之间的相似度。这种方式计算速度快,适合从海量数据中进行初步筛选。但由于查询和文档是分别编码的,双编码器无法捕捉到它们之间的细粒度交互信息。

而跨编码器则将查询和每个候选文档拼接在一起,作为一个整体输入给一个更强大的 Transformer 模型。这样,模型可以在深层次上对查询和文档之间的每一个词进行交互式、细粒度的相关性判断。在处理 “苹果公司最新产品” 的查询时,跨编码器能够同时关注 “苹果公司”“最新产品” 等关键词与文档中相关内容的关系,从而更准确地判断文档与查询的相关性。通过这种 “共同关注” 的机制,跨编码器能够捕捉到双编码器无法感知的、更细微的语义关联,输出一个远比任何单一检索方法都更准确、更相关的最终排序结果。在实际应用中,像BAAI/bge-reranker-v2-m3等模型常被用于神经重排序,它们在各种信息检索任务中展现出了卓越的性能,能够有效提升检索结果的质量和相关性。

4.2 实验验证:混合检索的卓越性能𝜗𝜚🍒ᝰ.ᐟ

为了验证混合检索的有效性和优越性,通过 retrieval-pipeline 项目构建了一个完整的、包含稠密检索、稀疏检索和神经重排序的教育性检索流水线。该项目精心设计了一系列测试用例,旨在系统性地展示混合检索在不同场景下的表现,深入揭示各种检索方法的优缺点。

在这个检索流水线中,首先对文档集合进行预处理,包括文本清洗、分词、去除停用词等操作,然后分别使用稠密检索和稀疏检索对文档进行索引稠密检索采用基于 Transformer 的嵌入模型,如 BERT 或 BGE-M3,将文档和查询转换为向量表示,并使用高效的向量搜索算法(如 HNSW)进行检索。稀疏检索则基于 BM25 算法,构建倒排索引,实现关键词的精确匹配检索

在神经重排序阶段,使用BAAI/bge-reranker-v2-m3模型对稠密检索和稀疏检索融合后的结果进行重排序。这个模型经过大量数据的训练,能够准确地判断文档与查询之间的相关性,从而对检索结果进行优化。

在 “语义相似性” 测试中,当查询为 “kitty behavior” 时,由于文档中可能只包含 “feline” 或 “cat” 等与 “kitty” 语义相近的词,稀疏检索因为缺乏语义理解能力,无法准确检索到相关文档,而稠密检索凭借其强大的语义理解能力,能够轻松地找到与查询语义相关的文档,表现出色。

在 “精确名称” 测试中,当查询为人名 “Alexander Humphrey” 时,稀疏检索能够通过精确匹配关键词,准确地命中包含该人名的文档,而稠密检索可能会因为语义理解的偏差,返回其他语义相关但姓名错误的结果。

在多语言查询场景中,如中文查询 “人工智能”,稠密检索能够理解中文语义,准确地检索到相关文档,而稀疏检索在处理多语言时可能会遇到困难。在技术代码查询场景中,如 “HTTP-403”,稀疏检索能够凭借精确匹配技术代码,快速找到相关文档,稠密检索则可能因为过于关注语义而忽略了精确的代码匹配。

神经重排序在提升最终结果质量方面发挥了显著作用。通过对稠密检索和稀疏检索融合后的结果进行重排序,神经重排序能够智能地识别出那些被单一检索方法低估、但实际上与查询高度相关的文档,并将其提升到列表的顶端。在某些测试用例中,经过神经重排序后,相关文档的排名得到了显著提升,检索结果的准确性和相关性得到了极大的改善。

这些实验结果充分证明了混合检索的优势。在复杂的信息检索场景中,单一的检索方法往往难以满足所有的需求,而混合检索通过结合稠密检索和稀疏检索的优势,并利用神经重排序进行优化,能够在各种场景下都取得较好的检索效果,为用户提供更准确、更全面的信息。它不仅提高了检索的召回率和准确率,还增强了检索系统的鲁棒性和适应性,使其能够应对多样化的查询需求。

五、超越扁平文本:构建结构化索引𝜗𝜚🍒ᝰ.ᐟ

5.1 结构化索引方法𝜗𝜚🍒ᝰ.ᐟ

5.1.1 RAPTOR 方法𝜗𝜚🍒ᝰ.ᐟ

在信息爆炸的时代,如何高效地组织和检索知识成为了关键问题。传统的检索增强生成(RAG)系统在处理长文本时,常常面临上下文碎片化和信息丢失的困扰,就像在杂乱无章的仓库中寻找特定物品一样困难。为了解决这些问题,结构化索引技术应运而生,其中 RAPTOR(Recursive Abstractive Processing for Tree-Organized Retrieval)方法以其独特的树状层次结构,为知识的组织和检索带来了新的思路。

RAPTOR 采用自下而上的递归抽象方式构建知识树。在索引阶段,它首先将长文档切分成小的文本块,这些文本块就像是知识树的 “叶子节点”,承载着最具体的细节信息。然后,通过聚类算法,RAPTOR 会将语义相近的叶子节点分组,这些节点可能来自同一主题的不同部分,通过聚类将它们汇聚在一起。利用强大的语言模型,为每个分组生成一个更高层次的摘要,这个摘要就成为了它们的 “父节点”。这个过程不断递归,每一次递归都在更高层次上对知识进行抽象和整合,最终形成一个从具体细节到宏观概念的多层次知识树。

以查询英特尔 CPU 架构技术手册中 “SSE 指令集” 为例,当我们向基于 RAPTOR 的索引系统提出这个问题时,它的查询过程就像是在知识树中进行一场 “跨层穿梭” 的旅行。系统可能首先在知识树较高层次的摘要节点中定位到 “SIMD 指令集” 这个宏观概念,这个节点就像是知识树的一个重要分支,它概括了一系列与单指令多数据处理相关的知识。然后,系统沿着树状结构向下钻取,从 “SIMD 指令集” 这个分支逐渐深入到与 “SSE 指令集” 相关的更具体的节点,最终在与具体 SSE 指令相关的叶子节点中找到详细的技术描述。这种由宏观到微观的检索路径,使得系统能够快速准确地定位到所需知识,并且在检索过程中,能够从不同层次的节点获取相关信息,从而更全面地回答问题。比如,在宏观层次,我们可以了解到 SSE 指令集在整个 SIMD 指令集中的地位和作用;在微观层次,我们可以获取到具体指令的详细操作和应用场景。

5.1.2 GraphRAG 方法𝜗𝜚🍒ᝰ.ᐟ

与 RAPTOR 不同,GraphRAG 采用了另一种独特的视角来组织知识,它将文档中的知识建模为一个由实体(Entities)和关系(Relationships)构成的知识图谱。这种网络化的知识表示方法,能够更直观地展示知识之间的复杂关联,特别擅长回答那些涉及多个实体之间复杂关系的问题。

在索引构建阶段,GraphRAG 首先利用语言模型从文本中提取出关键的实体,这些实体可以是人物、地点、概念、技术术语等。在英特尔 CPU 架构技术手册中,“SSE 指令集”“XMM 寄存器”“浮点运算” 等都可以作为实体被提取出来。然后,GraphRAG 会进一步提取这些实体之间存在的各种关系,这些关系可以是因果关系、包含关系、关联关系等。“SSE 指令集” 与 “XMM 寄存器” 之间可能存在使用关系,即 SSE 指令集会使用 XMM 寄存器来进行数据处理;“SSE 指令集” 与 “浮点运算” 之间可能存在功能关系,即 SSE 指令集主要用于进行高效的浮点运算。基于这个构建好的知识图谱,系统可以通过社区发现(Community Detection)算法,找出在语义上紧密关联的实体集群,并为这些集群生成摘要。这些摘要能够帮助我们快速了解每个社区的核心内容,以及社区内实体之间的主要关系。

当我们查询英特尔 CPU 架构技术手册中 “SSE 指令集” 与其他实体关系的问题时,GraphRAG 的查询过程就像是在一张错综复杂的关系网中漫游。系统首先会定位到知识图谱中的 “SSE” 这个核心实体,然后通过遍历与该实体相连的关系边,找到所有与 “SSE 指令集” 相关的其他实体,“XMM 寄存器”“浮点运算” 以及具体的指令(如ADDPS)等。通过分析 “SSE” 所在的社区,系统还能提供关于其在整个 CPU 架构中所处位置的上下文信息,帮助我们更好地理解 SSE 指令集与其他部分的协同工作方式。如果我们询问 “SSE 指令集如何影响 CPU 的性能”,GraphRAG 可以通过分析知识图谱中 SSE 指令集与其他性能相关实体(如缓存、总线带宽等)的关系,给出全面而深入的回答。

为了深入探究 RAPTOR 和 GraphRAG 这两种索引策略的特点和性能差异,通过 structured-index 项目搭建了一个全面的实验平台。在统一的框架下完整地实现了 RAPTOR 和 GraphRAG 两种方法,并将它们应用于同一个极具挑战性的任务 —— 索引并查询长达数千页的英特尔 CPU 架构技术手册。选择这个任务的原因在于,英特尔 CPU 架构技术手册包含了丰富而复杂的知识,其知识具有高度结构化、层次化和关联性的特点,非常适合用来测试两种索引策略在处理复杂知识时的能力。

实验的目的是对比 RAPTOR 和 GraphRAG 在知识表达哲学上的差异,以及它们在实际应用中的性能表现,包括检索准确性、查询效率、对复杂问题的处理能力等方面。

实验流程如下:首先,使用 RAPTOR 和 GraphRAG 分别对英特尔 CPU 架构技术手册进行索引构建。在这个过程中,记录下构建索引所需的时间、资源消耗等信息。然后,准备一系列精心设计的问题,这些问题涵盖了不同类型,包括对具体概念的解释(如 “SSE 指令集” 的功能)、对实体关系的查询(如 “SSE 指令集” 与 “XMM 寄存器” 的关系)、对宏观架构的理解(如 SSE 指令集在整个 CPU 架构中的作用)等。将这些问题分别提交给基于 RAPTOR 和 GraphRAG 的索引系统进行查询,记录下每个系统的响应时间和返回的答案。最后,通过人工评估和自动化评估指标(如召回率、准确率、F1 值等),对两个系统的回答进行评估和对比分析。

6.2.2 实验结果与启示𝜗𝜚🍒ᝰ.ᐟ

通过对实验结果的深入分析,可以清晰地看到了 RAPTOR 和 GraphRAG 在处理相同问题时的不同响应方式,以及它们各自在捕捉知识层次结构和横向关联方面的优势。

在处理关于 “SSE 指令集” 这样的问题时,RAPTOR 能够凭借其树状结构,从宏观到微观快速定位到相关知识。它首先在较高层次的摘要节点中找到与 “SIMD 指令集” 相关的信息,对问题的宏观背景有一个初步的了解。然后,沿着树状结构逐步深入,在具体的叶子节点中获取关于 SSE 指令集的详细技术描述。这种方式使得 RAPTOR 在回答需要从高层概念入手,逐步深入细节的问题时表现出色,能够提供具有层次感和逻辑性的回答。

而 GraphRAG 则在处理涉及实体关系的问题时展现出独特的优势。当查询 “SSE 指令集” 与其他实体关系的问题时,GraphRAG 能够迅速定位到知识图谱中的 “SSE” 实体,并通过遍历关系边,找到与之相关的其他实体,以及它们之间的具体关系。在回答 “SSE 指令集与 XMM 寄存器的关系” 这个问题时,GraphRAG 可以清晰地指出 SSE 指令集如何使用 XMM 寄存器进行数据处理,以及这种关系对 CPU 运算性能的影响。这种方式使得 GraphRAG 在回答那些关于 “谁和谁有关?”“A 是如何影响 B 的?” 这类问题时,能够提供全面、详细的答案。

实验结果表明,RAPTOR 和 GraphRAG 并非互相取代的关系,而是两种互补的知识组织范式。RAPTOR 更擅长捕捉知识的层次结构和抽象关系,它能够帮助我们从宏观到微观逐步理解知识体系;而 GraphRAG 则更擅长揭示知识的横向关联和网络结构,它能够帮助我们深入理解知识之间的复杂关系。在一个完备的 Agent 知识体系中,理想的方案或许是结合使用这两种策略,构建一个既有深度又有广度的、立体化的知识索引。这样,Agent 就能够像真正的专家一样,从多个维度和层次上理解和运用知识,在面对各种复杂问题时,都能够提供准确、全面的回答。

七、Agentic RAG:知识检索的范式转变𝜗𝜚🍒ᝰ.ᐟ

7.1 Agentic RAG 核心思想𝜗𝜚🍒ᝰ.ᐟ

传统的 RAG 流程在面对复杂问题时,往往显得力不从心。以 “比较不同 RAG 实现方案的优缺点,并给出在资源受限场景下的最佳实践” 这样的问题为例,传统 RAG 可能只是机械地检索包含 “RAG”“优缺点”“资源受限” 等关键词的文档,然后简单拼凑出答案,无法真正理解问题的本质和需求。这是因为传统 RAG 采用的是固定的 “检索 - 生成” 线性流程,缺乏对问题的深入理解和对检索结果的智能评估能力。

Agentic RAG 的出现,正是为了打破这种局限,实现从 “被动工具” 到 “主动智能体” 的跨越。它的核心思想是将知识库检索工具化,不再把检索视为一个自动化的前置步骤,而是让 Agent 能够自主地、动态地利用知识库。Agent 采用 ReAct(Reasoning and Acting)这样的高级模式,通过 “思考→行动→观察” 的循环,深入分析问题、自主决定检索策略,并对检索结果进行评估和优化,从而实现对问题的深度理解、分解和迭代探索 。

7.2 工作流程与优势𝜗𝜚🍒ᝰ.ᐟ

7.2.1 工作流程

当 Agentic RAG 面对一个复杂问题时,其工作流程如下:

  • 思考阶段:Agent 首先对问题进行深入分析,理解问题的核心需求和意图。对于 “如何优化企业内部知识管理系统的搜索效率” 这个问题,Agent 会思考需要从哪些方面入手,比如是否需要了解当前系统的架构、使用的检索算法、数据量大小等信息。
  • 行动阶段:根据思考的结果,Agent 会决定采取相应的行动,即调用knowledge_base_search工具进行检索。在这个过程中,Agent 会根据问题的需求,提炼出精准的查询关键词,以提高检索的准确性。它可能会查询 “企业知识管理系统架构”“知识管理系统检索算法”“提高知识管理系统搜索效率的方法” 等相关内容。
  • 观察阶段:Agent 会对检索到的结果进行观察和评估,判断这些信息是否足够回答问题。如果检索结果不理想,Agent 会进入下一轮 “思考→行动→观察” 的循环。它可能会进一步分析问题,调整查询关键词,再次进行检索。比如,发现检索到的信息大多是关于通用知识管理系统的,而没有针对企业内部具体情况的内容,Agent 可能会在查询中加入企业的行业特点、业务规模等信息,重新检索。
  • 答案生成阶段:当 Agent 判断已经收集到了足够充分的信息后,它会综合所有检索到的上下文,运用自身的推理和分析能力,生成最终的、有理有据的答案。在回答 “如何优化企业内部知识管理系统的搜索效率” 时,Agent 会结合检索到的关于系统架构、检索算法、企业特点等信息,给出具体的优化建议,如优化索引结构、选择更适合的检索算法、根据企业业务特点进行数据分类等。
7.2.2 优势分析𝜗𝜚🍒ᝰ.ᐟ

Agentic RAG 在处理复杂问题时具有显著的优势。它能够根据问题的需求自主调整检索策略,避免了传统 RAG 中检索质量依赖初始查询的问题。在传统 RAG 中,如果用户的查询表述模糊,很容易返回不相关的文档,而 Agentic RAG 可以通过对问题的深入理解,不断优化查询关键词,提高检索结果的相关性。

Agentic RAG 能够对检索结果进行智能评估,避免了将不相关的信息输入给生成模型,从而提高了答案的准确性和可靠性。它还能够处理需要多轮检索或跨文档推理的复杂问题,通过多次迭代和推理,逐步逼近正确答案。

以一个实际案例来说明,在医疗领域,当医生询问 “针对一位患有糖尿病且有心脏病史的老年患者,最新的治疗方案是什么” 这样复杂的问题时,传统 RAG 可能只能检索到一些关于糖尿病或心脏病的一般性治疗方案,无法综合考虑患者的特殊情况和最新的医学研究成果。而 Agentic RAG 则可以通过 “思考→行动→观察” 的循环,首先分析问题中涉及的疾病、患者特征和最新治疗方案等关键信息,然后有针对性地检索相关的医学文献、临床研究报告等。在观察检索结果时,判断是否满足需求,如果发现缺少最新的研究成果,会再次检索最新的医学期刊论文。最终,综合所有信息,为医生提供全面、准确的治疗方案建议,包括最新的药物治疗、生活方式干预等方面的内容,并且能够解释为什么这些方案适合该患者 。

致谢˚𝜗𝜚🍒ᝰ.ᐟ

谢谢大家的阅读,以上是我对近期文献阅读的总结,欢迎大家在评论区指出,如果我的内容对你有帮助,可以点赞 , 收藏 ,大家的支持就是我坚持下去的动力!

“请赐予我平静,去接受我无法改变的 ;赐予我勇气,去改变我能改变的。”

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐