如何使用混合搜索实现更好的 LLM RAG 检索

news2024/9/22 19:32:59

通过结合密集嵌入和BM25构建高级本地LLM RAG管道

图片

基本的检索增强生成(RAG)管道使用编码器模型在给定查询时搜索相似文档。

这也被称为语义搜索,因为编码器将文本转换为高维向量表示(称为嵌入),在该表示中,语义相似的文本彼此接近。

在我们拥有大型语言模型(LLMs)来创建这些向量嵌入之前,BM25算法是一个非常流行的搜索算法。BM25关注重要关键词,并在可用文档中寻找精确匹配。这种方法被称为关键词搜索

如果您想将RAG管道提升到一个新的水平,您可能想尝试混合搜索。混合搜索结合了关键词搜索和语义搜索的优点,以提高搜索质量。

在本文中,我们将涵盖理论并在Python中实现这三种搜索方法。

RAG 检索

混合搜索是关键词搜索和语义搜索的结合。我们将分别介绍这两种搜索策略,然后再将它们结合起来。

关键词搜索与BM25

BM25是关键词搜索的首选算法。使用BM25,我们可以为语料库中的每个文档计算查询得分。

BM25基于TF-IDF算法,这意味着公式的核心是**词频(TF)逆文档频率(IDF)**的乘积。

TF-IDF算法的基本思想是“在较少出现的、更具体的术语上的匹配比在常见术语上的匹配更有价值”[1]。

换句话说,TF-IDF算法寻找包含我们查询中稀有关键词的文档。

图片

BM25算法有许多变体,每种变体都旨在改进原始算法。然而,似乎没有一种算法在系统上优于其他算法[2]。

因此,在实践中,选择一种并坚持使用是可以的。

如果我们查看LangChain的source code,可以看到它使用了来自rank_bm25包的BM25Okapi类,这是ATIRE BM25算法的一个稍微修改过的版本[3]。

在ATIRE BM25版本中,计算文档d和给定查询q(由多个术语t组成)得分的公式如下[2]:

