查看原文
其他

大模型商业应用的“天王山之战”——消灭LLM幻觉

这个男人来自千祥 土猛的员外 2023-12-04

本文主要内容:

大模型LLM为什么会有幻觉?

“消灭”幻觉的四个主要方法

幻觉如何检测

在之前我一篇文章比较受欢迎的文章《大模型主流应用RAG的介绍——从架构到技术细节》中提到了大语言模型(LLM)的主要缺点有三点:

  • 幻觉问题:大模型的底层原理是基于概率,所以它有时候会一本正经胡说八道,比如我们问大模型的问答系统,“良渚博物院下周一开门吗?”我相信这样的问题你不能连续问,因为大模型会有一定的几率告诉你开门。而如果游客真的在下周一去了良渚博物院,那估计就要失望了,如果这个Chat还是博物院官方提供的,那事情最终会演变成一通12345的投诉电话。所以在很多需要非常精确的场景,仅仅依赖GPT的这种生成式回答是很不严谨的,而且看起来很难消除。
  • 新鲜度问题:规模越大(参数越多、tokens越多),大模型训练的成本越高。类似OpenAI的ChatGPT3.5,目前的数据新鲜度依然保留在2021年,对于之后的事情就不知道了。而且对于一些高时效性的事情,大模型更加无能为力,比如帮我看看今天晚上有什么电影值得去看?这种任务是需要去淘票票、猫眼等网站先去获取最新电影信息的,大模型本身无法完成这个任务。
  • 数据安全:OpenAI已经遭到过几次隐私数据的投诉,而对于企业来说,如果把自己的经营数据、合同文件等机密文件和数据上传到互联网上的大模型,那想想都可怕。如果企业人员想提一个类似这样的问题:“帮我看看3月份XX部门的销售环比数据与哪些兄弟部门的增长是密切相关的?”,这需要打穿企业内部的很多数据。既要保证安全,又要借助AI能力,那么最好的方式就是把数据全部放在本地,企业数据的业务计算全部在本地完成。而在线的大模型仅仅完成一个归纳的功能,甚至,LLM都可以完全本地化部署。

这三个问题中,“新鲜度问题”已经基本上被解决了,像GPT-4 Turbo这样的最新大模型已经有类似RAG(Retrieval Augmented Generation,检索增强生成)这样的技术,可以借助外挂快速吸收最新知识(世界知识)。剩下的两个问题,“数据安全”最好的解决方案当然是本地化,敏感数据不上公网才是最安全的。次之的解决方案是使用可信度更高的大模型厂商,他们肯定都有基本的职业操守。当然这不是本文主要讨论的问题。好了,剩下最棘手的就是大模型的“幻觉问题”了,所以今天我们主要来讲讲幻觉,以及如何“消灭”幻觉。

幻觉产生的原因

就大语言模型(LLM)本身来说,可能是永远无法消除“幻觉”的,就像Sam Altman说:“幻觉和创造性是等价的”。这个概念我似乎很早就理解了,因为就像生物进化一样,只有不稳定的随机性才能带来的多样性,而多样性才能让物种穿越周期不断进化。

从技术原理来看幻觉这个问题。大模型的输出是一个token一个token往外吐的。为了能够输出下一个token,我们可以想象大模型内部是有一个概率表的,比如根据前面”今晚我想“这四个字,后面接着要推理出来的token也有一个概率表,大模型每次都带有一点“随机性”,去挑选概率表中的TOP10%中的一些token,而不是一直选择排名第一的token。

那么这个概率表哪里来的?

大模型在训练的时候(包括或者微调的时候,甚至是prompt的示例指令阶段)”吃“下去很多文本内容,从这些文本中将发现了各个词之间的关系,做了上面说的这么一个概率统计表。

为了你可以更容易理解,我再举个例子:我们在某百科搜索”猫(cat)“,把前100篇英文文章进行字母统计(英文字母比中文解释起来更简单),得到a后面各单词的概率、b后面各单词的概率......统计后你可以看到如下这样一个字母对出现的概率表:


图1:字母概率表

根据这个表,我们可以看到,r、s、t和n几个字母后面,a出现的概率都极高,回想”今晚我想“这句话后面各种词(比如“吃”、“走”、“喝点”、“回”、“买”)出现的概率,我们应该可以知道概率是怎么来的了,LLM因为吃了这么文本内容,所以它的“脑子”里也有这么一个概率表,只不过它可不是二维的,而是n维的。也是因为是n维的,所以大模型的tokens越大,技术难度越大,训练成本也越高。

