今天是2023年12月5日,星期二,北京,天气晴。
我们再来看看大模型幻觉的一个框架性的工作,最近的工作《Minimizing Factual Inconsistency and Hallucination in Large Language Models》:https://arxiv.org/pdf/2311.13878,提出了一个多阶段框架,首先生成理由,然后验证和完善不正确的理由,并将其作为生成答案的辅助参考,从而提升模型性能。
该工作提出的几个步骤很有趣,有些cot中,step by step的意思,供大家一起参考。
一、整体技术方案
工作《Minimizing Factual Inconsistency and Hallucination in Large Language Models》提出的多阶段框架由五个部分组成,包括混合检索器(HybridRetriever)、提示引擎(PromptEngine)、理由生成器(RationaleGenerator)、理由验证器(Rationale Verifier and Refiner)、答案生成器(Answer Generator)。
其中:
混合检索器(HybridRetriever)根据用户的查询,从各种数据源(如文档、知识图谱和互联网)中检索相关信息(上下文);
提示引擎(PromptEngine)将上下文和用户查询作为输入,为每个组件创建带有说明的简明提示;
理由生成器(RationaleGenerator)使用上下文和用户查询生成带有支持证据的理由(解释);
理由验证器(Rationale Verifier and Refiner)验证理由的事实准确性以及是否在上下文中明确或隐含地提及,理由提炼器根据上下文修改或提炼不正确的理由;
答案生成器(Answer Generator)利用经过验证和提炼的理由,促进LLM生成最终的描述性答复,确保答案的事实准确性。
二、混合检索器HybridRetriever
混合检索器(HybridRetriever)组件可同时处理文本和三元组,以便从不同来源和格式中高效检索相关信息,包括文档、知识图谱和网络中的索引段落块。
检索系统由多个检索器组成,每个检索器擅长不同的检索方法和数据类型,包括语义向量、词法和知识图谱。
每个检索器可以单独使用,也可以组合使用,从索引数据存储中检索细粒度信息。检索系统还包括一个重新排序器,根据相关性得分只保留最重要的信息。这就形成了与用户查询和提示一起作为输入传递给LLM的上下文。
1、段落搜索
段落搜索以段落块𝑃={𝑝1,𝑝2,…,𝑝𝑚}的形式检索信息,这些段落块从一组内部文档𝐷={𝑑1,𝑑2,…,𝑑𝑛}中拆分并编入索引。
给定用户查询q,采用语义和词法技术来检索相关段落的前𝑘。
其中,涉及到语义搜索和词法搜索两方面的内容。
其中:
语义搜索使用纯编码器语言模型作为检索器来获取查询语句的嵌入向量,并在包含所有段落块的嵌入向量的数据存储上执行语义向量搜索。
余弦相似度用于检索与用户查询语义相似度最高的相关段落,即𝑃𝑠𝑒𝑚=𝑝𝑠𝑒𝑚1,𝑝𝑠𝑒𝑚2,…,𝑝𝑠𝑒𝑚𝑘,其中𝑝𝑠𝑒𝑚𝑖是与q语义最相似的𝑖𝑡h段落块。
词法搜索检索包含用户查询中的确切单词或短语的最相关段落块,即𝑘、𝑃𝑙𝑒𝑥=𝑝𝑙𝑒𝑥1,𝑝𝑙𝑒𝑥2,…,𝑝𝑙𝑒𝑥𝑘,其中𝑝𝑙𝑒𝑥𝑖是与⑪匹配的第𝑖𝑡h个段落块。
注意,一旦两种搜索方法都检索到了相关性最高的段落块,会使用重新排序器为每个检索到的段落块提供一个与Δ相关的相关性得分。
根据相关性得分的递减,重排序器只保留相关性得分最高的段落块。词汇和语义对𝑃𝑘的贡献权重根据应用的性质决定。通过并行使用语义搜索和词法搜索,可以检索出与用户查询语义相似且完全匹配的最相关段落块。
2、三元组搜索
三元组搜索以三元组的形式从知识图谱(KG)或在检索过程中转换成三元组的段落中检索相关信息。
在前一种情况下,即给定一个用户查询和知识图谱𝐺,从三元组=𝑡1,𝑡2,…,𝑡𝑘是与查询∆最相关的,利用子图再迭代算法(Subgraph Retrieval)遍历,同时考虑到图谱中的实体与查询q之间的语义关系。
其中的子图迭代算法可以查看https://arxiv.org/pdf/2202.13296.pdf
在后一种情况下,给定一个用户查询𝑃和一组段落块𝑃,通过将检索到的段落块快速处理为实体和关系,检索出最重要的𝑘三元组𝑇=𝑡1,𝑡2,…,𝑡𝑘。
将句子中的所有引用替换为各自的实体提及,将实体提及链接到原始实体,并对生成的三元组进行规范化。
3、网络搜索
网络搜索通过选择性搜索引擎和社交媒体API从互联网上检索自然语言文本形式的相关信息。
给定一个用户查询△,检索与查询△最相关的前𝑘个网页的文本和API响应=𝑤1,𝑤2,…,𝑤𝑘。这有助于缩小搜索请求的范围,获得的文本将即时处理为段落块。
总的来说,混合召回组件结合了非结构化段落、三元组搜索和网络搜索的结果相结合,产生一个综合的Context。
三、提示引擎及理由生成器PromptEngine
提示引擎是一个共享组件,负责将用户查q、以文本和三连音形式检索的上下文𝐶,以及任何其他可用的组件输出(如生成的理由𝑅和验证语句𝑉)转换为简洁的预定义提示指令p模板。然后,在每个阶段将提示传递给LLM,以生成相应的输出。
1、理由生成器RationaleGenerator
理由生成器利用检索到的上下文为给定查询生成中间理由(解释)。它在引导LLM得出有事实根据的答案方面起着至关重要的作用。它还能让用户追溯到上下文的关键部分,使答案有据可依、值得信赖。
给定一个查询q和上下文𝐶=𝑐1,𝑐2,…,𝑐𝑘作为输入,提示引擎会生成一个提示指令p,然后将该指令输入给LLM,由LLM识别并生成理由。
然后,提示引擎生成一个提示指令p,并将其反馈给LLM,由LLM根据对每个检索到的上下文部分的隐式和显式推理来识别和生成理由𝑅=𝑟1,𝑟2,…,𝑟𝑘。
这样做是为了确保生成的理由集与𝐶中每个检索到的上下文部分之间是一一对应的。根据检索的来源,𝑅中的每个解释至少与一个标识符(PID-、TID-、WID-*)相关联。
2、原理验证器和提炼器Rationale Verifier and Refiner
首先,理由验证器根据查询和上下文评估所生成理由的真实性和相关性。
理由中的每条陈述都会根据其与上下文中各自已识别部分的相关性被归类为:”CORRECT-EXPLICIT”、”CORRECT-IMPLICIT”、”CORRECT-ADDITIONAL_INFO”、”INCORRECT-FALSE_INFO”、”INCORRECT-DEVIATING_INFO” 、”INCORRECT-ILLOGICAL”,对应为”正确-显式”、”正确-隐式”、”正确-附加信息”、”不正确-虚假信息”、”不正确-偏离信息”、”不正确-逻辑”。
形式化为:
给定查询q、上下文𝐶=𝑐1、𝑐2、……、𝑐𝑘和理由𝑅=𝑟1,𝑟2,…作为输入,提示引擎会生成一个提示结构p,然后将其输入LLM,以验证理由𝑅并将其分类为验证语句𝑉=𝑣1、𝑣2、……、𝑣𝑘。
原理验证器会对原理中的每个陈述进行分类,并为其分类提供全面的理由。此外,还会根据评估标准做出判断,将语句标记为”正确”或”不正确”。这有助于过滤掉不正确的语句,并将其发送给”理由提炼器”。
其次,理由提炼器利用从理由验证器收到的理由作为反馈,对理由中的错误部分进行审查和修正。 该模块将反馈意见与所提供的查询和上下文一起进行评估,并将其整合到修订后的理由中。
理由提取器是一个可选组件,如果没有来自理由验证器的不正确标签,则可以跳过。
给定查询𝑘,context𝐶=𝑐1,𝑐2,…,𝑐𝑘,rationale𝑅=𝑟1,𝑟2,…,𝑟𝑘,以及验证语句𝑉=𝑣1,𝑣2,…作为输入,提示引擎生成一条提示指令p,然后将其反馈给LLM,由LLM利用𝑉的反馈信息修改𝑅中不正确的语句,并提供修正后的理由𝑅′=𝑟′,𝑟′,…,𝑟′。
四、答案生成器Answer Generator
答案生成器利用经过精心验证和提炼的基本原理,为给定查询生成符合事实的答案。
答案生成器还将上下文标识符与每个引文背后的原理(解释)一起作为引文,使用户可以轻松地将它们与答案的部分内容进行交叉引用,并验证生成答案所使用的来源。
给定查询q和细化理由𝑅′=𝑟′,𝑟′,…,𝑟′作为输入,提示引擎会生成一个提示指令p,然后将其输入LLM,以提供最终答案𝐴,以及用于将部分答案与上下文和理由进行交叉引用的引文。
五、具体效果
1、在PubMedQA和AEQA数据集上的表现
在加入RAG以及RAG+FE之后,性能有一定的提升。
2、具体的例子
3、消融分析
表2列出了一项消融研究的结果,对RAG+FE方法的不同组成部分进行了评估,以评估它们对准确性和忠实性的影响。
结果表明,RAG+FE方法的所有变体在准确性和忠实性方面都优于基线RAG方法:对比准图形检索实验,使用”理由验证器”和”理由提炼器”的方法获得了最高的准确率96.85%,最高的忠实度83.24%。这表明,验证和提炼可以产生高质量的理由,并提高整体性能。
总结
本文主要介绍了最近的工作《Minimizing Factual Inconsistency and Hallucination in Large Language Models》,其中提到的理由生成器RationaleGenerator有COT的意思,变成step by step。
不过,其中具体实现细节,原文中并未有太多提及,但大概率是通过prompt实现,有后续的,我们可以跟进。
参考文献
1、https://arxiv.org/pdf/2311.13878
关于我们
老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。
老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。
对于想加入更优质的知识图谱、事件图谱、大模型AIGC实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。