RAG混合检索关键词+向量,解决纯向量检索漏召回

纯向量检索虽然能理解语义,但对漏拼写、缩写、商品型号这类字面信息不敏感,经常把真正命中的文档排到后面。
RAG混合检索就是把关键词检索和向量检索同时跑一遍,再合并结果,从而显著减少漏召回。
这篇文章会讲清楚漏召回的原因、混合检索的实现思路,并给出能直接运行的示例和验证方法,适合正在做RAG应用开发或者检索优化的读者。

纯向量检索漏召回,到底漏在哪

向量检索是把文本映射成高维向量,然后按余弦距离找相似。
问题在于它只认语义,不认字面。
比如搜索 BERT-base,向量检索很可能召回一堆 Transformer 相关的内容,却漏掉字面完全匹配的文档。
再比如代码函数名 getPrice,语义向量很难覆盖这种拼写型关键词。

另一个原因来自向量模型本身:训练数据里低频词、专有名词、混合语言的表示往往不稳定,导致这些文档的向量偏离真实语义。
结果就是,按向量相似度排序时,真正包含关键词的文档排不到前面,这就是漏召回。

混合检索:关键词兜底,向量补语义

混合检索的思路很简单:两路独立检索,最后合并。

  • 关键词检索:用 BM25 或 Elasticsearch 的 match 查询,确保字面命中的文档一定出现在候选集里。
  • 向量检索:用 embedding 模型做语义召回,把“意思一样但说法不一样”的内容找回来。

合并方式常用 RRF(Reciprocal Rank Fusion),
核心思想是给每一路结果按排名加权,
而不是直接比较分数,
因为两类检索的分数不可比。混合检索不是简单叠加,
而是用关键词召回兜住准确率,
用向量召回提升召回率,
最终让结果更完整。

用 Python 快速实现关键词+向量混合检索

下面是一段可运行的简化示例,假设已有文档列表 docs

from rank_bm25 import BM25Okapi
from sentence_transformers import SentenceTransformer
import numpy as np

# 准备文档
# docs = ["文档1内容", "文档2内容", ...]

# 关键词检索 BM25
bm25 = BM25Okapi([doc.split() for doc in docs])
bm25_hits = bm25.get_top_n(query.split(), docs, n=10)

# 向量检索
model = SentenceTransformer('BAAI/bge-small-zh-v1.5')
query_vec = model.encode(query)
doc_vecs = model.encode(docs)
vec_scores = np.dot(doc_vecs, query_vec)
vec_hits = [docs[i] for i in np.argsort(vec_scores)[::-1][:10]]

# RRF 合并

def rrf(rank_lists, k=60):
    score = {}
    for rank_list in rank_lists:
        for i, doc in enumerate(rank_list, 1):
            score[doc] = score.get(doc, 0) + 1 / (k + i)
    return [doc for doc, _ in sorted(score.items(), key=lambda x: x[1], reverse=True)]

final_results = rrf([bm25_hits, vec_hits])

生产中不推荐自己写 RRF,直接使用 Elasticsearch 8.11 以上自带的 rank: rrf 查询,或者用 Milvus 的混合检索功能,效率和稳定性更好。

配置时的三个高频坑

第一,两路候选集大小不一致。 BM25 取 10 条,向量取 100 条,融合后向量那路会占据排名优势。
建议两路都取相同的 top N,比如各取 20 条。

第二,RRF 的 k 值不是必须动的。 k 默认 60,调小会让排名靠前的结果权重更高,调大则更平滑。
业务不复杂时保持默认,优先观察结果分布。

第三,中文检索一定要做分词。 直接用 split() 会把“混合检索”拆成“混合”“检索”,效果差。
生产环境用 ES 的 ik 分词器或 jieba 预分词,否则关键词这路等于没有。

怎么验证召回率真的提升了

准备一组测试问题,每个问题标注至少一条“应召回”的文档。
然后分别运行纯向量检索和混合检索,统计 top 10 内命中的比例。

一个可行的实验:
构造 100 条查询,
其中 30 条包含明显关键词(如型号、
缩写),
分别计算 Recall@10。如果混合检索的召回率显著高于纯向量,
说明双路方案在你的数据上有效。
另外也检查一下最终排序中是否有无关结果混入,
避免因为添加关键词路导致准确率下降。

如果你正在处理 RAG混合检索关键词+向量,解决纯向量检索漏召回,建议先按本文思路搭建双路检索,再根据业务数据调整融合参数。
遇到异常时,优先检查分词、向量质量、融合权重这三项。

分享到:
上一篇
Agent任务超时处理,长时间运行任务心跳与超时终止
下一篇
Agent访问外部代理配置,Agent网络出口统一代理池
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意