目前让大型语言模型 (LLM) 保持事实准确性的标准是检索增强生成 (Retrieval Augmented Generation) ,简称 RAG。其前提很简单: 在 LLM 回答问题之前,一个独立的“检索器”系统会扫描数据库,找到相关文档,并将它们粘贴到 LLM 的上下文窗口中。

这种方法虽然有效,但在架构上却很笨重。你需要两个截然不同的模型——一个密集检索器 (如双编码器) 和一个生成器 (LLM) ——它们通常并不使用相同的“语言”。它们必须分别进行训练或微调,而且该流程需要在系统之间传递数据。

如果我们不需要独立的检索器呢?如果 LLM 可以在其自然写作过程中,直接从数据库中“生成”所需的文档,且逐字逐句地生成,那会怎样?

这正是 Google DeepMind 的研究人员在其论文 “From RAG to RICHES: Retrieval Interlaced with Sequence Generation” 中提出的问题。他们提出了一种完全消除独立检索步骤的系统,允许单个 LLM 在一次解码过程中执行多跳推理和证据检索。

RICHES 针对多跳查询的输出示例,使用单个 LLM 和单次解码过程。绿色引用文本是“检索到的”或从检索语料库中逐字生成的。RICHES 的生成原生交织了思考和多个检索证据。

如图 1 所示,模型不仅是在回答,它还在思考,决定需要证据,直接从语料库中“生成”该证据 (由绿色文本表示) ,然后合成答案。

流水线的问题

要理解 RICHES 的重要性,我们必须看看当前 RAG 系统中的摩擦。

在标准设置中,你有一个“检索器 (Retriever) ”和一个“阅读器 (Reader) ”。检索器将你的查询转换为向量嵌入,并在海量向量数据库中搜索相似的嵌入。这严重依赖于嵌入的质量。如果检索器的训练分布与你当前的任务不同 (领域漂移) ,它可能无法找到正确的文档。

此外,这是一个截然不同的步骤。LLM 暂停,检索发生,上下文更新,然后 LLM 继续。如果问题需要多个步骤 (多跳问答) ,这种“走走停停”的交互就会变成一个包含子查询和 API 调用的复杂循环。

RICHES (Retrieval Interlaced with Sequence Generation,交织序列生成的检索) 提出了一个彻底的简化方案: LLM 解码就是一个搜索过程。

当 LLM 生成文本时,它是在所有可能的词符 (token) 序列空间中进行搜索。如果我们能约束这个搜索空间,使模型只允许生成我们文档语料库中实际存在的序列,那么“生成”就变成了“检索”。

核心方法: 受限解码

RICHES 的核心是 受限集束解码 (Constrained Beam Decoding)

在普通 LLM 中,下一个词符的概率完全由模型的训练权重和目前的上下文决定。

\[ P _ { \theta } ( \mathbf { y } | \mathbf { x } ) = \prod _ { i = 0 } ^ { | \mathbf { y } | } P ( y _ { i } | y _ { 0 } , \ldots , y _ { i - 1 } , \mathbf { x } , \theta ) \]

RICHES 修改了这个概率分布。它引入了一个约束,强制输出的特定跨度 (即“检索键”) 必须存在于预定义的有效文档集 \(K\) 中。

\[ \begin{array} { l } { { \displaystyle P _ { \theta } ( { \bf y } | , { \bf x } , K ) = \frac { 1 } { Z } \prod _ { { \bf q } \in \mathcal { Q } ( { \bf y } ) } \mathbb { 1 } _ { K } ( { \bf q } ) } } \\ { { \displaystyle ~ \times \prod _ { i = 0 } ^ { n } P ( y _ { i } | y _ { 0 } , \dots , y _ { i - 1 } , { \bf x } , \theta ) } } \end{array} \]

虽然上面的公式看起来很复杂,但实现起来很直观。当模型进入“检索模式” (由 «» 等特殊标记标记) 时,我们会限制词表。我们查看模型目前已生成的前缀,根据我们的文档语料库检查哪些词符可以合法地延续该句子,并将所有其他词符的概率设为零 (或负无穷大) 。

