提纲
1 简介
2 背景
3 实验设置
4 实验结论
5 总结
参考文献
1 简介
今年做了不少检索增强的工作,所以对这方面的文章格外关注。这是一篇中国人民大学跟百度发布的文章,里面没有提出新的模型或者方法,而是 **探索了基于检索增强的大模型知识边界,做了蛮充实的实验,里面的一些结论对于从事这方面工作的朋友还是挺有价值的。**
目前往大模型注入知识的渠道有两种,一种是在训练时加入相应的语料,通过模型权重参数的形式将知识隐式存储下来,另一种就是在推理时将知识写进prompt中,作为模型输入的一部分,显示指导模型的生成。对于知识问答场景而言,很多事实性问题都需要依赖于外部的领域知识才会回答,单靠大模型本身是解决不了的, **于是就有研究人员针对检索增强下大模型知识边界的几个相关问题展开了一系列实验。a)大模型的知识边界在哪?大模型到底能否判断问题是否需要引入外部知识或者自身就可以解决。B)检索增强对于大模型的影响在哪?c)不同特性的检索结果对于大模型的影响有何差异?**
2 背景
开放域问答的目标是,给定一个问题q跟一个庞大的知识文档库D={d},模型可以利用知识库D的相关文档生成问题q对应的答案a。传统的开放域问答采用的是检索+阅读理解的流水线,首先利用一个检索模块从知识库中召回若干个相关文档,然后利用阅读理解模型从召回结果中提炼出最终的答案。随着大规模语言模型的兴起,研究人员也开始在这类型任务中引入了大模型。 **利用大模型来完成开放域问答任务有两种方式。第一种就是通过prompt p,不借助外部语料,直接让模型生成对应的答案a,即a=fLLM(p,q)。另一种就是先通过检索模块召回跟问题q相关的若干文档L,将用户问题q,模型prompt p以及检索结果L一同作为模型的输入,显式为模型注入外部知识,即a=fLLM(p,q,L)。** 为了获得令人满意的端到端问答效果,大规模语言模型LLM对于问题的理解能力,生成回复的能力,检索结果的质量以及外部知识源的利用方式都是值得考虑的要素。
为了探索大模型处理这类问题的边界所在,研究人员构建了两种不同类型的任务指令,分别叫做QA prompting跟judgemental prompting。 **QA prompting用于指导语言模型生成对应问题的回复,从而可以去评估模型的问答能力。具体而言就是在指令中要求模型根据问题以及其他信息去生成对应回复。针对前面提及的两种语言模型的使用方法,研究人员也构造了两种不同的QA prompting指令,** 分别如下。
a) Normal setting, 要求语言模型利用自身知识直接生成回复,不借助外部知识,对应上文中语言模型的第一种使用方式。例如
Answer the following question based on your internal knowledge with one or few words.
b) Retrieval-augmented setting, 要求语言模型利用来自外部的相关文档以及自身知识去生成回复, **跟前者的区别在于模型输入多了检索模块返回的相关文档** 。例如
Given the following information: · · ·
Answer the following question based on the given information or your internal knowledge with one or few words without the source. · · ·
**而Judgemental prompting则是用于研究探索模型是否能感知到自身知识边界,具体而言就是让语言模型根据已有信息判断问题是否超出了自身的知识边界** ,同样根据是否使用了检索结果分为normal setting跟retrieval-augmented setting两种类型的指令。除此之外,研究人员还考虑了两种不同的判断视角的模型指令,具体如下。
a)
Prior judgement,要求模型评估是否有把握回复该问题,具体来说就是在模型还没生成回复前让模型判断是否有能力去回复该问题,是要选择生成回复还是放弃。以normal setting为例,对应的模型指令为,
Are you sure to accurately answer the following question based on your internal knowledge, if yes, you should give a short answer with one or few words, if no, you should answer ‘Unknown’.· · ·
b) Posteriori judgement,要求模型去评估生成自身生成回复的准确性,具体来说就判断生成结果是否可靠。以normal setting为例,对应的模型指令为。
Can you judge if the following answer about the question is correct based on your internal knowl- edge, if yes, you should answer True or False, if no, you should answer ‘Unknown’.· · ·
3 实验设置
研究人员在包括Natural Questions(NQ), TriviaQA, HotpotQA这几个开放域问答数据集上进行相应实验,实验过程涉及了多项指标,具体如下。
Exact match: 模型生成回复跟标准答案完成一致的比例,用于评估语言模型的问答能力。
F1: 模型生成回复跟标准答案重叠的程度,也是用于评估语言模型的问答能力。
Give-up: 语言模型放弃回复的比例,用于评估语言模型生成回复的置信度。
Right/G: 语言模型放弃回复中能本来能正确回复的比例。
Right/~G: 语言模型选择生成回复中能正确回复的比例。
Eval-Right: 语言模型评估自身回复为正确的比例,换言之就语言模型觉得自己生成了正确回复的比例。
Eval-Acc: 语言模型生成回复跟标准答案一致的比例,换言之就是语言模型真正回复正确的比例。
为了方便获得上述多个指标,研究人员利用一些规则对语言模型的输出进行了解析。同时研究人员也考虑了多种不同类型的检索模块,包括稀疏检索的BM25,稠密检索的RockerQAv2, **生成模型chatgpt(让生成模型根据自身记忆生成相应的知识文档)** ,通过前两者召回的文档都具有相同的格式“Passage-{num}: Title:{title} Content:{content}”,而通过生成模型生成的文档的格式则为“Passage-{num}:{content}”。
图1: 检索增强下大模型知识边界的探索
4 实验结论
a) **大规模语言模型不能准确感知模型自身的知识边界,对于自身回复能力通常会过于盲目自信。总体而言,模型的问答效果(EM,F1)跟模型自身的置信度高度向度,但是模型对自身能力的置信度往往超出了它真实的水平。** 如图所示,模型放弃回复的比例(Give-up)并不高,而且回复正确的比例也不高。图中Eval-Right数值远超Eval-Acc也能说明模型对于生成回复会过于盲目自信。这就是大家所诟病的模型幻视问题,即便不知道答案,也会一本正经的胡说八道,并且模型还会过度自信,没有意识到自己的胡说八道,这跟大家平时使用大模型的感受比较一致。
图2: 不带检索增强的语言模型的表现
b) **语言模型不能充分利用自身具备的知识,而通过检索增强显示引入外部知识可以弥补该缺陷,而且检索增强可以提升模型对于知识边界的感知能力。在不超过模型输入限制的条件下,随着检索增强召回的文档数增加,整体问答效果随之提升,同时模型也更加自信。** 如图所示,带有检索增强的问答效果显著优于不带检索增强的,并且,通过检索增强,模型感知的能力跟问答效果一致得到提升,可以看到Right/G有明显的下降,Eval-Right跟EM更加一致,同时Eval-Acc有明显提高。这也是蛮符合直观感受,通过检索增强可以在模型生成过程中显示引入外部知识,指导模型生成恰当回复。而增加检索文档数量,有利于提高检索文档的准确率,虽然会引入更多噪声,但只有模型本身有较强的归纳总结能力,那对于整体效果还有帮助的。
图3: 检索增强带来的增益
图4: 模型问答效果,置信度跟检索文档数量的关系
c) **语言模型的置信度以及对于检索结果的依赖程取决于问题跟检索效果之间的相关性。只有提供高质量的相关文档,才能提升大规模语言模型整体的问答效果以及对于知识边界的感知能力。** 同时,语言模型会更加依赖于检索的结果,如果提供了低质量的跟问题不相关的文档后,模型就会容易胡说八道,即便在输入指令中让模型先判断检索结果质量后再决定是否使用也不能规避这个问题。也就是,检索结果跟问题越相关,模型就越自信,所以如果检索结果相关但是错误的,就很容易将模型带偏(图中的highly-related, weakly-related是跟问题相关但是没有正确答案文档,可以理解为错误的文档)。
图5: 不同检索结果对于问答效果的影响
d) 基于上述的一些发现,研究人员提出了一种简单的动态检索增强方法,就是图中第三部分,让模型根据检索结果判断是否有能力回复当前问题,如果是的话,就将当前问题,检索结果一同作为模型的输入,引导模型生成,否则就是在模型生成过程中不加入检索结果。
图6: 一种简单的动态检索增强方法
5 总结
**虽然这篇文章做了不少实验,得到了很多有价值的结论,对于做检索增强的人来说还是颇有借鉴意义的。但是这里有两点是需要进一步思考的,其一在于在prompt engineering这块没有太多的尝试,对应的prompt看起来都比较言简意赅,如果针对性地去设计prompt会不会有所差异呢?其二在于**
实验用的生成模型是Davinci003跟ChatGPT,都是能力非常强大的大规模语言模型,当在实际中使用了其他语言模型时,很大概率会出现另外的一些问题。比如模型无法follow检索结果,或者检索文档里噪音太多导致模型无法从中提取有用信息,等等。
参考文献
Investigating the Factual Knowledge Boundary of Large Language Models with Retrieval Augmentation