关于RAG优化的几个小技巧

一、背景说明

RAG技术为大型语言模型(LLMs)提供了从数据源检索到的信息,以支撑其生成的答案。简而言之,RAG就是搜索加上LLM提示,你让模型在提供的信息上下文中回答问题。查询和检索到的上下文都被注入到发送给LLM的提示中。

传统的建模方式:

典型的RAG向量化应用程序有两个主要组件:

索引:从源中获取数据并对其进行向量化索引。

检索和生成:运行时接受用户查询转化成向量化数据,并从索引中检索相关数据,然后将其传递给LLM,生成内容。

实际使用过程中,上面简单的流程经常效果不能满足业务需求,核心问题在于如何检索并处理好传给LLM的内容,下面介绍几种优化思路以及LangChain的实现。

二、优化方法

2.1 多层索引

多层索引技术主要是针对海量的文档检索的处理策略,对面临需要从海量的文档中搜索、找到相关信息,并将这类信息综合成一个答案,并应用其来源。一般有2种方式建立多层索引来优化这类问题。

一种是为文档建立多级索引,比如建立文档的类别标签,在处理指定业务场景下的问答时,只需要对该类别下的知识库进行检索,如:

处理医疗领域的RAG问答业务时,可能会涉及很多的医学知识库,假设有1000篇文档,包括10个不同的医学研究方向。
当涉及的业务问题范畴只涉及外科相关知识时,可以通过类别标签进行筛选过滤,而无需从1000篇文档中进行全局检索。

第二种是从两个索引——一个是有该文档的摘要组成,一个由文档切片组成。在处理学术论文时,这类方法一般有较好的表现。这类方法的思路是分为两个步骤进行检索,首先通过摘要部分进行召回检索,过滤出可能和当前问题相关的候选文档集,然后再利用切片索引,从候选的文档集中进行检索,召回相关的知识切片。

2.2 假设性问题

首先解释一下什么是假设性问题: 假设性问题是一种提问方式,它基于一个或多个假设的情况或前提来提出问题。在对知识库中文档内容进行切片时,是可以以该切片为假设条件,利用LLM预先设置几个候选的相关性问题的,也就是说,这几个候选的相关性问题是和切片的内容强相关的。

在构建切片索引时,可以将对应的假设性问题进行向量化,并同时存储于向量库中。在RAG中的召回步骤中,对这个问题向量索引进行查询搜索,然后路由到原始文本块,并将它们作为上下文发送给LLM以获取答案。这种方法提高了搜索质量,因为与原始文本块相比,查询和假设问题之间的语义相似性更高。

除此以外,还有一种候选的假设性问题解决方案,和上述策略是对应的,它的核心思想可以表示为:

在要求LLM给定查询信息时,用LLM预先生成一个假设的响应,然后将其向量和查询向量一起使用,进一步提升检索的质量。示例如下:

问题: 感冒了怎么办?
大模型预设响应: 感冒了需要多休息,喝水,必要时就医。
召回时用问题和大模型预设响应进行拼接,形成新的prompt内容进行召回。

2.3 拓展上下文

检索较小的块以获得更好的搜索质量,但将周围的上下文一起拼接起来传给LLM推理。当然在索引的时候就要把数据处理好,搜索的时候才能找到周围的上下文。这么做的好处,就是小的文本块可以提升搜索的准确率,而扩展上下文则可以给LLM更丰富的内容。这里有两种拓展上下文的方式可以作为参考:

一种处理的方案是,通过分割和存储小块数据来实现,在检索过程中,它首先获取小块,然后查找这些块的父ID,并返回那些较大的文档。这种方式在langchain里有进行封装。

图片
在这里插入图片描述

第二种是对更大的块进行检索,有时,完整文档可能太大而无法按原样检索它们。在这种情况下,我们真正想做的是首先将原始文档分割成更大的块,然后将其分割成更小的块。然后我们索引较小的块,但在检索时我们检索较大的块(但仍然不是完整的文档)。

在这里插入图片描述

2.4 融合检索

将检索到的结果与不同的相似性分数适当地结合起来——这个问题通常是在倒排融合算法的帮助下解决的,该算法将检索得到的结果重新排序以获得最终输出。在LangChain中,这是在EnsembleRetriever类中实现的,它结合了您定义的检索器列表,例如faiss矢量索引和基于BM25的检索器,并使用RRF进行重新排序。混合或融合搜索通常会提供更好的检索结果,因为两种互补的搜索算法结合在一起,同时考虑了查询和存储文档之间的语义相似性和关键字匹配。

图片
在这里插入图片描述

2.5 过滤与压缩

检索容易遇到的一个问题,当把数据向量化索引到数据库时,不太可能预想到对应的用户问题会是什么。这意味着,与查询最相关的信息可能隐藏在一个包含大量不相关文本的文档中,如果都一股脑传给LLM,不仅费用高(肉疼)而且效果可能也会受影响。