约束的可视化

想象一下,模型想要引用谁扮演了小丑 (Joker) 。它已经生成了前缀 “Joker is played by”。

图 3: 受限解码过程的图解。给定前缀“Joker is played by”,续写词“Nolan”未在语料库中找到,因此被掩码屏蔽。

如图 3 所示,LLM 本能地可能想要预测 “Nolan” (也许混淆了导演和演员) 或 “Jared”。但是,系统会检查语料库。语料库包含诸如 “Joker is played by Ledger…” 或 “Joker is played by actor…” 的句子。它包含 “Joker is played by Nolan”。

因此,系统应用了一个掩码。词符 “Nolan” 的概率变为 0。存在于语料库中的词符 “Ledger” 被允许通过。数据库的约束迫使模型保持事实准确。

FM 索引 (The FM-Index)

你可能会问: 我们如何在生成的每一步都检查一个序列是否存在于十亿词符的语料库中,而又不让模型速度慢如蜗牛?

研究人员使用的是 FM 索引 (FM-Index) 。 这是一种压缩后缀数组结构,常用于生物信息学中的 DNA 测序。它允许极快的子串搜索。至关重要的是,找到下一个允许词符所需的时间与语料库大小无关——它仅取决于词表大小。这使得 RICHES 能够扩展到像维基百科 (数百万文档) 这样的语料库,同时仍能实时生成文本。

严格的约束可能是危险的。如果模型开始生成一个句子,它几乎与文档匹配,但有一个词稍微弄错了,约束可能会导致其没有有效的下一个词符。生成就会崩溃。

为了解决这个问题,RICHES 使用 集束搜索 (Beam Search) 。 它不是只保留单一的最佳序列,而是在任何时候都保持前 \(k\) 个最可能的序列 (集束/beams) 处于活跃状态。

图 2: 针对查询: “马拉松何时改名为士力架?”的受限集束可视化。RICHES 的最终输出是“Marathon was renamed Snickers in 1990”。粗框跟踪了顶部集束序列的进度。灰色打叉的框是 LLM 偏好但被语料库约束阻止的序列。

在图 2 中,我们看到了针对士力架 (Snickers) 条形码查询的集束搜索过程。

  1. t=2: 模型探索 “The” 和 “Marathon” 等选项。
  2. t=5: 它探索 “Marathon bars were” 或 “Marathon was renamed” 等路径。一些路径走进了死胡同 (标有红色 X) ,因为它们偏离了语料库文本。
  3. t=12: 集束收敛到了语料库中存在的事实陈述: “Marathon was renamed Snickers in 1990.”

研究人员引入了 自适应集束 (Adaptive Beam) 。 当模型生成自由文本 (思考或规划) 时,它使用贪婪解码 (快速、简单) 。当它进入检索块 («...») 时,它会拓宽集束以同时探索多个潜在的文档匹配。这确保了在不浪费算力在“思考”部分的情况下,获得高召回率的事实检索。

我们在检索什么?

在传统的 RAG 中,我们通常索引段落 (文本块) 。然而,让 LLM 逐字逐句地生成整个段落是很困难的——措辞必须完全匹配。

研究人员探索了几种“检索键 (Retrieval Keys) ”:

  1. 标题: 仅生成文档标题。
  2. 句子: 从文本中生成特定句子。
  3. 命题 (Propositions) : 源自文本的原子的、独立的事实。

研究发现, 命题是更优的检索键。一个长句子可能包含复杂的子句,这会绊倒受限解码。命题经过了简化,例如将 “He was born in…” 改为 “Obama was born in…"。这使得模型更容易逐字生成事实。

表 3: NQ 上不同检索键的比较

如表 3 所示,使用命题 (33.9 Hits@1) 的表现明显优于搜索原始段落 (19.0 Hits@1) 或标题 (19.5 Hits@1) 。

交织生成: 多跳优势

RICHES 的真正威力显现于多跳问题中——即需要找到事实 A 才能找到事实 B 的问题。

在标准 RAG 中,这是一个“迭代检索”过程。模型检索文档,阅读它,制定新查询,再次调用检索器,阅读新文档,最后回答。这需要复杂的编排。

