重排序模型:检索精排

检索常分两阶段:先用向量召回(Embedding)快速粗筛,再用重排序(Reranker)精细打分重排。重排序模型把查询与候选同时输入,给出更准确的关联分数,弥补向量召回的语义模糊。

交叉编码器原理

重排序多用交叉编码器(cross-encoder):把查询与文档拼接送入模型,经自注意力交互后输出一个相关性分数。因 query 与 doc 早期交互,精度高于仅比向量的双编码器,但无法离线建库,只能对少量候选打分。

from sentence_transformers import CrossEncoder
reranker = CrossEncoder("BAAI/bge-reranker-large")
pairs = [("用户问题", doc) for doc in candidate_docs]
scores = reranker.predict(pairs)        # 逐对相关性打分
ranked = [d for _, d in sorted(zip(scores, candidate_docs), reverse=True)]

与召回的配合

典型流程:向量召回取前 100 候选,重排序对这 100 个重排取前 10。这样既保召回广度,又得精排精度,是 RAG 与搜索的常用组合。

小结

重排序模型以交叉编码器对查询与候选联合打分,弥补向量召回的语义误差,常与初召回级联使用,显著提升最终检索精度。

参考与延伸阅读

本文累计阅读