Skip to content

5.4.1 什么是混合检索? ​

先给结论:混合检索可以先理解成:在同一轮检索里,同时使用不止一种召回信号,再把它们的结果合并、排序或融合。最常见的就是把向量检索和关键词检索一起用。

所以它的重点不是“混合”这个词本身,而是:

  • 系统不再把相关性只押在一种信号上

为什么会出现“混合检索”这个思路 ​

因为单一路召回几乎总会有盲点。

比如:

  • 向量检索能覆盖近义表达,但术语命中不一定稳
  • BM25 能命中精确术语,但问法一变就可能漏召回

如果系统只选其中一种,就会天然继承这一种方法的盲区。

混合检索的基本思路就是:

  • 让不同信号一起参与召回
  • 再把它们的结果做统一排序或融合

最常见的混合检索是什么 ​

在 RAG 场景里,最常见的一种混合检索就是:

  • 向量检索 + BM25

也就是说:

  1. 一路用 embedding 做语义召回
  2. 一路用关键词或全文检索做精确匹配
  3. 再把两边结果合并

有的系统还会进一步叠加:

  • 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,本质上是在补单一路召回的盲点,而不是单纯增加复杂度。