三十一:Rerank模型自测题答案¶
来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247484373&idx=1&sn=16561dbad7ab0e81b540938251cbf158&chksm=f01eb0acc76939ba3cc0f0f90521229701c0b8f3ad2536c04be34aaa4e4ecb3004f12a31e6f2#rd
参考资料¶
-
BGE-M3 paper:https://arxiv.org/abs/2402.03216
-
BGE reranker model card:https://huggingface.co/BAAI/bge-reranker-v2-m3
-
Jina Reranker v2 model card:https://huggingface.co/jinaai/jina-reranker-v2-base-multilingual
-
Jina Embeddings 2 paper:https://arxiv.org/abs/2310.19923
-
mGTE paper:https://arxiv.org/abs/2407.19669
-
GTE multilingual reranker:https://huggingface.co/Alibaba-NLP/gte-multilingual-reranker-base
-
Qwen3-VL Embedding / Reranker paper:https://arxiv.org/abs/2601.04720
一、模型定位与基础概念¶
1. RAG 中 reranker 的位置是什么?它和 retriever 的职责有什么区别?¶
答案: Reranker 位于召回之后、上下文注入 LLM 之前。Retriever 从大规模文档中快速找候选,目标是高召回;reranker 对少量候选做精细排序,目标是把最能回答问题的证据排到前面。评分点:说出二阶段检索、召回和精排职责、top-n 到 top-k。
2. 为什么 embedding bi-encoder 通常适合召回,而 cross-encoder reranker 更适合精排?¶
答案: Bi-encoder 把 query 和 document 分别编码成向量,文档向量可离线预计算,适合百万级召回。Cross-encoder 把 query 和 document 一起输入,能做 token 级交互,相关性判断更细,但每个候选都要过模型,成本更高。评分点:离线向量、相似度、pair 输入、精度和延迟权衡。
3. 请解释 query-document pair 输入方式,以及它为什么能提升相关性判断。¶
答案: Query-document pair 指把 [query, document] 共同送入模型,让 attention 同时看到问题和候选文本。这样模型能判断实体是否对应、条件是否满足、否定是否一致、数字是否匹配,而不是只看整体语义相近。常见输出是一个 relevance score。
4. Rerank 是否能解决“相关文档完全没有被召回”的问题?为什么?¶
答案: 不能。Reranker 只能重排已有候选,如果 first-stage retrieval 没有召回相关文档,reranker 没有材料可排。此时应优化 query rewrite、chunking、BM25+dense hybrid、索引字段、top-n 或召回模型。
5. Reranker 输出的分数是否一定可以跨 query 比较?生产中应该怎么使用?¶
答案: 不一定。很多 reranker 输出的是 logit 或未校准分数,同一 query 内排序通常可靠,但不同 query 的分数分布可能不同。生产中优先用于同一 query 下排序;若要阈值过滤,需要在业务验证集上做校准,并监控分布漂移。
6. 常见 reranker 架构有哪些?请比较 cross-encoder、late interaction 和 LLM-as-reranker。¶
答案: Cross-encoder 精度强、速度慢,适合 top-50 精排。Late interaction 如 ColBERT 保留 token 级向量,精度和可扩展性折中。LLM-as-reranker 表达力强,可判断证据充分性和复杂指令,但成本高、延迟大、稳定性和可复现性较弱。
7. 选择 rerank 模型时,除了榜单分数,还要关注哪些工程维度?¶
答案: 关注语言、输入长度、任务类型、部署方式、许可证、模型大小、batching 能力、输出分数校准、训练数据、hard negative 能力、评估指标、P95 延迟和单位查询成本。评分点:不能只说“看 MTEB 分数”。
8. 为什么 rerank 会增加延迟?候选数和输入长度分别如何影响成本?¶
答案: Rerank 增加延迟是因为每个候选都要和 query 共同推理。候选数 top-n 增大,推理次数近似线性增加;输入长度增大,Transformer attention 成本和显存压力会明显增加。模型越大,batch 越小,延迟越高。
9. Rerank top-n 到 top-k 的 n 和 k 应该如何设置?¶
答案: 常见起点是召回 top-50 或 top-100,rerank 后保留 top-3 到 top-10。n 要保证召回覆盖答案,k 要适配 LLM 上下文长度和答案需要。调参时同时看 Recall@n、nDCG@k、答案 groundedness、延迟和成本。
10. 在中文知识库、多语言知识库、代码知识库、多模态知识库中,reranker 选型有什么差异?¶
答案: 中文知识库可优先 BGE reranker。多语言场景测 BGE v2-m3、Jina、mGTE。代码、SQL、函数调用场景可重点测 Jina 或专门代码 reranker。多模态知识库需要 Qwen3-VL Reranker 这类可处理图像、截图、视频或视觉文档的模型。
二、BGE Reranker v2-m3¶
11. bge-reranker-v2-m3 属于什么类型的模型?适合放在 RAG 的哪个阶段?¶
答案: 它是多语言 cross-encoder reranker,适合放在 RAG 的二阶段精排阶段。输入 query-passage pair,输出相关性分数,用于把 retriever 召回的候选重排。
12. BGE-M3 的 M3 分别代表什么?它和 bge-reranker-v2-m3 是什么关系?¶
答案: BGE-M3 的 M3 指 Multi-Linguality、Multi-Functionality、Multi-Granularity。BGE-M3 是 embedding / retrieval foundation model,支持 dense、sparse、multi-vector 等能力;bge-reranker-v2-m3 是基于 BGE-M3 的 cross-encoder reranker。
13. bge-reranker-v2-m3 的输入输出形式是什么?¶
答案: 输入是一组 [query, passage] pair,输出是每个 pair 的相关性 score。高分表示 passage 更可能回答 query。实际使用中按同一 query 的 score 对候选降序排列。
14. 为什么说它的原始分数通常更适合同一 query 下排序,而不是直接做全局阈值?¶
答案: 原始分数通常是模型 logit,不一定经过概率校准。不同 query 的难度、长度和候选分布不同,score 分布也不同。因此同一 query 内排序可靠性更高,全局阈值需要业务标注集校准。
15. 使用 FlagEmbedding 调用 BGE reranker 时,normalize=True 和 max_length 分别影响什么?¶
答案: normalize=True 常把 logit 通过 sigmoid 变成 0 到 1 附近的分数,便于展示和粗略阈值,但不保证是真概率。max_length 控制 query-passage pair 的截断长度,影响是否丢失证据、显存、吞吐和延迟。
16. bge-reranker-v2-m3 相比早期中英 reranker 的主要优势是什么?¶
答案: 主要优势是多语言能力更强,基于 BGE-M3,工程生态成熟,适合中文、英文和跨语言 RAG。相比早期 base/large 中英模型,它更适合多语言和较长输入场景。
17. 你会如何把 BGE reranker 接入一个已有 embedding RAG 系统?¶
答案: 流程是:保留已有 embedding retriever,先召回 top-50 或 top-100;构造 [query, chunk_text] pairs;批量调用 BGE reranker;按 score 降序;保留 top-5 左右 chunk;把这些 chunk 和引用信息交给 LLM。上线前对比 embedding-only 的 nDCG、答案正确率和 P95 延迟。
18. 如果 rerank 后答案质量没有提升,你会从哪些方向排查?¶
答案: 先看召回是否包含答案;再看 chunk 是否把证据切断;检查 max_length 截断;检查 top-n 是否太小;分析 hard negatives 是否被排高;对比中文、英文、长文档不同子集;最后看 LLM prompt 是否正确使用 top-ranked evidence。
19. 在高 QPS 服务中使用 BGE reranker,需要做哪些延迟优化?¶
答案: 优化手段包括减少 top-n、控制 max_length、批量推理、FP16/BF16、GPU 服务化、缓存热门 query 结果、异步 rerank、轻量模型 fallback、按 query 类型跳过 rerank,以及在召回阶段用 RRF 提高候选质量。
20. 面试中如果只能熟悉一个 reranker,你会如何完整介绍 BGE reranker v2-m3?¶
答案: 完整介绍应包含:它是 BGE Reranker v2 系列的多语言 cross-encoder;基于 BGE-M3;输入 query-passage pair,输出 relevance score;用于 RAG top-n 候选精排;优点是中文/多语言效果稳、开源易部署;限制是延迟、截断、分数校准和不能弥补召回缺失。
三、其他热门模型¶
21. Jina Reranker v2 的主要特点是什么?它和 Jina Embeddings v2 有什么区别?¶
答案: Jina Reranker v2 是多语言 cross-encoder reranker,强调 function calling、SQL、代码检索和 agentic RAG。Jina Embeddings v2 是 embedding 模型,重点是 8192-token long-document embedding;Jina Reranker v2 是 pairwise 精排模型,不能混为一谈。
22. 为什么 Jina Reranker v2 会被用于 function calling、SQL、代码检索等 agentic RAG 场景?¶
答案: 因为这类场景不仅要语义相似,还要判断函数参数、工具描述、schema 字段、代码符号和约束是否匹配。Cross-encoder 可以同时看 query 与候选工具或代码片段,做更细粒度的对齐。
23. mGTE / GTE multilingual reranker 的核心特点是什么?¶
答案: mGTE / GTE multilingual reranker 强调多语言、长上下文和高效文本表示。GTE multilingual reranker 支持 70+ 语言和 8192 token 级输入,适合长段落、法规、论文、说明书等长文本候选精排。
24. 长上下文 reranker 是否一定比短上下文 reranker 更好?请说明权衡。¶
答案: 不一定。长上下文减少截断,但会增加显存和延迟,也可能引入更多噪声。短 chunk 加合理召回和 rerank 有时更稳。是否需要长上下文,要看证据是否跨越长段落、截断率、P95 延迟和端到端答案收益。
25. Qwen3-VL Embedding / Reranker 主要面向什么场景?¶
答案: Qwen3-VL Embedding / Reranker 面向多模态检索:文本、图像、文档截图、视频、图文混合输入。适合 PDF 页面检索、截图问答、商品图文检索、视频片段匹配和视觉文档 RAG。
26. 多模态 reranker 和纯文本 reranker 的输入、训练目标和使用场景有什么区别?¶
答案: 纯文本 reranker 通常输入 query 和 text passage。多模态 reranker 可能输入文本 query 与图像、截图、视频帧或图文混合文档,需要视觉编码器和跨模态对齐训练。它解决的是跨模态相关性,而不仅是文本语义相关性。
27. LLM-as-reranker 的优点和缺点是什么?¶
答案: LLM-as-reranker 能理解复杂指令、可做 listwise 比较、可判断证据是否足够支持答案;缺点是成本高、延迟高、输出不稳定、难以批量化,且需要严格提示词和结构化输出校验。
28. 如果业务数据包含中英混合、PDF 截图、代码片段,你会如何设计候选模型对比实验?¶
答案: 设计多路实验:文本用 BGE v2-m3;代码/SQL/函数候选加入 Jina;长文档加入 GTE/mGTE;截图/PDF 页面加入 Qwen3-VL。统一使用同一批标注 query,比较 nDCG@5、MRR@10、答案 groundedness、P95 延迟和成本,再按业务子集选择组合。
四、评估与调参¶
29. Rerank 离线评估常用哪些指标?nDCG@k、MRR@k、Recall@k 分别关注什么?¶
答案: Recall@k 关注相关文档是否进入 top-k;MRR@k 关注第一个相关文档的位置;nDCG@k 同时考虑相关性等级和排序位置;Precision@k 关注 top-k 中相关比例。Rerank 最常看 nDCG 和 MRR,因为它直接改变排序。
30. 为什么评估 rerank 不能只看检索指标,还要看最终 RAG 答案指标?¶
答案: 因为 RAG 质量还受 prompt、LLM、chunk 拼接、引用策略影响。检索指标提升不一定等于答案更好;可能 top-k 更相关但证据冗余、上下文过长、关键信息被压到后面。最终要看 answer correctness、groundedness 和 citation accuracy。
31. 如何构造一个比较 embedding-only 和 embedding + rerank 的实验?¶
答案: 构造固定测试集和标注相关文档。Baseline 是 embedding top-5 直接给 LLM。Variant 是 embedding top-50 -> rerank top-5 -> LLM。保持 LLM、prompt、chunk 不变,比较检索指标、答案指标、延迟和成本。
32. 什么是 hard negative?为什么 reranker 训练和评估都需要 hard negative?¶
答案: Hard negative 是表面相似但不相关或不足以回答问题的负例。Reranker 如果只见简单负例,会学得很浅;hard negative 能训练模型区分“语义接近”和“证据真正支持”。评估集中也需要 hard negative 才能暴露错排。
33. Reranker 的 top-k precision 提升但最终答案变差,可能是什么原因?¶
答案: 可能原因:top-k 过少导致多跳证据丢失;reranker 偏好短而相似的段落;LLM 需要背景信息但被 rerank 去掉;chunk 顺序打乱影响阅读;prompt 没要求引用最高分证据;或标注指标和答案指标不一致。
34. 如何判断 reranker 是否过度偏向语义相似,而不是证据充分性?¶
答案: 人工抽样 top-ranked false positives,看它们是否只是主题相似但缺少关键事实。构造 hard negative 集合,如同实体不同属性、同主题不同版本、否定条件、数字不一致。若这些负例经常排高,说明模型对证据充分性不足。
35. 文档 chunk 太长或太短会如何影响 rerank?¶
答案: 太长会导致截断、噪声增加、延迟变高;太短会切断证据,导致 passage 无法独立回答问题。理想 chunk 应该语义完整,有标题和元数据,长度与 reranker max_length 和 LLM context 匹配。
36. rerank 分数分布漂移时,线上阈值过滤可能出现什么问题?¶
答案: 全局阈值可能导致简单 query 保留过多无关文档,困难 query 过滤掉所有候选。分布漂移时,线上召回为空、答案缺证据或成本异常都可能出现。应做 query 分桶校准,并保留 top-k 兜底。
37. 如何为 reranker 设计线上降级策略?¶
答案: 降级策略包括:高峰期减少 top-n;使用更小 reranker;只对低置信 query rerank;超时返回 embedding 排序;缓存热门 query;异步补充 rerank;根据业务类型决定是否跳过 rerank。
38. 请写一个伪代码流程:hybrid retrieval top-100 -> rerank -> top-5 -> LLM。¶
答案: 伪代码:
query = rewrite(user_query)
bm25_hits = bm25.search(query, top=100)
dense_hits = vector.search(query, top=100)
candidates = rrf_fusion(bm25_hits, dense_hits, top=100)
pairs = [[query, c.text] for c in candidates]
scores = reranker.score(pairs)
ranked = sort_by_score(candidates, scores)
contexts = ranked[:5]
answer = llm.generate(query, contexts)
39. 请写一个简单的 BGE reranker 调用代码片段,包含 query、documents、排序输出。¶
答案: 示例:
from FlagEmbedding import FlagReranker
query = "RoPE 为什么能体现相对位置?"
docs = [
"RoPE 对 Q 和 K 按位置做旋转,内积会依赖相对距离。",
"LayerNorm 用于稳定 Transformer 训练。",
"BM25 根据词频和逆文档频率进行稀疏检索。",
]
reranker = FlagReranker("BAAI/bge-reranker-v2-m3", use_fp16=True)
pairs = [[query, doc] for doc in docs]
scores = reranker.compute_score(pairs, normalize=True, max_length=1024)
ranked = sorted(zip(docs, scores), key=lambda x: x[1], reverse=True)
for doc, score in ranked:
print(round(score, 4), doc)
40. 给你 500 条人工标注 query 和相关文档,你会如何做 reranker 选型和上线验收?¶
答案: 做法:划分验证集和保留测试集;候选模型至少包括当前 baseline、BGE、Jina/GTE 等;固定召回候选,比较纯 rerank 能力;再做端到端 RAG 比较;按中文、多语言、长文档、代码等子集分析;上线验收看 nDCG@5、answer groundedness、P95 延迟、成本和失败样例;灰度发布并监控分数分布和无答案率。
预览时标签不可点
<div class="