引言

像 GPT-4 和 LLaMA 这样的大型语言模型 (LLMs) 彻底改变了我们与信息交互的方式。然而,它们都有一个众所周知的缺陷: 幻觉 (Hallucination) 。 即使是最先进的模型也可能自信地输出过时的信息或完全捏造事实。

为了解决这个问题,业界广泛采用了检索增强生成 (Retrieval-Augmented Generation, RAG) 技术。通过将 LLM 连接到外部知识库,我们可以将模型的回答建立在事实性、最新的文档之上。它结合了预训练模型的推理能力与搜索引擎的准确性。

但新问题也随之而来: 复杂性

一个 RAG 系统不仅仅是一个单一的算法;它是一个由多个不同模块组成的管道。你应该重写用户的查询吗?文档应该分块切多小?应该使用哪个向量数据库?在将检索到的文本输入 LLM 之前,是否应该对其进行摘要?

面对如此多的变动环节,开发者往往会陷入“分析瘫痪”。在论文*《Searching for Best Practices in Retrieval-Augmented Generation》 (寻找检索增强生成的最佳实践) *中,来自复旦大学的研究人员进行了一项全面系统的研究,旨在拨开迷雾。他们不只是测试一个模型;他们测试了 RAG 工作流中的每一个组件,以确定最佳配置。

在这篇文章中,我们将拆解他们的框架,分析每个模块,并揭示构建当今最有效、最高效 RAG 系统的“配方”。


RAG 系统解剖

要了解如何优化 RAG,我们首先需要可视化整个工作流程。RAG 不是一条直线;它是一系列的决策。

正如图 1 所示,研究人员建立了一个全面的框架,包括评估、微调和多步骤检索过程。

检索增强生成工作流程,显示了从评估到检索源和向量数据库的相互连接的组件。

该工作流程就像一个漏斗:

  1. 查询分类 (Query Classification) : 决定是否需要进行检索。
  2. 检索 (Retrieval) : 在向量数据库中搜索相关内容。
  3. 重排序 (Reranking) : 优化搜索结果以找到最高质量的匹配项。
  4. 重打包与摘要 (Repacking & Summarization) : 组织和压缩数据以适应 LLM 的上下文窗口。
  5. 生成 (Generation) : 产出最终答案。

作者采用了“模块化”的研究方法。他们一次优化一个模块,在该步骤确定最佳方法后,再进入下一步。让我们逐步看看他们的发现。


第一步: 查询分类

一个 RAG 系统应该问的第一个问题不应该是“我需要什么文档?”,而应该是“我到底需不需要文档?”

检索需要时间。如果用户问“法国的首都是哪里?”,LLM 可以立即从其内部参数化记忆中回答。为这样简单的事实触发数据库搜索是对资源和延迟的浪费。相反,如果用户询问有关 2024 年特定公司内部政策的问题,LLM 就必须检索数据。

研究人员提出了一个查询分类模块。如图 2 所示,任务可以根据信息是“充分” (包含在提示词或模型中) 还是“不充分” (需要外部知识) 进行分类。

分类图表将任务分为信息充分的任务与需要检索的信息不充分的任务。

他们训练了一个基于 BERT 的分类器来自动区分这些不同的任务类型。结果令人信服:

显示查询分类器高准确率、精确率和召回率指标的表格。

结论: 实施分类步骤是一个“快速胜利 (quick win) ”。它通过绕过简单查询的检索过程来减少平均响应时间,同时不会牺牲复杂查询的准确性。


第二步: 分块与嵌入

在检索数据之前,我们必须对其进行索引。这涉及分块 (Chunking) (将文本切分成片段) 和嵌入 (Embedding) (将文本转换为数字) 。

分块困境

如果分块太小,你会丢失上下文 (例如,一个只有“他说好”的片段,如果不知道“他”是谁,就毫无用处) 。如果分块太大,你会在 LLM 的上下文窗口中填满无关的噪声。

