13 Reranking(重排序)

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
  }
]
相关推荐
linmoo19867 个月前
Langchain4j 系列之二十四 - Scoring (Reranking) Models
人工智能·langchain·langchain4j·scoring·reranking