paper2skills Playbook

检索后精排 — Cross-Encoder Reranking

Skill-RAG-Reranking-CrossEncoder · 08-知识图谱

causalexperimentoptimizationrecommendationragknowledge_graphmulti_agent客服与VOC推荐与搜索知识图谱与RAGMAS与智能体工程WF-C 客服分诊WF-F 动态定价WF-G Listing内容优化
年化 ROI28 万
业务视角
适用角色选品负责人 / 运营负责人 · 数据分析师 · 供应链负责人
适用平台Amazon 品类体系 · 竞品 ASIN 网络分析
什么情况下用品类很多,不清楚品类间的关联,没法做系统性类目扩张规划;竞品矩阵太复杂,品牌/SKU/渠道理不清
成功是什么样的建立品类知识图谱,清晰看到哪些是入口品/引流品/利润品,指导下一步选品扩张方向
业务痛点
品类太多不知道先做哪个竞品关系理不清楚不知道用户买了奶瓶还会买什么类目扩张没有逻辑

1. 解决的问题

RAG 管道的检索阶段(BM25/向量检索)优先保证召回率,会返回大量候选文档(top-50~100)。但这些候选文档与查询的相关性排序往往不准——召回阶段的 Bi-encoder 是独立编码查询和文档,无法捕捉两者间的细粒度交互。

2. 核心算法逻辑

RAG 管道的检索阶段(BM25/向量检索)优先保证召回率,会返回大量候选文档(top50~100)。但这些候选文档与查询的相关性排序往往不准——召回阶段的 Biencoder 是独立编码查询和文档,无法捕捉两者间的细粒度交互。

3. 业务应用场景

业务问题: 母婴出海卖家的客服 FAQ 系统包含 2000+ 条目,覆盖退换货政策、安全认证、喂养指南等话题。混合检索召回 top-20 候选后,LLM 直接基于这 20 条生成答案,但排名靠后的高相关 FAQ 经常被 LLM 忽略(注意力随位置衰减)。

解决方案: 引入 BGE-Reranker-v2 对 top-20 候选重排,将最相关的 5 条 FAQ 放在前面送给 LLM,显著减少 LLM 忽略关键信息的概率。

业务价值: - 客服自动回复准确率提升 21pp - 人工客服介入率从 38% 降至 21% - 年化节省人工客服成本约 ¥28 万(月均 5000 工单 × 17% 减少量 × 人均成本)

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

28 万

7. 代码模板

代码块数量:4 · 路径:未检测到

"""
检索后精排系统(Cross-Encoder Reranking)
基于 arXiv:2310.07554 和 arXiv:2304.09542

功能:
1. Pointwise Cross-Encoder 精排(Mock + 真实模型接口)
2. Listwise LLM 精排(Mock 实现)
3. 融合元数据的混合精排
4. 母婴 FAQ 精排演示 + 3 测试用例
5. NDCG@k 评估指标

Author: paper2skills
Date: 2026-06-06
"""

import math
import re
import ast
from typing import List, Dict, Tuple, Optional, Callable
from dataclasses import dataclass, field


# ============================================================
# 数据模型
# ============================================================

@dataclass
class Candidate:
    """精排候选文档"""
    doc_id: str
    text: str
    title: str = ""
    initial_rank: int = 0       # 召回阶段排名
    initial_score: float = 0.0  # 召回阶段分数
    metadata: Dict = field(default_factory=dict)

    def full_text(self) -> str:
        return f"{self.title} {self.text}".strip()


@dataclass
class RerankResult:
    """精排结果"""
    doc_id: str
    rerank_score: float
    rerank_rank: int
    initial_rank: int
    rank_change: int  # 正数=上升,负数=下降
    document: Optional[Candidate] = None


# ============================================================
# Cross-Encoder 精排器(Pointwise)
# ============================================================

class CrossEncoderReranker:
    """
    Pointwise Cross-Encoder 精排器
    
    s(q, d) = BERT([CLS] q [SEP] d [SEP])

8. 论文来源

  • 2304.09542
  • 2309.15088
  • 2310.07554