当前位置: 首页 > news >正文

构建生产级的 RAG 系统

对 RAG 应用程序进行原型设计很容易,但要使其高性能、健壮且可扩展到大型知识语料库却很困难。

本指南包含各种提示和技巧,以提高 RAG 工作流程的性能。我们首先概述一些通用技术 - 它们按照简单到复杂的顺序进行排列。然后,我们将更深入地研究每种技术、该技术解决的用例,以及如何使用 LlamaIndex 实现它!

RAG 系统的终极目标是:优化系统的检索和生成性能,让 LLMs 能够准确回答来自更复杂的数据集的更多 query,而不会产生幻觉。

构建生产级 RAG 系统的通用技术总结

以下是构建生产级 RAG 的一些主要注意事项:

1️⃣ 用于检索的文本块不一定要与用于LLM生成的文本块相同

在信息检索阶段,通常将文档分割成较小的文本块,以提高检索的准确性和效率。然而,在让 LLM 生成回答时,可能需要更大的文本块来提供充分的上下文信息。因此,针对检索和生成过程,应采用不同的文本分块策略,以优化各自的效果。

2️⃣ 嵌入应存在于不同的潜在空间中,而不是直接使用原始文本的嵌入

原始文本可能包含无关的填充词或噪音,直接对其进行 embedding 可能会引入偏差。为了获得更准确的文本表示,可以考虑对文本进行预处理,如去除停用词、提取关键信息,或者对 embedding 模型进行微调,以生成更有意义的 embedding 向量。

3️⃣ 如果检索未能返回正确的上下文,可能需要动态加载或更新数据本身

当检索结果不理想时,问题可能出在数据源本身过时或不完整。此时,动态地加载新数据或更新现有数据可以改善检索效果,确保LLM使用最新且相关的信息来生成回答。

4️⃣ 设计具有可扩展性的处理流程

原型阶段的系统延迟可能较高,这在生产环境中是不可接受的。应从易于使用但延迟较高的模块开始,逐步优化各个组件以降低延迟,提升系统的性能和可扩展性,满足生产级应用的需求。

5️⃣ 以层次化的方式存储数据

为每个文档存储摘要和具体的文本块,可以构建一个层次化的数据结构。这种方法允许在需要快速概览时获取摘要信息,而在需要深入细节时访问具体的文本块,提高了数据检索和处理的效率。

6️⃣ 在生产环境中,健壮的数据管道尤为重要,尤其是当源数据不断变化时

如果数据仅需加载一次,数据管道的稳定性影响较小。然而,当源数据频繁更新时,必须确保数据管道的可靠性和稳定性,以防止数据不一致或系统故障。

7️⃣ RAG不仅适用于问答,还可用于摘要等其他任务;应根据用例调整文本块大小

在生成摘要时,可能需要处理所有相关的文本块以涵盖完整的信息;而在问答场景中,只需检索特定的文本块即可。因此,应根据具体的应用场景和需求,调整文本块的大小和分割方式。

8️⃣ 基于嵌入的检索对实体查找效果不佳;混合搜索可结合关键词查找的优势和额外的上下文

对于查找特定实体(如人名、地名)等精确匹配的需求,纯粹依赖嵌入可能无法获得最佳结果。混合搜索方法将关键词匹配与嵌入检索相结合,既利用了精确匹配的优势,又提供了上下文信息,从而提高了检索效果。

将用于检索的 chunk 与用于 synthesis 的 chunk 分离

更好地检索的关键技术是将用于检索的 chunk 与用于 synthesis 的 chunk 分离。

检索到的质量最好的 chunk 可能与最适合用于 synthesis 的 chunk 不同。例如,原始文本块可能包含 LLM 给定查询的更详细答案所需的详细信息。但是,它可能包含冗余的词或信息,这可能会使 embedding 表示产生偏差,或者它可能缺少全局上下文,并且在相关查询出现时根本无法检索。

解决方案:

1. 嵌入文档摘要,该摘要链接到与文档关联的数据块。

这有助于在检索 chunk 之前整合更多相关的文档,而不是直接检索 chunks(可能在不相关的文档中)。

相关资源:Table Recursive Retrieval、Document Summary Index

