Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

11.4 检索增强生成(RAG)

上一节介绍的信息检索技术可以通过一种称为检索增强生成(retrieval-augmented generation, RAG)的方法集成到语言模型中。在本节介绍的基本 RAG 场景中,我们使用 IR 技术从某个指定文档库中检索可能含有有用信息的文档,再让大语言模型以这些文档和原始查询为条件生成答案。

正如本章导言所概括的,检索增强生成有许多目标。RAG 可以向模型提供一组可信文档,从而帮助缓解幻觉;可以帮助语言模型针对私人电子邮件、健康记录、公司内部文档或其他法律文件等专有数据生成事实性文本;还可以缓解知识动态变化、具有时效性的问题,例如用户的信息需求涉及语言模型训练结束之后的数据。

RAG 系统包含两个主要组件:检索器(retriever)和生成器(generator);由于历史原因,后者有时也称为阅读器(reader)(Chen et al., 2017a)。图 11.13 概述了这种标准问答模型。

在图 11.13 所示检索增强生成(RAG)模型的第一阶段,我们从预先指定的文本集合中检索相关篇章,例如使用上一节的稠密检索器。在第二个生成阶段,我们把检索到的篇章集合与用户提示整合,将某种形式的组合结果交给大语言模型,使模型以二者为条件生成答案。

例如,假设用户问“歌剧《魔笛》在哪一年首演?”。我们把这个问题交给稠密检索器,返回一系列有关《魔笛》的篇章。

图 11.13 检索增强生成以用户提示(其中可能像本例的问题一样表达某种信息需求)以及可能有助于满足该需求的文档语料库作为输入。该方法分为两个阶段:检索阶段从集合中返回相关文档;生成阶段则把文档放入提示,让 LLM 据此生成文本。某些生成结果还会包含知识引用,帮助用户判断是否应信任生成内容,或在感兴趣时继续查阅。

检索增强生成的思想是把检索到的篇章与某些提示文本共同作为条件,例如“根据这些文本回答下列问题:”。因此,给定文档集合 D 与用户查询 q,最基本的 RAG 算法如下:

  1. 调用检索器,返回 D 中相关性最高的 k 个篇章 R(q)=d1dkR(q)=d_1\cdots d_k

  2. 创建包含 q 和所检索篇章的提示。

  3. 使用该提示调用 LLM。

所得提示可能如下所示:

RAG 提示示意

检索篇章 1

检索篇章 2

...

检索篇章 k

根据这些文本回答下列问题:歌剧《魔笛》在哪一年首演?

语言模型的任务随后是根据如下概率模型生成文本:

p(x1,,xn)=i=1np(xiR(q); Answer the following question... ;q;x<i)p (x _ {1}, \dots , x _ {n}) = \prod_ {i = 1} ^ {n} p (x _ {i} | \mathrm{R} (q); \text { Answer the following question... }; q; x _ {< i})

这一基本 RAG 范式有许多扩展。其中之一是使用基于智能体的 RAG(agent-based RAG)。在目前介绍的 RAG 范式中,系统总会运行一次搜索,再将检索到的篇章和用户问题组合成提示。但在实际应用中,我们可能不希望每一轮用户交互都运行检索;也可能要针对不同用户需求从不同集合中检索(有时是网络,有时是私有集合)。在基于智能体的 RAG 中,系统会自行决定何时调用检索智能体,以及检索哪个集合。

另一个研究方向涉及检索器与生成器之间的关系。例如,检索到的篇章中可能存在噪声:有些篇章不相关或错误,排列顺序也可能无助于作答。怎样才能鼓励 LLM 聚焦于高质量篇章?一些 RAG 架构会添加一个重新排序器,在篇章检索完成后再次排序或调整顺序。某些复杂问题则可能需要多跳(multi-hop)架构:先用查询检索文档,再把这些文档附加到原始查询上,进行第二阶段检索。

另一类解决方案是针对 RAG 训练 LLM。上述基本 RAG 不涉及训练:我们拿来现成的 LLM,为其提供篇章和提示,希望它能正确判断哪些篇章有助于或关系到答案生成。一种学习变体是对 LLM 进行指令微调:首先创建一个问题数据集,为问题标注检索篇章和正确答案,再指令微调 LLM,使其能根据篇章正确回答问题。另一种方法通过测试时计算来实现:提示 LLM 在回答问题的同时,生成对“哪些篇章有用”的反思。生成这些反思的过程可能使 LLM 更善于识别优质篇章。所得反思文本还可以用于上下文学习,例如把它作为后续问题提示的一部分。

除训练 LLM 外,我们还可以训练 IR 引擎。毕竟,IR 引擎本身并未针对 RAG 场景优化。它可能根本没有训练过;即使接受过训练,也很可能针对简单 IR 或事实型问答任务,而不是让另一个 LLM 专门利用检索篇章生成文本的 RAG 场景。对于可训练的 IR 算法,可以在某个问答集上端到端训练整个架构,同时训练 IR 模型与 LLM 的参数,以解决这种不匹配。

最后,让 LLM 为任何事实性陈述提供证据通常很有用。证据可以采用知识引用的形式,例如可信来源的 URL,或特定文献的引文。例如,问答系统可能生成如下带编号的 URL 指针:

问:哪些电影的演员阵容中有巩俐?

答:《秋菊打官司》[1]、《霸王别姬》[2]、《西游记之孙悟空三打白骨精》[3]、《花木兰》[3]、《兰心大剧院》[3]……

生成知识引用最简单的方法,是把这项要求写入提示。例如 Gao et al.(2023)使用了包含如下文字的提示:

“仅使用所提供的搜索结果(其中一些可能不相关)回答给定问题,并正确引用这些结果……任何事实性主张都必须给出引用。”