检索与重排序
检索阶段的目标是召回覆盖,重排的目标是排序精度。两件事分开做:先宽召回,再精排,别指望一步到位。
向量检索与 BM25 互补
| 检索方式 | 擅长 | 搞不定 |
|---|---|---|
| 向量检索 | 语义相似、同义词、抽象概念 | 精确匹配:产品型号、错误码、函数名 |
| BM25 关键词 | 精确匹配专名、编号、代码标识符 | 语义理解:搜“怎么退订”,文档写的是“取消订阅” |
向量检索理解“意思”,关键词检索抓住“字面”。用户问 “ERR-4023 怎么解决”,向量检索可能召回一堆语义相近但无关的错误处理文档,BM25 精确命中那个错误码。这就是混合检索成为生产标配的原因。
混合检索
混合检索 + 重排的两阶段管线
融合是混合检索的关键。不能把两路分数直接相加:余弦相似度在 0 到 1 之间,BM25 是无上界的正分,量纲不同,直接加权某一路会完全主导。
**RRF(Reciprocal Rank Fusion)**是稳健默认:只看排名不看分数,score(d) = Σ 1/(k + rank_i(d)),k 通常取 60。某一路排名靠前就给高分,天然完成了跨量纲融合和去重。Cormack 等人 2009 年提出,Elasticsearch、OpenSearch、Azure AI Search 都内置。
备选是分数归一后加权求和(min-max 或 z-score),权重按场景调:术语编号多的知识库调高 BM25,概念性内容调高向量。没有标注数据时从均等权重或 RRF 起步。
重排:两阶段的第二段
重排用交叉编码器(Cohere Rerank、bge-reranker),query 和候选块拼接打分,比双编码器精细得多。经验值:粗召回 Top-50,精排后取 Top-5 到 10 进上下文。Anthropic 的实测里,混合检索加 Rerank 的效果可以叠加,top-20 进 Prompt 比 top-5 更有效。
重排不是必须的:延迟敏感或候选已经很准的场景可以省略。但上下文窗口紧张、答案质量敏感时,重排把最相关的少数片段顶到前面,收益明确。
面试追问
- 为什么纯向量检索不够? 向量对精确匹配弱:产品型号、错误码、专名。BM25 对语义改写弱。两者互补
- RRF 是什么? 倒数排名融合,只看排名不看原始分数,score = Σ 1/(k+rank),k 取 60。绕开量纲问题,免调参
- 为什么不能直接把两路分数相加? 量纲不同:余弦在 0 到 1,BM25 无上界。直接加权某一路主导,混合检索退化成单路
- 重排用什么模型? 交叉编码器,query 和文档拼接打分。双编码器粗召回、交叉编码器精排,标准两阶段管线
- 什么场景不需要重排? 延迟极敏感或候选已经很准。混合检索解决召回覆盖,重排解决排序精度,按需取舍