2. 嵌入一个句子,然后扩展到句子周围的内容。

这允许更细粒度地检索相关上下文(embedding 巨大的 chunk 会导致 LLM“迷失在长文本中”),但也确保了 LLM 能看到足够长的上下文。

相关资源:Metadata Replacement Postprocessor

大型文档集的结构化检索

标准 RAG 流程(top-k 检索 + 基础的文本拆分)的一个大问题是,随着文档数量的增加,它表现不佳 - 如果您有 100 个不同的 PDF。在这种情况下中,给定一个 query,你可能希望使用结构化信息来帮助进行更精确的检索;例如,如果您提出一个仅与两个 PDF 相关的问题,请使用结构化信息来确保返回的内容来自这两个 PDF。

解决方案:

有几种方法可以为生产质量的 RAG 系统执行更结构化的标记和检索,每种方法都有自己的优点/缺点。

1. 元数据过滤器 + 自动检索:用元数据标记每个文档,然后存储在向量数据库中。在推理期间,使用 LLM 筛选符合条件的元数据,然后再查询向量数据库。

✅ 优点 : 主流向量数据库支持。可以通过多个维度过滤文档。

🚫 缺点 : 可能很难定义正确的标签。标签可能不包含足够的相关信息,无法进行更精确的检索。此外,使用标签进行搜索主要基于关键词匹配,无法理解词语的深层含义或上下文关系,因此无法进行语义层面的查找。

2. 存储文档的层级结构(摘要 -> 原始文本块)+ 递归检索 : 首先嵌入文档摘要,并为每个文档建立一个摘要与分块的映射。在检索时,先在文档级别找到相关内容,然后再深入到更细的文本块层次。

✅ 优点 :支持文档级别的语义查找,通过摘要嵌入,系统可以进行语义匹配,而不仅仅依赖于关键词,从而获得更有深度和关联的搜索结果。

🚫 缺点 : 无法通过结构化标签进行关键词查找(关键词匹配有时能更精准地找到特定信息,而语义查找较为泛化,可能无法替代关键词的精确性);自动生成摘要的成本较高(要为大量文档生成和维护准确的摘要非常耗时、昂贵,尤其在处理大型数据集时更为明显)

根据任务动态检索数据块

RAG(检索增强生成)不仅适用于回答特定事实问题(通常通过 top-k 相似度检索优化),还广泛涵盖了多种查询需求。用户可能提出各种类型的问题,例如关于具体事实的问答(如“这家公司2023年的多元与包容计划是什么?”或“叙述者在Google的经历是什么?”);还可能需要对整个文档进行总结(如“能给我一个这篇文档的高层次概述吗?”),甚至进行比较(如“你能对比X和Y吗?”)。这些不同的查询需求表明,RAG应用不仅仅局限于事实问答,而是扩展到了更多的检索和生成任务。构建 RAG 系统时,为适应多样化的需求,可能需要灵活配置不同的检索和生成方法,以确保在各种场景下都能提供最佳的回答。

解决方案:

LlamaIndex 提供了一些抽象的 core 来帮助完成基于特定任务的检索,包括 router 模块以及 data agent 模块。这还包括一些高级查询引擎模块。这还包括链接结构化和非结构化数据的其他模块。你可以使用这些模块进行联合问答和总结,甚至可以将结构化查询与非结构化查询相结合。

Core Module Resources

  • Query engine
  • Agents
  • Router

Detailed Guide Resources

  • Sub-Question Query Engine
  • Joint QA-Summary
  • Recursive Retriever Agents
  • Router Query Engine
  • OpenAI Agent Cookbook
  • OpenAIAgent Query Planning

优化上下文嵌入

这与上面“Decoupling chunks used for retrieval vs. synthesis” 中描述的动机有关。我们希望确保 embedding 的内容经过优化,以便更好地检索到正确数据语料。基于通用场景预训练的模型可能无法捕获实际应用案例中数据的显著特征。

解决方案:

除了上面列出的一些技术之外,我们还可以尝试微调 embedding 模型。我们可以使用无标签的非结构化文本语料进行微调。

在此处查看相关指南:Embedding Fine-tuning Guide

参考内容:

Building Performant RAG Applications for Production - LlamaIndex

