BGE 重排模型
BGE 重排系列(bge-reranker-*)是交叉编码器:把查询与候选片段拼成一对输入模型,输出一个相关性分数。与向量检索的双塔结构不同,交叉编码器能看到查询与片段的词级交互,因此精度明显更高,代价是无法预计算、只能对候选池逐条打分,通常放在粗排之后处理几十条候选。中文与多语言场景下 bge-reranker-v2-m3 是常用选择,但加载成本与推理耗时都要按候选条数估算。
基本信息
| 模型类型 | CrossEncoder 交叉编码器 |
|---|---|
| 典型模型 | BAAI/bge-reranker-v2-m3(多语言)、bge-reranker-base/large |
| 输入单位 | (查询, 片段)二元组,逐对打分 |
| 长度上限 | 由 max_length 控制,超长部分被截断 |
| 运行依赖 | sentence-transformers,GPU 可选 |
典型使用场景
- 向量检索后精排:把 top 50 候选压到 top 5 进上下文
- 混合检索融合:稠密与稀疏两路分数不可比时,用重排统一给一个相关性序
- 回答质量回退排查:先看重排分与命中位置,判断是召回问题还是排序问题
- 小语料本地部署:不想调用外部托管 API 时,自建模型可离线运行
- 对比评测:与托管重排服务在同一评测集上比 Recall@n 与人工通过率
加载与批量打分
加载与批量打分
from sentence_transformers import CrossEncoder
model = CrossEncoder('BAAI/bge-reranker-v2-m3', max_length=512)
pairs = [('如何评估召回', '召回率指标定义……'),
('如何评估召回', '向量维度选择……')]
scores = model.predict(pairs, batch_size=16) # 数值越大越相关
ranked = sorted(zip(scores, pairs), key=lambda x: -x[0])
print(ranked[0])参数与观察点
| 参数 | 作用 | 调整建议 |
|---|---|---|
| max_length | 截断长度上限 | 片段超长时优先改切分,不要一味加大 |
| batch_size | 单批打分条数 | 按显存实测,长文本调小 |
| 候选池大小 | 打分条数 | 由粗排召回率定,池外答案救不回来 |
重排分数只在同一次查询内可比较:不同查询之间的绝对值受候选内容影响,不要拿它做全局阈值判断。跨语言片段混排时,语言覆盖不足的模型会把非目标语言片段的分数整体压低。
选型与评估要点
- 先量延迟:候选池条数乘平均长度决定单次重排耗时,秒级预算内要看能否满足
- 再看收益:与不重排的基线在同一评测集上对比 Recall@n 与人工通过率
- 长文档场景优先调切分:让进入重排的片段本身就短而完整
- 上线后持续抽检:查询类型分布变化会让重排收益缓慢下滑