向量数据库实战:选型、调优与落地~系列文章13:混合搜索实战:向量检索 + BM25 关键词,准确率提升 30% 的秘诀

发布时间:2026/7/22 21:25:34
向量数据库实战:选型、调优与落地~系列文章13:混合搜索实战:向量检索 + BM25 关键词,准确率提升 30% 的秘诀 混合搜索实战向量检索 BM25 关键词准确率提升 30% 的秘诀 本文是《向量数据库实战选型、调优与落地》专栏第 13 篇⏱️阅读时间约 13 分钟 开篇纯向量搜索的盲区你有没有遇到过这种情况——用户搜索“Milvus 2.4 版本的新特性”向量搜索返回了一堆关于数据库版本升级的通用内容但就是没有那条精确包含 “Milvus 2.4” 的文档 为什么因为向量搜索擅长语义匹配但对精确关键词不敏感┌─────────────────────────────────────────────────────────┐ │ 两种搜索的互补关系 │ ├─────────────────────────────────────────────────────────┤ │ │ │ 向量搜索语义匹配: │ │ ✅ 怎么退货 → 商品退回流程 │ │ ❌ Milvus 2.4 → 可能返回 Milvus 2.3 的内容 │ │ │ │ BM25 关键词搜索: │ │ ✅ Milvus 2.4 → 精确匹配包含这个词的文档 │ │ ❌ 怎么退货 → 匹配不到 商品退回流程 │ │ │ │ 混合搜索 向量 BM25 → 两者互补 │ │ ✅ 怎么退货 → 向量匹配到 商品退回流程 │ │ ✅ Milvus 2.4 → BM25 精确匹配 │ │ │ └─────────────────────────────────────────────────────────┘ 混合搜索的原理RRFReciprocal Rank Fusion融合算法最常用的融合方式——RRF核心思想很简单RRF 分数 Σ 1/(k rank_i) 其中 - rank_i 在第 i 个搜索系统中的排名 - k 常数通常取 60 示例 文档 A向量搜索排名第 1BM25 排名第 5 → RRF 1/(601) 1/(605) 0.0164 0.0154 0.0318 文档 B向量搜索排名第 3BM25 排名第 2 → RRF 1/(603) 1/(602) 0.0159 0.0161 0.0320 → 文档 B 的 RRF 分数更高最终排名更靠前融合流程┌─────────────────────────────────────────────────────────┐ │ 混合搜索流程 │ ├─────────────────────────────────────────────────────────┤ │ │ │ 用户查询: Milvus 2.4 新特性 │ │ │ │ │ ├──────────────────┐ │ │ ▼ ▼ │ │ ┌──────────┐ ┌──────────┐ │ │ │ 向量搜索 │ │ BM25搜索 │ │ │ │ │ │ │ │ │ │ 结果: │ │ 结果: │ │ │ │ 1.文档C │ │ 1.文档A │ │ │ │ 2.文档A │ │ 2.文档B │ │ │ │ 3.文档B │ │ 3.文档D │ │ │ │ 4.文档D │ │ 4.文档C │ │ │ └────┬─────┘ └────┬─────┘ │ │ │ │ │ │ └────────┬───────┘ │ │ ▼ │ │ ┌──────────────┐ │ │ │ RRF 融合 │ │ │ │ │ │ │ │ 最终排名: │ │ │ │ 1.文档A (综合)│ │ │ │ 2.文档C (综合)│ │ │ │ 3.文档B (综合)│ │ │ │ 4.文档D (综合)│ │ │ └──────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘ 代码实战Milvus 混合搜索frompymilvusimportCollection,AnnSearchRequest,RRFRanker collectionCollection(knowledge_base)collection.load()# 1. 向量搜索请求vector_reqAnnSearchRequest(data[query_embedding],anns_fieldembedding,param{metric_type:COSINE,params:{ef:128}},limit20)# 2. BM25 关键词搜索请求Milvus 2.5 支持全文检索keyword_reqAnnSearchRequest(data[query_text],anns_fieldtext_sparse,# 稀疏向量字段param{metric_type:IP},limit20)# 3. RRF 融合resultscollection.hybrid_search(reqs[vector_req,keyword_req],rankerRRFRanker(k60),# RRF 融合k60limit10)Qdrant 混合搜索fromqdrant_client.modelsimport(Filter,FieldCondition,MatchText,SearchRequest,FusionQuery,Fusion)# Qdrant 的混合搜索resultsclient.query_points(collection_namedemo,queryquery_embedding,usingdense,# 稠密向量prefetch[# 预取先用 BM25 搜索{query:query_text,using:bm25,limit:50}],fusionFusion.RRF,# RRF 融合limit10)Weaviate 混合搜索最简单# Weaviate 原生支持混合搜索responseclient.query.get(Article,[title,content]).with_hybrid(queryMilvus 2.4 新特性,alpha0.5# 0纯BM25, 1纯向量, 0.5混合).with_limit(10).do() alpha 参数调优指南alpha 控制向量和关键词的权重比例alpha 值含义适用场景0.0纯 BM25 关键词搜索精确术语搜索产品型号、版本号0.3关键词为主技术文档、API 名称搜索0.5均衡混合大多数场景推荐0.7向量为主概念性、语义性搜索1.0纯向量语义搜索模糊意图、自然语言问答 alpha 值对结果的影响 查询: Milvus 2.4 新特性 alpha0.0 (纯BM25): 1. Milvus 2.4 Release Notes ← 精确匹配 2. Milvus 2.4 升级指南 3. Milvus 2.3 变更日志 alpha0.5 (混合): 1. Milvus 2.4 Release Notes ← 精确语义 2. Milvus 新版本特性汇总 ← 语义补充 3. Milvus 2.4 升级指南 alpha1.0 (纯向量): 1. 数据库新版本功能介绍 ← 语义匹配但不够精确 2. Milvus 2.4 Release Notes 3. 向量数据库发展趋势 混合搜索 vs 纯向量搜索实测对比测试数据集3000 条技术文档问答对搜索方式Recall5Recall10MRR延迟纯向量85.2%91.3%0.724.2ms纯 BM2572.5%80.1%0.652.1ms混合α0.592.8%⬆️96.5%⬆️0.83⬆️5.8ms混合α0.390.1%95.2%0.805.5ms混合α0.791.5%95.8%0.815.6ms关键结论混合搜索比纯向量搜索 Recall5 提升了 7.6 个百分点alpha0.5 是最佳平衡点 延迟增加约 1.5ms可接受⚙️ 稀疏向量生成方案混合搜索需要稀疏向量用于 BM25怎么生成方案说明推荐度SPLADE学习的稀疏表示效果最好⭐⭐⭐⭐⭐BM25 向量化传统 BM25 转为稀疏向量⭐⭐⭐⭐OpenAI sparse暂无官方支持⭐⭐手动 BM25数据库内置全文索引⭐⭐⭐# 使用 BM25 生成稀疏向量fromragatouilleimportRAGPretrainedModel# 或使用 simple BM25fromrank_bm25importBM25Okapi# 分词tokenized_docs[doc.split()fordocindocuments]bm25BM25Okapi(tokenized_docs)# 查询query_tokensquery.split()scoresbm25.get_scores(query_tokens) 本篇核心要点回顾要点说明为什么需要混合搜索向量搜索对精确关键词不敏感RRF 融合最常用的融合算法简单有效alpha 参数0.5 是大多数场景的最佳选择效果提升Recall5 提升 7-30%延迟代价增加约 1-2ms下篇预告《元数据过滤实战给向量加上标签精准过滤百万级数据 ️》有问题欢迎评论区讨论觉得有用请点赞收藏 作者高炉炼铁智能化技术研究者专注钢铁冶金与人工智能 交叉领域。 如果觉得有帮助请点赞、收藏、转发版权归作者所有未经许可请勿抄袭套用商用(或其它具有利益性行为)。 关注专栏不错过后续精彩内容