研究人员测试了各种尺寸,发现了一个“金发姑娘 (Goldilocks) ”区域 (即恰到好处) 。如表 3 所示,非常小的分块 (128 token) 具有较高的相关性,但忠实度较低。大分块 (2048 token) 则有相反的问题。

比较不同分块大小的忠实度和相关性的表格,显示 256 和 512 为最佳。

最佳实践: 256 到 512 token 之间的分块大小提供了最佳平衡。作者还指出,为分块添加“元数据” (如标题或关键词) 有显著帮助,尽管他们在主要实验中坚持使用句子级分块。

选择嵌入模型

分块后,数据必须被嵌入。研究比较了通用嵌入器 (如 bge-largee5) 与专用嵌入器。他们发现 LLM-Embedder (一种专门为检索任务微调的模型) 在性能和模型大小之间提供了最佳平衡。

列出各种嵌入模型结果的表格,强调了 LLM-Embedder 和 BAAI 模型。


第三步: 检索策略

这是系统的核心。我们如何找到正确的文档?研究人员探索了三种主要策略:

  1. 稀疏检索 (Sparse Retrieval, BM25) : 传统的关键词匹配。速度快,但会遗漏语义含义。
  2. 密集检索 (Dense Retrieval) : 基于向量的搜索。善于理解含义,但可能会遗漏精确的关键词。
  3. 混合搜索 (Hybrid Search) : 结合两者。

混合公式

研究人员发现,仅依靠一种方法是不够的。他们利用了一个由参数 \(\alpha\) 加权的混合搜索

结合稀疏和密集分数的混合搜索分数计算公式。

这里,\(S_s\) 是稀疏 (关键词) 分数,\(S_d\) 是密集 (向量) 分数。但是关键词与向量的权重应该各占多少?通过测试不同的 alpha 值 (见表 8 ),他们发现值为 0.3 时结果最佳。这意味着虽然精确的关键词很重要,但语义含义 (向量分数) 应该占大部分权重。

显示混合搜索中不同 alpha 值检索结果的表格,其中 0.3 表现最佳。

查询转换: HyDE 的力量

用户经常会写出混乱的查询。为了解决这个问题,研究人员测试了查询重写查询分解 , 但表现最突出的是 HyDE (Hypothetical Document Embeddings,假设性文档嵌入)

HyDE 不使用你的问题进行搜索。相反,它要求 LLM 针对你的问题幻觉出一个假设性答案。然后,它嵌入那个虚构的答案,并搜索看起来像那个虚构答案的真实文档。这弥合了问题 (例如,“为什么天空是蓝色的?”) 和答案 (例如,“大气层散射阳光……”) 之间的语义鸿沟。

结论: 混合搜索 + HyDE 的组合提供了最高的检索准确性,尽管由于额外的生成步骤,它会带来延迟成本。


第四步: 重排序

检索引擎优先考虑速度,这意味着它们使用“近似最近邻 (Approximate Nearest Neighbor) ”计算。它们很快,但并不完全精确。为了解决这个问题,增加了一个重排序 (Reranking) 步骤。检索器抓取一个大池子 (例如 100 个文档) ,然后一个专门的“重排序器”模型会仔细排序,只保留最前面的几个。

论文比较了两种类型的重排序器:

  • DLM 重排序 (monoT5): 使用序列到序列模型来检查相关性。它非常准确,但较慢。
  • TILDE: 一种专门的高效排序方法。

结论: 如果你想要绝对最好的质量, monoT5 是赢家。如果速度至关重要,TILDEv2 提供了巨大的速度提升,且性能下降很小。


第五步: 重打包与摘要

一旦我们有了热门文档,我们不能只是随机地将它们扔给 LLM。顺序很重要。

重打包: “反向”策略

对“迷失在中间 (Lost in the Middle) ”现象的研究表明,LLM 最关注提示词的开头和结尾。

