已经唠了三章的RAG,是时候回头反思一下,当前的RAG是解决幻觉的终点么?我给不出直接的答案,不过感觉当前把RAG当作传统搜索框架在大模型时代下的改良,这个思路的天花板高度有限~
反思来源于对RAG下模型回答的直观感受,最初我们被ChatGPT的能力所震惊,并不是它能背诵知识,而是模型在知识压缩后表现出的“涌现能力”,更具体到RAG所属的问答领域,是模型能够精准的基于上文从压缩的参数中召回并整合相应的知识,甚至进行知识外推的能力。通俗点说它有可能生成我在任何地方都检索不到的答案!
但RAG当前的多数使用方法,采用只让模型基于检索到的内容进行回答的方案,其实限制了模型自身对知识压缩形成的智能,大模型似乎变成了文本抽取和总结润色的工具。体验上大模型直接回答的效果就像是学霸答题文采四溢,而RAG有时倒像是学渣开卷考试,答得小心翼翼一有不慎还会抄错答案…
既要保证事实性,又要保留模型智能,则需要最大化的使用模型已经内化压缩到参数中的信息,只在需要使用外部知识增强的时候再进行工具调用。看到过以下几种方案
- Detection:通过前置判断,决策模型何时需要使用外挂,在模型可以自行回答的时候,使用模型回答,当模型不能回答的时候走RAG检索生成
- Realtime Data:需要获取动态世界的信息,部分场景可以通过意图进行决策,相对好解决
- Incorrect or Incomplete:模型不知道,或者模型推理幻觉,如何知道模型可能不知道是更难解决的问题
- Calibration:通过后置处理,让模型先生成,再使用召回内容对模型回答进行修正校准和事实性检查
- 两种方案勾兑一下:高置信度判断模型可以自行完成直接回答,中置信度先生成再校验,低置信度直接走RAG检索生成,或者通过意图和场景进行决策
如何勾兑就不在这里说了,这里我们聊聊基础的前置判断和后置处理分别有哪些方案~
前置判断-Detection
检测模型回答存在幻觉可以通过检索外部知识进行校验,不过考虑生成式模型覆盖问题的广泛性,Self-Contradictory论文中评估chatgpt生成的回答中38.5%的内容无法通过Wiki等外部知识进行校验。
因此这里我们先介绍一种完全基于模型自身,不依赖外部知识的幻觉判断方案自我矛盾。后介绍一种模型直接拒绝回答的方案,和RLHF里面的事实性原则类似,这里是基于SFT的模型自我拒绝方案,不过个人对拒识类的方案持一定的保留意见,但不妨碍学习新思路哈哈~~
自我矛盾
第一种发现模型幻觉的方案是基于模型多次回答的不一致性来判断模型是否在胡说八道。相似的概念在解密Prompt系列9. 模型复杂推理-思维链基础和进阶玩法里面聊Self-Consistency COT时就提到过,该论文是使用多路COT推理来投票出一个最合理的推理路径,从而提高思考的准确率。这里只不过改变了使用的形式,通过模型多次回答的不一致来判断模型是否出现了幻觉。有以下几种生成模型多次回答,并度量一致性的方案
单模型推理
- SELFCHECKGPT: Zero-Resource Black-Box Hallucination Detection for Generative Large Language Models
- SELF-CONTRADICTORY HALLUCINATIONS OF LLMS: EVALUATION, DETECTION AND MITIGATION
对于如何度量模型随机生成的多个回答之间的不一致性,Self-Check尝试了包括Bert相似度计算在内的5种方法,其中效果最好的两种分别是传统NLI和基于大模型prompt的NLI,从推理性价比上传统NLI有优势,效果上LLM更好,以下是使用不同相似度计算方案来衡量模型多次随机解码的不一致性,并用该指标来计算模型回答是否符合事实性的AUC效果
传统NLI推理任务,是给定前提(premise)判断假设(hypothesis)是否成立或者矛盾。这里论文就是使用MNLI数据训练的Debarta-v3-Large来判断模型生成的回答r(hypothesis),是否和其他N个采样生成的回答(premise)相矛盾。论文分别尝试了句子级的判断和整个回答粒度的判断,句子级别的效果显著更好。
而基于大模型prompt,同样是NLI任务的思路,只不过改成了自然语言指令,以下context等同于以上的 Sn, sentence就是 ri, 大模型推理返回的Yes/NO会被转化成0/1,并计算均值。
SELF-Contradictory的思路很相似,方法更加复杂些,感兴趣的朋友自己去看论文吧~
多模型问答
- DeepMind LM vs LM: Detecting Factual Errors via Cross Examination
- Improving Factuality and Reasoning in Language Models through Multiagent Debate
同样是自我矛盾的思路,还可以通过多模型对话的方式来进行。LM VS LM采用了模型B多次反复提问模型A的方式来生成多个回答。类似的方式也用于问卷中问题的设计,出题人会用不同的方式把一个问题问好几遍,如果每次回答都不一样,说明做题人对类似问题的回答是不确定的。如下图
第一步模型A先生成回答(claim)。第二步模型B会针对cliam,从多个角度生成提问并让模型A再次进行回答。第三步模型B会基于A的原始回答,和对多个问题的回答来判断原始回答的正确性。以上B提问A回答的步骤,如果B判断需要进行补充提问的话,可能会重复多次。
这里涉及到的三个任务都是通过大模型指令来进行的,三个任务分别是:模型B基于A的cliam进行提问,模型B判断是否继续提问,模型B基于A的所有回答判断claim是否正确。对应的具体prompt如下
相比上面SELF-CHECK随机解码生成多个答案的方案,从多角度进行提问,个人感觉更有针对性,但两种方法都会有遗漏和误伤。推理成本上SELF-CHECK更低,LM vs LM更高。
自我拒绝
- R-Tuning: Teaching Large Language Models to Refuse Unknown Questions
除了通过不一致性判断模型出现幻觉,另一种更干脆直接的方案,是让模型在碰到自己不确定的问题时,直接选择拒绝回答,和RLHF中的事实性原则的是一个思路。但我对这类方案最大的疑惑是拒识能力的泛化性。究竟模型是学到了对于自身parametric knowledge置信度较低,混淆度较高的问题进行拒绝回答,还是模型背下来了对某些知识和上文语义空间进行拒绝回答。这个我也还没想明白哈哈哈~
所以这里我们绕过这个问题,聊一种中间策略,毕竟西医好多疾病也没研究明白,但病还得治不是。R-Tunning提出指令微调可能放大了模型的回答幻觉。因为指令微调的数据集中所有问题都有答案,微调任务就是负责教会模型各种任务范式,以及在不同的任务中如何召回预训练中学习的知识并回答问题。但我们忽略了SFT中很多任务涉及到的知识在模型预训练中可能是没接触过的,但我们依旧选择让模型去进行回答。这种预训练和指令微调间的不一致性,可能会进一步放大模型幻觉。
R-Tunning给出的解决方案是在构建指令微调数据集时,加入模型是否对改答案表示肯定的描述,这样允许模型拒绝自己不确定的问题。分成2个步骤
- 找到模型不确定的问题,论文尝试了两种方案
- R-Tuning:模型回答和标注答案不一致,适用于有标准答案的QA问题
- R-Tuning-U:模型回答自我矛盾,这里论文计算模型回答包含的所有答案的熵值
- 构建允许模型拒绝的指令数据集,论文也尝试了以下两种prompt指令模板
- R-Tuning:“Q:{Question},A:{Answer}.{Propmt}.”,其中prompt是Are you sure you accurately answered the question based on your internal knowledge:对于上面模型确定的问题加上I am sure,不确定的问题加上I am not sure
- R-Tuning-R: 对于确定给的问题使用"Q:{Question},A:{Answer}",对于不确定的问题用I am not sure 的各种相似表达来直接替换Answer
然后使用以上加入模型不确定性表达的数据集进行指令微调即可。在我们的使用场景中R-Tunning-R这种直接拒绝的方案更加合适,毕竟我倾向于指令微调的核心并不是知识注入,而是任务对齐,所以模型只要学习到对于自己不确定的问题选择拒绝回答即可。在论文验证的MMLU等数据集上这种拒绝微调方案有一定的领域外的泛化效果,不过这些数据集和我们的使用场景相差很大,具体效果要等测试后才知道了。
后处理:Calibration Method
和Detection相反,Calibration把重心放在模型回答的后处理上。也就是先不做判断直接使用模型生成回答,再调用工具对回答进行校验和修改。这里我们介绍谷歌和微软提出的几种方案。不同方案对于如何后处理,和调用哪些工具进行后处理存在差异,不过整体流程都和下图相似:模型生成 -> 召回相关知识 -> 对生成结果进行校验和修复
指令方案
- RARR: Researching and Revising What Language Models Say, Using Language Models
- CRITIC: LARGE LANGUAGE MODELS CAN SELFCORRECT WITH TOOL-INTERACTIVE CRITIQUING
基础方案是RARR提出的Research-then-revise框架,整个流程分为以下几个步骤
Generation Stage,先让LLM直接生成问题回答X
Research Stage,用于收集可以校验回答的事实性证据。针对X使用Few-shot-prompt, 生成用来校验X的多个搜索问题,每个问题分别进行谷歌搜索并召回Top5内容。这里论文没有使用搜索自带的snippet,而是对网页内容进行分块(每4个句子一块),并使用T5-Encoder计算每个chunk和query的相似度保留top-J个内容块。这里会得到一个(Q1,chunk1)(Q1,chunk2),(Q2,chunk1),…的(问题,事实)列表
**Revise Stage,获取所有检索到的事实之后,进入校验阶段。**论文会遍历以上列表,针对每一个问题,分别先使用few-shot-cot判断每个事实和模型回答X之间是否是一致的(agreement model如下)。如果一致则遍历下一个,如果不一致则使用few-shot-prompt让大模型基于事实+问题对模型回答进行修改(revision model如下)。论文在修改回答时,会先定位原始回答X中哪个span和事实不符再进行修改,从而避免大幅修改原始回答
评估部分,后处理方案需要兼顾对模型原始回答的保留和事实性,这里RARR提出了两个指标:
- Attribution Score计算归因得分,既给定所有事实,修改后回答Y中每个句子和所有事实的最大NLI打分的平均值,既整体回答能获得事实性支撑的平均概率
- Preservation score计算保留率,由回答原始意图的保留概率 * 前后答案的未改变率(编辑距离度量)得到
RARR最大的问题在于效率,一部分是大模型的推理效率,一方面是最后的Revise部分采用了串行修改,这部分在后面的微调方案中会有改良
另一篇论文CRITIC提出的verify-then-correct和RARR非常相似,只不过在不同的任务上尝试使用了不同的外部工具进行校验。在开放问答上使用搜索,在代码问题就用代码解释器,并未涉及动态的工具选择,只是在不同数据集上固定选用不同的工具,这里就不展开说啦,感兴趣的盆友自己去看论文吧~
微调方案
- PURR: Efficiently Editing Language Model Hallucinations by Denoising Language Model Corruptions
- Check Your Facts and Try Again: Improving Large Language Models with External Knowledge and Automated Feedback
- Fusion-in-decoder: Leveraging Passage Retrieval with Generative Models for Open Domain Question Answering
PURR针对RARR的效率问题进行了优化,使用的是大模型能力通过数据蒸馏到小模型的方案,也就是把上面最耗时的Revise部分使用T5-large模型来实现,query生成的部分也用T5-large来实现,并且把串行修改的方案优化为了所有事实进行一次性融合修改。
论文的核心就在于如何使用大模型来构建用于事实性修改的T5模型。论文使用了corrput的方案,也就是把正确的回答,人为进行破坏构造幻觉,再训练模型进行还原,具体包含以下几个步骤
- 生成正确的回答:整理了来自各个领域和话题的6000个种子问题,每个问题调用搜索引擎获取TopN网页,并进行chunking分段,使用和上面RARR相同的T5-Encoder计算每个段落和Q的相似度,阈值以上的为positive evidence(E++)这里限制最多4条,其余阈值以下的为negative evidence(E−−)。然后使用zero-shot-prompt来让大模型基于E++生成多文档总结,作为正确的回答Y。
- 对回答添加噪声:同样使用大模型基于2shot-cot-prompt,来对以上获得的正确答案进行破坏,指令要求大模型先生成修改方案,再对回答进行魔改。魔改包括但不限于魔改实体,魔改语义关系,魔改语法等等,这里论文使用了text-davinci-003,指令和效果如下图
- 训练T5:微调使用E+�+的事实和添加噪声的回答作为输入,模型目标是把噪声回答修复成正确答案。这里如果E+�+不足4条的会随机采样E−�−这样可以提高模型对噪声事实的识别能力。值得说一下的是这里多个事实并非采用拼接的形式进行融合,而是使用Fusion-in-decoder的形式在encoder层编码后进行拼接,再进入Decoder。
效果上PURR对比RARR,对模型原始回答有更高的保有率(Pres),以及更高的平均归因率(Attr)。
如何系统的去学习大模型LLM ?
大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业
?”“谁的饭碗又将不保了?
”等问题热议不断。
事实上,抢你饭碗的不是AI,而是会利用AI的人。
继科大讯飞、阿里、华为
等巨头公司发布AI产品后,很多中小企业也陆续进场!超高年薪,挖掘AI大模型人才! 如今大厂老板们,也更倾向于会AI的人,普通程序员,还有应对的机会吗?
与其焦虑……
不如成为「掌握AI工具的技术人
」,毕竟AI时代,谁先尝试,谁就能占得先机!
但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高。
针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料
分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程
等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓
一、LLM大模型经典书籍
AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。
二、640套LLM大模型报告合集
这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)
三、LLM大模型系列视频教程
四、LLM大模型开源教程(LLaLA/Meta/chatglm/chatgpt)
LLM大模型学习路线 ↓
阶段1:AI大模型时代的基础理解
-
目标:了解AI大模型的基本概念、发展历程和核心原理。
-
内容:
- L1.1 人工智能简述与大模型起源
- L1.2 大模型与通用人工智能
- L1.3 GPT模型的发展历程
- L1.4 模型工程
- L1.4.1 知识大模型
- L1.4.2 生产大模型
- L1.4.3 模型工程方法论
- L1.4.4 模型工程实践
- L1.5 GPT应用案例
阶段2:AI大模型API应用开发工程
-
目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
-
内容:
- L2.1 API接口
- L2.1.1 OpenAI API接口
- L2.1.2 Python接口接入
- L2.1.3 BOT工具类框架
- L2.1.4 代码示例
- L2.2 Prompt框架
- L2.3 流水线工程
- L2.4 总结与展望
阶段3:AI大模型应用架构实践
-
目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
-
内容:
- L3.1 Agent模型框架
- L3.2 MetaGPT
- L3.3 ChatGLM
- L3.4 LLAMA
- L3.5 其他大模型介绍
阶段4:AI大模型私有化部署
-
目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
-
内容:
- L4.1 模型私有化部署概述
- L4.2 模型私有化部署的关键技术
- L4.3 模型私有化部署的实施步骤
- L4.4 模型私有化部署的应用场景
这份 LLM大模型资料
包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程
等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