检索增强语言模型(Retrieval-based LMs)入门教程
本教程基于ACL‘23会议上陈丹琦团队带来的Tutorial内容整理而成,旨在从问题设置、架构、应用、挑战等角度全面了解检索增强的语言模型。无论你是初学者还是希望系统梳理该领域的研究者,本教程都将帮助你快速入门并掌握核心概念。
1 简介:Retrieval-based LMs = 检索 + 语言模型
首先,我们需要理解常规语言模型(自回归LM)的工作方式:它通过计算
并采样来预测下一个token,从而生成完整句子。掩码语言模型或编码器-解码器模型的概率计算方式不同,但核心思想一致。
检索增强的语言模型则进一步挂载了一个外部知识库。在生成过程中,模型不仅依靠自身参数,还会从知识库中检索相关文档,辅助生成。下图展示了这一概念:
那么,既然现有的大规模语言模型(LLMs)已经很强大了,为什么还需要检索增强?它解决了哪些关键问题?
1.1 LLMs无法记忆全部长尾知识
所谓长尾知识,即不热门、不常用的知识(例如“河北省2020年总人口数”)。研究表明,仅通过扩大模型规模(scaling law),对长尾知识的性能提升非常有限。检索外部知识库可以有效“回忆”这类信息。下图显示,面对冷门问题(蓝色线),性能并不会随规模提升而改善。
1.2 参数记忆的知识容易过时且难以更新
互联网信息飞速更新,而LLMs训练一次后知识就固定了。虽然“知识编辑”方法有所缓解,但可扩展性差。而检索增强模型只需更新外部知识库即可,成本极低,且可以轻松扩展规模。示意图如下:
1.3 LLMs输出难以解释和验证
我们通常无法知道模型“为什么”给出某个答案(黑箱)。检索增强模型通过返回检索到的文档来源,让我们可以追溯信息依据,从而验证其正确性。例如,NewBing会列出文档来源:
1.4 LLMs容易泄露隐私训练数据
如果隐私数据(如用户地址、联系方式)被包含在预训练语料中,所有使用者都可能接触到。检索增强模型将隐私数据存储在外部知识库中,模型本身不直接保存,从而保护隐私并支持个性化服务。下图显示,部分隐私数据已混入预训练语料:
1.5 LLMs规模极大,训练和运行昂贵
部署大模型推理成本高昂。检索增强模型可以用较小的语言模型达到与大型模型媲美的性能(例如某工作以25倍参数缩减实现了与GPT-3匹配的性能)。这更经济,对学术界和小公司更友好。
检索增强语言模型已成为当前关键研究问题,值得深入探索。
小提示: 许多人误以为检索增强模型只适用于知识密集型任务,实际上它在生成、分类、多模态等场景也有广泛应用。
常见问题:
Q:检索增强模型是否只能用于开放域问答?
A:不。它可以用于多种任务,包括文本生成(如摘要、翻译)、分类(如情感分析)、多语言/多模态任务等。详见后续“应用”章节。
2 问题定义:一个在测试阶段使用外部知识存储的语言模型
该定义分为两部分:
- 语言模型:包括Decoder-only、Encoder-only、Encoder-Decoder等架构。
- 在测试阶段使用外部知识存储:推理时从外部库中检索信息。
不同解码方式/架构的语言模型示意图:
目前常用的训练范式是“预训练 + Prompting”,使模型适配多种下游任务,常见任务示例(不完整):
评估模型性能的两种常用指标:困惑度(Perplexity)和下游任务准确度(Downstream Accuracy)。Perplexity计算方式为:
,实际常用log-perplexity,即计算。
2.1 测试阶段使用外部知识存储的具体形式
下图展示了检索增强LMs的推理阶段:
- Datastore:通常由原始文本语料组成(至少1-10B token,无标签、非结构化),也可能是向量存储形式。
- Query:用于检索的查询,与输入x不一定相同。
- Index:在知识库D中找到与q最相似的Top-k个元素子集。
相似度计算方式包括传统方法(如TF-IDF)和向量点乘等。检索方式有精确检索和近似检索,这是检索开销与精度的权衡。两种文本间相似度计算示例:
2.2 需要解答的三大核心问题
后续章节将围绕这三个问题展开:
- (When)检索查询是怎样的?何时执行检索?
- (What)检索何种形式的内容?
- (How)如何利用检索得到的内容?
小提示: 注意Query和输入x可以不同,这在需要将输入转换为另一种形式进行检索时很有用(例如输入是中文,但知识库是英文)。
常见问题:
Q:为什么有时Query不等同于输入x?
A:例如,输入是一段长文本,但检索需要提取核心实体作为查询;或者输入是图像,检索时需用文本描述作为查询。这种设计可以提升检索精度。
3 架构:What & How & When
下图是对三个问题的回答总结:
对应的表格更清晰地对比了不同选择:
3.1 What to retrieve?(检索什么内容)
- Chunks(文本块):直接检索大段文本,降低检索难度,空间友好。适合大多数场景。
- Tokens(词元):检索更细粒度的token,能更好利用罕见模式(如“torch”表示深度学习包而非火把)和领域外知识,检索高效(kNN搜索很快),但存储开销大(Wikipedia chunks约13M vs tokens约4B),且缺少交叉注意力计算,可能损失部分性能。
- Entity mention(实体提及):即“One vector per entity mention”,在实体为中心的任务中更有效,存储开销介于两者之间,但需要额外实体检测步骤。
3.2 How to use retrieval?(如何利用检索结果)
- 在input layer加入:简单直观,但面对大量频繁检索时效率低。
- 在intermediate layer加入:可利用更多模型块,支持更频繁检索,计算更高效,但需要额外训练,不能直接使用。
- 在output layer应用:如kNN-LM,对语言模型预测token概率与检索token概率加权聚合,无需训练即可使用,但存储token上下文的空间开销大。
3.3 When to retrieve?(何时检索)
- 通常固定频率检索。当前也有自适应检索频率的工作:当模型对答案置信度高时降低检索频率,反之增加。也可以在output layer将权重视为输入的函数动态调整。自适应能提高效率,但结果可能不是最优。
各工作所采取的不同架构总结图:
各工作所采取的不同架构总结表:
上表最后一行还提到一类特殊的检索增强模型:从自身生成的历史信息中“自检索”,而非外部知识库,用于处理超长文本或实现长期记忆。
小提示: “What”和“How”的选择往往相互影响。例如,若选择在output layer聚合,则检索内容通常用token更合适。
常见问题:
Q:自适应检索频率在实际中容易实现吗?
A:有一定难度,因为需要模型具备“不确定性估计”能力。目前相关研究仍在发展,但已有一些有效方法(例如基于注意力机制或输出概率的置信度判断)。
4 训练:(To train and how to train) or not to train
训练检索增强语言模型的关键挑战是:同时训练语言模型和更新索引计算开销巨大。目前被证实的有效训练方式有以下四类:
- Independent training:语言模型和检索器独立训练。优点:可使用现成模型,无需额外训练,各部分独立改进。缺点:语言模型未学习如何利用检索,检索器也未针对LM任务优化。
- Sequential training:先训练一个组件并固定,再训练另一个。优点:可借用现成组件,训练LM更有效利用检索结果,或训练检索器提供更好结果。缺点:总有一个组件是固定的。
- Joint training w/ asynchronous index update:联合训练,但每隔T步才重新更新索引(允许索引“过时”)。优点:性能更好。难点:索引更新频率的选取(频率高开销大,频率低性能下降)。
- Joint training w/ in-batch approximation:只在批内进行重新索引计算,近似整体索引效果,以节省计算开销。
四种方式优缺点总结表:
示意图如下:
Independent training:
Sequential training:
Joint training w/ asynchronous index update:
Joint training w/ in-batch approximation:
(注:原图同前,但此处表示批内近似方式)
整体来看,训练方式的选择是计算开销与模型性能之间的权衡。后续研究也应围绕寻找最佳平衡点展开。
小提示: 如果你的资源有限,可以优先尝试Independent training或Sequential training,因为它们不需要频繁更新索引。
常见问题:
Q:Joint training w/ in-batch approximation 真的能近似全局索引吗?
A:能提供一定近似,但存在训练-测试差异(因为训练时只看到批内文档,而测试时面对整个知识库)。不过实践中在很多任务上效果已足够好。
5 应用:What & How & When
5.1 What are the tasks?(适用于哪些任务)
检索增强语言模型可应用于多种下游任务,如下图所示:
- 第一行:知识密集型任务(knowledge-intensive)
- 第二行:更多生成类任务(More generations)
- 第三行:更多分类类任务(More classifications)
5.2 How to adapt?(如何适配下游任务)
主要求解范式有三种,可组合使用:
- Fine-tuning:微调模型。
- Reinforcement learning(RLHF):强化学习与人类偏好对齐。
- Prompting:通过提示语操作输入/输出层(合并检索上下文或插值token概率)。
下图展示了适配方法:
注意:若无法训练(如缺乏计算资源或使用专有模型),则应使用Prompting。Fine-tuning+RL需要额外数据和训练,但结果方差小;Prompting简单但方差大。在下游任务上训练检索器会很有帮助。
5.3 When to use?(何时使用检索增强)
总结如下图:
各模型在What & How & When维度上的分类总结:
知识库类型多样,包括:Wikipedia、训练数据、代码文档等。但在OOD(领域外)检索上仍具挑战。
特别注意:多数工作证实检索增强模型在MMLU数据集(Multiple-choice NLU任务)上表现不佳。这可能与向量相似度无法很好完成多标签召回有关,该部分仍有很大提升空间。
小提示: 若你的任务需要高度可解释性(如医疗诊断、法律咨询),强烈建议使用检索增强模型,因为可以返回来源文档供验证。
常见问题:
Q:为什么在MMLU等多选题上表现不佳?
A:可能是由于检索到的文档与选项之间的语义匹配不够精确,或者模型难以融合多个检索结果中的矛盾信息。目前已有改进方案如使用更细粒度的检索或训练专门的融合模型。
6 扩展:Multilingual & Multimodal
检索增强语言模型可以扩展到更多样的知识库形式,使模型从多种存储中获取知识。下图展示了不限形式的检索增强模型:
6.1 多语言检索增强
通过跨语言检索和生成,可以克服许多世界语言中数据存储的稀缺性(例如中文互联网缺少的知识可以从英文互联网补充)。代表性工作[3]之外,现有工作总结如下:
6.2 多模态检索增强
使输入/输出适配更多模态(图像、音频、视频等),让模型更灵活通用。Meta的最新工作[4]之外,现有工作总结如下:
总结: 扩展到多语言检索,可以克服数据稀缺;扩展到多模态检索,可以适配更多应用场景,实现更灵活通用的部署。
小提示: 多模态检索时,需要注意不同模态之间的对齐问题(例如图像特征与文本特征如何映射到同一空间)。
常见问题:
Q:多语言检索增强是否要求知识库中必须有对应语言的内容?
A:不一定。例如,可以利用英文知识库回答中文问题(跨语言检索),但需要好的跨语言编码器和对齐策略。
审核编辑:彭菁
