在 RAG(检索增强生成)场景中,检索质量直接影响生成答案的准确性。向量检索擅长语义匹配,传统关键词检索(如 BM25)擅长精确匹配,两者结合可以显著提升召回率,但也会增加延迟。如何平衡?以下是可落地的混合方案。
为什么需要混合检索
- 向量检索:通过嵌入模型将文本映射为向量,计算余弦相似度。优点:理解同义词、上下文。缺点:对罕见词、专有名词、数字不敏感。
- 关键词检索:基于词频统计(如 BM25)。优点:精确匹配,可解释性强。缺点:无法处理语义变化。
混合检索同时执行两种检索,再融合结果,能覆盖更多相关文档,提升召回率。
常见融合策略
- 加权求和:对两种检索的得分归一化后加权。例如向量得分权重 0.7,BM25 权重 0.3。权重需根据业务调参。
- RRF(Reciprocal Rank Fusion):不依赖分数,只利用排名。公式:
score = Σ 1/(k + rank),k 通常取 60。简单有效,推荐作为基线。 - 级联检索:先用关键词检索缩小范围,再对候选集做向量重排。适合数据量大、延迟敏感的场景。
实现步骤(以 Elasticsearch 8.x 为例)
Elasticsearch 8.x 支持 knn 搜索与 query 组合。以下为混合检索示例:
{
"query": {
"bool": {
"should": [
{ "match": { "text": "用户查询" } },
{ "knn": { "field": "embedding", "query_vector": [0.1, 0.2, ...], "k": 10, "num_candidates": 100 } }
]
}
},
"size": 10
}
注意:knn 作为 should 子句时,需设置 boost 调整权重。实际使用请参考官方文档。
若使用 Milvus 或 Qdrant,通常需在应用层分别调用向量检索和关键词检索(如结合 Whoosh 或 Elasticsearch),再用 RRF 融合。
平衡召回率与延迟
- 候选集大小:向量检索的
num_candidates越大,召回率越高,延迟也越高。建议从 100 开始,逐步调整。 - 并行执行:两种检索并行发起,总延迟取决于较慢者。
- 缓存:对高频查询缓存结果,降低重复计算。
- 降级策略:延迟敏感时,可仅用向量检索或关键词检索。
评估指标
- 召回率@k:前 k 个结果中包含相关文档的比例。
- 延迟:P99 延迟(毫秒)。
- MRR:平均倒数排名,衡量相关文档的排名位置。
建议在真实数据集上做 A/B 测试,找到业务可接受的平衡点。
小结
混合检索是提升 RAG 召回率的有效手段。优先尝试 RRF 融合,再根据延迟要求调整候选集大小和并行策略。没有万能参数,持续评估是关键。