https://www.youtube.com/watch?v=Zj5RCweUHIk

https://x.com/jerryjliu0/status/1692931028963221929?s=20

相关文章:

构建生产级的 RAG 系统

对 RAG 应用程序进行原型设计很容易,但要使其高性能、健壮且可扩展到大型知识语料库却很困难。 本指南包含各种提示和技巧,以提高 RAG 工作流程的性能。我们首先概述一些通用技术 - 它们按照简单到复杂的顺序进行排列。然后,我们将更深入地研…...

完全透彻了解一个asp.net core MVC项目模板2

这是《完全透彻了解一个asp.net core MVC项目模板》的第二篇,如果你直接进入了本篇博文而不知道上下文,请先阅读《完全透彻了解一个asp.net core MVC项目模板》的第一篇。 文章目录 一、补充几个问题1、有关导航链接和Tag Helper2、_ViewStart.cshtml与…...

uniapp 如何调用音频

uniapp调用音频 button点击 <view><button click"startPlay">开始播放</button></view>方法实现 startPlay() { const innerAudioContext uni.createInnerAudioContext();innerAudioContext.src /static/sounds/oqc.mp3;innerAudioContex…...

在Facebook运营中使用住宅IP的重要性

在当前社交媒体的浪潮中&#xff0c;Facebook作为全球最大的社交网络之一&#xff0c;吸引了数以亿计的用户。为了在这一平台上实现有效的运营和推广&#xff0c;越来越多的博主和营销人员正在寻求最佳的养号策略。其中&#xff0c;IP地址的选择显得尤为重要&#xff0c;尤其是…...

EJB项目如何升级SpringCloud

记录某金融机构老项目重构升级为微服务过程1 如何从EJB架构拆分微服务 这个非常有趣的过程&#xff0c;整个过程耗时大致接近半年时光&#xff0c;需要考虑到重构升级保留原来的业务线&#xff0c;而且还要考虑后续的维护成本&#xff0c;保留现有的数据库表结构&#xff0c;…...

HTTPS 协议原理

一.HTTPS的定义 大家在刚开始学习的时候是不是也是非常好奇HTTP与HTTPS之间有什么区别和联系&#xff0c;两者都是应用层协议&#xff0c;而HTTPS是在HTTP的基础上引入了加密层&#xff0c;从而将HTTP的明文传输进行加密&#xff0c;保障数据的安全性 二.加密与解密 定义&#…...

Vxe UI 表格行编辑(默认不显示编辑框,点击后可编辑)

效果: HTML代码:(type"integer"为这个,是限制只能输入正整数或负整数,英文和汉字自动转成0) <vxe-tableshow-overflowkeep-sourcev-loading"loading":data"ruleList"ref"Table":row-config"{isHover: true}"height"…...

移远通信闪耀2024香港秋灯展,以丰富的Matter产品及方案推动智能家居产业发展

10月27-30日&#xff0c;2024香港国际秋季灯饰展在香港会议展览中心盛大开展。 作为全球领先的物联网整体解决方案供应商&#xff0c;移远通信再次亮相&#xff0c;并重点展示了旗下支持Matter协议以及亚马逊ACK ( Alexa Connect Kit ) SDK for Matter方案的Wi-Fi模组、低功耗蓝…...

爬虫利器playwright

是什么 它是微软在 2020 年初开源的新一代自动化测试工具&#xff0c;其功能和 selenium 类似&#xff0c;都可以驱动浏览器进行各种自动化操作。还可以录制脚本 案列-01 运行之后我们用它自动打开的谷歌浏览器&#xff0c;打开百度&#xff0c;输入漂亮小姐姐并查找&#x…...

着色器的认识

知识了解&#xff1a; 着色器&#xff1a; 顶点着色器: 用来描述顶点的特性,如位置、颜色等&#xff0c;其中&#xff0c;顶点&#xff1a;是指二维或三维空间中的一个点比如交点或者端点。 片元着色器&#xff1a;用来进行逐片元处理操作&#xff0c;比如光照、颜色叠加等&…...

科技的成就(六十四)

591、《传奇》开始公开测试 "2001 年 9 月&#xff0c;《传奇》开始公开测试。《传奇》&#xff08;全称《热血传奇》&#xff09;是由韩国 WeMade 娱乐开发制作的大型多人在线角色扮演游戏&#xff0c;由 Delphi 编写。盛大网络于2001 年获得该游戏在中国的代理权。《传奇…...

银行信贷风控专题:Python、R 语言机器学习数据挖掘应用实例合集:xgboost、决策树、随机森林、贝叶斯等...

全文链接&#xff1a;https://tecdat.cn/?p38026 分析师&#xff1a;Fanghui Shao 在当今金融领域&#xff0c;风险管控至关重要。无论是汽车贷款违约预测、银行挖掘潜在贷款客户&#xff0c;还是信贷风控模型的构建&#xff0c;以及基于决策树的银行信贷风险预警&#xff0c;…...

〈壮志凌云:独行侠〉中的超高音速战机

电影《壮志凌云&#xff1a;独行侠》中使用的黑星&#xff08;Darkstar&#xff09;高超音速概念战机模型&#xff0c;虽然看起来像是科幻电影里的产物&#xff0c;但这架飞机实际上是由洛克希德马丁公司的臭鼬工厂&#xff08;Skunk Works&#xff09;设计&#xff0c;这是一家…...

k8s集群 ceph rbd 存储动态扩容

k8s 集群 rbd 扩容有两种方法&#xff0c;如下所示 通过StorageClass自动扩容 # kubectl get sc csi-rbd-sc -oyaml|grep allowVolumeExpansion allowVolumeExpansion: true如果搜索有如上字段&#xff0c;说明是可以自动扩容的&#xff0c;修改对应要扩容的 PVC容量&#xf…...

C语言笔记(指针题目)例题+图解

本文分为两部分 &#xff0c;第一部分为数组、字符串、字符指针在sizeof和strlen中的辨析&#xff0c;第二部分是一些笔试题目。若有错误&#xff0c;请批评指正。 目录 1.第一部分 1.1.数组名的使用 1.1.1一维整型数组在sizeof中的使用 1.1.2一维字符数组在sizeof中的使用…...

从零开始的 vue项目部署到服务器详细步骤(vue项目build打包+nginx部署+配置ssl证书)

从零开始的 vue项目部署到服务器详细步骤&#xff08;vue项目build打包nginx部署配置ssl证书&#xff09; 文章目录 从零开始的 vue项目部署到服务器详细步骤&#xff08;vue项目build打包nginx部署配置ssl证书&#xff09;一、前言二、vue项目部署前配置1、vite.config.js 增加…...

[OceanBase-不止于记录]:揭秘双引擎战略,共探AI时代数据架构未来

前言 又到了一年一度大家最爱的探会文章&#xff0c;非常荣幸收到OceanBase官方的邀请参加2024 OceanBase 年度发布会&#xff0c;作为一个经常参加线下探会的博主&#xff0c;每一次体验都有所不同&#xff0c;每一次新技术的突破都让人感到无比兴奋。同时&#xff0c;作为数…...

项目:抽奖系统

文章目录 1. 项目&#xff1a;抽奖系统 1. 项目&#xff1a;抽奖系统 from faker import Fakerfk Faker(localezh_CN)name_list [] for i in range(100):name_list.append(fk.name()) print(name_list)import randomclass MyFrame(wx.Frame):def __init__(self):wx.Frame.__…...

synchronized进阶原理

synchronized进阶原理 1.轻量级锁 轻量级锁的使用场景:如果一个对象虽然有多个线程访问,但多线程访问的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化(如果出现竞争,操作系统会将轻量级锁升级为重量级锁)。轻量级锁对使用者是透明的(由操作系统控制),即语法仍是s…...

C++,STL 052(24.10.29)

内容 1.对map容器的大小进行操作。 2.map容器的交换操作。 运行代码 #include <iostream> #include <map>using namespace std;void printMap(map<int, int> &m) {for (map<int, int>::iterator it m.begin(); it ! m.end(); it){cout <<…...

纺织抗菌,选对材料才关键

在纺织行业中&#xff0c;抗菌消臭性能是提升产品附加值的核心抓手&#xff0c;其中贴身衣物、家纺等贴身类产品&#xff0c;因长期接触人体或所处环境特性&#xff0c;细菌滋生、异味残留等问题尤为突出。DN128抗菌消臭剂作为高效无机消臭材料&#xff0c;可广泛用作面料及家纺…...

使用pycharm调试后端项目

本文主要解决终端工具与charm环境隔离问题&#xff0c;让终端虚拟环境与pycharm进行关联&#xff0c;简化pycharm的操作第一步 安装 UV 并创建虚拟环境&#xff08;uv工具安装步骤已经跳过&#xff0c;不知道怎么安装的找AI问&#xff09;确保系统中已安装 UV 工具。若需特定 P…...

Matlab粒子动画:3D爱心生成与动态模拟

1. 从零开始理解Matlab粒子动画 第一次看到3D爱心在屏幕上跳动时&#xff0c;那种震撼感至今难忘。作为理工科学生&#xff0c;我们常常用Matlab处理枯燥的数据&#xff0c;但很少有人知道它还能创作出如此浪漫的视觉效果。这就像用计算器弹钢琴——工具本身没有情感&#xff0…...

2025新算法TOC优化VMD实战:六种熵值评估信号分解,一键Matlab出图

1. 为什么需要优化VMD参数&#xff1f; 第一次接触VMD&#xff08;Variational Mode Decomposition&#xff09;时&#xff0c;我和很多初学者一样被它的参数调优问题困扰。记得当时处理一组轴承振动信号&#xff0c;手动试了十几组K值和α值&#xff0c;结果要么模态分解不彻底…...

vLLM-v0.17.1效果展示:128K上下文下PagedAttention稳定性验证

vLLM-v0.17.1效果展示&#xff1a;128K上下文下PagedAttention稳定性验证 1. vLLM框架核心能力 vLLM是一个专为大语言模型推理优化的高性能服务库&#xff0c;最新发布的v0.17.1版本在超长上下文处理能力上实现了重大突破。这个最初由加州大学伯克利分校开发的框架&#xff0…...

终极RPG Maker解密工具:3分钟学会提取游戏资源

终极RPG Maker解密工具&#xff1a;3分钟学会提取游戏资源 【免费下载链接】RPGMakerDecrypter Tool for extracting RPG Maker XP, VX and VX Ace encrypted archives. 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerDecrypter 还在为RPG Maker加密文件无法提取…...

SpringCloud Eureka停更了,我为什么还在用它做微服务注册中心?

SpringCloud Eureka停更后&#xff0c;为什么它仍是微服务架构的隐秘王牌&#xff1f; 当Netflix在2018年宣布停止维护Eureka时&#xff0c;整个Java微服务社区都为之震动。五年过去了&#xff0c;这个"过时"的组件却依然活跃在众多企业的生产环境中。上周我参与了一…...

别再只算理论了!聊聊直流稳压电源设计中那些容易被忽略的‘坑’:从二极管热损耗到MOSFET驱动

直流稳压电源实战避坑指南&#xff1a;从二极管选型到PCB布局的工程细节 在实验室里搭建一个能正常工作的直流稳压电源原型并不难&#xff0c;但要让它在工业现场稳定运行上千小时&#xff0c;完全是另一回事。我曾见过太多电源设计在测试台上表现完美&#xff0c;却在量产阶段…...

硬件工程师转向嵌入式软件开发的十大技巧

嵌入式系统设计&#xff1a;硬件工程师转向软件开发的十大实用技巧1. 引言嵌入式系统设计是硬件与软件紧密结合的领域&#xff0c;硬件工程师在扩展技能到软件开发时&#xff0c;需要建立新的思维模式和工作方法。本文总结了硬件工程师转向软件设计时需要掌握的十大关键技巧&am…...

VMware硬件兼容性自查避坑指南:收购后这些查询细节变了

VMware硬件兼容性自查避坑指南&#xff1a;收购后这些查询细节变了 当企业虚拟化平台的稳定性悬于一线&#xff0c;硬件兼容性往往成为最容易被忽视的致命环节。博通收购VMware后&#xff0c;那些曾经熟悉的兼容性查询路径和规则正在发生微妙却关键的变化——就像手术器械消毒流…...