绝区捌--将GPT幻觉的发生率从20%以上降低到2%以下

news/2024/9/13 23:49:45/ 标签: 机器学习, 学习, ai, 开发语言
aidu_pl">

总结:我们没有使用微调,而是结合使用提示链和预处理/后处理来将幻觉发生率降低一个数量级,但这确实需要对 OpenAI 进行 3-4 倍的调用。还有很大的改进空间!

使用 GPT 等大型语言模型面临的最大挑战之一是它们倾向于捏造信息。

这对于生成用于创意写作或头脑风暴会议的文本等用例来说可能没什么问题,但当输出用于客户支持等商业应用时,这可能是灾难性的。幻觉或虚假信息的产生在这些情况下尤其有害,并可能导致严重后果。

即使一次虚假信息的产生也可能损害公司的声誉、导致法律责任并损害客户的利益。

有几种方法可以解决这一挑战。

一种常用方法是使用微调来提高模型在特定领域数据集上的准确性。微调的问题在于,当你拥有多租户 SaaS 产品时,收集特定领域的数据集很困难,因为每个客户的用例和用户角色都略有不同。所以我们必须找到其他方法来解决这个问题。

以下是我们目前所做的工作

提示词链接(Prompt Chaining)

我们尝试的第一件事是使用提示链技术将复杂的提示分解成几个部分,并让 GPT 在每一步“检查其答案”。

例如,我们不是使用用户输入和注入的内容单独调用 GPT,而是首先要求 GPT 评估它是否可以回答问题并证明其响应的合理性。我们目前有 3 个步骤——预处理步骤、评估步骤和响应步骤。

以下是我们在评估步骤中使用的提示示例。它只是要求 GPT 回答它是否可以根据提供的内容回答问题。"""<|im_start|>system You found the following content by searching through documentation. Use only this content to construct your response. {content}<|im_end|>
<|im_start|>user First, determine if the content found is sufficient to resolve the issue. Second, respond with a JSON in the format:
{
"content_contains_answer": boolean, // true or false. Whether the information in the content is sufficient to resolve the issue.
"justification": string // Why you believe the content you found is or is not sufficient to resolve the issue.
}
The inquiry: {inquiry}<|im_end|><|im_start|>assistant {
"content_contains_answer":<|im_end|>"""

请注意,我们要求 GPT 以 JSON 格式返回答案,并使用预期结构为助手的答案提供种子。这确保我们能够解析响应,并且几乎 100% 的时间都有效。

我们还注意到,content_contains_answer即使我们不使用它做任何事情,只需要求模型提供理由就可以提高其预测的准确性。你只需要叫出 GPT 的胡说八道!

这种方法将幻觉的发生率从20%降低到了5%。


后期处理

接下来帮助我们将效率从 5% 降至 2% 的是对 GPT 的输出进行后处理。这有几个步骤:

  1. 检查 token 的 e^(logprob) 是否true低于 90%。如果是,我们重新运行评估提示并强制content_contains_answer为假。我们发现这可以减少误报,而不会对误报产生太大影响。
  2. 如果content_contains_answer为假,我们将使用返回的理由并再次调用 GPT API 来重新措辞理由以将其定位到用户。这减少了我们最终输出出现奇怪措辞(如“用户应该……”)的可能性。这不完全是幻觉,也不是最佳体验。

预处理

这是我们最近添加的步骤,使我们的幻觉率低于 2%。我们做的第一件事是让 GPT 对用户查询的意图进行分类。根据意图,我们将在评估和响应步骤中使用不同的提示。

我们还在尝试对用户输入进行额外的预处理,使其更有可能在搜索步骤中找到相关结果。这可以通过从用户的查询中提取实体并在稀疏嵌入上以更高的权重运行向量搜索来实现。这有助于解决技术性问题并涉及特定标记组合(如) ,因为对于这些情况,关键字搜索比语义搜索更有用。这一切都是通过 Pinecone 的新混合搜索功能keras.save_model实现的。

最后的想法

最后一条可能有用的提示是将内容包装在 <Content></Content> 标签中。这有助于 GPT 理解不同来源之间的差异,甚至返回稍后可以str.replace()使用链接的占位符(例如 Content1)。您还可以对注入提示的任何其他数据执行此操作。

