检索增强生成RAG系列2--提高RAG准确度的关键点

上一章讲到了RAG的基本流程,但是如果只是完成一个基本流程,想要在商业上使用还是不行,因为正常商业上的使用其准确度至少有个90%甚至更高。那么如何提高RAG的准确度,那么需要看看RAG有哪些关键点。

目录

  • 1 RAG结构图
  • 2 文档处理
  • 3 问题优化
  • 4 总结

1 RAG结构图

在上一章中展现了一个最基本的RAG流程图,其实主要是想让你了解RAG的工作模式以及最基本包含的组件,下面的图让你更为细节的了解一个RAG架构的可能性:

在这里插入图片描述

从上图可以看出更为详细的RAG过程中的步骤,我们可以总结为2个大方面对RAG的准确性提高有着举足轻重的影响,后续也会根据这2个大的方面改进做一些详细代码实现,本章先通过简单介绍每个模块作用和如何对RAG产生影响的。

  • 文档处理:包括文档解析、文档分块、文档embedding、向量数据库等
  • 问题优化:通过改写问题、增强问题、分解问题、重排等手段,使得问题更匹配知识库

下面就通过这2个大方面来分别说明为什么这些内容是提高RAG准确度的关键点。

2 文档处理

我们能够从上图看到,文档处理包括很重要的3个部分:文档解析、文档分块、文档embedding。

  • 文档解析:我们需要查询的文档可能包括pdf、Excel、图片等等各种各样的内容,而这些内容中包括很多不同的格式,比如pdf中可能还包括表格和图片,因此选择哪些文档解析工具非常重要。目前市面上有很多工具,如PyPDF、LlamaParse、Firecrawl等等。关于使用哪些解析工具解析哪些文档,这方面在系列3中详细讲解。
  • 文档分块:之所以要分块是因为2个原因,第一个是因为大模型有token长度限制,第二是过长的token其实对于大模型的理解和推理会变慢或者不准确。因此需要适当的对文档进行分块,有可能分块会将原先有关联的一句话给分隔开了,这样对RAG的检索结果就会不准确甚至找不到答案。因此如何分块或者该分块多大才是最优解,这些也在系列3中详细讲解,这里只是说明文档的分块对于RAG的准确度也是影响较大的。
  • 文档embedding:文档最终是向量化后存入向量数据库,然后通过query方式查询问题与答案的相似度来获取top_n的数据,再交于大模型去返回最终答案。这里要注意的是embedding也是一个可训练的模型或者已经训练完成的模型。那么有可能embedding模型做得不好,导致查询的结果与答案不一致。那么如何选对一个embedding模型也是对于RAG的准确度至关重要,这些也在系列3中详细讲解。
  • 向量数据库:向量数据库需要存储向量化后的数据,然后通过问题查询相似度,得到最终相关的几个答案,扔给大模型进行回答。那么向量数据库的存储和相似度查询就可能会影响RAG最终的结果,因此,我们选择哪一种向量数据库,对于我们来说还是比较重要的。

3 问题优化

我们能够从上图看到,问题优化包括改写、增强、分解等措施。那么先说一下为什么要对问题优化。其实很好理解,你在使用大模型的时候,经常使用优化prompt的方式让大模型能够返回你想要的答案,那么对于问题优化也是同样的道理,可能造成的原因是用户表达不准确、问题和文档不在一个语义空间或者可能问题需要拆解多步等等。那么对于RAG来说,对于问题优化包括以下内容:

  • 问题改写:可能提问的不是很准确,让大模型或者其它技术给你的问题进行改写,这样能够提高问题的准确性,使得查询结果相关性更高
  • 问题增强:增强可能比较难以理解,其实就是通过某些技术让模型更能理解你这句话,比如使用假设性回答去找答案或者通过抽象问题去检索等等
  • 问题分解:很明显是对于需要针对多步解决的问题,这时候对问题进行分解有利于得到更准确的答案,比如将问题分解为更小更简单的问题或者利用生成和检索不断交替等方法去优化问题
  • 重排:前面提到过可能根据改写、增强等方式对问题进行优化,有可能是生成多个不同角度问题,再做多次查询,获得最终查询结果。但是最终的查询结果需要进行一个相关性的排序,因为有可能数据过多,需要过滤掉一些,也有可能获取的数据相关性不一。因此对于返回结果进行重排也是能够提高RAG的准确度