另外,由于RLHF(Reinforcement Learning fromHuman Feedback,人类反馈强化学习)的存在,也导致了大模型“立场”不坚定,很多时候它的第一次回答是正确的,但只要你对它进行了质疑,它就会说“对不起,是我理解错了”,然后巴拉巴拉说了一个错误的回答。而且有时候某些知识是会被这种反馈学习给刻意污染的。

其他的一些关于大模型幻觉的原因如下:

过度自信:大语言模型被训练成流利的、类似人类的文本。它们巨大的参数空间允许在语言中建模细微的模式。然而,这种表达能力也可以生成关于任何话题的详细的、令人信服的文本——甚至是虚构的或荒谬的话题。而且相对于人类知道自己说错了会脸红心跳(至少对我来说是这样的),除了职业骗子,一般我们都不太愿意继续这样的谎言。但是大模型不会,他们有非常稳定的“发挥”。

缺乏推理能力:人类在创造语言时利用一般知识和推理能力,相比之下,大语言模型只在文本中单词和概念之间的统计关系上进行训练,他们不考虑现实世界的合理性。结果,他们产生了缺乏逻辑一致性的详细输出的幻觉。

世界知识不足:与大语言模型缺乏关于世界如何运作的一般常识密切相关。人类的常识对产生无意义的文本起着关键的检查作用。但大语言模型是在有限的输入数据上训练的,这些数据不能包含人类直觉上使用的所有世界知识。比如我之前举国一个例子:如果只训练《西游记》,大模型以为人是有三头六臂或者许多个头的,因为哪吒和孙悟空的描述里面是特意讲了这些数字的,而小说本身并没有强调人有多少个头。

拟人化:大语言模型旨在展示类似人类的对话能力。它们的输出模拟了人类的反应,这让人们对它们的事实准确性产生了不应有的信任。然而,用户可能会将人性与真实性混为一谈,导致他们相信幻觉文本代表的是真实的信息,就像来自真人一样。

自动化训练:与人类不同,大语言模型在没有直接监督的情况下使用自动化的大规模算法进行训练。这使得从庞大的数据集中学习复杂的行为成为可能。但它也消除了在训练过程中减少学习错误信息所需的人类判断。

好了,关于大模型的幻觉,我们先说到这里,接下来我们来看看如何尽可能降低幻觉吧。当然在我们继续之前,我需要先强调一下,本文更多讲的是外部的解决方案,而不是深入到大语言模型内容去解决幻觉的问题,不涉及比如在大模型训练时候的因果建模、逻辑引导等工作。

消灭幻觉的方法

方法一:BERT

我们最早的解决方案是前置一个BERT,或者预置Agent+Prompt做优化。

前置BERT的困难点在于我们需要人工去提前预设很多问答对(或者叫问题和语料),在提前预设里面有两个最大的困难点:

  • 知识库运营人员需要去详细业务的每个角落,然后猜想用户可能会问哪些问题,去预先设置问答对。这种预设的问题预设过多,人员成本巨大。如果预设过少,那么很容易被击穿(问了无答案,或者直接去到GPT);
  • 相较于GPT模型,BERT模型属于精准检索和召回,理解能力偏弱,所以我们需要去做很多相似问法。没有行业知识包的BERT可能无法理解WC和洗手间是同一个事物,所以相似问法是另外一个更加繁琐的工作,一般每条问答对需要有30个左右的相似问法。如果我们预设了100个问答对,那么就需要准备3000个相似问法。

所以前置BERT模型和知识库虽然确实可以在一定程度上解决幻觉的问题,但是知识库条目如果数量不够就会被轻易击穿(到GPT模型),而知识库条目数量太多考验的就是人的工作而不是AI的能力了。换句话说,那就是回到“有多少人工,就有多少智能”的时代了。

对于有能力来自建AI和大模型应用系统的企业来说,BERT前置确实可以很好地应用在他们的一些需要精确度的业务中。但是这种方式却无法有效复制扩展规模,没有自建和维护NLP能力的企业怎么办呢?所以我们需要看看还有没有其他方法,在GPT大模型时代,我们尽量采用“新时代”的方式方法来解决问题,所以在试用了一段时间的前置BERT之后,我们看中了Agent和Prompt优化。


方法二:Agent+Prompt

大语言模型的幻觉通常源于用户相对模糊或过于宽泛的prompt。从信息学的角度来看,这中情况减少了指令的信号,增加了输入数据的信息熵。

我说了,GPT时代我们就用新时代的方式来解决问题。在发现前置BERT不能解决对更多客户的服务需求之后,我们看到了LangChain框架,以及更加极致的AutoGPT——对,就是那个非常烧钱的工具。我为什么把Agent和Prompt放在一起讲,因为我们仔细看了这些架构的细节之后,发现说到底Agent是拆解了用户的提问,使用一种对LLM更有耐心的方式来提问,最终的落脚点其实都在prompt上。

