缓解大模型幻觉问题的解决方案

本文记录大模型幻觉问题的相关内容。
参考:Mitigating LLM Hallucinations: a multifaceted approach
地址:https://amatriain.net/blog/hallucinations

解决LLM幻觉的不同方式
(图:解决大模型幻觉的不同方式)

什么是幻觉?

幻觉(Hallucination)指生成内容与源数据不一致或无意义,可分为内生幻觉和外在幻觉(参考Paper:Survey of Hallucination in Natural Language Generation)。

  • 内在幻觉:生成内容与源数据相矛盾,引入了事实错误或逻辑不一致的情况。
  • 外在幻觉:生成内容与源数据没有矛盾,但也并不能根据源数据进行验证,添加了可能被视为推测性或无法证实的元素。

为什么产生幻觉?

LLM通过预训练来预测下一个token,没有正确/错误的概念,仅仅是基于概率来生成文本。虽然这导致了一些意外的推理能力,但这仅仅是这种基于概率的逐标记推理的结果。指令微调和RLHF确实能让模型更偏向事实,但并没有改变LLM的机制及缺陷。

LLM已经在整个互联网、图书、问答和百科等许多数据集上进行了训练。它们在训练集中有正确和错误的知识。模型回答偏向于它们见过最多的内容。比如提问一个医学问题,而且问法跟某个帖子差不多,那可能就会得到跟训练集里那个帖子大致一样的答案。

在一篇最近的题为 Sources of Hallucination by Large Language Models on Inference Tasks 的论文中,作者展示了LLM训练数据集的两个方面导致了幻觉的产生:真实性先验(veracity prior)和相对频率启发式(relative frequency heuristic)。

如何评测是否有幻觉?

幻觉评测的五个步骤

  1. 准备基准数据:也就是给出大模型生成的参考答案;
  2. 准备测试集:包括随机通用测试集 + 对抗性攻击样本;
  3. 提取断言:可以用手动、规则、机器学习等方式;
  4. 验证:确保大模型生成的东西跟基准数据对齐;
  5. 评价指标:可以用基准错误率(Grounding Defect Rate)评估,即跟基准答案不一致的数量除以测试集总数量。

幻觉的常用度量标准和方法