总体而言,我们发现,结合使用提示链、预处理和后处理可以很好地降低幻觉风险并提高 GPT 的准确性。缺点是它需要更多的 API 调用,但随着最近价格下降 90%,这现在非常可行。


欢迎你分享你的作品到我们的平台上:www.shxcj.com 或者 www.2img.ai 让更多的人看到你的才华。

创作不易,觉得不错的话,点个赞吧!!!




http://www.ppmy.cn/news/1475495.html

相关文章

关于maven工程编译的一些问题

首先抛问题&#xff0c;在maven clean的时候出现下面的错误&#xff1a; 错误源代码如下&#xff1a; [ERROR] The build could not read 1 project -> [Help 1] [ERROR] [ERROR] The project com.**:**:2.0.0 (D:\JAVA\**-policy\pom.xml) has 1 error [ERROR] N…

音视频开发—FFmpeg处理流数据的基本概念详解

文章目录 多媒体文件的基本概念相关重要的结构体操作数据流的基本步骤1.解复用&#xff08;Demuxing&#xff09;2.获取流&#xff08;Stream&#xff09;3. 读取数据包&#xff08;Packet&#xff09;4. 释放资源&#xff08;Free Resources&#xff09;完整示例 多媒体文件的…

【自动驾驶/机器人面试C++八股精选】专栏介绍

目录 一、自动驾驶和机器人技术发展前景二、C在自动驾驶和机器人领域的地位三、专栏介绍四、订阅需知 一、自动驾驶和机器人技术发展前景 随着人工智能、机器学习、传感器技术和计算能力的进步&#xff0c;自动驾驶和机器人的技术水平不断提升&#xff0c;使得它们更加智能、可…

js项目生产环境中移除 console

1、terser-webpack-plugin webpack 构建的项目中安装使用 安装&#xff1a; npm install terser-webpack-plugin --save-dev 配置 在webpack.config.js文件中 new TerserPlugin({terserOptions: {output: {comments: false, // 去除注释},warnings: false, // 去除黄色警告,co…

Python酷库之旅-第三方库Pandas(021)

目录 一、用法精讲 52、pandas.from_dummies函数 52-1、语法 52-2、参数 52-3、功能 52-4、返回值 52-5、说明 52-6、用法 52-6-1、数据准备 52-6-2、代码示例 52-6-3、结果输出 53、pandas.factorize函数 53-1、语法 53-2、参数 53-3、功能 53-4、返回值 53-…

在InternStudio上创建一台GPU服务器

填写配置 创建完成 ssh连接&#xff0c;并测试常用指令 查看开发机信息 查看gpu信息 创建conda环境 跑个test

康谋分享 | 自动驾驶联合仿真——功能模型接口FMI(三)

在之前的两篇文章中&#xff08;文末往期回顾中可查看&#xff09;&#xff0c;我们主要介绍了功能模型接口FMI的主要组成部分和一些使用场景&#xff0c;今天就以康谋自动驾驶仿真软件aiSim为例&#xff0c;来展示一下如何建立一个FMU并实现基于UDP和FMI联合仿真&#xff08;c…

GitHub+Picgo图片上传

Picgo下载&#xff0c;修改安装路径&#xff0c;其他一路下一步&#xff01; 地址 注册GitHub&#xff0c;注册过程不详细展开&#xff0c;不会的百度一下 地址 新建GitHub仓库存放图片 生成Token令牌 点击头像&#xff0c;点击Settings 滑到最后 过期时间&#xff1a;No expi…

MyBatisPlus实现增删改查

文章目录 MyBatisPlus实现增删改查基本操作分页查询配置分页插件 MyBatisPlus实现增删改查 实体类GkUser package com.geekmice.springbootselfexercise.entity;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField;…

uniapp 初始学习1

uni-app代码基本包括js,vue,css.在app端支持原生渲染nvue&#xff0c;可编译的kotlin和swift 掌握js就可以进行不同应用的开发 页面文件遵循 Vue 单文件组件 (SFC) 规范&#xff0c;即每个页面是一个.vue文件 .vue文件是一个自定义的文件类型&#xff0c;用类HTML语法描述一…

