Reranker
Reranker 是 RAG 管线中对检索结果做二次排序的组件。它比向量搜索更精确,但更慢,用于对初步检索结果做精细排序。
#type / concept
#status / evergreen
#tech / ai
[!info] related notes
- 所属 MOC: RAG Engineering MOC
- 相关: Retriever, 意图感知 RAG 重排
- 模型: Reranker 模型
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]]
常见坑
- 不做重排序: 向量搜索结果直接用
- Reranker 太慢: 对每个请求都做重排序,延迟高
- top_k 太小: 重排序后只留 2 个,可能漏掉相关信息
- 模型不匹配: Reranker 模型和 Embedding 模型的语义空间不同