LLMChainFilter是一个简单的压缩器,使用LLM链来决定最初检索到的文档中的哪些要过滤掉,哪些要返回,而无需操作文档内容。嗯。。。这个,我就是因为不想调用LLM费钱处理才采用这个方案的吗?EmbeddingsFilter通过嵌入文档和查询并只返回那些与查询具有足够相似嵌入的文档,提供了一个更便宜、更快的选项。

LLMChainFilter的用法:

在这里插入图片描述

EmbeddingsFilter的用法:

from langchain.retrievers.document_compressors import EmbeddingsFilter
from langchain_openai import OpenAIEmbeddingsembeddings = OpenAIEmbeddings()
embeddings_filter = EmbeddingsFilter(embeddings=embeddings, similarity_threshold=0.76)
compression_retriever = ContextualCompressionRetriever(    base_compressor=embeddings_filter, base_retriever=retriever
)compressed_docs = compression_retriever.get_relevant_documents("What did the president say about Ketanji Jackson Brown"
)
pretty_print_docs(compressed_docs)

2.6 元数据过滤

我们已经习惯了SQL查询的时候增加Where的限制条件,这个可以精确查询所需的数据。RAG也不是所有的时候都要通过语义或关键词检索。比如检索“所有评分大于8分的电影”,或者我们公司实际的业务场景,检索的时候只需要明确某个品牌的数据。

通过元数据过滤实现精确过滤,和语义检索配合。在存储数据块到向量数据块时,需要先处理好元数据,在我们公司的场景中,就是把所属的品牌ID一起存储。检索的时候可以利用大模型的理解能力,把自然语言转成元数据过滤。看看LangChain的实现,metadata_field_info是pydantic的格式。

图片

from langchain.llms import OpenAI
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain.chains.query_constructor.base import AttributeInfo metadata_field_info=[AttributeInfo(    name="genre",        description="The genre of the movie",         type="string or list[string]",     ),    AttributeInfo(    name="year",        description="The year the movie was released",         type="integer",     ),    AttributeInfo(    name="director",        description="The name of the movie director",         type="string",     ),   AttributeInfo(    name="rating",        description="A 1-10 rating for the movie",        type="float"    ),
]
document_content_description = "Brief summary of a movie"
llm = OpenAI(temperature=0)
retriever = SelfQueryRetriever.from_llm(llm, vectorstore, document_content_description, metadata_field_info, verbose=True)

2.7 时间加权

对于一些类似客服FAQ的场景,检索命中越频繁,数据的权重就越高,可以使用了语义相似性和时间衰减的组合。LangChain给出的计算公式是这样的。

图片

hours_passed是指自上次访问检索器中的对象以来(而不是自创建对象以来)经过的小时数。这意味着频繁访问的对象保持“新鲜”。

还有另一种时间权重,比如新闻资讯,创建时间越近权重越高,甚至可以为其设置过期时间。

RAG应用系统中,大家比较关心的因素:准确率、速度、成本。上面讨论的方案基本上都是提升准确率的,同时带来的问题就是速度下降,部分方案会成本上升。

另一方面,在实际的业务场景中,准确率可能是现阶段最重要的问题,业务人员对于应用的要求可能是90分,而LLM目前的能力只能达到60分,如果不能通过其它的方式提升效果,那么应用可能无法在实际场景中使用了。

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

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

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

相关文章

求生之路史低入手 教你怎么使用求生之路创意工坊提高体验性

求生之路是一款抵御丧尸的第一人称射击游戏,四名幸存者联机配合,在现代的城市中,击败各种丧尸还有强大的变种人BOSS,虽然是十几年前的游戏,但是毫不夸张的说,游戏丝毫不过时,目前steam夏促&…

Redis持久化(RDB AOF)

Redis持久化 MySQL的事务,有四个比较核心的特性: 原子性一致性持久性(和持久化一样),将数据存储在硬盘上,重启主机之后数据仍然存在隔离性 redis是一个内存数据库,把数据存储在内存中&#xff0…

算法题 — 接雨水

