Reranking(重排序)
Reranking 是什么
Reranking(重排序)是在检索之后、送给 LLM 之前,额外加一步精排:
用户问题 → 检索 → 10个候选 → Reranker 精排 → top-3 → LLM
Reranker 对每个"问题-文档"对单独打分,比向量余弦相似度更准确,因为它能理解两段文字之间的语义交互。
两种 Reranker
类型 原理 代表
Cross-Encoder
问题+文档一起输入模型,直接打相关性分
bge-reranker、Cohere rerank
LLM-based
让 LLM 打分或排序
RankGPT
新概念关系
第51课 向量检索(单路)
↓
第53课 混合检索(多路召回,量多但精度一般)
↓
第54课 Reranking(精排,从多变精)
代码示例
py
def rerank(
embedding_api_key: str,
query: str,
documents: list[str],
top_n: int = 3,
) -> list:
url = "https://api.siliconflow.cn/v1/rerank"
payload = {
"model": "BAAI/bge-reranker-v2-m3",
"query": query,
"documents": documents,
"top_n": top_n,
"return_documents": True,
}
headers = {
"Authorization": f"Bearer {embedding_api_key}",
"Content-Type": "application/json",
}
response = requests.post(url=url, json=payload, headers=headers)
response.raise_for_status()
return response.json().get("results", [])
def retrieve_with_rerank(
embedding_api_key: str, query: str, retriever: EnsembleRetriever, top_n: int = 3
) -> list:
# 1. 粗召回
candidates = retriever.invoke(query)
if not candidates:
return []
# 2. 精排
docs_text = [c.page_content for c in candidates]
reranked_docs = rerank(
embedding_api_key=embedding_api_key,
query=query,
documents=docs_text,
top_n=top_n,
)
# 3. 映射回 Document
return [
(r.get("relevance_score"), r.get("document").get("text")) for r in reranked_docs
]
完整 HTTP 响应大致是:
py
{
"id": "rerank-...",
"results": [ ... ], // ← reranked_docs 就是这个
"meta": { "tokens": {...}, "billed_units": {...} }
}
results 响应大致是:
py
[
{
"index": 1,
"document": { "text": "人工智能(AI)是一门让机器模拟..." },
"relevance_score": 0.7782858610153198
},
{
"index": 0,
"document": { "text": "的发展也带来隐私、偏见..." },
"relevance_score": 0.6578798890113831
},
{
"index": 2,
"document": { "text": "# 天气\n\n## 早晨\n..." },
"relevance_score": 1.7809470591600984e-05
}
]