RICHES 原生就能做到这一点。因为检索只是文本生成,模型可以将“思考” (无约束的规划) 与“证据” (受限的检索) 交织在一起。

表 2: RICHES 的迭代检索输出示例。备注以 (# Comments) 标注

看看表 2 中关于“夏洛特黄蜂队 (Charlotte Hornets) ”的第三个例子。

  1. 思考: 模型首先确定它需要找到 1992-93 年间黄蜂队的成员。
  2. 检索: 它生成了一个受限事实: « Muggsy Bogues played for the Charlotte Hornets... »
  3. 思考: 它现在知道该实体是 “Muggsy Bogues”,并计划找到他的特征。
  4. 检索: 它生成下一个事实: « Muggsy Bogues is the shortest player ever... »
  5. 回答: 它合成最终答案。

整个序列发生在一个连续的词符流中。没有外部检索器调用,没有上下文切换,也没有复杂的流水线代码。

结果与性能

研究人员将 RICHES 与强大的基线进行了比较,包括广义密集检索 (GTR) 和迭代 RAG 流水线。

单跳性能: 在 Natural Questions (NQ) 数据集上,RICHES 证明了它可以与专用的密集检索器并驾齐驱。

表 1: 单跳 QA 中 RICHES 与密集检索的示例对比。仅显示检索到的文本以作说明。

表 1 强调了质量上的差异。密集检索器通常依赖关键词匹配 (例如,检索 “Prudential Center” 仅仅是因为地点匹配) 。由 LLM 语义理解驱动的 RICHES 倾向于检索能够在语义上回答问题的证据 (例如,“Prudential Center is home to the New Jersey Devils”) 。

交织的影响: 表 6 中的消融研究证明了混合“思考” (无约束关键词) 与检索的重要性。

表 6: 使用自适应集束交织无约束关键词和检索键。贪婪解码无约束子序列允许受限检索充分利用集束搜索。

当模型被迫只检索而不“思考” (Keywords: X) 时,性能下降。当它可以生成无约束关键词来指导搜索,并使用自适应集束来管理搜索空间时,性能达到顶峰 (NQ 上 40.2 F1) 。

胜负分析: RICHES 并不完美。作者在表 7 中对失败模式进行了分类。

表 7: RICHES 在 Hotpot-QA 上的损失类别

“搜索失败 (Search Failure) ”是最常见的问题 (52%) 。这意味着正确的证据存在于索引中,但受限集束搜索无法找到生成它的路径。这凸显了一个权衡: 受限解码是精确的,但如果 LLM 的内部语言模型没有给语料库中使用的措辞分配高概率,集束可能会过早地剪枝掉正确的文档。

然而,“胜利”也是显著的。表 15 展示了一些例子,在这些例子中,无约束 LLM 可能会产生幻觉答案 (例如,说 “Air Supply” 唱了 “Only in My Dreams”) ,但约束迫使它走上正确的路径 (“Debbie Gibson”) 。

表 15: 无约束与受限生成。LLM 在无约束时给出错误答案,但基于语料库的约束帮助 RICHES 覆盖这一预先存在的知识以获得正确答案的示例

结论

RICHES 代表了我们对 AI 中“知识”思考方式的一个迷人转变。RICHES 不再将 LLM 视为一个需要助手投喂文档的“缸中之脑”,而是将 LLM 视为一个仅仅通过说话就能自己查找信息的智能体。

关键要点:

  1. 统一架构: 检索和生成被统一为一个单一的概率过程。
  2. 无需训练: 该方法可以通过提示 (prompting) 与现成的指令微调模型 (如 PaLM 2) 一起使用。
  3. 高效用: 它自然支持归因 (引用来源) 和多跳推理,无需复杂的循环。
  4. 约束即护栏: 通过强制模型生成语料库中存在的文本,我们在证据收集阶段有效地从机制上阻断了幻觉。

虽然存在挑战——特别是集束搜索的计算成本和对高质量命题索引的需求——但 RICHES 为我们展示了一个未来: 在那个未来,“搜索”只是“生成”的另一种形式。