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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

43. Three.js案例-绘制100个立方体

43. Three.js案例-绘制100个立方体 实现效果 知识点 WebGLRenderer(WebGL渲染器) WebGLRenderer是Three.js中最常用的渲染器之一,用于将3D场景渲染到网页上。 构造器 WebGLRenderer(parameters : Object) 参数类型描述parametersObject…

YOLO原理讲解

一、YOLO的输入参数介绍 打标签后会生成一系列参数,包含: 置信度、预测框的位置(中心点的位置、高度宽度)、类别(标签1、标签2、标签3......) 二、处理图像和标签 首先YOLO会把图像均分为19*19个格子 &a…

9. zynq应用开发--makefile编译

3. 使用SDK工具 如果只做 Linux 应用开发,只需要一个 sdk.sh 文件即可,可以脱离 Petalinux 和 Vitis,也可以编译其三方的应用,可以说一劳永逸。 配置根文件系统 petalinux-config -c rootfs 编译SDK petalinux-build --sdk Linu…

“鞋履创新工坊”:运动鞋店的新产品设计与管理

3.1 系统可行性分析 开发一款程序软件不仅需要时间,也需要人力,物力资源。而进行可行性分析这个环节就是解决用户这方面的疑问,看看程序在当前的条件下是否可以进行开发。 3.1.1 技术可行性分析 此程序选用的开发语言是Java,这种编…

重温设计模式--6、享元模式

文章目录 享元模式(Flyweight Pattern)概述享元模式的结构C 代码示例1应用场景C示例代码2 享元模式(Flyweight Pattern)概述 定义: 运用共享技术有效地支持大量细粒度的对象。 享元模式是一种结构型设计模式&#xff0…

*(int**)是什么意思

有这样一段连续的内存,int*arr(int*)malloc(20); malloc 开辟了 20 个字节大小的空间,arr 指向这段空间的开头 我们要实现像链表一样的功能,有什么方法呢?(关于为什么要在一段连续的空间上实现像链表一样的功能,这只是…

STM32 SPI读取SD卡

七个响应类型: R1 Response (Normal Response): R1响应是最基本的响应,包含一个字节的状态位,用于指示命令是否成功执行。常用。最高位为0。最低位为1表示是空闲状态。其他位是各种错误提示。 R1b Response (Normal with Busy): 类似于R1&a…

[手机Linux] 七,NextCloud优化设置

安装完成后在个人设置里发现很多警告,一一消除。 只能一条一条解决了。 关于您的设置有一些错误。 1,PHP 内存限制低于建议值 512 MB。 设置php配置文件: /usr/local/php/etc/php.ini 把里面的: memory_limit 128M 根据你自…

使用Excel制作通达信自定义“序列数据“

序列数据的视频教程演示 Excel制作通达信自定义序列数据 1.序列数据的制作方法:删掉没有用的数据(行与列)和股代码格式处理,是和外部数据的制作方法是相同,自己上面看历史博文。只需要判断一下,股代码跟随的…

逆向工程在医疗器械中的应用

关于逆向工程: 逆向设计跟正向设计流程不同,它是对己有产品原型进行分析、改进和再创造的过程。通过先进的数字测量手段反向获取产品的外形数据,然后利用各种造型软件由点云数据重构出该产品的CAD模型。逆向工程的辅助设计建构可以缩短产品的…

Web安全攻防入门教程——hvv行动详解

Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中,保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现,还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻防…

rk3588 android12 root

问题说明: 将 andorid12 root 测试情况说明:我在 串口上 实际上 是可以 使用 su root 命令 进入 root 的,但是 使用 root check apk 检测的时候却通不过。 是否解决说明: 已解决 解决问题的逻辑: 就按照 网上的资料…

基于Mysql、JavaScript、PHP、ajax开发的MBTI性格测试网站(前端+后端)

源码地址:https://download.csdn.net/download/2302_79553009/89933699 项目简介 本项目旨在构建一个基于MBTI(迈尔斯-布里格斯性格分类指标)理论的在线平台——“16Personalities”。该平台利用PHP、MySQL、JavaScript等技术栈开发&#x…

数字IC后端设计实现十大精华主题分享

今天小编给大家分享下吾爱IC社区星球上周十大后端精华主题。 Q1:星主,请教个问题,长tree的时候发现这个scan的tree 的skew差不多400p,我高亮了整个tree的schematic,我在想是不是我在这一系列mux前边打断,设置ignore p…

Docker 快速搭建 GBase 8s数据库服务

1.查看Gbase 8s镜像版本 可以去到docker hub网站搜索:gbase8s liaosnet/gbase8s如果无法访问到该网站,可以通过docker search搜索 docker search gbase8s2.拉取Gbase 8s镜像 以下演示的版本是目前官网最新版本Gbase8sV8.8_3.5.1 docker pull liaosn…

大型语言模型(LLMs)演化树 Large Language Models

大型语言模型(LLMs)演化树 Large Language Models flyfish 下面的图来自论文地址 Transformer 模型(如 BERT 和 GPT-3)已经给自然语言处理(NLP)领域带来了革命性的变化。这得益于它们具备并行化能力&…

让 AMD GPU 在大语言模型推理中崭露头角:机遇与挑战

在当今科技飞速发展的时代,大语言模型(LLM)的兴起彻底改变了人工智能领域的格局。从智能客服到文本生成,从知识问答到代码编写辅助,大语言模型的应用无处不在,深刻影响着我们的生活和工作。然而&#xff0c…

CPU条件下Pytorch、jupyter环境配置

一、创建虚拟环境 查看虚拟环境 conda env list 创建python虚拟环境 conda create -n minist python3.11 激活虚拟环境 conda activate minist 查看虚拟环境下有哪些包 pip list 二、安装pytorch 切换清华源 conda config --add channels https://mirrors.tuna.tsing…

【iOS安全】Block开发与逆向

1. OC中的Block 1.1 Block的基本概念 在iOS开发中,Block是一种特殊的数据类型,类似于其他编程语言中的匿名函数。它可以封装一段代码,并且能够像普通变量一样传递、存储和执行。Block可以捕获并访问定义它时所在作用域的变量,这…

C# 中的记录类型简介 【代码之美系列】

🎀🎀🎀代码之美系列目录🎀🎀🎀 一、C# 命名规则规范 二、C# 代码约定规范 三、C# 参数类型约束 四、浅析 B/S 应用程序体系结构原则 五、浅析 C# Async 和 Await 六、浅析 ASP.NET Core SignalR 双工通信 …