重排模型是什么
重排(Rerank)模型是检索链路上的精排环节:向量或关键词召回先给出一批候选(常见 50-100 条),重排模型对「查询 + 文档」成对打分,再取分数最高的几条送进生成。它通常是交叉编码器(cross-encoder),把查询与文档拼在一起编码,精度高于分别编码再算相似度的双塔向量模型;代价是必须逐对计算,无法预先建索引。RAG 答非所问时,先加一层重排往往比换成更贵的生成模型更划算。
基本信息
| 输入 | 查询与候选文档组成的文本对 |
|---|---|
| 输出 | 相关性分数,用于重排序 |
| 位置 | 召回之后、生成之前 |
| 代表模型 | bge-reranker 系列、Cohere Rerank、Qwen 重排模型 |
| 部署 | 小尺寸模型 CPU 可用,大尺寸建议 GPU |
| 延迟 | 随候选数量近似线性增长 |
典型使用场景
- RAG 质量优化:召回结果相关度参差时,用精排把噪声挡在上下文之外
- 多路召回融合:向量与关键词各召回一批,用统一分数排序去重
- 上下文预算紧张:只把最高分的 3-10 条送进生成,节省输入 token
- 搜索结果排序:站内检索、文档门户的相关性排序
- 自建评测闭环:用精排分数辅助定位召回缺失还是排序失准
本地交叉编码器用法
本地交叉编码器用法
# 安装:pip install sentence-transformers
from sentence_transformers import CrossEncoder
# 小尺寸重排模型,CPU 也能跑,适合先验证效果
model = CrossEncoder("BAAI/bge-reranker-v2-m3")
query = "如何申请报销?"
candidates = ["报销流程:登录 OA 提交单据,附发票原件", "年假规则:入职满一年享五天", "发票抬头填写规范"]
scores = model.predict([(query, c) for c in candidates])
# 按分数降序取前 k 条作为生成上下文
ranked = sorted(zip(scores, candidates), reverse=True)[:2]
print(ranked)参数与候选数怎么定
| 参数 | 建议取值 | 原因 |
|---|---|---|
| 初排候选数 | 50-100 条 | 太少会漏掉答案,太多则延迟不可接受 |
| 精排保留数 | 3-10 条 | 进生成上下文,过多会稀释重点并推高成本 |
| 分数阈值 | 不要硬编码绝对值 | 分数分布随模型与语料漂移,宜按分位或相对差距取 |
| 批量大小 | 按显存调整 | 一次打分对数越多吞吐越高,显存也越高 |
重排分数是相对排序信号,不是绝对相关度。跨语料或换模型后旧阈值会失效,需要重新采样分布再定值。
上线前用固定评测集对比加分前后指标(命中率、MRR、答案正确率),确认收益大于延迟与算力开销再保留,否则只是增加成本。