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 与重排参数要按放大后的规模重新估算延迟与成本,并把混合前后作为一次完整回归来评测。