2024年中国网络安全市场全景图 -百度下载

是自2018年开始&#xff0c;数说安全发布的第七版全景图。 企业数智化转型加速已经促使网络安全成为全社会关注的焦点&#xff0c;在网络安全边界不断扩大&#xff0c;新理念、新产品、新技术不断融合发展的进程中&#xff0c;数说安全始终秉承科学的方法论&#xff0c;以遵循…

02:项目二:感应开关盖垃圾桶

感应开关盖垃圾桶 1、PWM开发SG901.1、怎样通过C51单片机输出PWM波&#xff1f;1.2、通过定时器输出PWM波来控制SG90 2、超声波测距模块的使用3、感应开关盖垃圾桶 需要材料&#xff1a; 1、SG90舵机模块 2、HC-SR04超声波模块 3、震动传感器 4、蜂鸣器 5、若干杜邦线 1、PWM开…

【系统架构设计】操作系统(一)

操作系统&#xff08;一&#xff09; 操作系统的类型和结构操作系统基本原理进程管理进程三态模型挂起状态进程互斥 / 进程同步前趋图进程调度死锁 存储管理设备管理文件管理作业管理 操作系统原理的关键在于“一个观点、两条线索”&#xff1a;一个观点是以资源管理的观点来定…

SpringBoot实用篇

一、运维实用篇 1.工程的打包与运行 ①对SpringBoot项目打包&#xff08;执行Maven构建指令package&#xff09; ②运行项目&#xff08;执行启动指令&#xff09; java -jar 工程打包的文件名.jar jar支持命令行启动需要依赖maven插件支持&#xff0c;请确认打包时是否具有…

集成excel工具:自定义导入回调监听器、自定义类型转换器、web中的读

文章目录 I 封装导入导出1.1 定义工具类1.2 自定义读回调监听器: 回调业务层处理导入数据1.3 定义文件导入上下文1.4 定义回调协议II 自定义转换器2.1 自定义枚举转换器2.2 日期转换器2.3 时间、日期、月份之间的互转2.4 LongConverterIII web中的读3.1 使用默认回调监听器3.2…

Python爬虫技术从去哪儿网获取旅游数据,对攻略进行可视化分析,提供全面的旅游攻略和个性化的出行建议

背景 随着信息技术的快速发展和互联网的普及&#xff0c;旅游行业也迎来了数字化和智能化的变革。去哪儿网作为中国领先的在线旅游平台之一&#xff0c;提供了丰富的旅游产品和服务&#xff0c;涵盖了机票、酒店、旅游度假等各个方面。用户通过去哪儿网可以方便地查询、预订和…

Adobe Photoshop 2024(Beta) v 25.11(2675) 旭日 免安装版

Adobe Photoshop 2024(Beta) v 25.11(2675) 旭日 免安装版&#xff0c;直接下载解压即可使用&#xff0c;感兴趣的同学可以下载体验。 文件下载:Photoshop 2024(Beta) .zip 安装报错解决方法 1、由于找不到msvcp140 dll无法继续执行 一、重新注册 msvcp140.dll 运行库文件&…

语言模型演进:从NLP到LLM的跨越之旅

在人工智能的浩瀚宇宙中&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是一个充满挑战和机遇的领域。随着技术的发展&#xff0c;我们见证了从传统规则到统计机器学习&#xff0c;再到深度学习和预训练模型的演进。如今&#xff0c;我们站在了大型语言模型&#xff…

【持续集成_06课_Jenkins高级pipeline应用】

一、创建项目选择pipeline的风格 它主要是以脚本&#xff08;它自己的语言&#xff09;的方式进行运行&#xff0c;一般由运维去做的事情&#xff0c;作为测试而言。了解即可。 --- 体现形式全部通过脚本去实现&#xff1a;执行之前&#xff08;拉取代码&#xff09;执行&…

C++ | Leetcode C++题解之第232题用栈实现队列

题目&#xff1a; 题解&#xff1a; class MyQueue { private:stack<int> inStack, outStack;void in2out() {while (!inStack.empty()) {outStack.push(inStack.top());inStack.pop();}}public:MyQueue() {}void push(int x) {inStack.push(x);}int pop() {if (outStac…