拆解提问

比如我们本来问一个问题“小明的老婆生了一对龙凤胎,加上他们4岁的女儿,那么请问小明现在一共有几个儿子几个女儿?”,但是现在我们把这个问题拆成多个来问,如龙凤胎是什么意思?最终的答案是要求输出什么?一个女儿加上一个女儿等于几个女儿?等等,然后一步步去做这些问答的执行,中间也可能存在memory的寄存和加减。

将复杂的任务分解成更简单的组件可以提高LLM的理解能力和准确性。这种方法使模型更容易管理复杂的问题,允许它一次只关注一个方面,并以结构化的方式构建最终的解决方案。它还减少了模型的认知负荷,最大限度地减少了由于过于复杂而产生错误的机会。

Prompt的特异描述

Prompt的特异性大大减少了产生幻觉的机会。通过制作清晰直接的prompt,用户可以将LLM引导到预期的主题或任务,减少不相关回答或偏离主题的回答的机会。这种方法在信息准确性非常重要的应用程序中特别有用,例如在金融、教育和政务等行业中。特别是如果我们的业务会涉及到12345的投诉的话,那就更加需要小心了,哈。

这个思路在之前的文章中其实也提到过,不过那次说的是RAG里面的融合检索。当我们接收到用户的一个提问之后,我们会先让大模型对这个提问进行解读,并给出重新梳理之后的新提问,保证这个提问的prompt具有更强的特异性。

给一个示例

提供期望输出的示例可以指导大模型理解我们的期望并最大限度地减少错误。示例作为模型可以模仿的具体参考,帮助它掌握预期响应的语气、风格和实质内容。这种技巧在创造性任务中尤其有效,因为在创造性任务中,期望的结果可能更主观,更不明确。比如下面这个prompt中我们就给大模型讲了一些示例:

请帮我分析一下这段话”我需要看2021年3月至7月(含)的浙江分公司的自研产品的销售数据报表“,如果包含时间,请帮我列出”时间:xxxx年xx月“这样的格式,如果包含机构,请帮我列出”机构:xxxx“,如果包含其他实体,请帮我列出”实体:xxxx/xxxx“

我们作为中小学生的时候,有时候很兴奋的算出了一道应用题中最难的一个结果值,然后却忘了题目要求的是想把这个结果和之前的一个结果相加,最终导致被扣分。我们给这个示例,也是为了大模型不犯我们犯过的错。

方法三:RAG

相信老朋友们都已经知道,我的公众号讲的最多的就是RAG及其相关技术,虽然本文我不想大篇幅再去说RAG的能力,但是依然可以再针对幻觉展开讲讲。

RAG是一种实时利用外部资源的方法,通常作为Embeddings存储在向量数据库中。这种集成允许LLM在文本生成之前接收相关信息,从而通过将其响应集中在相关的现有数据上来减少幻觉。RAG本质上为LLM提供了一个安全网,确保它的输出不仅依赖于它的训练,而且还依赖于更最新、更相关或刚刚超出训练模型所用数据领域的其他数据。这种方法在准确性和事实正确性至关重要的情况下特别有效,例如在科学研究或新闻报道中。RAG吸收外部数据的能力为LLM的响应增加了一层深度和丰富性,使它们更加翔实和全面。

这种检索增强功能通过维护存储文本和代码段表示的向量数据库来实现。在生成文本时,LLM可以查询该数据库,以根据prompt的上下文检索相关信息。这些检索到的信息然后作为LLM的额外输入,指导它产生更准确和一致的输出。

通过整合这些外部知识,LLM可以克服自身训练数据的局限性,减少产生幻觉的可能性。此外,RAG实时访问和处理外部信息的能力使其能够根据查询的特定上下文调整其响应,从而增强其通用性和适用性。

这里可以讲一讲我们在提高RAG准确度上的一些方法:

  • 微调特有的Embedding模型:应该说目前已经有很多优秀的Embedding模型,比如Bge-large-zh、Jina-embeddings和m3e等,一般来说维度越高效果越好,OpenAI、通义千问等商用embedding模型的shape都是1500+。然后,大家如果觉得embeeding在理解特定业务知识上不够优秀,还可以自己微调一下的,可以参见我之前的文章《Embedding手工微调》;
  • 重新排序策略:在检索一组候选文档后,根据更细粒度的标准对它们进行重新排序可以改善结果。这涉及到使用额外的特性或模型来更准确地评估每个检索文档与查询的相关性。Rerank的效果有时候是决定性的,大家可以参考我之前的文章《Rerank,百尺竿头更进一步》;
  • 交叉编码器:使用交叉编码器模型,将查询和文档联合考虑进行Embedding,可以提高检索质量。在Elasticseach8.8之后好像具备默认的RRF方法,具体的内容大家也可以参看我之前的文章《RAG Fusion》。

