LLM 内部先验知识与 RAG 冲突了怎么办?

前段时间在华为诺亚完成了一篇有关 Adaptive RAG 的工作,现在在做对齐架空世界知识与现实世界知识,尤其是智能游戏 NPC 的工作。分享一下有关对 LLM 如何平衡内外部知识的一些思考以及我们在这方面做出的几个探索性、分析性和总结性工作。

写的比较意识流,欢迎指正。

图片

背景(RAG)

1.1 什么是 RAG

Retrieval-Augmented Generation(RAG):RAG 通常指的是在 LLM 的生成过程中通过检索的方式为 LLM 的生成引入外部知识的方法。

检索的源可以是搜索引擎,也可以是 off-line 的数据库(比如企业、政府内部的机密数据)。

结合外部知识的方式可以是通过某种 Encoder 将外部知识 Encode 成一个向量与 LLM 的中间层或者输出层结合,也可以是直接把检索到的知识以 Prompt 的方式输入 LLM,让它继续生成。前者的代表作是 KNN-LM [1];后者比较简单也更加符合直觉并且无需 Finetune,是目前主流的方式。

BTW,前者的方式在推荐系统/表格预测中也得到了大量的应用,应用的方式也相对更好理解。参考 RIM [2] 和 ROK [3]两个都是华为诺亚的工作。其中,RIM 是 KDD 2021 的工作,ROK 则是 CIKM’24 的工作。

图片

上图取自 ACL 2023 Tutorial [4],来自 Princeton NLP 以及 UW NLP。他们将 Retrieval-Augmented Generation(RAG)的流程分解成检索什么(如何处理需要检索源),如何使用检索到的东西(结合到输入、中间层还是输出层)以及何时检索(我们在什么时候需要检索)。本文主要关注何时检索以及如何使用检索到的东西。

1.2 为什么需要 RAG

首先先引入几个观点:

  1. LLM 始终是需要不断引入新知识的,比如某个小领域内的知识,比如公司、政府的机密信息,比如实时信息。

  2. 幻象问题(LLM 胡说八道)几乎无法避免,但我们希望尽可能让 LLM 的输出“有迹可循”。

对于知识的更新,我们可以通过 continue-pretraining 或者 Finetune 的方式让 LLM 把知识变成 LLM 的 parametric memory(训练),也可以通过检索的方式让 LLM 通过 ICL 的方式进行回答(RAG)。

那么为什么要使用 RAG 呢?

1. RAG 可以加强 LLM 输出的可解释性(具体用了那个 supporting doc)。

