在某些情况下,我们在使用大模型生成结果时,会有一个直观的感受,就是“一本正经的胡说八道”。
- 一本正经:生成结果流畅、困惑度 PPL 低、有逻辑性。
- 胡说八道:存在两种定义①内容与人类认知不一致;②内容不可证伪。
这里给出一些大模型生成结果的例子,大家可以思考这些问题是否属于大模型的幻觉问题,以及我们是否真的要解决这些问题。
从学术界的共识来看,大模型的幻觉可以分成两大类:
- 事实性的幻觉:包括事实不一致和捏造事实两类。
- 忠实性的幻觉:包括不遵循指令和不遵循上下文两类。
如何在业务工作中,对大模型幻觉进行具体分类,可以参考流程图。
- 首先关注用户指令和上下文,如果没有遵循指令,则是不遵循指令的忠实性幻觉,如果没有遵循上下文,则是不遵循上下文的忠实性幻觉。
- 其次,关注回复内容,如果回复内容正确,则正常,如果回复错误,则需要进一步看错误类型。
- 最后,回复错误类型包括知识类的捏造事实,计算、代码类的事实不一致,以及推理过程中的逻辑不一致等。
2. 大模型幻觉问题产生的原因
上节介绍了大模型幻觉的定义和分类,接下来介绍大模型幻觉问题产生的原因,共有三大类。
- 数据
- 算法和训练
- 推理
(1)数据导致的幻觉问题
以知识边界为例,如果大模型未学习到该领域的知识,或者虽然学习到了,但是知识过时,或者是知识生产时间晚于模型数据生产时间等情况,均会导致大模型由于数据问题出现幻觉。
(2)数据采样过程导致的模型幻觉
一种情况是数据采样的知识捷径。最近的研究表明,LLMs 往往依赖于捷径,而不是真正理解事实知识的细节。它们倾向于过度依赖预训练数据中的共现统计、共现频率和相关文档计数,这可能会引入对虚假相关性的偏见,如果这种偏见反映了事实上不正确的信息,可能会导致幻觉。长尾知识以其在预训练数据中的相对罕见性为特征,对 LLMs 构成了固有的挑战,它们主要依赖于共现模式来记忆事实知识。因此,当面临涉及这种长尾知识的查询时,LLMs 在生成事实上不准确的回答方面存在较高的风险。
(3)预训练过程导致的模型幻觉
一方面,可能受限于 Decoder-Only 架构,以及注意力机制的缺陷。大模型基于前一个标记预测下一个标记,仅从左到右。这种单向建模虽然促进了高效的训练,但也存在局限性。它仅利用单一方向的上下文,这阻碍了捕捉复杂的上下文依赖关系,可能增加幻觉的风险。self attention 模块在捕获长距离依赖关系方面表现出色。然而最近的研究表明,它们偶尔在算法推理的背景下表现出不可预测的推理错误,无论是长距离还是短距离依赖关系,无论模型规模大小。一个可能的原因是 soft attention 的局限性,随着序列长度的增加,注意力在各个位置之间变得稀释。
另一方面是曝光偏差的问题。这是由于自回归生成模型的训练和推理之间的差异造成的。在训练过程中,这些模型通常采用最大似然估计(MLE)的训练策略,其中真实标记作为输入提供。然而,在推理过程中,模型依赖于自己生成的标记进行后续预测。这种不一致性可能导致幻觉,尤其是当模型生成的错误标记在后续序列中引发错误级联时。
此外,微调对齐也会导致幻觉问题,大模型在预训练期间建立了固有的能力边界,当在微调数据中包含了预训练阶段未见过的新知识时,大模型被训练为生成超出自身知识边界的内容,增加了幻觉的风险。在模型对齐阶段,大模型也可能会产生谄媚的行为,其回应更倾向于用户的观点,而不是提供正确或真实的答案,这也会增加大模型幻觉现象。
推理阶段同样可能导致幻觉问题。一方面,temperature、top k、top b 等技术来引入随机性,可能导致幻觉。另一方面,长文本时,更多关注局部 attention,缺少全局信息关注,导致忘记指令或指令不遵循等情况,从而产生幻觉。此外,由于模型最后,经过一系列注意力机制和计算后,最后 output 层会做一次 Softmax 生成最终的预测概率,然而,基于 Softmax 的语言模型的有效性受到 Softmax Bottleneck 这一已知限制的阻碍,其中 Softmax 与 embedding 的结合限制了输出概率分布的表达能力,阻止了语言模型输出期望的分布,从而导致了幻觉问题。
3. 如何检测大模型幻觉
上文介绍了大模型幻觉问题的产生原因,接下来介绍大模型幻觉问题的检测。
(1)按照知识的确定性划分类别
首先,判断用户问题是否可以回答,即问题是否客观、真实、确定性。例如主观问题、哲学类问题、科学想象问题、尚未形成科学共识的问题等,如果希望模型给出确定性答案,大概率是存在问题的。当然,对这种问题,有一个讨巧的办法,让生成结果更符合人类偏好,对于主观问题,给出多种可能答案。
其次,当排除掉非确定性答案的问题后,对于有确定答案的问题,从大模型对知识掌握的认知层面看,又可以分成如下几类:
- 大模型知道自己知道知识
- 大模型不知道自己知道知识
- 大模型不知道自己不知道知识
- 大模型知道自己不知道知识
针对于前两类,并不影响回答正确性。
针对于后两类,大模型本身的回答存在幻觉,是我们重点关注的问题。
(2)针对不可回答类问题的检测思路
此处列举了 2 个工作。TruthfulQA 评测集,使用人类经常回答错误的问题来构建测试集 benchmark,以评估大模型的幻觉能力或者程度。
另一个工作是收集不可回答的问题,通过语义相似度方法,构建语义类似的但是可以回答的问题。利用二元分类器,判断模型的幻觉程度。
(3)如何检测“大模型知道自己不知道”
是否可以让大模型知道自己在“胡说八道”呢?可以利用语义熵的思路。有两种方法。
第一种方法,通过让模型多次回答同一个问题,观察模型回复的一致性。通过对模型多次回答的结果进行语义聚类,如果聚类结果比较分散,可能表明模型的回答存在幻觉。注意,即使模型多次给出了相同的回答,也不能直接判断其为正确答案,因为模型有可能稳定的回复错误答案,这需要与已知事实或专业知识进行对比验证。
第二种方法,让模型对同一个问题生成多个回答,检查这些回答之间是否相互支持,即一个回答是否可以作为另一个回答的证据或补充。如果在这些回答中发现相互矛盾或冲突的信息,这可能是模型产生幻觉的迹象。如果所有回答都相互一致且没有冲突,这可能表明模型的回答是可靠的。同样注意,即使回答一致,需要将模型的回答与已知的事实、数据或其他可靠的信息源进行对比,以验证其真实性。
(4)如何检测“大模型不知道自己不知道”
对于这种情况,可以引入外部工具来检测幻觉,比如搜索引擎、代码解释器等。
针对大模型输出的结果,抽取事实或者观点 claims,用事实或观点再用大模型去生成问题,用生成的问题去搜索引擎、代码解释器等工具收集证据,将收集的证据与大模型输出对比,判断是否有冲突。如果存在冲突,则可能存在幻觉。
此外,还有一个技巧,参考人类撒谎的情况,撒谎时候对于细节问题是很容易出现错误或者冲突,一个谎言往往需要更多的谎言来掩盖。我们在生成问题的过程中,可以利用不断追问的方式来生成,有利于判断大模型是否存在幻觉。
二、360 可信大模型的幻觉解决方案
1. 在数据、算法、推理阶段,缓解大模型幻觉问题
综上来看,大模型幻觉产生的各类问题都有相应的缓解方案,在实际工作过程中,根据不同问题可以利用不同解决办法,包括预训练、微调、对齐、解码策略、RAG、知识编辑等技术。
2. 使用 RAG 缓解大模型幻觉
(1)RAG 工作流程
利用预训练阶段优化方法去解决幻觉问题成本较高,可以考虑利用 RAG 和知识库的方法来缓解大模型幻觉。
首先,对于用户输入进行预处理工作。
然后,进入语义路由判断问题类别,对于创意性任务例如写小说,则无需考虑幻觉问题,因此这类任务偏好多样性和创意性。
对于事实性、政治性、严肃性问题,需要通过特定的知识库,进行知识增强,进一步生成答案。生成的答案依然可能存在幻觉问题,需要分类器判断是否存在幻觉,如果有再进一步缓解。
最后,为了判断回答是否与任务相关,如果大模型回答没有解决用户问题,则需要新一轮的迭代处理策略。
(2)RAG 技术架构
这是一个比较详细的 RAG 技术架构图,主要包括 query 分析、建索引、搜索排序、上下文选择、推理等阶段。
Query 预处理,包括query 扩展、query transformation、query routing 语义路由等模块。
对于检索模块,需要根据不同的数据类型使用不同的检索技术。比如结构化数据、半结构化数据、非结构化数据,公开数据、私域数据等。对于非结构数据和半结构化数据,可以通过文档解析、切片、embedding 向量化后,通过向量检索引擎进行索引。对于结构化数据,可以使用关系型数据库、图数据库等进行建模;
最后,对于不同的索引数据类型,使用不同的 query 查询技术进行混合建设,比如关键词搜索、基于 embedding 的语义相似度检索、text 转 SQL 后的结构化查询、text 转 graphSQL 的 N 元组查询等,对于查询结果进行重排序,将重排序后的结果给到大模型作为上下文信息,由大模型进行推理。
3. query 预处理
(1)sub-query
对于某些问题,本身需要多步推理,可以先针对这些问题,通过大模型,基于少量示例(fewshot)学习或者特定任务微调(SFT),生成一系列子查询,从而引导大模型一步一步针对性回复,在我们实际的工作中能够得到比较好的收益。
(2)Text2SQL
Text2SQL 在智能 BI 场景里也在落地。目前,对于简单的 SQL 效果还可以,但是联表等复杂查询效果还有进一步提升空间。在实际业务中,可以通过减少联表查询的策略来提升相应的效果,比如创建一个大宽表(wide table)。
text2sql 技术包括3 个阶段,预处理、sql 语句生成、后处理。通过 schema linking 技术,结合 Few-shot 学习方法或者 SFT 技术,让模型快速学习如何根据特定的 schema 生成 SQL 语句。生成的 SQL 语句,可能存在错误,因此需要通过后处理阶段来进一步修正。一方面可以通过调用多个大型语言模型来生成 SQL 语句,通过多模型投票的策略提高查询的准确性和可靠性,也可以通过对单个模型多次生成具有不同温度参数(temperature)的查询结果,增加结果的多样性,然后通过一致性投票技术来选择最终的输出结果。
4. 文件解析
用户可能上传 PDF 文档、word 文档、FAQ 数据等结构化、半结构化的数据。对于 PDF,不仅是文字,还涉及表格、公式、图表等,都需要解析,这里涉及版面识别的工作。
识别区域后需要进一步处理。对于表格,需要使用图像处理 OCR 的方法,对表头、列、元素等进行定位和提取。
同时,我们需要对文档中的公式进行识别和解析,并建立索引,以帮助提升搜索结果的准确性。
5. 数据增强
对于解析后得到的文本数据,可以通过数据增强技术来帮助进一步提升搜索效果。Self-QA 这项工作针对于文档让大模型生成多个问题,然后将问题和原始文档给到大模型,让大模型生成答案,从而构造了
对于图片数据,可以使用 LLaVA 等模型通过图像描述(image captioning)技术,将图片转成文本描述进行索引召回。在索引的时候,需要在索引的 meta 字段记录图像和文本描述的链接关系,大模型输出时,可以通过证据溯源技术,把原始图像引用出来。
我们在实际业务中,经常会遇到一些 bad case,比如对文档进行总结摘要,这种场景使用传统的 RAG 技术无法得到很好的满足。我们使用了微软团队的 GraphRAG 工作,对文档进行增强建模。具体来说,对于 document 先切成 trunk,即 Text unit。对于每个 textUnit,进行 SPO 三元组抽取、claims 抽取、摘要生成等工作。然后构建知识图谱,并进行层次聚类,构建成子图、社区等层级,并向量化。在查询的时候,既可以使用全局搜索技术利用社区层级摘要来推理有关语料库的整体问题,也可以使用局部搜索技术通过扩展到其邻居和相关概念来推理特定实体的情况。
6. context selection
研究发现,如果给到大模型的文档或知识库本身就是不相关的,效果反而更差。因此,我们可以在检索后或者重排后将结果进行过滤。例如,通过小模型把不相关的结果过滤掉。如果是复杂的查询,可以将搜索结果组织成选择题形式,使用大模型做选择题的能力,过滤掉不相关的查询片段。
此外,也可以利用 small2big、调大长文本窗口甚至让大模型直接处理整篇文档等技术来提升效果。
7. 在推理时解决幻觉
(1)解码策略
大模型在推理过程中,前期生成的内容幻觉率不高,但在推理后期,由于解码的时候依赖于前面生成的 token,这个时候幻觉问题就会出现了,可以通过动态调整解码参数的方法来缓解。此外也有一些工程化的方案,比如基于 semantic routing 的技术,对于不同任务,设置不同的解码参数,也能达到不错的效果。
(2)Contrastive Decoding
对比解码技术,是通过比较不同模型(通常是一个小模型和一个大模型)的输出来提高解码过程的准确性的。在对比解码中,分析大模型和小模型在下一个 token 预测上的分布差异(DIFF),以此来评估输出的可靠性。在解码过程中,通过识别和剪除可能导致幻觉的路径来减少不真实的输出。需要对差异阈值进行细致的调整,以平衡减少幻觉和避免错误剪除有效输出之间的权衡。
这个工作,需要注意线上成本,即是否接受小模型在线上运行。
(3)Recitation-augmented generation
回忆增强技术是一个比较有意思的工作,类似于人类在回答问题时会先回忆自己已经学习到的知识,然后再进行回答。可以通过模拟人类回答问题的策略,通过提示工程技术,让大模型在回答之前先回忆内部知识,将知识显性化放到上下文中,然后再根据上下文信息进行回答,以提高其回答问题的准确性。
(4)Gen-Critic-Edit
自我批判或者知识编辑,是利用外部数据库、外部工具、大模型自我判断等方法,让大模型对生成结果进行反思和自我批评,然后再修正回答的一种技术。在修正阶段,可以使用对答案进行多次生成与一致性投票、训练一个额外的模型来对生成的回答进行打分以评估其质量、使用 RAG 技术从知识库中抽取相关证据并利用抽取的证据来指导模型进行进一步的生成等多种策略,来提高回答的准确性和可靠性。这里列举几个比较典型的工作。
①RARR
RARR 这个工作通过让大模型对原始 query 进行改写从而生成多个 query,然后对每个 query 调用搜索引擎,将搜索结果作为参考信息,用于与模型生成的回答进行比较。如果搜索结果与原始回答存在冲突,模型将根据这些信息进行进一步的生成和修正。如果搜索结果与原始回答一致,模型可能认为没有幻觉存在。
②FAVA
FAVA 工作需要训练一个改写模型,具体来说,通过数据增强的方式,比如插入噪声文本,修改文本等技术对原始文本进行破坏,将得到的错误文本和原始正确文本给到大模型进行训练,让大模型学会纠正能力。这种技术具备一定的成本,适合解决事实性问题,例如政治敏感场景,效果较好。
③some critics
在自我反思和自我批判模块,还有 CRITIC、self-refine 等一些优秀的工作,这里就不做过多介绍了,大家感兴趣可以自行查阅相关材料。
8. 模型增强技术
接下来是一些成本比较高的方法,包括预训练和微调对齐技术。
(1)预训练
当大型语言模型缺乏特定知识时,首要方法就是将这些知识通过预训练的方式训到大模型中。可以从外部数据源,如 Common Crawl 等数据集中提取相关知识,并将其纳入模型训练中。对于时效性较强的知识,可以通过时效性搜索引擎或数据抓取工具,实时或定期地更新模型的知识库,在模型的持续预训练阶段,不断引入新知识以保持模型知识的时效性和覆盖面。训练过程中需要仔细调整数据回放比例、学习率、数据配比等。
(2)微调和对齐
在微调阶段,如果微调数据集中包含了预训练模型中不存在的知识,大模型可能会生成不准确或虚假的回答,可以在预训练的退火阶段对微调数据集进行 next token prediction 的建模,然后通过 SFT 和 DPO 技术进行进一步微调对齐。
注意,直接使用人工标注的数据和搜索引擎结果作为正负例进行对齐训练可能存在问题。正例和负例的生成应尽量来自原有模型的输出,而不是外部来源,以保持数据的一致性和可靠性。建议训练一个打分模型来评估数据质量,帮助识别哪些数据是高质量的正例,哪些可能是低质量的负例。
三、360 可信大模型应用案例
1. 360 大模型安全解决方案
我们将上述 360 可信大模型解决方案应用在了大模型的内容安全检测业务和防护上,在中国信通院 AI Safety Benchmark 的 Q1 和 Q2 两个季度的安全性评估上,360 智脑的安全性蝉联第一名。
2. 360AI 搜索
同时,我们将上述解决方案应用在了 360AI 搜索产品中,可以看到 360AI 搜索产品可以很好解决这些 GPT4 解决不了的幻觉性问题。
3. 360AI 浏览器
360AI 浏览器的智阅产品,用户可以上传文档,根据文档做问答、做翻译、生成脑图,读者有兴趣可以去体验一下这套方案在真实的业务场景里面到底做得怎么样。
四、360 可信大模型的未来探索
我们的探索不是完成时,而是进行时。在真实生成环境中,随着业务、方案落地,我们遇到更多挑战。随着评测,我们发现 benchmark 跟真实场景的数据分布和幻觉一致性不完全相同。所以,我们需要自己在业务场景中构建自己的 benchmark,并且不断迭代,去进一步发现问题。
五、问答环节
Q1:RAG 工作流程中,二元分类器是怎么训练的?
A1:首先建立幻觉体系,根据不同幻觉类型,标注不同类别。数据主要来自于线上日志。通过使用各种自动化辅助标注工具进行离线数据挖掘和数据标注,并进行人工打标,最终形成了我们的训练数据,然后再进行分类模型的训练。
Q2:混合检索结果的重排序,有哪些方法?
A2:我们的方案涉及到了多种检索策略,包括关键词搜索、语义搜索、关系型数据库搜索、图搜索、工具调用等。对于每种检索策略,首先会调用自己的重排序方法,比如对于语义搜索,可以使用 bge-rerank 相关的模型。最终多条召回流的结果,可以使用策略重排或者通过数据标注训练一个重排模型,这里要结合自己的业务场景来进行调优。