我们配合RAG还做了其他一些组件,比如幂等分类器(TorchV IC,IC = Idempotent Classifier),这是一个对用户输入进行分解的组件。比如前面说到的“我需要看2021年3月至7月(含)的浙江分公司的自研产品的销售数据报表”,我们会先对这句话进行理解,然后通过时间(2021年3月至7月(含))排除掉大约95%的时间元数据不相关的索引。再通过浙江分公司排除掉其他chunks,再是自研产品、销售数据等等。这样就排除掉了海量的干扰项,最终组成prompt送给LLM的内容是干净的,不会造成“矛盾”、“重复”的,尽可能把一些既定事实用幂等的方式来处理,而不是事事交给“概率”。


图2:TorchV的中间件系统中,专门为RAG提供了幂等分类器——TorchV IC

方法四:领域适配和微调

这个方法可能需要一点“体力”,我们用大量领域特定数据对大语言模型进行微调,可以比较有效地减少在特定领域内生成文本的幻觉。这里的关键是模型在特定的细微差别、术语、本体论和领域模式中的深度沉浸,这使它能够生成的输出不仅更有可能是事实正确的,而且更重要的是,非常符合上下文的情境。

微调(全微调或参数高效微调)涉及在专门为目标领域、行业或任务设计的精心设计的较小数据集上训练LLM。这个过程改进了模型产生更精确响应的能力,减少了模型产生无根据信息的倾向。

微调允许更集中的学习体验,其中模型暴露于直接与它将执行的特定任务相关的高质量相关数据。这种有针对性的方法不仅提高了模型的准确性,而且还提高了它的召回效率,因为模型变得更善于识别和处理与任务相关的信息。此外,随着新数据的出现,微调可以不断调整和优化,使模型在快速发展的领域保持最新和相关。

对于微调,说实话我不是很感冒,因为更喜欢在外部解决问题。但是领域适配这个倒是很有意思,特别是对于方法三中“幂等分类器”也是有帮助的。

幻觉检测方法

让机器识别幻觉内容还是非常具有挑战性的,因为人都不一样能识别出来一些捏造的内容。目前我们接触到的主要方法包括:

交叉验证:最傻也是最有效的方式,就是我们使用三个不同的大模型,比如GPT-3.5/4(不差钱尽量用4)、通义千问/智谱/Baichuan,以及待检测的大模型。让他们对同一个问题进行回答,然后用Bge-large-zh等embedding模型直接进行相似度计算,如果他们的结果之前相似度非常高(设置一定的阈值),那么通过。如果出现了2:1的情况,或者1:1:1(三个大模型都有各自的想法),那么记录log,推给人来检查;

循环验证:这种方法适合于本地部署的大模型,因为tokens免费。我们发起一个for循环,然后依然还是用Bge等embedding模型进行检测。比如我们同一个问题问100遍(当然是和其他问题交叉的,不是连续问同一个问题100遍),发现不一样的那个问题。这个问题往往是异常的,我们做标记。每个大模型都有自己比较有特色的幻觉,所以我们可以把这个检测出来的幻觉当做质检异常样本,用于这个大模型在生产环境中使用时的“幻觉”监测。

嗯,我目前觉得就是这两个方法还比较适合自动化,也适合对生产环境中的大模型进行幻觉监测,一旦发现,报警(不是打110),然后重做或者挂起任务。

结尾

最近和我们的客户聊的比较多,针对他们商业业务中具体的问题,一致的看法就是:如果LLM的幻觉没办法控制,很多业务不敢使用LLM。所以在LLM成为白盒之前,我们的更多做法是在前后两侧来发力。前侧就是TorchV IC(幂等分类器)来做过滤和问题理解,后侧就是用交叉验证和循环验证之后的智能质检来做监测(兜底)。

最近两周加我微信询问RAG中各环节问题的朋友比较多,其实我已经把知道的七八成的RAG知识都写成文章了,但是可能太多篇,而且先后顺序有点乱,所以很多朋友看起来有点累。下周如果有时间,我会写一篇总概,把整个RAG的脉络梳理一下,然后讲讲每个环节的重点内容,以及详细的文章链接,敬请期待!


近期其他文章:

用弹子球机讲述LLM原理——如何用损失函数、梯度下降做训练和微调

Rerank——RAG中百尺竿头更进一步的神器,从原理到解决方案

全新ChatGLM3-6B针对七项RAG能力的评测,谁最适合RAG?

完全指南——使用python提取PDF中的文本信息(包括表格和图片OCR)

大模型主流应用RAG的介绍——从架构到技术细节


继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存