混合检索是什么
混合检索同时跑两路召回再合并:向量路负责语义近似,关键词路(BM25)负责专名与精确匹配。它解决的是单路召回的盲区问题——用户换个说法时靠向量兜住,出现型号与编号时靠关键词兜住。两路各取几十条候选,融合排序后交给重排与生成。
基本信息
| 组成 | 向量检索 + 关键词检索 + 融合排序 |
|---|---|
| 候选池 | 各路通常取 20 至 100 条,再由重排精挑 |
| 融合方式 | 排名融合(RRF)或归一化后的加权分数融合 |
| 前置条件 | 中文语料必须配好分词器,否则关键词路噪声大 |
两路召回骨架
两路召回骨架
def hybrid_search(q, k=20):
dense_hits = vector_store.search(embed(q), top_k=k)
sparse_hits = bm25_index.search(q, top_k=k)
return fuse(dense_hits, sparse_hits) # 见 RRF / 加权融合融合方式
| 融合方式 | 特点 |
|---|---|
| RRF(排名融合) | 只用排名不用分数,免调权重,跨系统稳定 |
| 加权分数融合 | 先归一化两路分数,权重可调,要防失衡 |
落地检查点
- 先各跑单路基线,记录召回率;混合只有在单路都有贡献时才有意义
- 确认两路的文档 id 体系一致,否则融合时无法判定是否同一片段
- 融合后按内容哈希或 chunk_id 去重,避免同一内容占多个上下文名额
- 用最差场景压测:专名密集的查询与口语化查询各测一批
- 线上保留可切换的单路开关,混合出现异常时可快速降级
上线前给混合与单路各建评测基线,确认混合带来实际收益再保留这份复杂度;若两路结果高度重叠,收益可能不足以覆盖额外延迟。
两路候选怎么配比
两路候选池通常等量起步,但配比要看语料:技术手册专名密集,关键词路的候选可以多给一些;口语化客服语料以向量路为主。融合后要再做一次去重与截断,把条数压到重排能承受的范围(通常不超过一百条),否则精排耗时会把检索阶段的收益吃掉。
融合排序只决定候选进入重排的顺序,不决定最终答案:不要在融合环节追求过高精度,把排序质量的判断交给重排与评测。参数变更后记得同步更新评测基线,避免前后结论不可比。