核心要点

  • 能讲清为何多路:单一召回有盲区,向量擅长语义、关键词擅长精确匹配、不同 chunk 粒度覆盖不同信息密度,多路互补能显著提高召回率

  • 能列出常见通路:向量检索、关键词 BM25、不同 embedding 模型、不同 chunk 粒度、知识图谱/结构化检索,各自并行召回 Top-K

  • 能说清融合方式:RRF(倒数排名融合,只看排名不调权重)、加权求和(需分数归一)、可学习重排(交叉编码器对合并候选精排)

  • 能讲动态权重:按各路在验证集上的贡献离线调权,或按 query 类型在线切换——事实型偏关键词、语义型偏向量

标准回答

为什么要多路召回

任何单一召回策略都有盲区:纯向量检索对专有名词、编号、术语的精确匹配偏弱,纯关键词 BM25 又抓不住同义改写与语义近似。多路召回让多条通路并行各召回一批候选,再融合去重,本质是用互补性把整体召回率拉高——某一路漏掉的,另一路往往能补上。

常见通路包括:向量检索(语义)、关键词 BM25(精确匹配)、换用不同 embedding 模型(捕捉不同语义分布)、不同 chunk 粒度(小块精准定位、大块保留上下文)、以及知识图谱或结构化字段检索。每路独立取 Top-K。

多路结果如何融合

第一类是 RRF(Reciprocal Rank Fusion,倒数排名融合):每个文档在某一路的得分取 1/(k + rank),k 常取 60,再把各路相加。它只用排名、不依赖原始分数,因此天然规避了不同召回分数量纲不一致的问题,几乎不用调参,是工程上的稳妥默认。

第二类是 加权求和:先把各路分数归一化到同一量纲(如 min-max 或 z-score),再按权重相加。权重既可离线在验证集上按各路贡献度调出,也可在线按 query 类型动态切换。

第三类是 可学习重排:把多路合并去重后的候选集喂给交叉编码器 reranker 做精排,让模型直接学融合排序,效果通常最好但延迟和成本更高。

动态权重怎么分配

离线侧,用一份带标注的验证集,衡量每路单独召回的命中贡献,按贡献给定基础权重。在线侧,先对 query 做轻量分类或意图识别:事实型、含编号/术语/专名的查询调高关键词权重,开放型、语义复述类查询调高向量权重。更进一步可做可学习的门控,由小模型根据 query 特征输出各路权重。无论哪种,融合后都要做去重(同一文档多路命中需合并取最高贡献)并截断到最终 Top-N。

常见误区

⚠️ 常见踩坑

别在不归一化的情况下直接把各路原始分数相加——向量余弦相似度和 BM25 分数量纲完全不同,直接相加会让某一路压倒性主导。要么先归一化再加权,要么用只看排名的 RRF 彻底绕开量纲问题;另外别忘了多路命中同一文档时的去重合并。

追问

追问 1RRF 和加权求和该怎么选?

没有调参资源、各路分数不可比时优先 RRF,开箱即用且稳健;如果有验证集且想精细控制各路影响、或某些路明显更可信,用归一化后的加权求和。两者也可叠加:先 RRF 粗融合,再用 reranker 精排。

追问 2多路召回会不会拖慢延迟?怎么优化?

各路检索本身互相独立,应并行发起而非串行,整体延迟约等于最慢一路。还可对低收益的路设更小 Top-K、对高频 query 缓存召回结果、把重排放在融合去重后的小候选集上,避免对全量候选跑交叉编码器。

追问 3如何评估多路召回比单路更好?

用带标注的检索评测集,对比单路与多路融合后的召回率(Recall@K)、命中率和 MRR/nDCG;同时做消融,逐路加入观察增量贡献,确认每路都有正向边际收益,否则该路可裁掉以省成本。

🔗 相似问题

同一考点的不同问法,面试官可能换着问,一起刷更稳

没找到想看的面试题?把你想看的告诉我们 →

延伸学习

按主题分类的相关资源,便于系统复习