Appearance
L02-09 混合检索:纯向量检索会漏掉关键词命中的文档
全局中心内容:向量擅长语义、BM25 擅长精确词,两者互补,用 RRF 融合不需要调权重。 全局讲解主线:一个漏召案例 → 两种检索的互补性 → RRF 原理 → 权重融合对比 → 编码 → 效果验证。
P1 · 产出页
中心内容:向量 + BM25 双路召回,RRF 融合,漏召率明显下降。
- 讲解技巧
- 开场案例:用户搜「错误码 E1024」,向量检索返回一堆「异常处理概述」,就是没有 E1024 那一页。
- 这个例子极有代入感——专有名词、编号、缩写是向量的死穴。
- 时长:20s
P2 · 为什么向量会漏
中心内容:向量把「E1024」这种低频专有符号的语义稀释掉了。
页面内容:向量检索 top5 结果展示(无一条命中)
讲解技巧
- 解释原理时别讲数学,讲直觉:Embedding 是在语义空间里找近邻,编号和代号几乎没有语义。
- 补一句:同理还有人名、产品型号、内部黑话。
时长:4min
P3 · BM25 补位
中心内容:BM25 是词频+逆文档频率的排序,精确匹配极强。
页面内容:同一 query 的 BM25 top5(第一条命中)
讲解技巧
- 并排展示两路结果,这个视觉反差是本节的记忆点:向量漏的 BM25 命中,BM25 漏的同义表述向量命中。
- 说明 Elasticsearch 自带 BM25,PGVector 场景可以用全文检索或简易倒排。
时长:5min
P4 · RRF 原理
中心内容:RRF 用排名的倒数求和,不需要归一化分数。
页面内容:公式
score = Σ 1/(k + rank),k=60讲解技巧
- 这是本节的核心方法论:强调 RRF 最大的好处是不用调两个通道的权重,因为余弦相似度 0.7 和 BM25 的 12.3 根本不在同一量纲。
- k=60 是经验值,讲清它的作用:k 越大,排名靠前和靠后的差距越被压缩。
时长:6min
P5 · 权重融合的坑
中心内容:加权求和看起来直观,实际很难调。
页面内容:加权融合 vs RRF 的调参成本对比
讲解技巧
- 说明为什么不用加权:分数分布不同、量纲不同、换模型就失效。
- 结论:先用 RRF,效果不够再考虑加权。这句话给学员一个明确的行动顺序。
时长:4min
P6 · 编码:双路召回 + 融合
中心内容:并行执行两路,用 ConcurrentHashMap 收集,超时降级为单路。
页面内容:HybridRetriever 实现;CompletableFuture 编排
讲解技巧
- 重点讲降级:BM25 服务挂了不能让整个检索失败,向量单路继续服务。
- 提醒:并行要用独立线程池,别占用 Web 容器的请求线程。
时长:8min
P7 · 效果验证
中心内容:混合检索的收益要用 recall@k 量化。
页面内容:纯向量 / 纯 BM25 / 混合 三组的 recall@5、recall@10 对照
讲解技巧
- 给一个可预期量级:混合检索通常比纯向量 recall@10 提升 10~20 个百分点。
- 强调必须自己测,不同语料差异很大。
时长:5min
P8 · 成本与代价
中心内容:多一路检索就多一份延迟和运维成本。
- 讲解技巧
- 客观说明代价:需要维护倒排索引、多一次查询、融合逻辑。
- 给出适用判断:有编号/术语/人名的场景必上;纯叙述性文档收益有限。
- 时长:4min
P9 · 避坑与小结
中心内容:召回多不等于答得对,还要精排。
- 讲解技巧
- 引出下一节:现在召回到 20 条,怎么挑出最好的 3 条?——02-10 Rerank。
- 时长:2min
讲师备忘
| 项 | 内容 |
|---|---|
| 课前必做 | 准备「E1024」类专有名词 query 与双路结果对照 |
| 最容易超时处 | P6 编码,CompletableFuture 部分容易展开太多——只讲降级与线程池 |
| 学员最常问 | 「k=60 怎么来的?」答:原始论文经验值,实测 20~100 差异很小 |
| 现场备用 | BM25 服务不可用 → 用内存倒排的简化实现演示融合逻辑 |