企业中对RAG的优化方案

企业中对RAG的优化方案

  • RAG优化:检索、语义和生成方面的提升
    • RAG流程
    • 一、数据处理优化
      • 数据清洗
      • 实际案例
    • 二、检索方面优化
      • 向量库检索
      • 倒排索引数据库检索
    • 三、生成方面优化
      • 调整Prompt
    • 四、架构优化
      • RAG+Agent架构
      • Self-RAG架构
      • Agentic RAG架构
    • 总结

RAG优化:检索、语义和生成方面的提升

在现代企业应用中,不同业务场景的需求多种多样,因此采用合适的检索模式和工具至关重要。本文将探讨RAG(Retrieval-Augmented Generation)在数据、检索、生成、架构四个方面的不同选择和优化。

RAG流程

在这里插入图片描述

一、数据处理优化

数据清洗

高性能RAG系统依赖于准确且清洁的原始知识数据。一方面为了保证数据的准确性,我们需要优化文档读取器和多模态模型。特别是处理如CSV表格等文件时,单纯的文本转换可能会丢失表格原有的结构。因此,我们需引入额外的机制以在文本中恢复表格结构,比如使用分号或其他符号来区分数据。另一方面我们也需要对知识文档做一些基本数据清洗其中可以包括:

a)基本文本清理:规范文本格式,去除特殊字符和不相关信息。除重复文档或冗余信息。

b)实体解析:消除实体和术语的歧义以实现一致的引用。例如,将“LLM”、“大语言模型”和“大模型”标准化为通用术语。

c)文档划分:合理地划分不同主题的文档,不同主题是集中在一处还是分散在多处?如果作为人类都不能轻松地判断出需要查阅哪个文档才能来回答常见的提问,那么检索系统也无法做到。

d)数据增强:使用同义词、释义甚至其他语言的翻译来增加语料库的多样性。

e)用户反馈循环:基于现实世界用户的反馈不断更新数据库,标记它们的真实性。

f)时间敏感数据:对于经常更新的主题,实施一种机制来使过时的文档失效或更新。

实际案例

在处理录音转文字的项目中,由于录音环境嘈杂、人员众多,导致转文字效果不理想,常出现语义歧义、停顿词和重复词等问题。为解决这一问题,我们采用了大模型对转换后的文字内容进行重新整理,确保文字语义清晰、一致,然后再进行后续处理。

二、检索方面优化

在实际项目中,常见的检索方案有两种:

向量库检索

向量库检索适用于将各种数据类型转换为向量进行查询。此方法通过将不同数据表示为高维向量,使得在复杂、多样化的数据中能更快速、准确地找到相关内容。

倒排索引数据库检索

倒排索引数据库适合处理大量纯文本数据。此方法通过预先建立文本索引,提高检索效率和准确性,特别是在处理大规模文本数据时效果显著。

三、生成方面优化

调整Prompt

优化生成内容的关键在于调整prompt。市面上有许多prompt调优的教程,但我认为最实用的是OpenAI官方指南(OpenAI Prompt Engineering),中文文档说明OpenAI官方的Prompt工程指南:你可以这么玩ChatGPT。许多教程都是基于此指南,因此熟悉官方指南是提升生成效果的基础。

客户需求:他们有大量文档(比如10万份),希望模型只基于这些文档进行知识检索。
解决方案:

  1. 直接将PDF和docx文件嵌入,准确率是45%。
  2. 经过20次调优迭代,解决细节小Bug - 准确率到65%
  3. 基于规则进行优化,譬如先判断问题属于什么领域(退一步思考),然后再回答,效果提升到85%
  4. 发现数据里有一些是结构化数据(如表格),为此定制提取解决,准确率提升到98%

四、架构优化

RAG+Agent架构

1.RAG的局限性
RAG最初是为简单问题和小型文档集设计的,它通常包括数据解析、索引检索和简单的问答。然而,它在处理更复杂的问题时存在局限性,例如总结整个年度报告、比较问题、结构化分析和语义搜索等。

2.Agent的引入
为了解决RAG的局限性,文档提出了引入Agent的概念。Agent是一种更高级的系统,它能够执行多轮对话、查询/任务规划、工具使用、反思和记忆维护等更复杂的功能。

3.从RAG到Agent的转变
提到了从RAG到Agent的转变,这涉及到增加以下几个层次的功能:

  • 多轮对话:与用户进行更深入的互动。

  • 查询/任务规划层:能够理解并规划复杂的查询和任务。

  • 工具接口:与外部环境进行交互,使用工具来辅助任务执行。

  • 反思:能够自我评估并改进执行过程。

  • 记忆:维护用户交互的历史,以提供个性化服务。

4.Agent的不同层次
从简单到高级Agent的不同层次,包括:

  • 简单Agent:成本较低,延迟较低,但功能有限。

  • 高级Agent:成本较高,延迟较高,但提供更复杂的功能,如动态规划和执行。

