Reranker
Reranker 是 RAG 管线中对检索结果做二次排序的组件。它比向量搜索更精确,但更慢,用于对初步检索结果做精细排序。
#concept
#evergreen
#ai
[!info] related notes
- 所属 MOC: RAG Engineering MOC
- 相关: Retriever, 意图感知 RAG 重排
- 模型: Reranker 模型
Reranker
一句话定义
Reranker 是 RAG 管线中对检索结果做二次排序的组件。向量搜索是”粗排”(快但不精确),Reranker 是”精排”(慢但精确)。先粗排检索 20 个候选,再精排选出最相关的 5 个。
它解决什么问题
向量搜索的相似度分数不一定反映真实相关性:
- 向量距离近 ≠ 语义相关
- 关键词匹配被向量搜索忽略
- 查询意图和文档内容的匹配度需要更精确的判断
角色边界
本页是 Reranker 管线组件 的 canonical concept:关注它在 Retriever 之后、上下文选择之前的职责、输入输出和编排位置。用于产生相关性分数的模型能力统一放在 Reranker 模型;组件职责不等于某一个具体模型。
核心原理
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]]
常见坑
- 不做重排序: 向量搜索结果直接用
- Reranker 太慢: 对每个请求都做重排序,延迟高
- top_k 太小: 重排序后只留 2 个,可能漏掉相关信息
- 模型不匹配: Reranker 模型和 Embedding 模型的语义空间不同
学习检查
- Reranker 在典型 RAG 管线中处于哪两个阶段之间?
- 为什么“先召回较多候选再重排”与“直接只检索少量结果”不是同一件事?
- 哪些参数属于管线策略,哪些属于 reranker 模型能力?
- 如果延迟预算不足,可以从候选规模、是否启用重排和模型成本三层怎样取舍?