以上是对于问题优化为什么能够提高RAG的准确度进行简单的概述,优化手段将在本系列4中详细讲解。

4 总结

本章中我们通过更为详细的描述RAG整体架构流程图,并一一分析了里面对于RAG准确度的影响。其实主要包括2部分:文档处理问题优化。接下来几章可能真的这些部分做出详细的一些优化策略的解决方案,同时也会总结一些实战经验。

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

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

相关文章

【PyQt5】一文向您详细介绍 QVBoxLayout() 的作用

【PyQt5】一文向您详细介绍 QVBoxLayout() 的作用 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本硕&a…

前端面试题(基础篇十一)

一、DOCTYPE 的作用是什么&#xff1f; <!DOCTYPE> 声明一般位于文档的第一行&#xff0c;它的作用主要是告诉浏览器以什么样的模式来解析文档。一般指定了之后会以标准模式来进行文档解析&#xff0c;否则就以兼容模式进行解析。在标准模式下&#xff0c;浏览器的解析规…

速盾:ddos高防ip是什么?

DDoS攻击是一种通过向目标网络发送大量的无效请求&#xff0c;以致其无法正常运作的攻击方式。这种攻击方式广泛应用于各种网络服务&#xff0c;如网站、服务器、游戏等。由于DDoS攻击可以导致被攻击的网络瘫痪&#xff0c;因此许多组织和个人都开始关注网络安全&#xff0c;并…

什么是C++模块化系统?C++20的模块化系统。

C20引入的模块化系统是一种新的代码组织和编译机制&#xff0c;它旨在替代传统的头文件机制&#xff0c;提供更好的代码组织、更快的编译速度和更强的封装性。模块化系统的主要目标包括&#xff1a; 减少编译时间&#xff1a;通过减少冗余的头文件解析和宏定义传播&#xff0c…

Nest使用multer实现文件上传,并实现大文件分片上传(下)

上节我们学了在 Express 里用 multer 包处理 multipart/form-data 类型的请求中的 file。 单个、多个字段的单个、多个 file 都能轻松取出来。 接下来我们就来学习一下在Nest 里使用multer。 一,Nest如何使用multer实现文件上传 首先我们先创建一个Nest项目&#xff1a; nest…

性能测试4【搬代码】

性能测试4与性能测试3最后的 三、性能瓶颈分析和性能调优 (1)基准测试 (2)负载测试 (3)压力测试 (4)浪涌测试 (5)容量测试 有关&#xff0c;需要结合看 性能瓶颈分析和性能调优 (1)基准测试 一般是单接口&#xff08;单交易&#xff09;&#xff1a;使用一个用持续压测1min以…

【Linux系列】Fedora40安装VMware Workstation Pro报错

问题描述 由于Fedora 40使用的Linux内核是6.9,导致安装VMware Workstation Pro 时&#xff0c;安装依赖无法成功&#xff0c;具体报错如下 ..................CC [M] /tmp/modconfig-a8Fcf5/vmnet-only/smac.oCC [M] /tmp/modconfig-a8Fcf5/vmnet-only/vnetEvent.oCC [M] …

液体粒子计数器的原理及常见型号选择 lighthouse代理商北京中邦兴业

​液体颗粒计数用于测量液体样品中颗粒的大小和分布。通过用激光二极管照射液体样品并检测散射光来测量颗粒分布和尺寸。散射光的性质与粒子大小的大小有关。液体颗粒计数器可用于批量取样或在线&#xff08;连续监测&#xff09;应用&#xff0c;如水处理厂&#xff0c;或用于…

【封装】Unity编辑器模式GUID加载资源

介绍 在编辑器模式下通过GUID获取工程目录下的指定资源的接口工具封装 工具原理 借助AssetDatabaseAPI FindAssets : 获取 GUID GUIDToAssetPath : 通过GUID获取路径LoadAssetAtPath<T>: 通过路径加载资源 代码&#xff1a; public static class GetAssetUtil {pub…

ADC位数、增益调制与参考电压