给定 n 给非负整数,表示每个宽度为 1 的柱子的高度图,计算按照此排列的柱子,下雨之后能能接到多少雨水。 输入:height [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1] 输出:6 解释:上面是由数组 [0, 1, 0, 2, 1,…

布尔运算00

题目链接 布尔运算 题目描述 注意点 运算符的数量不超过 19 个布尔表达式由 0 (false)、1 (true)、& (AND)、 | (OR) 和 ^ (XOR) 符号组成算出有几种可使该表达式得出 result 值的括号方法 解答思路 可以使用动态规划根据左右两侧区间不同结果相应组合数量计算得出当前…

国产Cortex-A55人工智能教学实验箱_基于Python机械臂跳舞实验案例分享

一、实验目的 本实验通过TL3568-PlusTEB教学实验箱修改机械臂不同舵机的角度,增加延迟时间,从而做到机械臂跳舞的效果。 二、实验原理 ROS(机器人操作系统) ROS(机器人操作系统),是专为机器人…

@ComponentScan注解在Spring的作用

ComponentScan注解的作用是什么? 告知Spring扫描那些包下的类,可以配置includeFilters,excludeFilters,过滤某些类,更多内容可以具体看下此注解文件。 Spring是如何通过这个注解将类注入到Ioc容器中的? 请…

[linux]sed命令基础入门详解

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这…

生命在于折腾——Macbook虚拟机开启360核晶

首先启动PD虚拟机,打开360,发现提示如下: 此时将虚拟机关机。 打开该虚拟机设置: 将虚拟机监控程序改为Parallels,并启动nested虚拟化。 改好后截图如下: 保存设置,开机 此时就可以开启了…

硬件实用技巧:摄像头常用的输出协议类型和输出接口类型

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140042485 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

docker 多网卡指定网卡出网

前言 宿主机中有多个网卡 ens160 192.168.4.23/20 内网通信用 ens192 10.31.116.128/24 出公网访问-1 ens193 10.31.116.128/24 出公网访问-2 现在需要不同容器中不同出网访问,举例 容器1 192.168.0.1/20 网段走宿主机 ens160网卡,否则全部走ens192 网…

太速科技-FMC144 -八路 250MSPS 14bit AD FMC子卡

FMC144 -八路 250MSPS 14bit AD FMC子卡 一、板卡概述   FMC144是一款具有8通道模数转换器(ADC)的FMC卡,具有14bit分辨率,最大采样速率达250Msps。时钟配置芯片为AD9516-1,可由板载10MHz时钟提供参考,也可…

STM32人体心电采集系统

资料下载地址:STM32人体心电采集系统 1、项目功能介绍 此项目主要实现了以STM32为核心的人体心电采集系统软硬件的设计。软件设计过程是在STM32上移植的uCGUI做图形界面,并如实显示采集到的心电波形信号,有SD卡存储和USB数据传输功能。 2、实…

Ubuntu20.04安装Prometheus监控系统

环境准备: 服务器名称内网IP公网IPPrometheus服务器192.168.0.23047.119.21.167Grafana服务器192.168.0.23147.119.22.8被监控服务器192.168.0.23247.119.22.82 更改主机名方便辨认 hostnamectl set-hostname prometheus hostnamectl set-hostname grafana hostn…

SAS:quote函数合dhms函数

quote函数 dhms函数 中间停药时的给药日期确定

stm32 No traget connected/debug识别不到串口的问题

关于stm32串口识别不到,第一步先确定是否线接错(stlink与stm32接口对应),如果确认接线没有问题的话,可以使用以下方法,成功率较高。 首先将stlink的boot0置1,就是把跳线帽换到高电平这一侧&…

投标书制作

一、投标书的基本要求l . 帮助与你的标书读者沟通。从这个角度上来讲,标书是一篇针对用户需求的论文,逻辑结构和语言一定要清晰、可读。考虑到评标专家一般都具有较好的学术经验,其中很多还是教授、博导,投标的语言要针对读者的阅…

国产固态光耦在工业照明领域的应用

工业照明作为工厂和生产设施中不可或缺的一部分,其效率和安全性直接影响到生产运行的顺畅性和员工的工作环境。国产固态光耦作为现代工业照明技术的重要组成部分,在提升照明系统效率和安全性方面发挥着关键作用。本文将深入探讨国产固态光耦在工业照明领…

中科驭数第三代DPU芯片K2-Pro,专为数据中心打造的“六边形战士”

近日,中科驭数重磅发布第三代DPU芯片K2-Pro,是国内首颗面向量产的全功能芯片! K2-Pro采用自主研发的Kernel Processing Unit架构,集网络、存储、安全及计算等多业务卸载功能于一体,包处理速率翻倍至80Mpps&#xff0c…

第4章,在 PyCharm 中创建、打开、关闭项目的操作

在 PyCharm 中创建、打开、关闭项目的操作 在PyCharm中创建、打开和关闭项目的操作步骤。以下是每个操作的步骤说明,以及在PyCharm界面中可能对应的区域: 1、创建新项目 1)启动PyCharm: 打开PyCharm IDE。 2)创建新…

餐饮点餐的简单MySQL集合

ER图 模型图(没有进行排序,混乱) DDL和DML /* Navicat MySQL Data TransferSource Server : Mylink Source Server Version : 50726 Source Host : localhost:3306 Source Database : schooldbTarget Server Type …