当前位置: 首页 > 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 <<…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...