2. 从效果上来看:

  1. Fine-Tuning or Retrieval? Comparing Knowledge Injection in LLMs [5的结果显示,在注入新知识上,RAG 的效果>微调。

  2. Does Fine-Tuning LLMs on New Knowledge Encourage Hallucinations?[6的结果显示,Finetune LLM 反而可能会增大大模型产生幻觉的风险。

  3. 一个粗浅的观点:Pre-train 阶段是注入知识的主要过程,Finetune 可能无法注入新知识,而只是训练了模型遵从某种指令的能力

相比于 Finetune 的各种不确定性,RAG 是一个更加简单,成本低并且可解释性强的方案

1.2.1 对比长上下文LLM

btw,这里可以讨论一下在模型有长上下文能力的情况下是否还需要 RAG。

首先结论是需要。

原因是,其实 RAG 和长上下文想做的事情是一样的。RAG 是通过 retriever 和对文档的切片,更加细粒度的处理和召回 LLM 对于回答问题所需要的上下文。长上下文 LLM 做的事情则是把这种召回通过 prompt 的方式交给 LLM 本身。所以可以把 RAG 理解成一个给输入 LLM 的 prompt(上下文)去噪的过程。

给出一些简单的观点:

1. 效果和可解释性

  • 除了简单的大海捞针评估,我们暂时无法确定 LLM 能否在大量上下文中有效推理

  • 噪声上下文会损害 LLM 的表现 [7] [8]

  • 对于 Prompt 如何影响 LLM 的 response 仍然没有一个完整的理论和分析【即使是最简单的给几个 demonstration 的 ICL 场景,更何况是超长上下文】

2. 成本:Transformer 的推理成本随着上下文长度的增加而增加,过度依赖长上下文可能不划算,也并不 make sense【当然现在有很多工作试图降低这种成本】。

那么长上下文对于 RAG 的启示是什么呢?

RAG 不用太关注特别细粒度的切分了,也就是将来我们更加在乎找回文档的 recall 而不是 precision(更在乎有没有召回能够帮助我们回答问题的东西,而没有那么在乎我们召回的 10 个文档里面到底有几个能帮助我们回答问题)


图片

何时检索以及如何用检索回来的东西(When to retrieve and How to use retrieval)

这两个问题其实关注的点是非常接近的:我们如何平衡模型的内部知识(parametric knowledge)以及外部知识。

换句话说,模型的内部知识有对有错,如果检索的话,检索回来的东西也有对有错(也可能有害)。那么最理想的情形就是,当模型的内部知识正确,就用模型的内部知识,当外部知识正确,我们也可以选择用那些正确的外部知识。

如果内外部知识都正确,当然没问题,用哪个都可以。但如果内外部知识只有一个正确呢?或者是它们都不全面需要互补呢?

外部知识不一定能帮助模型的精度:

我们在一个简单 Setting 下做了一个实验:Mistral-7B+BGE(Wikipedia 作为数据源)+TriviaQA。

大约有 10% 的问题,用内部知识可以回答正确,但是引入检索到的外部知识以后就回答错了这个 Setting 下,检索到的文档的质量以及 LLM 的能力是可以得到保证的(很好的 dense retriever + 干净的数据源+简单的问题+能力较强的模型),但仍然有很多问题引入外部知识是有害的。实际情况下只会更糟糕(效果无法确定的 retriever + 更脏的数据源+更加复杂的问题+模型能力无法保证)

2.1 内外部知识冲突与融合的分析

一些有关内外部知识冲突和融合的文章(How to use retrieval)研究了这个问题,试图在模型始终检索的 setting 下给出模型如何平衡内外部知识的分析。

一. 冲突:当模型认为的答案与 context 中的答案不一致,模型如何处理

ClashEval [9从模型对于不使用外部知识得到的答案的先验概率以及 context 偏离正确答案的程度分析模型什么时候使用内部知识,什么时候使用外部知识 [10]

这篇综述做出了比较全面的分析和总结。也可以参考作者 @莫驚蟄 对这篇 paper 的解读和分析 [11]

二. 融合:回答一个问题可能需要多个信息,如果部分信息只有内部知识有或者部分信息只有外部知识有,模型如何处理

Evaluating the External and Parametric Knowledge Fusion of Large Language Models [12第一次系统分析了知识融合的问题。这篇文章将知识融合解构成了 4 个场景并分析了 LLM 在 4 种场景下的表现:

  1. 内部知识足够回答问题
  2. 外部知识足够回答问题
  3. 内部知识+外部知识才足够回答问题,仅靠内部知识或者外部知识都不足够回答问题
  4. 内外部知识都不能帮助回答问题
然而,这方面的研究仍然比较 preliminary,暂时没有一个明确的结论 [3]

2.2 Adaptive RAG

另一方面,通过直观的控制模型是否检索,也可以平衡内外部知识【自然的,不检索就只使用内部知识】。这方面的工作也就是有关 When to retrieve 的探索。
图片
上图来自 CtrlA. [13直观的讲,ARAG 的方法本质上都是希望探测模型的知识边界。也就是,我们希望知道模型知道什么,也希望知道模型到底不知道什么。自然的,如果知道了模型的知识边界,那么就可以让模型在自己知道答案的时候直接回答,不知道答案的时候进行检索。然而探测模型的知识边界是一个非常困难的问题,所以现有的 ARAG 工作往往通过曲线救国的方式去判断什么时候应该去进行检索:

1. 基于显式的模型的 response feedback:例如,通过不同的方式扰动模型的 prompt 和问题,看模型的回答是否具有一致性。有一致性就代表模型知道答案,不需要搜。代表工作——Rowen [14]

2. 通过 probability feed back:假定模型 well-calibrated,也就是模型对于输出的 token 的概率本身就代表了他的信心。如果概率高,就代表信心足,就不需要搜。代表工作——FLARE [15]

3. 通过 Finetune 或者额外训练一个 classifier:这两种方式希望为模型注入自己判断是否要搜的能力。例如,判断问题类型,如果这类问题引入外部知识有益就搜,没什么帮助就不搜。代表工作——Self-RAG [16]
然而,通过模型的表面行为去判断模型的知识边界/信心/该不该搜是有一些问题的。我们首先可以看看在不引入外部知识的情况下,LLM 想要回答对一个问题(不妨假定是一个有明确答案的问题)需要满足什么条件。

条件1:模型的内部认知=Ground Truth
图片
内部认知是由预训练语料决定的,由于预训练语料存在噪声,以及 ground truth 可能会随着时间发生变化 [18],LLM 的内部认知不一定可以与 Ground Truth 对齐。

条件2:模型的内部认知=模型实际想要输出的答案
图片
为什么需要条件 2?因为模型对一个事情的认知不一定是它想要输出的。

一个典型的例子就是狭义的撒谎。例如,我们告诉 LLM 他在考试中得了 C,但是他不想回去被骂。接着,我们问他,他会如何表现。他可能会为了不受到惩罚而说自己考试得了 A。此时 LLM 的输出与他的认知发生了偏移 [19]

另一个例子是模型的无意识撒谎,这种情形在 TruthfulQA 中很常见。换句话说,LLM 会被 prompt 带偏 [20]。这种情况下模型不一定能够解码出自己真实的认知。

条件3:模型解码出自己的意图输出

即使 LLM 有一个明确想要输出的东西,它也不一定能够解码出自己意图的输出。

一个例子:多次采样可能得到截然不同答案。
图片
那么 RAG 做了一件什么事情从而能够让 LLM 的答案贴近 Gound Truth 从而提升正确率呢?
图片
答案:RAG通过引入外部知识,让模型的认知与 Ground Truth 对齐,从而让模型输出符合 ground truth 的答案。
图片

2.3 现有ARAG方法的不足

第一,现有的 ARAG 方法都没有考虑 LLM 的输出与内部认知不对齐的情况。而这种情况下,各种判断模型信心的方法是失效的。

第二,基于显式的模型的 response feedback 有一些明显的缺陷:
a. 基于模型的输出的一致性的方法:

首先,LLM 的输出一致性没有一个比较好的界定方法。

其次,这类方法需要模型输出很多次答案,极大降低了效率【实际 RAG 的生产中检索消耗的时间是非常少的【毫秒级】,延迟主要出现在 LLM 的解码过程】

b. 基于 probability feed back 的方法:

这种方法首先假设 LLM 是 well-calibrated 的(模型输出层的 Logits 代表了它的confidence),但实际上 LLM 并不是 well-calibrated 的。换句话说,模型输出 token 的概率不完全代表模型的信心

除此之外,这种方法无法区分认知不确定性和偶然不确定性 [21]

  1. 认知不确定性:内部认知不稳定导致的不确定性,换句话说,模型不知道某个问题的答案,但是又不能清楚的说自己不知道
  2. 偶然不确定性:模型不一定能够解码出自己意图的输出,or,同一个问题具有多种不同的答案

c. 通过 Finetune 或者额外训练一个 classifier 的方法

这种方法非常依赖数据的质量,而且 Finetune 成本高且可能损害模型本身的能力。例如,Repoformer [22] 的作者指出了 Self-RAG 选择检索时机的策略在某些情况下可能与随机选择一样。

图片

CtrlA

论文链接:

https:///abs/2405.18727

论文代码:

https://github.com/HSLiu-Initial/CtrlA


我们从模型内部表征出发,设计出了 Honesty 探针和 Confidence 探针,分别能够代表模型认知下的 Honesty 和 Confidence。

我们首先使用 Honesty 探针对模型进行控制,让模型的内部认知和意图输出对齐,接着使用 Confidence 探针去判断模型对此时的回答是否有信心(很有意思的是,我们不从模型对答案的不确定性出发,而是直接探测模型 general 的信心本身。换句话说,我们希望探测的是 LLM 对于 confidence 这个东西的认知)。如果没有信心就引入检索。

实验表明,我们的方法在不需要对检索到的文档进行额外处理的情况下就可以提升 RAG 的精度。除此之外,相比于 Finetune 的额外开销,我们的探针的训练只需要不到一分钟并且展示出了强烈的泛化性。

3.1 动机

我们希望有一个方法,能够让 LLM 的内部认知和输出对齐,对齐以后再判断他 “general” 的 confidence。从而实现,当 LLM 有信心的时候不需要搜,当 LLM 不自信的时候再搜。

3.2 方法

图片
我们通过 RepE [23] 的方式,首先提取 LLM 内部表征中代表 Honesty 和 Confidence 的方向。接着,我们通过改变 LLM 的内部表征强行让它诚实,并且通过探测 LLM 内部表征在 confidence 方向的长度(点积)来知道 LLM 对于自己输出的信心。如果不自信,就引入搜索。

3.3 实验结果

3.3.1 Main Results

我们在 5 个数据集上领先了一些现有的 ARAG 方法。

图片

图片

3.4 Honesty探针好不好

我们使用 Honesty 探针在不检索的 setting 下在 TruthfulQA 上做了实验,Honesty 提升了 LLM 在 TruthfulQA 上的表现。
图片
我们对比了直接在 prompt 中加入让 LLM 诚实的相关 prompt,发现可以给结果带来提升,但提升没有使用 honesty 探针进行控制明显。

图片

3.5 Confidence探针好不好

我们使用 self-aware [24] 以及自己构造的数据集上模拟了一些能够让模型自信和不自信的问题并且使用 confidence 探针去探测模型是否自信。具体来说,unanswerable 的问题让模型不自信,简单,无争议,明确的问题能够让 LLM 自信。confidence 探针在识别这些问题上展现出了极高的精度。
图片
在 TriviaQA 上,confidence 探针识别出的问题有 80%+ 的正确性,真的不需要去搜。
图片

3.6 一些例子

利用 Honesty 探针进行控制,可以让 LLM 承认自己的不足(对于不知道的问题说不知道,对于无关上下文说没有相关信息)。
我们使用的 backbone model 是 Mistral-7B v0.1 发布时间早于小米 SU7 和华为问界 M9,因此没有相关知识。confidence 探针识别出了模型不知道这两个车的相关信息。

图片

Honesty 探针缓解模型不诚实(狭义的撒谎)的情形。
图片
Confidence 探针识别出了多种不同情形下的不自信。

图片

Confidence 探针同样可以用于控制模型的生成,这种控制的效果展示出了我们真正提取到了 LLM 表征空间中代表 ‘confidence’ 的方向。

图片



图片

参考文献

图片

[1] https:///abs/1911.00172 

[2] https:///abs/2108.05252 

[3] https:///abs/2404.18304 

[4] https://acl2023-retrieval-lm. 

[5] https:///abs/2312.05934 

[6] https:///abs/2405.05904 

[7] https:///abs/2305.13300 

[8] https:///abs/2401.14887 

[9] https:///abs/2404.10198 

[10] https:///abs/2403.08319 

[11] https://www.zhihu.com/question/625481187/answer/3558297769 

[12] https:///abs/2405.19010 

[13] https:///pdf/2405.18727 

[14] https:///abs/2402.10612 

[15] https:///abs/2305.06983 

[16] https:///abs/2310.11511 

[17] https:///abs/2403.08319 

[18] https:///abs/2310.03214 

[19] https:///abs/2310.01405 

[20] https:///abs/2109.07958 

[21] https:///abs/2406.02543

[22] https:///abs/2403.10059 

[23] https://www. 

[24] https:///2023.findings-acl.551/

#artContent h1{font-size:16px;font-weight: 400;}#artContent p img{float:none !important;}#artContent table{width:100% !important;}