Reranker

Reranker 是 RAG 管线中对检索结果做二次排序的组件。它比向量搜索更精确,但更慢,用于对初步检索结果做精细排序。

#type / concept #status / evergreen #tech / ai

[!info] related notes

Reranker

一句话定义

Reranker 是 RAG 管线中对检索结果做二次排序的组件。向量搜索是”粗排”(快但不精确),Reranker 是”精排”(慢但精确)。先粗排检索 20 个候选,再精排选出最相关的 5 个。

它解决什么问题

向量搜索的相似度分数不一定反映真实相关性:

  • 向量距离近 ≠ 语义相关
  • 关键词匹配被向量搜索忽略
  • 查询意图和文档内容的匹配度需要更精确的判断

核心原理

Reranker 工作方式

用户查询 + 检索到的 20 个文档


Cross-Encoder 模型
    (同时看查询和文档,计算相关性分数)


按相关性分数重新排序


返回 Top 5

Python 实现

class Reranker:
    def __init__(self, model_name: str = "cross-encoder/ms-marco-MiniLM-L-6-v2"):
        self.model = CrossEncoder(model_name)

    async def rerank(self, query: str, chunks: list[Chunk], top_k: int = 5) -> list[Chunk]:
        # 构建查询-文档对
        pairs = [(query, chunk.text) for chunk in chunks]

        # 计算相关性分数
        scores = self.model.predict(pairs)

        # 按分数排序
        scored_chunks = list(zip(chunks, scores))
        scored_chunks.sort(key=lambda x: x[1], reverse=True)

        return [chunk for chunk, score in scored_chunks[:top_k]]

意图感知重排序

class IntentAwareReranker(Reranker):
    async def rerank(self, query: str, chunks: list[Chunk], top_k: int = 5) -> list[Chunk]:
        # 1. 识别用户意图
        intent = await self.classify_intent(query)

        # 2. 基础重排序
        base_ranked = await super().rerank(query, chunks, top_k=top_k * 2)

        # 3. 按意图调整排序
        adjusted = []
        for chunk in base_ranked:
            boost = self.get_intent_boost(intent, chunk)
            adjusted.append((chunk, boost))

        adjusted.sort(key=lambda x: x[1], reverse=True)
        return [chunk for chunk, _ in adjusted[:top_k]]

常见坑

  1. 不做重排序: 向量搜索结果直接用
  2. Reranker 太慢: 对每个请求都做重排序,延迟高
  3. top_k 太小: 重排序后只留 2 个,可能漏掉相关信息
  4. 模型不匹配: Reranker 模型和 Embedding 模型的语义空间不同

参考资料

创建于 2026/6/30 更新于 2026/7/15