位数&#xff1a;12bit、10bit、8bit 一般就是对应的ADC值分别为&#xff1a;4095、1023、255&#xff0c;也就选用对应位数时ADC的最大值。 增益的作用 增益设置用于放大或缩小输入信号&#xff0c;使其适配到ADC的输入范围。增益设置可以通过配置SAADC的通道配置寄存器来实…

Vscode lanuch.json

Intro 使用launch.json 能够方便的运行需要传很多参数的代码文件 如下&#xff1a; import math import argparse # 1、导入argpase包def parse_args():parse argparse.ArgumentParser(descriptionCalculate cylinder volume) # 2、创建参数对象parse.add_argument(--rad…

怎么处理整合了shiro的应用的RPC接口鉴权问题

这篇文章分享一下&#xff1a;当一个服务提供者整合了shiro安全框架来实现权限访问控制时&#xff0c;服务消费者通过feign请求服务提供者的接口时的鉴权不通过问题。 问题描述 博主有一个项目pms&#xff08;权限管理系统&#xff09;&#xff0c;使用了shiro框架来实现鉴权功…

【免费可视化工具】智慧港口全景监测大屏引领行业变革

在传统的港口运营中&#xff0c;人们往往要面对繁琐的数据、复杂的流程和不确定的风险。但随着科技的发展&#xff0c;智慧港口全景监测大屏&#xff0c;集数据整合、实时监控、智能分析于一体&#xff0c;为港口运营提供了全新的解决方案。 今天要说的是山海鲸可视化搭建的智慧…

Android 通知组

一. 通知组简介 从 Android 7.0&#xff08;API 级别 24&#xff09;开始&#xff0c;您可以在一个组中显示相关通知。如下所示: 图 1. 收起&#xff08;顶部&#xff09;和展开&#xff08;底部&#xff09;的通知组。 注意 &#xff1a;如果应用发出 4 条或更多条通知且未…

第十一次Javaweb作业

4.登录校验 4.1会话 --用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求和响应。 会话跟踪&#xff1a;一种维护浏览器状态的方法&#xff0c;服务器需要识别多次请求…

Django(根据Models中模型类反向生成数据库表)—— python篇

一、数据库的配置 1、 django默认支持 sqlite&#xff0c;mysql, oracle,postgresql数据库。 sqlite&#xff1a;django默认使用sqlite的数据库&#xff0c;默认自带sqlite的数据库驱动 , 引擎名称&#xff1a;django.db.backends.sqlite3 mysql&#xff1a;引擎名称&#xff…

解决Transformer根本缺陷,所有大模型都能获得巨大改进

即使最强大的 LLM 也难以通过 token 索引来关注句子等概念&#xff0c;现在有办法了。 最近两天&#xff0c;马斯克和 LeCun 的口水战妥妥成为大家的看点。这两位 AI 圈的名人你来我往&#xff0c;在推特&#xff08;现为 X&#xff09;上相互拆对方台。 LeCun 在宣传自家最新论…

leetcode 动态规划(基础版)单词拆分

题目&#xff1a; 题解&#xff1a; 一种可行的dp做法是基于完全背包问题&#xff0c;将s看成是一个背包&#xff0c;wordDict看作是物品&#xff0c;然后往s中放入物品判断最终是否可以变为给定的s即可。这道题和上一题都用到了在dp如何枚举连续子串和状态表示&#xff1a;枚…

【C++】C++拷贝构造引发的无限递归问题及其解决方法

了解C拷贝构造引发的无限递归问题及其解决方法 在C中&#xff0c;拷贝构造函数用于创建一个对象的副本。正确使用拷贝构造函数非常重要&#xff0c;否则可能会引发无限递归问题&#xff0c;导致程序崩溃。 什么是拷贝构造函数&#xff1f; 拷贝构造函数是一种特殊的构造函数…

Golang 百题(实战快速掌握语法)_2

返回集合中满足指定条件的最后一个元素 本实验将实现判断给定集合中的元素是否符合&#xff0c;并返回符合的最后一个元素。 知识点 forfmt.Error 适合人群 本课程属于基础课程。需要用户掌握 Go 语言编程基础知识、计算机基础知识和 Linux 环境的基本用法。 许可证 内容…