RAG 进阶 高级

重排(Rerank):精排的最后一道关卡

理解"召回粗排 + 精排"两阶段架构:Cross-Encoder 为何比 Bi-Encoder 准、主流 Reranker 选型与延迟权衡。

两阶段架构:先广撒网,再精挑细选

全库 10 万块 ─召回(向量+BM25)→ 20 块 ─重排(Rerank)→ 3 块 ─→ LLM

召回阶段追求"别漏"(快、覆盖广),重排阶段追求"排对"(准、只挑 20 个慢慢比)。这比"一步到位取 Top-3"效果好得多 —— 因为最好的片段经常排在召回结果的第 5~15 位。

Bi-Encoder vs Cross-Encoder

  • Bi-Encoder(双塔,召回用):问题和文档分别编码成向量再比距离。文档可离线预计算,在线只需算问题向量 —— 快,但两段文本没有充分交互,精度有限;
  • Cross-Encoder(交叉编码器,重排用):把「问题 + 文档」拼在一起送进模型,逐对输出相关分。两段文本在注意力层充分交互,能识别"答案确实在这句话里"的细粒度语义 —— 准,但每对都要跑一次模型,只能用于小候选集(20~100 条)。

主流 Reranker 选型

  • 开源:BGE-Reranker(中英双语,可本地部署,配合 sentence-transformers / LangChain CrossEncoderReranker);
  • API:Cohere Rerank、Jina Reranker —— 免运维按量付费;
  • LLM 兜底:用对话模型对 20 个片段做"相关/不相关"打分(Pointwise),无需额外模型但延迟与成本最高。
from langchain.retrievers import ContextualCompressionRetriever
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
from langchain.retrievers.document_compressors import CrossEncoderReranker

reranker = CrossEncoderReranker(
    model=HuggingFaceCrossEncoder(model_name="BAAI/bge-reranker-base"),
    top_n=3)
retriever = ContextualCompressionRetriever(
    base_compressor=reranker, base_retriever=hybrid_retriever)

成本与延迟权衡

  • 召回 50 → 重排取 3:效果最好,延迟 +100~300ms(本地 bge-reranker-base);
  • 重排不是免费的重排序玩具:它是用小模型的时间换大模型的 token —— 送进 LLM 的片段更少更准,反而省钱;
  • 验证价值:对比重排前后的 Hit Rate@3 与端到端回答质量(用评测集!),有效才保留。

📝 课后练习

quiz-1 两阶段检索架构中,重排(Rerank)器通常采用的模型结构是?