混合检索是什么?关键词检索与向量检索如何结合?
码海寻道 · 大模型、智能体与 RAG 工程组件系列第 26 篇
向量检索擅长理解语义,但可能忽略精确的产品型号、合同编号、错误码和专有名词;关键词检索擅长精确匹配,却不一定理解同义表达。混合检索的目标,是同时利用两种能力。
混合检索通常不是把两个分数直接相加。不同检索器的分数范围、排序方向和候选数量可能完全不同,必须先做候选去重、分数归一化或使用排名融合,再交给 Reranker。
一、两种检索各自擅长什么?
稠密向量检索
把问题和文档转换为稠密向量,根据语义距离查找相关内容。适合:
- 同义改写;
- 自然语言问题;
- 概念和主题关联;
- 用户表达不规范的场景。
稀疏或关键词检索
根据词项、频率和倒排索引匹配文本。适合:
- 产品型号;
- API 名称和错误码;
- 人名、组织名、合同编号;
- 必须出现的精确词。
二、为什么单一检索会失败?
用户问:“错误码PG-23505如何处理?”
关键词检索很容易定位包含该错误码的文档,而纯语义检索可能认为“数据库唯一约束冲突”与问题相关,却漏掉精确的错误码页面。
反过来,用户问:“员工出差住酒店超标怎么办?”如果文档写的是“住宿费用超出标准的处理流程”,关键词可能匹配不稳定,而向量检索更容易理解语义关系。
三、混合检索的基本流程
用户问题 ├── 稠密 Embedding → 向量检索 → 候选 A └── 关键词 / BM25 → 倒排检索 → 候选 B ↓ 合并、去重、归一化 ↓ RRF 或加权重排 ↓ Top K 结果四、RRF 是什么?
不同检索器的分数通常不可直接比较。余弦相似度、BM25 分数和内积的数值范围可能不同,直接相加容易让某一路结果天然占优。
RRF(Reciprocal Rank Fusion)可以按排名合并:
RRF(d) = Σ 1 / (k + rank_i(d))其中rank_i(d)是文档在第 i 个检索结果中的名次,k是平滑常数。RRF 不要求不同检索器的分数处于同一尺度,工程上较容易使用。
工程上要保存每个候选来自哪些召回通道,便于解释“为什么命中”,也便于分析某个通道是否长期带来噪声。
五、Milvus 中的混合检索思路
Milvus 支持在同一集合中保存稠密和稀疏向量,并通过混合搜索合并结果。伪代码如下:
dense_request=AnnSearchRequest([dense_query],"dense_vector",{"metric_type":"COSINE"},limit=20)sparse_request=AnnSearchRequest([sparse_query],"sparse_vector",{"metric_type":"IP"},limit=20)results=client.hybrid_search(collection_name="knowledge_chunks",reqs=[dense_request,sparse_request],ranker=RRFRanker(),limit=10,)具体方法名和参数随 SDK 版本可能不同,正式实现应参考目标版本文档。混合检索并不是“加两个字段”就完成,还需要同时维护两种向量的生成和版本。
两路召回还应使用相同的租户、权限和文档版本边界,合并时按稳定的chunk_id去重,并记录各通道命中数、融合后命中数和最终排名。
六、如何选择权重?
如果使用加权融合,可以根据查询类型动态调整:
包含错误码、型号、编号 → 提高关键词权重 自然语言解释型问题 → 提高语义权重 无法判断查询类型 → 使用 RRF 或默认权重权重不要凭感觉长期固定。应准备包含精确术语和自然语言问题的评测集,比较 Recall@K、MRR、答案引用正确率和延迟。
七、混合检索不等于最终答案
混合检索得到的是候选集合,还可能需要:
- 按租户和权限过滤;
- 按文档版本过滤;
- 按
document_id去重; - 使用 Reranker 对候选重新排序;
- 控制送入大模型的上下文数量。
稠密 + 稀疏候选 ↓ 融合与去重 ↓ Reranker ↓ 上下文压缩 ↓ 大模型回答八、什么时候不需要混合检索?
如果语料主题单一、用户问题简单、关键词检索效果已经足够,额外引入稀疏向量会增加模型调用、索引和运维成本。不要为了“架构完整”而强行使用混合检索。
九、上线时需要注意什么?
- 稠密和稀疏向量必须对应同一 Chunk;
- 两种索引的更新和删除要保持一致;
- 记录各路召回数量和合并后的数量;
- 监控关键词检索和语义检索的空结果率;
- 对编号、金额和日期等字段增加规则校验;
- 注意混合检索会增加查询延迟和内存占用。
结语
混合检索的价值在于互补:向量检索理解“意思相近”,关键词检索守住“词必须准确”。二者合并后,再通过去重、重排和评测,才能形成适合企业知识库的检索链路。
下一篇将继续优化召回质量,从查询改写、召回数量和 Reranker 讲起。
参考资料
- Milvus 官方文档:Hybrid Search
- Milvus 官方文档:Sparse Vector
- Milvus 官方文档:Full Text Search
- PostgreSQL 官方文档:Full Text Search
本文为“码海寻道”原创技术文章。混合检索 API 和索引能力会随版本变化,请使用目标版本 SDK 实测。