大模型RAG问答落地中的经典思考:什么时候应该进行RAG检索增强?
作者: 老刘说NLP 来源: 老刘说NLP
今天是2024年2月20日,星期二,我们来继续回到RAG的话题。
RAG发展至今,越来越多的方向是将其重要性弱化,如近期卷的长文本窗口大小,基座模型对长文本的阅读理解能力等等,从而降低chunk切分,rerank等pipeline的误差传播,这些都是一些值得关注的方向,虽然在实际应用环节会带来token量花费暴增、部署硬件成本加大等问题。
因为在实际落地过程中,我们发现,虽然RAG整合外部信息有助于填补知识空白,其中不相关的上下文可能会在生成阶段增加幻觉的可能性,模型生成阶段没有获取到输入相关片段,存在的原因可能包括召回遗漏知识库确实不存在相关片段时,都会加剧这种情况。
如上图及下图所示,当不相关的证据被纳入生成阶段时,基于RAG容易受到外部幻觉的影响,从而出现问题。
社区也有问,是能够让大模型决定什么时候需要借助外部知识,什么时候使用内部知识就行。
这其实涉及到RAG的几个经典问题:如何保证检索内容是有效,或有用的。如何验证检索的内容对输出的结果是支持的。如何验证输出的结果是来自检索还是模型的生成。
我们粗浅的想法就是,做一个分类器,写prompt,提示大模型自己进行决策,比如用langchain,把RAG作为一个tool进行调用,如简单的function call
我们之前在文章《也看引入自我反思的大模型RAG检索增强生成框架:SELF-RAG的数据构造及基本实现思路》https://mp.weixin.qq.com/s/VyrkSnYb4Uss8cfZp1yrvA中也讲过,《SELF-RAG: LEARNING TO RETRIEVE, GENERATE, AND CRITIQUE THROUGH SELF-REFLECTION》(https://arxiv.org/pdf/2310.11511.pdf) 引入了一个名为"自我反思检索-增强生成"(SELF-RAG)的框架,通过检索和自我反思来提高LM的质量和事实性,但这实际上要训练多个模型,可操作性并不强。
也有一个工作《Corrective Retrieval Augmented Generation》(https://arxiv.org/abs/2401.15884)提出了即插即用的纠正性检索增强生成(plug-and-play Corrective Retrieval Augmented Generation,CRAG),设计了一个轻量级的检索评估器来评估一个查询检索到的文档的整体质量,以提高生成的鲁棒性,这种实际上是事后检索。
在具体实现上,其通过 LLMs 进行检索评估(retrieval evaluator)来评估查询检索文档的整体质量,并为每个文档返回置信度分数。如果vectorstore检索被认为不明确或与用户查询无关,则执行基于 Web 的文档检索以补充上下文。通过将检索到的文档划分为“知识条”,对每个条带进行分级,并过滤不相关的条带,对检索到的文档进行知识细化。
因此,我们最好的点,其实是找到合适的时间进行检索,同时发挥大模型自有的知识和外部知识。
最近的工作《Retrieve Only When It Needs: Adaptive Retrieval Augmentation for Hallucination Mitigation in Large Language Models》(地址:https://arxiv.org/abs/2402.10612) 认为,跨语言一致性可以为识别幻觉提供高度敏感的信号。因此,利用一个多语言检测模块来交叉检查不同语言的相同问题的答案。
该方案由多语言语义感知检测模块控制,以评估跨不同语言对相同查询的回复的一致性。在检测到指示幻觉的不一致时,采用外部信息的检索,以纠正模型输出。
不过,该工作的方法有几个缺点。首先,其方式是事后纠正,只有在生成完整句子后才能检测幻觉的能力,而不是在生成上下文时实时检测。
其次,为了确保准确的答案,该方法需要对API接口进行多次请求。这包括生成CoT答案、干扰和响应输入、纠正原始答案等等,从而导致延迟增加。
本文对该工作的具体实现思路进行介绍,供大家一起参考。
一、先看解决幻觉问题的两种思路
关于解决幻觉这个问题,目前已经出现了许多工作,例如采用自我反思和自省等策略,或者通过多个模型之间的交互进行协作。****
1、对幻觉进行度量
一个是给出幻觉的度量(Exploring Uncertainty for Hallucination Detection)。
不确定性是指模型输出的置信水平,它是识别和消除幻觉的重要指标。不确定性可以帮助用户确定何时信任llm。一般来说,探索幻觉检测的不确定性的方法可以分为三种类型:
一种是基于逻辑的估计依赖于访问模型的逻辑来计算用于测量不确定性的token级概率或熵,但很多 模型通常是闭源的,并且被视为黑盒。
例如,《SelfCheckGPT: Zero-Resource Black-Box Hallucination Detection for Generative Large Language Models》,https://arxiv.org/pdf/2303.08896.pdf
又如,《A Stitch in Time Saves Nine: Detecting and Mitigating Hallucinations of LLMs by Validating Low-Confidence Generation》,https://arxiv.org/pdf/2307.03987.pdf,给定输入,迭代地从模型中生成句子,并主动检测和减轻幻觉。
在检测阶段,首先识别重要概念,计算模型在其上的不确定性,然后通过检索相关知识验证不确定性概念的正确性。
在缓解阶段,使用检索到的知识作为证据来修复幻觉句子。最后,将修复后的句子附加到输入以及之前生成的句子上,并继续生成下一个句子。
一种是基于语言化的估计涉及提示语言模型,使用特定提示来表达其不确定性。 然而,这些方法在表达自信时往往表现出高度的过度自信。
例如,《Can llms express their uncertainty? an empirical evaluation of confi-dence elicitation in llm》,https://arxiv.org/pdf/2306.13063.pdf中直接将置信度生成写成prompt提示大模型,如下:
另一种是采用基于一致性的估计来衡量模型为给定问题提供的多个回答之间的一致性得分。
例如,基于一致性的方法可以通过生成多个答案并测量其一致性来缓解这种过度自信。通过整合多种方法的优势,以进一步减少对错误答案的过度自信。
2、进行事后纠正
另一个是缓解幻觉的事后纠正(Post-hoc Correction for Hallucination Mitigation),在推理时间内减轻幻觉可能是一种经济有效且可控的方法。
一系列研究利用大模型广泛的参数知识和逻辑推理能力,通过单个模型内的自我反思来确保逻辑一致性或通过涉及多个模型的协作改进或辩论。例如chain of verification,以及self rag。
self rag在生成过程中引入一些特殊的token,来判断模型在回答query中要不要检索内容,判断检索内容是否相关,以及检索内容的支撑回答的程度怎样等问题。
self-RAG分三步:
第一步按需检索,当LLM生成时需要检索内容支撑时,就触发[Retrieve]token,表示接下来要用检索内容;
第二步利用prompt+检索内容进行并行生成,并在生成过程显示出对检索内容的相关度判断的token([Relevant],[Supported],[Irrelevent],[Partailly])
第三步,对上步生成的内容进行评价筛选,选择一个最佳片段作为输出;重复上面的步骤,直至回答完成。
尽管大模型有自己的优势,但有时会受到知识边界和推理链复杂性的限制,导致偶尔出现错误。
二、Rowen的大致实现思路
最开始使用llm的思维链(CoT)推理能力来产生初步回复。
为了评估初始回复中是否存在任何不正确的内容,集成了一个多语言幻觉检测模块,该模块通过分析各种潜在反应的不确定性来评估幻觉的可能性。
当检测到幻觉时,通过检索增强来纠正初始回复中的任何事实不准确之处,检索增强包括来自外部来源的已验证信息,形成最终回复。
然而,如果检测模块没有发现幻觉的证据,则认为初始反应是准确的,因此作为最终输出。
三、具体实现的三个阶段策略
整个系统包括生成初始答案Generating Initial Answer、决定是否检索Deciding Whether to Retrieve、检索增强生成Retrieval Augmented Generation三个模块。
1、生成初始答案Generating Initial Answer
为了处理输入查询x0,利用LM的大量参数知识和推理能力来生成初始答案。
为了确保初始答案的质量,利用大模型的思维链(CoT)能力,指示LM在回复输入x0的同时生成思维过程。用于生成CoT思维过程的提示如下:
这一步最大限度地利用了llm内部的参数化知识及其推理能力,从而在一定程度上减少了幻觉的发生。
一旦生成了CoT推理过程to0,则要求模型M根据思维过程提供一个简明的答案,这一块也采用提示的方式进行:
Based on the above thought process, provide a brief and direct answer
一旦没有检测到幻觉,获得的答案r0被认为是输入查询x0的最终回复。
2、决定是否检索Deciding Whether to Retrieve
在llm的反应中检测幻觉是具有挑战性的,因为现有的基于一致性的方法可能并不总是发现错误,它们依赖于单一语言中的语义一致性。
当大模型在各种干扰下给出连贯但不正确的答案时,这些方法可能会失效。
1)多语种变体生成
为了解决这个问题,引入了一种新的多语言检测模块,该模块涉及跨不同语言交叉检查同一问题的答案。
如果一个问题在不同的语言中得到不一致的答案,特别是那些具有重大文化差异的语言,则倾向于认为它可能是不正确的。
这块有个假设,就是使用多语言的能力,其首先利用LLM提示在源语言和目标语言中生成语义等效的变体。
具体地,首先,从一个输入x0开始,并指示模型M提供一组k个语义等价的输入Xs=x1s,x2s。
对应的提示为:
“For the question [ORIGINAL QUESTION], please provide k semantically equivalent questions”
并要求模型M将这些源变体Xs翻译成相应的释义问题Xt=x1t,x2t,…,xkt 。
为了确保在这一步中生成变体的质量,在生成的输入x/t和查询的输入x/t之间执行成对检查,这一步也采用大模型提示进行处理,对应的提示为:
在获得不同语种变体问题后,提示LM根据这些问题生成候选答案,并采用贪婪解码策略,提示模型M分别为每个扰动问题生成唯一的回复。
2)一致性评分计算
在这一步中,利用从前面所有阶段生成的样本集来计算捕获语言级交叉检查范式的数值一致性分数,通过比较两个QA对之间的语义等价性,如果语义等价则返回“True”,否则返回“False”。
对应的提示为:
然后,将回复映射到一个数字语义等效分数:{“True”→ 1.0,“False"→0.0}。
因此,多语言一致性评分Z可计算为:
其中P∗=(x∗,r∗)表示上一步生成的QA对,分数Z是衡量模型出现幻觉的可能性。
3、检索增强生成Retrieval Augmented Generation
如果一致性得分低于预定义的阈值,则表明原始回答中存在幻觉内容的可能性,则引入一个检索增强生成过程。
为了帮助LM模型纠正内部错误,从外部知识来源(如在线网页)中寻找支持证据。
最初,为了在寻找验证事实时对人类的查询进行模仿,指示模型M为x中的每个释义问题生成搜索查询。提示如下:
然后,将生成的相关搜索查询输入到GooglesearchAPI中以检索相关知识,将收集到的搜索结果在后续的幻觉纠正步骤中使用,以解决原始回复中潜在的事实错误。
在获得相关证据后,提示模型根据通过检索程序获得的检索证据来回顾之前的思维过程和最初答案。
总结
本文主要介绍了《Retrieve Only When It Needs: Adaptive Retrieval Augmentation for Hallucination Mitigation in Large Language Models》这一工作,其通过引入跨语言之间的一致性从而决定是否需要借助外部知识库进行检索。
但是,这也有个很大的前提,就是基座模型本身是需要多语种的,并且翻译性能要好,否则中间过程中所产生的语种变体也会发生偏移。
RAG发展至今,越来越多的方向是将其重要性弱化,如近期卷的长文本窗口大小,长文本的阅读理解能力等等,这些都是一些值得关注的方向。
而怎么进行探究大模型内部知识的边界,哪些知道,哪些不知道,也是值得探索的话题。
参考文献
1、https://arxiv.org/abs/2402.10612
2、https://mp.weixin.qq.com/s/de3UxM9WTrHNjnOKSny0aw
关于我们
老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。
老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。
对于想加入更优质的知识图谱、事件图谱、大模型AIGC实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。
更多AI工具,参考Github-AiBard123,国内AiBard123