图片

  • N是语料库中的文档数量
  • df_t是包含术语t的文档数量(也称为文档频率
  • tf_td是术语t在文档d中出现的次数(也称为词频
  • L_d是文档的长度,L_avg是平均文档长度
  • 有两个经验调优参数:bk_1

直观上,我们看到公式对所有术语t求和,我们可以将其视为单词。

BM25方程中的左侧因子log(N/df_t)称为逆文档频率。对于像“the”这样的常见词,所有文档可能都包含,因此逆文档频率将为零(因为log(1)为零)。

另一方面,非常稀有的词只会出现在少数文档中,从而增加左侧因子。因此,逆文档频率是术语t所包含信息量的度量。

右侧因子受术语t在文档d中出现次数的影响。

文档d=["I like red cats, black cats, white cats, and brown cats"]对于术语t="cats"具有非常高的词频tf_td,这将导致包含“cats”一词的查询获得高BM25得分。

让我们使用BM25通过Python库rank_bm25来获取一些直观的理解。

pip install rank_bm25

首先,我们加载库并用我们的分词语料库初始化BM25。

在这里插入图片描述

接下来,我们对查询进行分词。

query = "The cat"
tokenized_query = query.split(" ")

最后,我们使用BM25算法计算得分。高得分表示文档与查询之间的良好匹配。

在这里插入图片描述

由于BM25寻找精确的术语匹配,因此查询“cats”、“Cat”或“feline”都会导致我们的三个示例文档的得分为doc_scores = [0,0,0]

使用密集嵌入进行语义搜索

当我们通过密集嵌入执行语义搜索时,我们将单词转换为数值表示。其理念是相似的单词在这种新的数学表示中彼此接近

图片

文本嵌入是单个单词或整个句子的高维向量。它们被称为密集,因为向量中的每个条目都是一个有意义的数字。相反,当许多向量条目为零时,称为sparse

在将单词转换为嵌入之前,首先将它们转换为tokens,这是一种从字符串到整数的映射。一个称为编码器的神经网络嵌入模型随后将tokens转换为嵌入

图片

在将我们文档语料库中的所有文本转换为嵌入后,我们可以执行语义搜索,以查看哪个嵌入文档与我们的嵌入查询最接近。

我们可以通过绘制嵌入维度并找到与我们的查询最接近的文档匹配来可视化此任务。

图片

在数学上,我们使用余弦距离函数找到最接近的匹配。对于两个嵌入向量ab,我们可以使用点积计算余弦相似度,如下所示:

图片

其中,分子是两个嵌入向量的点积,分母是它们的大小的乘积。

在几何上,余弦相似度是向量之间的角度。余弦相似度得分范围从-1到+1。

余弦相似度得分为-1意味着嵌入ab完全朝相反方向,0意味着它们的角度为90度(它们无关),而+1意味着它们是相同的。因此,在将搜索查询与文档匹配时,我们寻找接近+1的值

如果我们事先对嵌入进行归一化,则余弦相似度度量等同于点积相似度度量(分母变为1)。

让我们使用Python包sentence-transformers执行基本的语义搜索。

pip install sentence-transformers

首先,我们加载库并从HuggingFace下载all-MiniLM-L6-v2编码器模型。该编码器模型经过训练以生成384维的密集嵌入。如果您有OpenAI API密钥,您也可以使用他们的text-embedding模型。

在这里插入图片描述

然后,我们使用与之前相同的文档语料库。
在这里插入图片描述

然后,我们嵌入我们的查询:

query = "The cat"
query_embedding = model.encode(query)

最后,我们可以计算余弦相似度得分。我们可以使用sentence_transformers中的实用函数cos_sim,而不是自己编写公式。
在这里插入图片描述
为了展示密集嵌入语义搜索的强大功能,我可以用查询“feline”重新运行代码:

在这里插入图片描述

尽管“feline”这个词在文档语料库中没有出现,但语义搜索仍然将关于猫的文本排名为最高匹配。

语义搜索还是关键词搜索?

哪种搜索方法更好?这要看情况。两者都有优缺点。现在我们知道了它们的工作原理,我们可以看到它们在哪些地方有用,在哪些地方可能会失败。

关键词搜索使用BM25查找查询词的精确匹配。 当我们寻找短语的精确匹配时,这非常有用。

如果我在寻找“猫帽子”,我可能是在寻找这本书/电影。我不想要与帽子或猫语义相似的结果。

关键词搜索的另一个用例是编程。如果我在寻找特定的函数或代码片段,我希望得到一个精确匹配。

另一方面,语义搜索寻找语义相似的内容。 这意味着语义搜索还会找到包含同义词或不同拼写的文档,例如复数形式、大写字母等。

由于这两种算法都有其用例,混合搜索使用两者,然后将它们的结果合并为一个最终排名。

混合搜索的缺点是它比仅运行一种算法需要更多的计算资源。

混合搜索

我们可以使用倒数排名融合 (RRF) 将 BM25 和余弦相似度的结果结合起来。RRF 是一种简单的算法,用于结合不同评分函数的排名 [4]。

首先,我们需要为每个评分算法获取文档排名。在我们的示例中,这将是:
在这里插入图片描述
每个文档 d 的组合 RRF 分数的公式如下:

图片

其中 k 是一个参数(原始论文中使用 k=60),r(d) 是来自 BM25 和余弦相似度的排名。

整合所有内容

现在我们可以通过分别执行 BM25 和余弦相似度来实现我们的混合搜索,然后使用 RRF 组合结果。

首先,让我们定义 RRF 的函数和一个辅助函数,将浮动分数转换为整数排名。

在这里插入图片描述

这是我使用上述概念实现的简单混合搜索。

在这里插入图片描述

现在我们可以使用 hybrid_search 进行不同的查询。
在这里插入图片描述

作为下一步,我们可以向我们的文档语料库添加更多知识。在我的文章 如何使用重排序提高 LLM RAG 检索 中,我将维基百科整合到了知识语料库中。

在混合搜索之上添加一个重排序器将进一步改善整体 RAG 流程。

结论

混合搜索结合了语义搜索和关键词搜索,以产生更好的整体搜索结果。

为了执行关键词搜索,我们实现了BM25算法,该算法寻找重要的关键词匹配。

对于语义搜索,我们使用了余弦相似度和一个预训练的编码器模型,该模型生成稠密的嵌入。

虽然混合搜索可以改善RAG检索,但它也需要比仅运行一种搜索算法更多的计算资源。

混合搜索是改善您的RAG管道的一个有趣的构建模块。试试看!

如何学习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.coloradmin.cn/o/2084981.html

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

相关文章

【计算机组成原理】汇总五、中央处理器

五、中央处理器 文章目录 五、中央处理器1.CPU的功能与结构1.1CPU功能1.2运算器1.2.1基本结构1.2.2 ALU和寄存器的数据通路 1.3控制器1.3.1基本结构1.3.2控制器功能 1.4CPU的基本结构 2.指令执行过程2.1指令周期2.2指令周期流程2.3数据流2.4指令执行方案:如何安排多…

Type-C接口诱骗取电快充方案

Type-C XSP08Q 快充协议芯片是一种新型电源管理芯片,主要负责控制充电电流和电压等相关参数,从而实现快速充电功能。Type-C XSP08Q快充协议是在Type-C接口基础上,加入了XSP08Q协议芯片的支持,很大程度上提升了充电速度。 正常情况…

ConcurrentHashMap扩容原理 | 存储流程 | 源码探究

新人写手,代码菜鸡;笔下生涩,诚惶诚恐。 初试锋芒,尚显青涩;望君指点,愿受教诲。 本篇文章将从源码的层面,探讨ConcurrentHashMap的存储流程以及扩容原理 Java版本为JDK17,源代码可…

Ollama 本地部署

文章目录 前言一、Ollama是什么?二、使用步骤1.安装 OllamaWindows检验是否安装成功 2.运行ollama 模型库运行模型提问修改配置(可选)如果有个性化需求,需要修改默认配置: 参考 前言 Ollama是一个易于使用的本地大模型…

LivePortraitV3,支持图像驱动和区域控制,更精确的人像控制(WIN,MAC)

LivePortrait又又又又更新了!这速度真是👍🏻👍🏻 【LivePortraitV3,支持图像驱动和区域控制,更精确的人像控制(WIN,MAC)】 https://www.bilibili.com/video/…

别暑气 迎秋意

今年长达40天的“三伏”结束啦! 伏天过后,暑热逐渐消退,天气开始转凉,秋季逐渐来临。我们也该调整好生活节奏,去迎接收获季节的开始。 1、注意防寒保暖 天气逐渐转凉,昼夜温差不断增大,所以要…

Pytest自动化测试框架关联/参数化实战

关联 利用Python提供的fixture可以实现关联 实现步骤: 在case目录下,新建conftest.py文件,比如我们需要token,就在这个文件下定义一个公共的方法,调用登录接口并返回需要的token值(注:公共的方…

【乐企】有关乐企能力测试接口对接-货物运输服务(详细)

1、前置条件,参考【乐企】有关乐企能力测试接口对接-基础版(详细) 2、接口文档 和基础版区别: 1、传参的时候添加了 用例编码:ylbm 2、发票上传接口的服务编码变化了:fwbm:HWYSFPSC 3、能力编码和用例编码…

Linux——安装软件(mysql)

一、应用部署: 安装软件 运行某个程序或者服务 安装软件包 dnf/yum 包安装工具官方网站提供的集成软件包源码编译安装 // 源码编译的步骤 只应用于编译型语言 对于解释性语言编写的程序 采用不用的方式打包 编译型语言编写的程序: nginx解释性语言…

Verilog刷题笔记63

找BUG 1、:Bug mux2 挑错: module top_module (input sel,input [7:0] a,input [7:0] b,output [7:0]out );assign out sel?a:b;endmodule结果正确: 原因: 1、输出out也应为8位 2、逻辑错误,&按位操作,需要将…

【可兼容的】protobuf、streamlit、transformers、icetk、cpm_kernels版本号

搞大模型训练的工作不可避免地需要很多库,但是非常讨厌的事情是这些库动不动就不兼容。最近在做文本分类训练的时候又遇到了这个问题,为了避免后面再安装包的时候把我之前的环境破坏了,所以特地来记录一下:protobuf、streamlit、t…

GD32F4xx---RTC初始化设置及闹钟方式实现秒中断讲解

GD32F4xx—RTC初始化设置及闹钟方式实现秒中断讲解 1、下载链接:源码工程 一、概述 GD32F4x的RTC例程网上资源较少,详细阅读用户手册后做出如下配置。RTC模块提供了一个包含日期(年/月/日)和时间(时/分/秒/亚秒)的日历功能。除亚秒用二进制码显示外,时间和日期都以BC…

欧科云链: Web3浪潮下合规是“必选项”, 技术创新成发展重点

如果说2023年将是Web3的监管与合规之年。那么2024年就是Web3发展里程碑之年。 自2023年,包括美国、日本、新加坡、迪拜、中国香港等全球多个国家和地区金融中心都先后宣布要成为Web3中心、虚拟资产中心,并努力在监管框架下推动Web3生态的技术创新。 放…

对新手的现货白银交易建议

近期现货白银价格表现十分不错,连续的上涨已经突破了30关口,这是一个重要的心理关口,受投资行情的吸引,很多新手现货白银交易者入场。那么,有没有一些对这些新手投资者的现货白银交易建议呢?下面我们就来讨…

通过Docker部署Nacos,以及Docker Desktop进行管理

目录 一.不需要持久化存储 1.启动容器 2.查看容器和镜像​ 3.容器管理 二.持久化存储启动mysql容器 1.创建docker卷 2.运行容器,指定卷 3.在nacos里面随便建个配置文件 4.停止并删除nacos容器 5.重新运行容器,并且挂载相同的卷,也就是上面第二步的命令 6.打开nacos并…

redis的紧凑列表ziplist、quicklist、listpack

文章目录 前言一、ziplist1.1 ziplist 查找复杂度高1.2 ziplist 连续更新风险 二、quicklist三、listpack 前言 当数据量较小时,Redis 会优先考虑用 ziplist 来存储 hash、list、zset,这么做可以有效的节省内存空间,因为 ziplist 是一块连续…

2024年用哪个思维导图软件好?这款在线工具堪称国产之光!

思维导图软件哪个好? 如今已经是2024年了,想做思维导图,面对琳琅满目的思维导图软件,哪一个才是最适合我们的呢? 在选用思维导图软件时,我们可能会综合考虑多个方面,譬如功能数量、操作易用性…

未来工作场所:知识中台与AI的融合

在快速迭代的未来工作场所,知识中台与AI的融合正引领着一场深刻的工作方式变革。这种融合不仅优化了企业的知识管理流程,还通过智能工具如AI问答、内容生成等,极大地提升了工作效率和决策质量。接下来,我们将以HelpLook AI知识库为…

【C/C++】C++类与对象基本概念(抽象与封装、构造函数、析构函数、静态、友元)

文章目录 七、类与对象基本概念抽象定义与声明访问控制类的实现与使用对象指针、this指针与对象引用构造函数析构函数拷贝构造函数 七、类与对象基本概念 抽象 抽象是相对,而非绝对的 在研究问题时,侧重点不同,可能会产生不同的抽象结果;解决…

解密低代码:持续更新的必要性与背后驱动力

在数字化转型的浪潮中,低代码(Low-Code)开发平台已经成为企业快速构建应用程序的重要工具。低代码平台通过图形化界面和少量手写代码,帮助开发者和业务人员在短时间内构建复杂应用。然而,随着技术的不断演进和业务需求…