ES已死,文本检索永生

48be2f700a468fd41b2cce09beb1237a.png

0d040212ef0a3a1f38b05d013a285ee3.png

长期以来,混合查询(Hybrid Search)一直是提升 RAG(Retrieval-Augmented Generation)搜索质量的重要手段。尽管基于密集向量(Dense Embedding)的搜索技术随着模型规模和预训练数据集的不断扩展,在构建 query 和文档之间的深层次语义交互方面展现出令人瞩目的性能,但其仍存在一些显著局限性,例如可解释性不足,以及在处理长尾查询(long-tail queries)和稀有词条(rare terms)时效果欠佳。

对于许多 RAG 应用来说,预训练模型往往缺乏基于领域知识的语料支持,在某些场景下,其性能甚至不及基于 BM25 的关键词匹配检索。在此背景下,混合查询结合了密集向量检索的语义理解能力和关键词匹配的精确性,为解决这些问题提供了更高效的方案,成为提升搜索效果的关键技术。

01.

混合检索很好,但也很复杂

利用 LangChain 或 LlamaIndex 等框架,快速构建一个用于 POC(概念验证)的 Hybrid Retriever 相对简单。然而,构建一个面向海量数据的生产级解决方案则充满挑战。通常情况下我们需要使用专门的Vector Database进行高效的语意检索,同时还需要传统搜索引擎进行关键词检索,以下是一个生产可用的混合检索系统的架构示意图:

d32c24eddf6348817bb24511ba88cf03.jpeg

这种架构虽然显著提升了搜索质量,但也带来了以下维护上的复杂性:

  • 高昂的基础设施维护成本

  • 数据冗余存储

  • 数据一致性维护困难

  • 安全性和访问控制难以统一

...

采用一套同时支持lexical和semantic search,在提升RAG应用的搜索质量降低系统的维护复杂度和成本,已经成了RAG开发者的迫切诉求。

02.

ES用于检索的工程化泥潭

ElasticSearch 是过去十年搜索领域最具影响力的开源项目之一。基于 Apache Lucene 构建,它凭借高性能、高扩展性和分布式架构广受欢迎。作为一款功能强大的搜索引擎解决方案,ElasticSearch 不仅在全文检索方面表现优异,还在 8.0 版本中引入了向量 ANN 检索功能,大幅降低了实现混合检索的技术门槛。然而,当基于 ElasticSearch 的方案投入生产环境后,往往会面临以下挑战:

数据更新与索引代价高

ElasticSearch 在处理写操作时的开销较大,尤其是在大批量数据更新的场景中。由于其架构设计中数据写入、索引构建和查询未能完全解耦,写操作会显著消耗 CPU 和 IO 资源,严重影响查询性能。对于实时性要求较高或高频更新的业务场景,这种资源竞争和性能损耗成为优化的主要瓶颈。

数据实时性差

ElasticSearch 是一种“近实时”搜索引擎,数据的可见性存在一定延迟。对于部分 AI 应用场景(如 Agent 系统),这种延迟可能会导致实时性不足,难以满足高频交互或动态决策的需求。

分片维护困难,扩展性差

ElasticSearch 使用分片机制来支持分布式架构,但分片管理对用户来说极具挑战。ES未能支持动态分片,在小数据量场景下,分片数量过多可能导致性能不足;而在大数据量场景下,分片数量过少则会限制扩展性,容易出现数据分布不均衡的问题。。

架构非云原生

ElasticSearch 的诞生早于云原生架构的普及,其设计将存储与计算紧密耦合,缺乏与公有云和 Kubernetes(K8s)等现代基础设施的深度整合。在需要扩展资源时,用户不得不同时增加存储和计算资源,灵活性较差。此外,在多副本(Replica)场景下,每个分片都需要独立构建索引,这进一步增加了计算成本,降低了资源利用效率。

向量检索性能低

虽然 ElasticSearch 在 8.0 版本中引入了向量 ANN 检索功能,但其性能与专为向量检索设计的引擎(如 Milvus)相比仍存在显著差距。ElasticSearch 的向量检索基于 Lucene 内核,采用的索引结构在高维数据场景下效率较低,难以满足大规模向量检索的性能需求。此外,在关键场景中,如标量过滤、多租户等复杂应用场景,ElasticSearch 的性能表现更容易出现不稳定,难以支持高负载或多样化的业务需求

资源消耗过高

ElasticSearch 对内存和 CPU 的需求极为苛刻,特别是在处理大规模数据时。其运行依赖 JVM(Java Virtual Machine),需要频繁调整堆内存大小和垃圾回收策略,大大降低了内存的使用效率。与此同时,向量检索对计算性能要求极高,涉及大量 SIMD优化计算,而 JVM 并非处理这些任务的理想环境。