作者测试了“正向” (最好的文档在先) 、“反向” (最好的文档在后) 和“两端” (最好的文档在开头和结尾) 。他们发现反向 (Reverse) 策略——将最相关的文档放在上下文的最底部,紧挨着用户的问题——产生了最佳性能。

摘要

最后,如果检索到的文档很长,它们可能会超出上下文窗口或混淆模型。作者测试了压缩文本的方法。他们发现 Recomp (使用提取式和生成式压缩) 有效地压缩了信息,而没有丢失回答查询所需的核心事实。


生成器微调

除了管道架构之外,研究人员还关注了 LLM 本身。我们可以微调生成器以使其更擅长 RAG 吗?

他们尝试了不同的训练数据混合,将模型查询配对:

  1. 仅相关文档 (\(D_q\))。
  2. 仅随机/无关文档 (\(D_r\))。
  3. 两者的混合 (\(D_{gr}\))。

比较不同微调策略下生成器性能的柱状图。

图 3 所示,使用混合数据训练的模型 (\(M_{gr}\)) 表现最好。这教会了模型一项关键技能: 辨别能力 。 通过在训练期间同时看到相关和无关的数据,模型学会了忽略噪声并专注于信号。


结论: 最佳 RAG 配方

在测试了每一个模块后,研究人员将他们的发现结合到一个大规模的基准评估中。 表 11 总结了对最佳实践的探索。

综合结果表,显示不同 RAG 配置的性能和延迟。

基于这些数据,论文为开发者提出了两个独特的“配方”:

配方 1: 最佳性能 (“全力以赴”法)

当准确性至关重要且可以容忍较高延迟时使用此方法 (例如,离线分析、医疗建议) 。

  • 分类:
  • 检索: 混合搜索 + HyDE
  • 重排序: monoT5
  • 重打包: 反向 (Reverse)
  • 摘要: Recomp

配方 2: 平衡效率 (“生产级”法)

用于速度很重要的实时应用程序 (例如,聊天机器人) 。

  • 分类:
  • 检索: 混合搜索 (放弃 HyDE 以节省时间)
  • 重排序: TILDEv2 (比 monoT5 快)
  • 重打包: 反向 (Reverse)
  • 摘要: Recomp (如果上下文窗口允许,可跳过)

“平衡”配方在保持具有竞争力的准确性的同时,大幅降低了延迟 (在某些设置中从约 11 秒降至约 1.5 秒) 。


超越文本: 多模态 RAG

论文最后提出了一个令人兴奋的扩展: 针对图像的 “检索即生成 (Retrieval as Generation) ”

从头开始生成图像 (使用 Stable Diffusion 等工具) 计算成本高昂且难以控制。研究人员提出了一个多模态 RAG 系统。

多模态检索的工作流程图,包括文生图和图生文过程。

图 4 所示:

  1. 文生图 (Text-to-Image) : 当用户要求一张图片 (例如,“一只睡着的狗”) 时,系统首先检查现有图片数据库。如果存在高相似度的匹配项,它会立即检索它。只有在找不到好的匹配项时,它才会生成新图像。
  2. 图生文 (Image-to-Text) : 同样,对于图像字幕生成,它会在尝试生成新字幕之前检索相似图像的现有字幕。

这种方法确保了真实性 (Groundedness) (使用经过验证的媒体而不是可能出现幻觉的视觉效果) ,并显著提高了效率

结语

“最好的”RAG 系统不是单一的模型,而是一个精心编排的管道。这项研究强调,虽然大型语言模型通常获得了所有的关注,但围绕它的工程设计——你如何分类、分块、检索和排序数据——才是决定成功的真正因素。

通过实施查询分类以节省资源,利用混合搜索来捕获关键词和含义,并采用反向重打包来优化 LLM 的注意力,开发者可以构建不仅准确,而且在现实世界中足够高效的 RAG 系统。