rag输出了幻觉怎么办

首先,幻觉也分类型。
一个是事实性幻觉,就是LLM凭借自身能力回答问题,但是这个回答是编的,也可能有正确答案但是LLM输出错了。总之这是LLM自身原因。
另一个是忠实性幻觉,就是你要求LLM根据你给的材料给出答案,而LLM看着材料还答错了。有时候更傻,你都说了按照材料回答,而LLM就是要自己编一个。这也是不忠实的表现。
对于RAG,还有另一个幻觉,就是你给的材料不对,可能10条材料8条是无关的,LLM硬是把这些信息融到了答案里,这也是一种"幻觉"。答案确实忠诚,也是事实,但是就是和query对不上。这种错误就得依靠强大的检索和rerank功能护航了。

为了减少幻觉,要做这些事:

  1. 一开始就要选择强力的模型,且对数据做过预训练和微调,裸模型对问题的性能指标就要有一些。基础打好,再用RAG框架弥补性能。等你框架搭起来,再想微调LLM,那你这框架稳不稳就不知道了,所以一般LLM微调都是一个版本调一次。
  2. 前处理。你这个RAG要是只针对特定领域的文档,你就别放无关问题进来,在前面就意图识别滤掉那些怪问题,然后将问题规范化or拆分成子问题。
  3. 检索。你要是检索回来一堆和query无关的chunk,硬答肯定出幻觉,所以对齐很重要。ANCE这个方法能很好地在训练阶段加强对负样本的学习,其实也不难,正例chunk在你训练数据里,每次你找负例都找相似度和query最大的chunk且不是正例的就行。
  4. 检索门槛。你的每路召回都是有所谓的相似度分数的,如果你发现不相关文档和相关文档之间的相似度分数有一个明显的差距,那么你就完全可以靠设置一个门槛来滤除那些相似度过低的chunk。这得靠你对embedding模型的训练来做到,否则正负例分数拉不开差距。
  5. 检索的时候还能给每个chunk一个可信度标记,这个标记是靠用户反馈更新的。如果来了一批chunk,LLM输出的结果用户不满意,那么就给这一批chunk都降一点分数,这个分数是每路召回时自带的分数。
  6. 相关性检查。前处理也有漏网之鱼。你可以通过相关性检查,检查每个chunk是否与query相关,如果全不相关,直接导向联网搜索or日常聊天模块。
  7. 诚实性训练。相关性检查也会有漏网之鱼,LLM必须做诚实性训练,LLM没法从chunk中找到答案,就该说不知道答案而不是按照惯性硬答,硬答就出幻觉了。数据集也好搞,直接拿前面说的ANCE用到的数据集就行。
  8. 大海捞针训练。有些项目你可能要检索回来100个chunk,rerank再提取20个塞进LLM,这文本量也不少,很难说LLM能力够不够,所以要选择大海捞针性能好的LLM。
  9. 后处理:幻觉检测。LLM的answer符不符合query的要求?answer是否来自context?这俩问题得让幻觉检测的LLM分析一下,然后再得出是否幻觉的结论。好的RAG系统一定不需要幻觉检测,毕竟你看kimi和文心一言它们生成答案时从来没有回溯过。如果真的用上了幻觉检测模块,应该是这么个场景:本地部署7B模型作为生成模块,它的功能有限,产生幻觉的概率大,所以需要加幻觉检测模块,如果有幻觉了,则使用更大的模型or改进prompt重新生成。假如你本地部署个70B的,肯定不需要幻觉检测了,幻觉多说明你前面的工作就没做好。
  10. 对于answer不来自于context的问题,各厂商的解决办法是信息溯源,即训练LLM懂得在输出一段话的时候,如果它的内容来自于材料,那么就在结尾生成一个来源的特殊token,这加强了LLM基于context作答的能力。

另外记录一个比较有意义的发表。
lamini6月份发的论文Banishing LLM Hallucinations Requires Rethinking Generalization提出通过百万个memory块让LLM记住事实,可以有效控制幻觉。这个论文让关键的事实性信息计算后的loss近乎归0,而应对其他问题仍然会有一定的loss,以此让LLM兼顾了记住关键事实和具有一定创造力的能力,其原理就是对于关键信息提问的query会严格依靠cross attention找到100万个memory中对应的32个memory向量,然后融合进query的embedding,与self-attention并行计算,结果再与self-attention的结果加和。而非关键query会在找32个memory时找得驴唇不对马嘴(因为根本没对这些query训练过),所以loss仍然存在。这就是这篇论文所谓的“记住事实,也能创造”的原因。
这是一种解决rag幻觉的办法————对于关键信息,用一种特殊的微调LLM的方法使其关键信息的loss过拟合到0,而不过多影响非关键信息的loss。

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

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

相关文章

Scikit-learn提供了哪些机器学习算法以及如何使用Scikit-learn进行模型训练和评估

Scikit-learn库的使用 一、Scikit-learn提供的机器学习算法 Scikit-learn(通常简称为sklearn)是一个广泛使用的Python机器学习库,它提供了多种用于数据挖掘和数据分析的算法。Scikit-learn支持的机器学习算法可以大致分为以下几类&#xff…

[240726] Mistral AI 发布新一代旗舰模型 | Node.js 合并 TypeScript 文件执行提案

目录 Mistral AI 发布新一代旗舰模型:Mistral Large 2Node.js 合并 TypeScript 文件执行提案:--experimental-strip-types Mistral AI 发布新一代旗舰模型:Mistral Large 2 Mistral AI 宣布推出新一代旗舰模型 Mistral Large 2,该…

算法-----递归~~搜索~~回溯(宏观认识)

