通过 Milvus 内置 Sparse-BM25 算法进行全文检索并将混合检索应用于 RAG 系统
随着大数据时代的到来,信息检索技术在各个领域中扮演着越来越重要的角色。阿里云向量检索服务 Milvus 版作为一款高性能的向量检索引擎,100%兼容开源 Milvus,凭借其开箱即用、灵活扩展和全链路告警能力,成为企业大规模 AI 向量数据相似性检索服务的理想选择。其最新版本 2.5 在全文检索、关键词匹配以及混合检索(Hybrid Search)方面实现了显著的增强,在多模态检索、RAG 等多场景中检索结果能够兼顾召回率与精确性。本文将详细介绍如何利用 Milvus 2.5 版本实现这些功能,并阐述其在 RAG 应用的 Retrieve 阶段的最佳实践。
背景信息
Milvus 2.5 集成了高性能搜索引擎库 Tantivy,并内置 Sparse-BM25 算法,首次实现了原生全文检索功能。这一能力与现有的语义搜索功能完美互补,为用户提供更强大的检索体验。
内置分词器:无需额外预处理,通过内置分词器(Analyzer)与稀疏向量提取能力,Milvus 可直接接受文本输入,自动完成分词、停用词过滤与稀疏向量提取。
实时 BM25 统计:数据插入时动态更新词频(TF)与逆文档频率(IDF),确保搜索结果的实时性与准确性。
混合搜索性能增强:基于近似最近邻(ANN)算法的稀疏向量检索,性能远超传统关键词系统,支持亿级数据毫秒级响应,同时兼容与稠密向量的混合查询。
前提条件
已创建内核版本为 2.5 的 Milvus 实例。具体操作,请参见快速创建Milvus实例。
已开通服务并获得 API-KEY。具体操作,请参见API-KEY的获取与配置。
使用限制
适用于内核版本为 2.5 及之后版本的 Milvus 实例。
适用于
pymilvus
的 Python SDK 版本为 2.5 及之后版本。
您可以执行以下命令来检查当前安装的版本。
如果版本低于 2.5,请使用以下命令更新。
操作流程
步骤一:安装依赖库
步骤二:数据准备
本文以 Milvus 官方文档作为示例,通过 LangChain SDK 切分文本,作为 Embedding 模型 text-embedding-v2
的输入,并将 Embedding 的结果和原始文本一起插入到 Milvus 中。
本文示例涉及以下参数,请您根据实际环境替换。

该示例使用了 Milvus 2.5 最新的能力,通过创建 bm25_function 对象,Milvus 就可以自动地将文本列转换为稀疏向量。

同样,在处理中文文档时,Milvus 2.5 版本也支持指定相应的中文分析器。
重要
在 Schema 中完成 Analyzer 的设置后,该设置将对该 Collections 永久生效。如需设置新的 Analyzer,则必须重新创建 Collection。
步骤三:全文检索
在 Milvus 2.5 版本中,您可以很方便地通过相关 API 使用最新的全文检索能力。代码示例如下所示。
步骤四:关键词匹配
关键词匹配是 Milvus 2.5 所提供的一项全新功能,该功能可以与向量相似性搜索相结合,从而缩小搜索范围并提高搜索性能。如果您希望使用关键词检索功能,则在定义模式时需要将enable_analyzer
和enable_match
同时设置为 True。
重要
开启 enable_match
会为该字段创建倒排索引,这将消耗额外的存储资源。
示例 1:结合向量搜索的关键词匹配
在此代码示例片段中,我们使用过滤表达式限制搜索结果仅包含与指定词语 “query” 和 “node” 匹配的文档。之后,向量相似性搜索会在已过滤的文档子集上进行。
示例 2:标量过滤查询
关键词匹配还可以用于查询操作中的标量过滤。通过在query()
中指定TEXT_MATCH
表达式,您可以检索与给定词语匹配的文档。在这个代码示例片段中,过滤表达式将搜索结果限制为仅包含与 “scalable” 或 “fast” 匹配的文档。
步骤五:混合检索与 RAG
结合向量搜索和全文检索,通过 RRF(Reciprocal Rank Fusion) 算法融合向量和文本检索结果,重新优化排序和权重分配,提升数据召回率和精确性。

代码示例如下所示。
评论