包括统计学方法、基于模型的方法、基于规则的方法、人类评价、。

  • 统计学方法:ROUGE、BLUE 计算文本相似性;PARENT、PARENT-T、Knowledge F1 评测结构化数据。局限性:主要关注内在幻觉,无法捕捉句法和语义的细微差异。
  • 基于模型的方法:用IE模型抽“主体-关系-对象” 然后做验证。
    • QA-based Metrics:认为对于同一个问题,如果上下文与训练数据一致,就会生成类似答案。因此计算生成内容和训练集的一致性。(参见:Evaluating Factual Consistency in Knowledge-Grounded Dialogues via Question Generation and Question Answering
    • NLI-based Metrics:用自然语言推理(NLI)数据集训模型,计算生成的“假设”在给定的“前提”下是真、假、不确定。(参见:Evaluating Groundedness in Dialogue Systems: The BEGIN Benchmark
    • Faithfulness Classification Metrics:用针对特定任务的数据集训个忠诚度分类的模型,来改进NLI模型的性能。(参见:Rome was built in 1776: A Case Study on Factual Correctness in Knowledge-Grounded Response Generation
  • 人工评价方法:一是对幻觉程度打分;二是对比生成答案和参考答案哪个好。(人工评价很重要,但同时也要找红队攻击模型,参考:“Red Teaming Language Models with Language Models”)
  • FActScore:可用于人工+模型的评估。该指标将LLM生成结果分解为“原子事实(atomic facts)”。最终得分是每个原子事实准确性的总和,每个原子事实都被赋予相等的权重。准确性是一个二进制数字,简单地表示原子事实是否由来源支持。作者实施了不同的自动化策略,利用LLM来估计这个指标。
    在这里插入图片描述

如何缓解大模型幻觉?

本节探讨各种幻觉缓解策略。

产品侧

产品设计的时候去避免大模型生成幻觉内容,比如在生成书面内容时关注观点类文章,而不是事实类文章,有助于降低幻觉。

  • 用户编辑:让用户编辑大模型生成的内容
  • 用户责任:告诉用户对生成内容负责
  • 引文参考:给用户展示引用的内容
  • 可选模式:比如精准模式(以计算成本为代价)等
  • 用户反馈:收集用户反馈(赞踩)用于迭代模型
  • 限制输出和轮数:更长更复杂的输出更容易幻觉
  • 结构化输入输出:预置一些结构化模版

数据侧

维护一个动态数据库专门记录各种幻觉,用于回归测试。而且要注意数据隐私安全。

模型侧

  • 换模型:更大参数量的模型更不容易幻觉
  • 调参数:temperature越小,模型更加接近高概率的token,越不容易幻觉
  • RLHF:能降低尤其是领域微调过的模型的幻觉
  • 指令微调:针对需求的任务数据做微调

Prompt Engineering

通过 Meta prompt 引导大模型 “不该做什么” 有助于降低幻觉。

控制幻觉的一般思路

  • 简化复杂任务,将任务分解并描述清楚
  • 内置一些 meta prompt,比如“不要捏造事实”等话术
  • Few-Shot Learning,添加几个例子
  • 对模型生成结果进行后处理

调整 MetaPrompts

  • 强调的语气:把需要强调的内容全大写或者突出强调
  • 更多上下文:提供更多背景知识
  • 细化输出:重新评估初始输出结果并调整
  • 引用:让模型证实自己的观点
  • 转化任务:让模型做摘要总结而不是做问答
  • 选择性处理任务:有些任务必须强依赖事实回答
  • 反复强调关键点:prompt的最后多强调几遍关键点
  • 回顾输入内容:要求模型回顾重要的输入细节
  • 使用算法过滤:筛选和优先考虑相关的信息

思维链(Chain of Thought)

思维链由 “Chain-of-Thought Prompting Elicits Reasoning in Large Language Models” 提出,因为LLM用来预测下一个token的概率而不是推理,所以指定模型生成推理步骤可以让模型更接近推理。
在这里插入图片描述

RAG:检索增强的生成(Retrieval-Augmented Generation)

在这里插入图片描述
先检索,后生成。但RAG会过度依赖空或错误的检索结果导致幻觉,因此注意事项:

  • 空结果:对于空结果可以回复 “很抱歉,我们没有关于此主题的足够信息。你能换个说法吗?” 或者重新检索;
  • 模棱两可的结果:比如问“李华是谁” 这种可能有多重结果的问题时,可以引导用户进一步描述想问干嘛的李华;
  • 错误结果:作为外部知识模型很难鉴别,需要提高检索组件的准确性。

高级 Prompt Engineering 方法

  • Self-consistency:来自论文 “SelfCheckGPT: Zero-Resource Black-Box Hallucination Detection for Generative Large Language Models”,思想是让模型针对同一 prompt 生成多个回答,然后用大模型本身去判断这些回答是否一致,或者结合 BERT-Score、N-gram 等计算。
    在这里插入图片描述
  • Reason and act (ReAct):Google 在 “ReAct: Synergizing Reasoning and Acting in Language Models” 提出的用于缓解 CoT 幻觉的方法,一步步生成 Thought 和 Action,有点像 Agent。
    在这里插入图片描述
  • Reflection(反思):直接问大模型对之前回答的内容是否笃定。还可以把反思过程作为长期记忆存起来强化反思过程。在这里插入图片描述
  • Dialog-Enabled Resolving Agents (DERA):Decider生成答案,让Researcher跟Decider这个Agent一起讨论这个答案,然后让Decider根据他俩的讨论结果调整答案。
    在这里插入图片描述
  • Chain-of-Verification (COVE):Meta最近提出的利用LLM生成多个回复并进行自我验证的变体。如下图所示,模型首先(i)起草一个初始回复;然后(ii)生成验证问题;(iii)独立回答这些验证问题,以避免答案受到其他回复的影响;(iv)生成最终经过验证的回复。
    在这里插入图片描述

总结

减轻幻觉需要多种手段综合应用,但完全消除难度非常大。Yann Lecun 认为,如果不完全重新设计底层模型,就无法解决这个问题(然而 OpenAI 首席科学家 Ilya Sutskever 并不同意)


参考资料:
[1] Mitigating LLM Hallucinations: a multifaceted approach:本文主体内容。
[2] 如何解决LLM大语言模型的幻觉问题?- 知乎:收集模型回答错误的问题,然后训模型的拒答能力。
[3] 大模型幻觉评估方法——忠实性(Faithfulness)与事实性(Factuality)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/173995.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见面试题-MySQL专栏(一)

为什么 mysql 删了行记录,反而磁盘空间没有减少? 答: 在 mysql 中,当使用 delete 删除数据时,mysql 会将删除的数据标记为已删除,但是并不去磁盘上真正进行删除,而是在需要使用这片存储空间时&…

Linux之线程池

线程池 线程池概念线程池的应用场景线程池实现原理单例模式下线程池实现STL、智能指针和线程安全其他常见的各种锁 线程池概念 线程池:一种线程使用模式。 线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待…

如何在Node.js中使用环境变量或命令行参数来设置HTTP爬虫ip?

首先,定义问题:在 Node.js 应用程序中,我们可以通过环境变量或命令行参数来设置HTTP爬虫ip,以便在发送请求时使用这些HTTP爬虫ip。 亲身经验:我曾经需要为一个项目设置HTTP爬虫ip,以便在发送请求时使用这些…

EtherNet Ip工业RFID读写器与欧姆龙PLC 配置示例说明

一、准备阶段 POE交换机欧姆龙PLC 支持EtherNet Ip协议CX-Programmer 9.5配置软件 二、配置读卡器 1、打开软件 2、选择网卡,如果多网卡的电脑请注意对应所接的网卡,网卡名一般为“Network adapter Realtek PCIe GBE Family” 3、点击“选择网卡”&…

Node学习笔记之user用户API模块

1、获取用户的基本信息 步骤 获取登录会话存储的session中用户的id判断是否获取到id根据用户id查询数据库中的个人信息检查指定 id 的用户是否存在将密码设置为空将数据返回给前端 // 获取用户信息数据 exports.userinfo (req, res) > {(async function () {// 1. 获取…

BUUCTF rar 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 这个是一个rar文件,里面好像隐藏着什么秘密,但是压缩包被加密了,毫无保留的告诉你,rar的密码是4位纯数字。 密文: 下载附件,解压得到一个rar压…

MySQL---JDBC编程

文章目录 什么是JDBC?JDBC的工作原理JDBC的使用添加驱动创建数据源DataSource创建数据库连接Connection创建操作命令Statement执行SQL指令释放资源 通过JDBC演示CRUD新增查询(需要增加一步 遍历结果集合的操作)修改删除 什么是JDBC&#xff1…

Qt界面实现中英文切换

要实现的效果,是下拉列表切换中文和English实现按钮文本中英文内容切换。 实现步骤: 1.在VS中鼠标对Translation Files文件右击,选择“添加”--->“模块”. 在弹窗的窗口中选择“Qt”--->“Qt Translation File”。 添加Translation_e…

BIOS MBR UEFI GPT详解

先来看下名词 启动方式: BIOS:Basic Input Output System,中文名称"基本输入输出系统"。 UEFI:Unified Extensible Firmware Interface,中文名称"统一的可扩展固件接口"。 Legacy:…

DAY38 动态规划 + 509. 斐波那契数 + 70. 爬楼梯 + 746. 使用最小花费爬楼梯

动态规划理论 动态规划,Dynamic Programming, DP, 如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导…

【Git】HEAD detached from xxx 问题及解决方案

问题背景 最近用git的时候遇到了一个问题,场景是这样的。 我有一个分支main,其中有两个commit A和B,A是最新commit,B是历史commit。我先切到B看了看之前的代码,然后切到A,并进行了一些代码修改&#xff0…

AD教程(一)工程组成及创建

AD教程(一)工程组成及创建 工程组成 原理图库 绘制电阻模型、芯片模型、电容模型等,即将元件模型绘制出来。 原理图 将绘制的原件模型放置到原理图中,然后再添加连接的导线、网络标号。器件和器件之间的连接关系,在原…

SDL事件处理以及线程使用(2)

事件使用 #include <stdio.h> #include <SDL.h>#define FF_QUIT_EVENT (SDL_USEREVENT 1) // 定义自定义事件#undef main int main() {SDL_Window* pWindow NULL;SDL_Init(SDL_INIT_VIDEO);// 创建窗口pWindow SDL_CreateWindow("Event Test Title&…

【方法】如何给PDF文件添加“打开密码”?

PDF文件可以在线浏览&#xff0c;但如果想要给文件添加“打开密码”&#xff0c;就需要用到软件工具&#xff0c;下面小编分享两种常用的工具&#xff0c;小伙伴们可以根据需要选择。 工具一&#xff1a;PDF编辑器 PDF阅读器一般是没有设置密码的功能模块&#xff0c;PDF编辑器…

深入浅出排序算法之希尔排序

目录 1. 原理 2. 代码实现 3. 性能分析 1. 原理 希尔排序法又称缩小增量法。希尔排序法的基本思想是&#xff1a;先选定一个整数&#xff0c;把待排序文件中所有记录分成个组&#xff0c;所有距离为的记录分在同一组内&#xff0c;并对每一组内的记录进行排序。然后&#xf…

7.scala方法初探

概述 在 scala 中&#xff0c;方法定义在内中&#xff0c;这点类似于 java &#xff0c;此文说明如何定义方法&#xff0c;及方法一些 用法 相关链接 阅读之前&#xff0c;可以先行浏览一下 官方文档 scala相关文章 定义一个参数的方法 这个例子定义了一个名为 double 方法&a…

【Linux】权限完结

个人主页点击直达&#xff1a;小白不是程序媛 系列专栏&#xff1a;Linux被操作记 目录 前言 chown指令 chgrp指令 文件类型 file指令 目录的权限 粘滞位 umask指令 权限总结 前言 上篇文章我们说到对于一个文件所属者和所属组都是同一个人时&#xff0c;使用所属者身…

Linux(Centos7)操作记录

1、nginx -t #Nginx配置文件检查 上述截图代表检查没问题 上述截图检查配置文件配置错误&#xff0c;并提示错误文件位置 2、systemctl restart nginx #重启Nginx 重启Nginx失败 3、systemctl status nginx.service #查看Nginx服务状态 80端口被占导致服务启动失败 4、n…

DVWA-SQL Injection SQL注入

概念 SQL注入&#xff0c;是指将特殊构造的恶意SQL语句插入Web表单的输入或页面请求的查询字符串中&#xff0c;从而欺骗后端Web服务器以执行该恶意SQL语句。 成功的 SQL 注入漏洞可以从数据库中读取敏感数据、修改数据库数据&#xff08;插入/更新/删除&#xff09;、对数据…

Vue实现首页导航和左侧菜单,介绍mock.js并实现登录注册间的跳转,实现左侧栏折叠效果,优化Main.vue组件,使用mock.js生成随机响应数据

目录 1. mockjs 1.1 mockjs介绍 1.2 mockjs使用步骤 1.2.1 安装mockjs依赖 1.2.2 在项目中引入mockjs 1.2.3 创建目录和文件 1.2.4 为每个组件准备模拟数据 1.2.5 测试 1.2.6 前端调试 1.2.7 mockjs生成随机响应数据 1.2.8 根据不同响应&#xff0c;给出不同提示 2…