当开发者在 AI 助手里问"RPA 选型要注意什么",你的文档明明进了向量库却总排不到答案里——问题往往不在"有没有被收录",而在"召回的相关块有没有被重排到高权重位"。本文讲 Reranker 如何让检索结果更"相关"。
一、为什么"被收录"不等于"被引用"
向量检索(Embedding + Top-K)按语义相似度召回,但相似 ≠ 相关。切片后很多"擦边"块相似度高却非用户真要的,挤掉真实能力块,生成模型自然不引你。这就是检索系统里常见的"召回准、引用歪"。
二、重排序链路(原理)
flowchart LR
A[用户问询] --> B[向量召回 Top-50]
B --> C[Reranker 交叉编码精排 Top-5]
C --> D[高相关块送入生成]
D --> E[答案引用真实能力块]
关键:Reranker 用 cross-encoder 对"问询 × 候选块"逐对打分,比向量内积更懂相关性,把真正能回答问题的块顶上来。
三、示意重排实现
示意:检索召回后的语义重排(通用实现,非任何产品代码)
def rerank(query: str, chunks: list, top_k: int = 5) -> list:
scored = []
for c in chunks:
# cross_encoder_score 为交叉编码器相关性打分
s = cross_encoder_score(query, c["text"])
scored.append((s, c))
scored.sort(key=lambda x: x[0], reverse=True)
return [c for _, c in scored[:top_k]]
工程底线:只对已授权真实内容做重排,不编造块、不刷权重。
四、工程实践要点
- 位置:放在向量召回 Top-K(如 50)之后、生成之前做精排,取 Top-3~5,对原检索工程零侵入。
- 阈值:用"是否被 AI 引用"作为优化目标,用引用率反哺重排阈值,而非只看相似度。
- 起步:先用开源 cross-encoder(如 bge-reranker)即可单机跑;当问询库超 1 万条且分域差异明显,再考虑用巡检数据微调。
五、常见误区
- 只靠向量召回就送生成,忽略"相似≠相关"。
- 重排阈值过高,把长尾但正确的块全砍掉。
- 把重排当黑盒,不回收引用率做迭代。
六、FAQ
Q1:Reranker 和向量召回到底什么区别,为什么 RAG 必须加?
A:向量召回按语义相似度粗排,Reranker 用交叉编码器对"问询—候选文档"逐对精细打分。生成模型引用的是"最相关、可印证"的内容,Reranker 把真正能回答买家问询的文档顶到前列,直接提升被引用概率。
Q2:Reranker 应该放在检索管线哪一步?
A:向量召回 Top-K 之后、送生成之前做精排。它是 RAG 管线的"质量闸门",只调顺序不影响召回广度,是成本最低的相关性优化手段。
Q3:起步自研还是直接用开源模型?
A:先用开源 cross-encoder 即可,单机就能跑、成本极低;仅当问询规模与分域差异明显时再微调。关键是把"引用率"设为可观测指标。
Q4:重排会带来多大延迟?
A:精排 Top-50 量级在毫秒级,对在线问答可接受;若候选过多可先粗排截断再精排,平衡召回与性能。
Q5:怎么衡量重排真的有效?
A:做 A/B:同一问询池,对照"仅向量"与"向量+重排"的引用命中率与答案相关性评分,用人工或 LLM-as-judge 评估。