重排序模型:检索精排
检索常分两阶段:先用向量召回(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 与搜索的常用组合。
小结
重排序模型以交叉编码器对查询与候选联合打分,弥补向量召回的语义误差,常与初召回级联使用,显著提升最终检索精度。
参考与延伸阅读
- “Sentence-BERT”(含交叉编码器思路, Reimers 等, 2019)。已核验。https://arxiv.org/abs/1908.10084
- Hugging Face Sentence-Transformers 文档首页。已核验。https://huggingface.co/docs/sentence-transformers/
本文累计阅读 — 次