首页/AI/RAG 与向量库速查/Milvus 混合检索与重排器

Milvus 混合检索与重排器

Milvus 2.4 起支持多向量混合检索:对同一集合的多个向量字段发起多路 search,用 Ranker(如 RRFRanker、WeightedRanker)在服务端融合,减少应用层拼装。

RAG 与向量库速查AI更新于 2026-10-13

Milvus 混合检索是什么

Milvus 2.4 起支持在同一个集合里对多个向量字段发起多路检索,并用服务端重排器把结果融合成一个序列:稠密字段抓语义,稀疏字段(或另一路向量)补专名与精确词形。融合在服务端完成的好处是少了应用层拼装与二次请求,代价是要理解各重排器的参数语义。不确定两路分数可比性时优先用 RRF,它只看排名不看分数,天然规避量纲问题。

基本信息

版本要求Milvus 2.4 及以上的多向量混合检索能力
接口client.hybrid_search,参数为多个 AnnSearchRequest
重排器RRFRanker(按排名融合)、WeightedRanker(按权重加权)
字段要求同一集合内的向量字段,各自建索引
限制混合检索不等同于跨集合检索

典型使用场景

  • 稠密 + 稀疏双路:语义召回与关键词召回的经典组合,中文专名场景收益明显
  • 多模态或双模型:图像与文本各一路向量,融合后统一排序
  • 替换应用层拼装:把原本要发两次请求、在客户端合并的逻辑收敛到一次调用
  • 对照实验:RRF 与 WeightedRanker 在同一评测集上比 Recall@k,用数据选重排器
  • 降低误召回:稀疏一路把型号、命令名精确命中,减少稠密一路的语义漂移

字段与融合检索

字段与融合检索
schema.add_field('dense', datatype='FLOAT_VECTOR', dim=1024)
schema.add_field('sparse', datatype='SPARSE_FLOAT_VECTOR')
# 分别建索引:dense 用 HNSW,sparse 用 SPARSE_INVERTED_INDEX

from pymilvus import AnnSearchRequest, RRFRanker
r1 = AnnSearchRequest(data=[dense_q], anns_field='dense', param={'ef': 64}, limit=20)
r2 = AnnSearchRequest(data=[sparse_q], anns_field='sparse', param={}, limit=20)
res = client.hybrid_search('kb', [r1, r2], RRFRanker(60), limit=10,
                           output_fields=['source'])   # 服务端融合

两种重排器对比

重排器依据适用与注意
RRFRanker各路排名位置两路分数不可比时的稳妥选择,无需调权重
WeightedRanker各路分数加权和分数已归一化时才用,权重需要评测确定
单路检索—先量基线收益,再决定是否值得加一路
混合检索会成倍放大候选量与计算量:limit 与重排参数要按放大后的规模重新估算延迟与成本,并把混合前后作为一次完整回归来评测。

易错点

  • 两路 anns_field 与查询向量类型不匹配,报错信息不易按字面理解,排查耗时
  • 不同重排器的排名参数语义相近但位置不同,迁移时传错参数而结果悄然变化
  • 两路分数未归一化就直接加权,其中一路完全压制另一路
  • 混合检索后未去重,同一片段被两路各召回一次,占满上下文位置
  • 只提高混合检索的召回却不看延迟,服务端融合带来的响应时间增长被忽略

数据来源与参考

  • Milvus 官方文档(Multi-Vector Hybrid Search / Ranker)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