5.ReAct
ReAct(Reasoning + Acting with LLMs),这是一个结合了推理和行动的LLM系统,它利用查询规划、工具使用和记忆来执行更复杂的任务。

6.LLMCompiler
一个Agent编译器,用于并行多功能规划和执行,它通过生成步骤的有向无环图(DAG)来优化任务执行。

7.自我反思和可观察性
Agent能够通过自我反思和反馈来改进执行,同时提供可观察性,以便开发者能够追踪和理解Agent的行为。

8.多Agent系统
多Agent系统的概念,其中多个Agent可以同步或异步地交互,以执行更复杂的任务。

Self-RAG架构

在业务复杂或问题复杂的场景下,可以考虑引入Agent或使用Self-RAG架构。Self-RAG是一种引入反思机制的RAG,流程如下:
在这里插入图片描述

  1. 从知识库中检索出结果后,评估其与用户提问的相关性。
  2. 如果不相关,则改写查询并重复RAG流程,直到相关度评分达到要求。

实现Self-RAG需要以下两个组件:

  1. 基于Graph的任务编排系统。
  2. 在Graph内执行的必要算子。例如,在Self-RAG中,评分算子至关重要。可以通过训练一个打分模型来针对检索结果评分,或者采用LLM(Large Language Model)进行评分,以简化系统开发并减少对各类环节的依赖。

Self-RAG是相对初级的Agentic RAG,实践证明,Self-RAG对较复杂的多跳问答和多步推理可以明显提升性能。

Agentic RAG架构

它可以根据用户提问的不同意图采用对应的策略:
开放域问答:直接通过 LLM 产生答案而无需依赖 RAG 检索。
多跳问答:首先将多跳查询分解为更简单的单跳查询,重复访问 LLM 和 RAG 检索器来解决这些子查询,并合并它们的答案以形成完整答案。

自适应检索:适用于需要多步逻辑推理的复杂问题。复杂的问答往往需要从多个数据源综合信息并进行多步推理。自适应检索通过迭代地访问 RAG 检索器和 LLM,逐步构建起解决问题所需的信息链。

如下图所示,Adaptive-RAG 的工作流程与 Self-RAG 类似,只是在前面增加了一个查询分类器,就提供了更多种对话的策略选择。

在这里插入图片描述

总结

本文探讨了如何优化RAG系统在检索、语义和生成方面的性能。强调了数据清洗和增强的重要性,包括文本格式规范、实体解析、文档划分、数据多样性和用户反馈。检索优化包括向量库和倒排索引数据库两种方案。生成优化关键在于调整prompt,推荐使用OpenAI官方指南。针对客户需求,通过迭代调优和规则优化,提升了基于文档的知识检索准确率。介绍了RAG+Agent架构,Agent能执行复杂功能,如多轮对话和任务规划。Self-RAG架构引入反思机制,通过任务编排系统和必要算子提升性能。Agentic RAG架构根据不同意图采用策略,如开放域问答和自适应检索,以解决复杂问题。


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

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

相关文章

Vue-cli搭建一个项目

目录 vue-cli搭建项目 主要的功能 需要的环境 用 HbuilderX 搭建 vue-cli 项目 1、创建一个vue项目(2.6.10) 2、组件路由 首先:安装 其次: 1.在src文件夹下创建router目录,创建index.js 2.使用路由——在App.vue中添加路由视图 3.在main.js 中…

WavRx:新型语音健康诊断模型

近年来,语音作为一种有前景的疾病诊断和远程健康监测手段已经出现。语音健康诊断通常基于这样一个假设:即影响发音和/或呼吸系统的疾病会导致人类语音信号中出现非典型模式。这种异常可能由多种原因造成,例如神经肌肉控制受损或声道和肺部发炎…

Akka框架:Scala并发编程的瑞士军刀

Akka框架:Scala并发编程的瑞士军刀 引言 在多核处理器时代,编写高效的并发应用程序变得越发重要。Scala语言凭借其强大的函数式编程特性和类型系统,为并发编程提供了天然的优势。Akka框架,作为Scala生态系统中的佼佼者&#xff…

C# as

以下是as关键字的一些使用场景:安全类型转换:接口到实现类的转换:基类到派生类的转换:使用as运算符时,重要的是要检查转换的结果是否为null,以确保代码的健壮性。 在 C#编程语言中, as关键字是…

【Android面试八股文】Framework面试:Handler怎么进行线程通信的?原理是什么?

文章目录 Handler整体思想Handler工作流程Handler工作流程图总结Handler整体思想 在多线程的应用场景中,将工作线程中需更新 UI 的操作信息 传递到 UI 主线程,从而实现 工作线程对 UI 的更新处理,最终实现异步消息的处理。 Handler工作流程 Handler 机制的工作流程主要包括…