03.

Sparse-BM25,混合检索的未来

Milvus 2.4 引入了稀疏嵌入向量检索,支持类似 Splade 的稀疏向量与稠密向量的混合查询能力,显著提升了搜索质量。然而,诸如 Splade 和 BGE-M3 的预训练模型仍然基于 Bert 等框架构建,有时难以完全适配用户语料库的实际数据分布,在处理长尾查询和罕见词汇时仍存在一定挑战。因此,引入对传统算法(如 BM25)的支持,成为社区呼声较高的优化方向。

在此基础上,Milvus 2.5 创新性地提出了基于稀疏向量的 BM25 检索能力,通过内置的 Sparse-BM25 对 Lexical 检索提供了原生支持,具体包括以下功能:

  • 分词和数据预处理:基于开源搜索库 Tantivy 实现,包括词干提取、词形还原和停用词过滤等功能。

  • 分布式词表和词频统计:高效支持大规模语料的词频管理与计算。

  • 稀疏向量生成与相似度计算:通过语料库的词频(Corpus TF)构建稀疏向量,并基于查询词频(Query TF)和全局逆文档频率 (IDF) 构建查询稀疏向量,再通过特定的 BM25 距离函数进行相似度计算。

  • 倒排索引支持:实现基于 WAND 算法的倒排索引,同时 Block-Max WAND 算法和图索引的支持也在开发中。

36555ca52cfc5841eef7d6ad6a98ad76.jpeg

相比于 Elasticsearch,Milvus的关键词搜索具有以下显著优势:

  • 算法灵活性

Milvus 将相似度计算转化为向量距离计算,支持更复杂的查询和语料库距离分析。基于论文《End-to-End Query Term Weighting》的研究,Milvus 实现了 Term Weighting BERT(TW-BERT)算法,该算法通过 BERT 模型推断查询中的 n-gram 术语权重,并利用这些权重构建查询表示。结合 BM25 对候选文档的相关性进行计算。与传统基于词项(token)的 BM25 方法相比,TW-BERT 在域内(In-Domain)和域外(Out-Domain)测试中均表现出显著的性能提升。

  • 成本优势

Milvus 通过稀疏向量实现词法搜索,不仅能够利用传统倒排索引的压缩技术,还支持密集嵌入(Dense Embedding)的有损压缩。通过对长尾词进行剪枝和向量量化,Milvus 实现了性能提升超过 5 倍,并在召回率下降不到 1% 的前提下将内存占用减少了 50%以上。同时,未来版本将继续优化数据压缩,进一步降低存储成本和查询 I/O。

  • 针对长查询的优化

传统搜索引擎广泛使用 WAND(Weak AND)技术优化倒排索引查询,通过跳过不相关文档提高效率。然而,WAND 在长查询场景中受限于倒排列表交叉过多和剪枝效率下降的问题。

Milvus 通过稀疏嵌入结合图索引(如 HNSW)显著提升长查询的性能。在 50 维以上稀疏向量搜索场景中,图索引相较传统倒排索引实现了超过 10 倍的性能提升。

04.

Milvus如何成为RAG落地的标配

