Appearance
5.4.1 什么是混合检索?
先给结论:混合检索可以先理解成:在同一轮检索里,同时使用不止一种召回信号,再把它们的结果合并、排序或融合。最常见的就是把向量检索和关键词检索一起用。
所以它的重点不是“混合”这个词本身,而是:
- 系统不再把相关性只押在一种信号上
为什么会出现“混合检索”这个思路
因为单一路召回几乎总会有盲点。
比如:
- 向量检索能覆盖近义表达,但术语命中不一定稳
- BM25 能命中精确术语,但问法一变就可能漏召回
如果系统只选其中一种,就会天然继承这一种方法的盲区。
混合检索的基本思路就是:
- 让不同信号一起参与召回
- 再把它们的结果做统一排序或融合
最常见的混合检索是什么
在 RAG 场景里,最常见的一种混合检索就是:
向量检索 + BM25
也就是说:
- 一路用 embedding 做语义召回
- 一路用关键词或全文检索做精确匹配
- 再把两边结果合并
有的系统还会进一步叠加:
- metadata 过滤
- semantic ranker
- reranker
但“混合检索”的核心,通常先是这一步:
- 让不同召回逻辑并行工作
混合检索不等于简单拼结果
这里要先说清。
混合检索不是:
- 向量搜一下
- BM25 再搜一下
- 两堆结果直接拼起来
更稳的混合检索通常还会考虑:
- 两边结果怎么去重
- 排序分数怎么融合
- 哪一路结果应该权重大一点
- 最终取前多少条进入后续链路
也就是说,真正难的不是“多查一路”,而是:
- 怎么把多路信号组织成更稳的一组候选
一个最小示意
python
vector_results = vector_search(embed(user_query), top_k=10)
bm25_results = bm25_search(user_query, top_k=10)
merged_results = fuse_results(vector_results, bm25_results)
final_results = rerank(merged_results)[:10]这段代码想表达的是:
- 混合检索至少包含两部分:多路召回 + 结果融合
如果只有前半段,没有后半段,系统通常还不够稳。
为什么很多搜索系统会用“融合”而不是“二选一”
因为很多查询本来就同时有两层信号:
- 一层是主题语义
- 一层是精确词项
比如:
- “接口 createOrder 的超时时间”
这里:
- “超时时间”更偏语义主题
createOrder更偏精确术语
如果只选一种检索方式,另一层信号就容易被浪费。
一个常见误区
很多人会把混合检索理解成:
- 给系统多加了一层复杂度
更准确的理解是:
- 它是在给系统补回单一路召回本来就缺失的稳定性
所以混合检索不是为了炫技,而是因为很多真实问题本来就不适合靠单一信号解决。
一句话总结
混合检索就是在同一轮检索中同时使用多种召回信号,再把结果合并和融合。它最常见的形式是向量检索加 BM25,本质上是在补单一路召回的盲点,而不是单纯增加复杂度。