【云服务器介绍】选择指南 腾讯云 阿里云全配置对比 搭建web 个人开发 app 游戏服务器

​省流目录:适用于博客建站(2-4G)、个人开发/小型游戏[传奇/我的世界/饥荒](4-8G)、数据分析/大型游戏[幻兽帕鲁/雾锁王国]服务器(16-64G) 1.京东云-618专属活动 官方采购季专属活动地址&#x…

Ubuntu多显示器设置不同缩放比例

Ubuntu多显示器设置不同缩放比例 设备问题解决方案 设备 笔记本屏幕分辨率为2560 \times 1600,外接显示器的分辨率为3840 \times 2160。 问题 Ubuntu默认的显示器设置中,缩放仅能选择100%,200%,300%,400%。假…

Android13.0 修改屏幕显示方向

Android13默认显示方向是0, 大屏幕产品是固定方向放置的,由于接口走向差异有些屏幕按照0度方向显示是倒的,需要旋转180 可以修改这些默认显示方向 diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/…

Python sorted 函数:Key参数,以及lambda 函数与常规写法区别

Python sorted 函数:Key参数,以及lambda 函数与常规写法区别 第一种方式: ous sorted(ouFilter.ous, keylambda ou:ou.path)使用 lambda 函数作为排序的关键字,这是一个简洁、明了的方式。lambda 函数在 Python 中表示一个简 单…

【面试系列】后端开发工程师 高频面试题及详细解答

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…

游戏心理学Day28

独立游戏团队架构 独立游戏工作室是一个包括编程美术设计院校项目管理和运营等各种职能的团队找到可以共同奋斗。数月甚至数年的合适人选并不是一件容易的事情。游戏开发过程中要涉及多种常规工作。小团队的每个成员通常都要身兼数职,而且有些角色常由多人担任。 …

页分裂和页合并——Java全栈知识(33)

上篇文章我们讲到了 MySQL 的数据页,我们说到了 InnoDB 的索引是以 B树的形式构建的,而且 B树的节点都是一个数据页。 但是 B树在使用过程中难免会有节点分裂和节点合并的过程。 因为我们是以数据页为基本单位构造的 B树,那么 B树的节点分裂和…

AutoCAD笔记

基础知识 基本问题 Q&A: Q:菜单栏不见了 A:输入命令MENUBAR,值改为1,或者点击 “顶部的下三角-显示菜单栏”即可 Q:做好了图框,怎么让每次都是用这个图框 A:打开你做好的图框,另存为“图…

真正的IDEA在线版有多好用

前言 在上一篇文章使用过TitanIDE的VS Code在线版以后,尝到了不少甜头,紧接着又去使用了他的在线版IntelliJ IDEA,同样非常惊艳,不需要任何时间去适应这款云原生开发工具,事不宜迟,马上开整 这才是真正的VS Code在线版…

Qt | windows Qt6.5.3安卓环境搭建成功版(保姆级教程)

01、第一章 Qt6.5.3安装 资源 Qt 国内下载地址清华大学开源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/qt/archive/online_installers/Qt 阿里云盘下载Qt 安卓开发https://www.alipan.com/s/kNaues6CHaG点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极…

锂电池的串并联特性

1节锂电池电芯的规格是10000mah,4v(总能量10000*4) 那么3节电芯串联电池的规格是10000mah,12v(总能量10000*12)注意,这里电池的规格不是30000mah 3节电芯并联的规格是30000mah,4v …

【Linux进阶】windows和linux文件互传的两种方式

前言 我们在windows电脑上使用ssh工具(比如Xshell)来远程登录并使用linux云服务器的时候,难免要将我们的文件传输到linux服务器上,或者将linux服务器的文件传输到我们的windows电脑里,那么,我们要怎么来实…

Reflector简介-archlinux更新镜像列表工具

Reflector 是一个用于 Arch Linux 的 Python 脚本,它能够自动从 Arch Linux 的镜像状态页面获取最新的镜像列表,并根据速度、国家和最后更新时间等因素对镜像进行排序和筛选。用户可以根据自己的需求选择不同的参数来定制镜像列表,并将结果写…

Springboot Mybatis 多数据源配置以及使用

在Spring Boot中配置MyBatis的多数据源是一个常见需求,尤其是在需要连接多个数据库时,下面是详细的步骤指南。 引入依赖 首先,在你的pom.xml文件中添加Spring Boot、MyBatis和数据库连接的相关依赖。例如,如果你使用的是MySQL数…

Java集合实例

一、什么是Java集合实例: 指的是在 Java 程序中创建和使用的集合对象,这些对象用于存储和操作数据。Java 集合框架提供了一系列的接口和实现类,用于管理不同类型的数据集合。 二、Java集合的主要实例类型: 1. List(列…