Milvus 不仅提供更强大的关键词搜索功能,更是构建 RAG 应用时的首选向量数据库。以下是其核心优势:

  • 丰富的元数据:支持动态 Schema 和强大的过滤功能,搭配多种索引选项,为数据管理和检索提供了极大的灵活性。

  • 多租户支持:针对 RAG 应用的多租户需求,Milvus 提供了基于 Collection、Partition 和 Partition Key 等多种粒度的多租户实现,满足不同业务场景的隔离需求。

  • 分层存储

    • Milvus 是首个支持磁盘向量索引的开源数据库,大幅降低了向量存储的成本。

    • 当前分层存储架构已覆盖内存、本地磁盘到 S3 等多层存储体系,并将持续优化。

    • 向量存储成本昂贵,建议认真核算你的使用成本!

  • 云原生架构,轻松扩展:基于 Kubernetes 和存算分离的云原生设计,Milvus 能轻松扩展至百亿规模向量,并支持最大千亿级向量的部署。借助云基础设施的弹性,我们实现了从1千万数据逐步插入并自动扩缩容到10亿向量。

  • 多样化的搜索模式:提供 Grouping Search、Range Search 和 Hybrid Search 等多种搜索能力,满足更丰富的检索需求。

  • 强大的生态集成:除了与 LangChain、LlamaIndex 和 Dify 等常见中间件深度整合,Milvus 还无缝支持数十款 AI 产品,详细信息可参考集成概览(https://blog.milvus.io/docs/integrations_overview.md)

在这过去的一年里,我们亲眼见证了 AI 技术的快速发展。从最初的概念验证(POC)到成熟的生产环境,越来越多的企业正在将 AI 智能真正融入业务流程。Milvus 正是这一转型浪潮中的关键支撑者。我们提供从嵌入式到单机,再到分布式的多样化部署方案,旨在帮助企业最快速地实现从创意孵化到开发落地,再到规模生产的全流程转型。无论是初创公司还是大型企业,Milvus 都致力于降低 AI 应用的技术门槛,让创新更加触手可及。

接下来,Milvus社区将围绕“存的起,看得见”这两大关键词持续发力,持续提升搜索体验和向量存储的极致成本。

05.

写在最后

我们基于开源 Milvus 构建了 Zilliz Cloud,这是一款全托管的向量数据库服务。通过采用云原生设计理念,我们重新实现了 Milvus 协议,使其在易用性、成本效益和安全性上实现了全面提升。

对于仍然受困于 Elastic Search 高额账单的企业,对于为向量检索服务的扩展性和稳定性而担忧的团队,以及那些关心 RAG 应用搜索质量和性能的开发者,Zilliz Cloud 将是你们的理想选择。现在,正是拥抱创新技术的最佳时机。

作为 Milvus 的开发团队,我们深谙构建和维护一个稳定且高性能的向量检索服务的复杂性。我们维护了全球最大规模的向量检索集群,也支持了数以千计的AI应用开发者。基于这些丰富的实践经验,Zilliz Cloud 不仅显著降低了自托管向量服务的运行成本,更重要的是,它帮助用户彻底摆脱繁琐的运维工作。

点击下方“阅读原文”即可免费开始体验Zilliz Cloud。无需信用卡,您的首 100 美金费用由我们承担。

作者介绍

589f7d5d8a3a2d91941a7f7f5febbfd3.jpeg

栾小凡

Zilliz 合伙人和研发 VP

LF Al & Data 基金会技术咨询委员会成员

推荐阅读

6f90b45b959491f30b1d2161017bd4c7.png

44157d3776fd29d22d0bda1de09281ba.png

1c559aa77e905c207fd65ba4ac107a64.png

9e9e7b7815f8135d3d32379cdd220875.png

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

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

相关文章

【Web】2024“国城杯”网络安全挑战大赛决赛题解(全)

最近在忙联通的安全准入测试,很少有时间看CTF了,今晚抽点时间回顾下上周线下的题(期末还没开始复习😢) 感觉做渗透测试一半的时间在和甲方掰扯&水垃圾洞,没啥惊喜感,还是CTF有意思 目录 Mountain ez_zhuawa 图…

VS2022 中的 /MT /MTd /MD /MDd 选项

我们有时编译时,需要配置这个 运行库,指定C/C++运行时库的链接方式。 如下图 那么这些选项的含义是什么? /MT:静态链接多线程库 /MT选项代表“Multi-threaded Static”,即多线程静态库。选择此选项时,编译器会从运行时库中选择多线程静态连接库来解释程序中的代码,…

前端常用算法集合

使用前介绍 不借助临时变量,交换整数 加减乘除法 注意:如果是浮点数,对于加减乘除法需要注意浮点数的精度丢失问题。 对象法 数组法 数组去重 方法1(filter,推荐使用) 方法2(新数组法&#xff…

保护模式基本概念

CPU 架构 RISC(Reduced Instruction Set Computer) 中文即"精简指令集计算机”。RISC构架的指令格式和长度通常是固定的(如ARM是32位的指令)、且指令和寻址方式少而简单、大多数指令在一个周期内就可以执行完毕 CISC&…

62.基于SpringBoot + Vue实现的前后端分离-驾校预约学习系统(项目+论文)

项目介绍 伴随着信息技术与互联网技术的不断发展,人们进到了一个新的信息化时代,传统管理技术性没法高效率、容易地管理信息内容。为了实现时代的发展必须,提升管理高效率,各种各样管理管理体系应时而生,各个领域陆续进…

【零基础保姆级教程】制作自己的数据集(二)——Labelme的安装与使用及常见的报错解决方法

前段时间安装了Labelimg,网上有些博客写着Labelme能进行语义分割的标注,但UI窗口就那么大找不着选项,只能打矩形框,为了能够标注自己的分割数据集,遂写下该教程以供参考。 采用Labelimg进行目标检测标注的教程如下。 …

详解磁盘IO、网络IO、零拷贝IO、BIO、NIO、AIO、IO多路复用(select、poll、epoll)

1、什么是I/O 在计算机操作系统中,所谓的I/O就是输入(Input)和输出(Output),也可以理解为读(Read)和写(Write),针对不同的对象,I/O模式可以划分为…

无人设备遥控器之定向天线篇

一、定义与功能 定向天线,顾名思义,是通过改变天线的辐射方向,实现信号发射、接收和增强的天线。它可以让信号以更高的功率、更远的距离传输到指定区域,同时也能够降低与周围天线之间的干扰。在无人设备遥控器中,定向天…

老旧小区用电安全保护装置#限流式防火保护器参数介绍#

摘要 随着居民住宅区用电负荷的增加,用电安全问题日益突出,火灾隐患频繁发生。防火限流式保护器作为一种新型电气安全设备,能够有效预防因电气故障引发的火灾事故。本文介绍了防火限流式保护器的工作原理、技术特点及其在居民住宅区用电系统…

dify的ChatFlow自定义上传图片并通过HTTP请求到SpringBoot后端

前情提要 交互场景:dify的ChatFlow上传文件(本示例是单张图片),通过HTTP请求至SpringBoot后端dify版本:0.13.2python版本:3.12.7 1. 自定义上传变量 在【开始】节点自定义变量单文件上传变量file 2. 下接HTTP请求节点 BODY要…

【幼儿园识物】比大小启蒙资料PDF

下载链接::huanxigou-uihttp://yiwub.natapp1.cc/zyweb/#/source/viewPdf?id9

帧缓存的分配

帧缓存实际上就是一块内存。在 Android 系统中分配与回收帧缓存,使用的是一个叫 ION 的内核模块,App 使用 ioctl 系统调用后,会在内核内存中分配一块符合要求的内存,用户态会拿到一个 fd(有的地方也称之为 handle&…

SDMTSP:黑翅鸢算法(Black-winged kite algorithm,BKA)求解单仓库多旅行商问题,可以更改数据集和起点(MATLAB代码)

一、黑翅鸢算法BKA 黑翅鸢算法(Black-winged kite algorithm,BKA)由Wang Jun等人于2024年提出,该算法受黑翅鸢的迁徙和掠食行为启发而得。BKA集成了柯西突变策略和领导者策略,增强了算法的全局搜索能力,提…

【Python】基础语法介绍

目录 一、标识符和关键字 二、注释 三、缩进 四、输入和输出 五、字符串操作 六、基本数据类型 七、复合数据类型 7.1 列表 7.2 元组 7.3 字典 7.4 集合 八、数据类型转换 九、运算符 8.1 算术运算符 8.2 比较运算符 8.3 赋值运算符 8.4 位运算符 8.5 逻辑运…

stm32定时器输出比较----驱动步进电机

定时器输出比较理论 OC(Output Compare)输出比较输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形每个高级定时器和通用定时器都拥有4个输出比较通道高级定时器的前3个通道额外拥有死区生成和互补输出…

【NLP 17、NLP的基础——分词】

我始终相信,世间所有的安排都有它的道理;失之东隅,收之桑榆 —— 24.12.20 一、中文分词的介绍 1.为什么讲分词? ① 分词是一个被长期研究的任务,通过了解分词算法的发展,可以看到NLP的研究历程 ② 分词…

Rust 在前端基建中的使用

摘要 随着前端技术的不断发展,前端基础设施(前端基建)的建设已成为提升开发效率、保障产品质量的关键环节。然而,在应对复杂业务场景与高性能需求时,传统的前端技术栈逐渐暴露出诸多不足。近年来,Rust语言…

谷歌浏览器的网络连接问题解决方案

在数字化时代,网络浏览器已成为日常工作和生活中不可或缺的工具。谷歌浏览器以其快速、稳定和丰富的功能深受用户喜爱。然而,就像其他软件一样,谷歌浏览器也可能遇到网络连接问题,这可能由多种因素引起。本文将为您提供一系列解决…

【Unity3D】Particle粒子特效或3D物体显示在UGUI上的方案

目录 一、RawImage Camera RenderTexture方式 (1)扩展知识:实现射线检测RawImage内的3D物体 (2)扩展知识:实现粒子特效显示RawImage上 二、UI摄像机 Canvas(Screen Space - Camera模式)方式 &#…

14-zookeeper环境搭建

0、环境 java:1.8zookeeper:3.5.6 1、下载 zookeeper下载点击这里。 2、安装 下载完成后解压,放到你想放的目录里。先看一下zookeeper的目录结构,如下图: 进入conf目录,复制zoo_sample.cfg&#xff0…