目录 1.什么是递归 1.1二叉树的遍历 1.2快速排序 1.3归并排序 2.为什么会用到递归 3.如何理解递归 4.如何写好一个递归 5.什么是搜索 5.1深度(dfs)优先遍历&优先搜索 5.2宽度(bfs)优先遍历&优先搜索 6.回溯 1.什…

Temu测评自养号如何做?三分钟带你入门!

环境系统 现在市场上很多的系统都是现成的或软件包,没有解决风控的能力,如果有需要建议大家自己学习一套技术,把技术掌握在自己手里,这样不会有依赖性 手机端环境:越狱后的ios指定版本手机可以一键新机的系统(参数调试)独享的家…

梧桐数据库:子查询优化技术

在数据库技术中,子查询是一个强大的工具,但不加优化的子查询可能会导致性能问题。优化子查询可以显著提升查询效率。以下是一些常见的子查询优化技术: 1. 使用连接(JOIN)替代子查询 1.1 基本原理 很多情况下&#x…

【NLP自然语言处理】为什么说BERT是bidirectional

首先,来看一下Transformer架构图: 我们知道,Bert设计时主要采用的是Transformer编码器部分,要论述Bert为啥是双向的,我想从编码器和解码器的注意力机制来阐述。 在看这篇博客前,需要对Transformer有一定的…

[C++] vector入门迭代器失效问题详解

文章目录 vector介绍**vector iterator 的使用** vector迭代器失效问题由扩容或改变数据引起的迭代器失效reserve的实现(野指针)insert实现(迭代器位置意义改变)insert修改后失效的迭代器 it迭代器失效 erase后的问题总结&#xf…

nextjs当后端使-读取excel文件

目前nextjs有种php的感觉,现在的需求是读取excel文件,入数据库,拆分出读取excel的代码如下: import { NextRequest } from "next/server"; import { join } from "path"; import { readFile } from "fs…

MyBatis-Plus的基本使用(一)

目录 前言 特性 MyBatis-Plus入门案例 常用注解 小结 前言 这篇文章主要来学习MyBatis-Plus这个非常强大的框架. 在学习MyBatis-Plus之前,需要有MyBatis的学习基础.因为MyBatis -Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变&#x…

spring —— 全注解实现事务管理器

全注解实现事务管理,就是取消 spring-config.xml 文件,而将配置信息在配置类中实现。 配置类: package com.spring.book;import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Bean; import org…

中英双语简单介绍:字典学习(Dictionary Learning)

中文版 字典学习(Dictionary Learning)是一种机器学习技术,用于从数据中学习一组基元(称为“字典”),以便能够用这些基元来表示数据。该方法特别适用于稀疏表示(Sparse Representation&#xf…

Prometheus通过注册中心nacos、Eureka 实现服务注册自动发现监控

Prometheus通过注册中心nacos、Eureka 实现服务注册自动发现监控 Prometheus通过Eureka 实现服务注册自动发现监控 使用 Prometheus 中的 Eureka (Service Discover)SD 来使用 Eureka REST API 来查询抓取目标。 Prometheus 将定期检查 REST 端点并为每个应用程序实例创建一个…

环境激活的艺术:Conda激活命令全解析

🌐 环境激活的艺术:Conda激活命令全解析 Conda作为Python编程生态中一个不可或缺的包管理器和环境管理器,为开发者提供了一个强大的工具来创建、管理并隔离不同的工作环境。本文将详细解释如何在Conda中使用conda activate命令来激活环境&am…

【Java Bean 映射器】通过 MapStruct 和 BeanUtils 拷贝对象的区别

目录 👋前言 👀一、环境准备 🌱二、拷贝工具使用 2.1 BeanUtils 使用 2.2 MapStruct 使用 💞️三、对比 📫四、章末 👋前言 小伙伴们大家好,最近在一些技术文章中看到了开发时经常接触的对…

面向对象·回顾;万类之祖object;抽象类Abstract。

回顾面向对象 类与对象 类--------(instance实例化对象)-------->对象 类图 调出你public方法–接口 访问控制符 常用private,public。 封装 可见性本类包不同包private✓✕✕不写dafalt(默认)✓✓✕protected✓✓继承✓public✓✓✓…

【工具类】Excel转图片

import com.spire.xls.Workbook; import com.spire.xls.Worksheet; public static void transExcelToImg(String excelPath, String imgPath){//加载Excel工作表Workbook wb new Workbook();wb.loadFromFile(excelPath);//获取工作表Worksheet sheet wb.getWorksheets().get(…

ChatGPT:为什么说 NoSQL 数据库天生支持分布式,数据冗余和数据分片等特性?

ChatGPT:为什么说 NoSQL 数据库天生支持分布式,数据冗余和数据分片等特性? NoSQL 数据库天生支持分布式、数据冗余和数据分片等特性,旨在提供可扩展的高可用高性能数据存储解决方案,有以下几个原因: 1. 分…

【计算机网络】RIP路由协议实验

一:实验目的 1:掌握在路由器上配置RIPv2。 二:实验仪器设备及软件 硬件:RCMS交换机、网线、内网网卡接口、Windows 2019操作系统的计算机等。具体为:三层交换机1台、路由器2台。 软件:wireshark软件、记…

软件架构文档:综合指南

软件开发团队为软件架构做出选择背后的原因常常被迷失。新团队成员常常对为什么开发人员选择 Ruby 或 React 这样的编程语言,或者为什么他们在一个平台而不是另一个平台上托管软件感到困惑。 出于这个目的以及更多目的,负责软件架构开发的团队可能希望记…

01-调试开发k8s

使用 Docker 构建 Kubernete 官方 release 是使用 Docker 容器构建的。要使用 Docker 构建 Kubernetes,请遵循以下说明: Requirements docker Key scripts 以下脚本位于 build/ 目录中。请注意,所有脚本都必须从 Kubernetes 根目录运行 build/run.…