Skip to content

重排序

重排序是对初检结果进行精细化排序,提升结果相关性的关键步骤。

原理

重排序模型能够深度理解查询与文档的相关性,比向量相似度更精准。

为什么需要重排序?

向量检索的相似度计算基于向量空间距离,无法深度理解语义:

查询: "分布式锁如何实现可重入?"

初检结果 (向量相似度):
1. "分布式锁的基本概念..."          相似度: 0.82
2. "Redis 实现分布式锁的原理..."    相似度: 0.78
3. "可重入锁的实现需要记录持有者..." 相似度: 0.75  ← 最相关,但排名靠后
4. "ZooKeeper 分布式锁..."         相似度: 0.72

重排序后:
1. "可重入锁的实现需要记录持有者..." 重排分数: 0.95  ← 升至第一
2. "Redis 实现分布式锁的原理..."    重排分数: 0.72
3. "分布式锁的基本概念..."          重排分数: 0.65
4. "ZooKeeper 分布式锁..."         重排分数: 0.58

实现

Knowledge 使用阿里云 DashScope 的 qwen3-rerank 模型:

java
// 伪代码 - 重排序实现
public List<RetrievedDocument> rerankDocuments(String query, List<RetrievedDocument> docs) {
    // 1. 提取文档内容,构建重排序请求
    List<String> documents = docs.stream()
            .map(doc -> "【标题】" + doc.getTitle() + "\n【内容】" + doc.getContent())
            .collect(Collectors.toList());
    
    // 2. 调用重排序 API
    RerankRequest request = RerankRequest.builder()
            .model("qwen3-rerank")
            .query(query)
            .documents(documents)
            .top_n(Math.min(topN, documents.size()))
            .instruct("Given a web search query, retrieve relevant passages that answer the query.")
            .build();
    
    ResponseEntity<RerankResponse> response = restTemplate.postForEntity(
            apiUrl, request, RerankResponse.class);
    
    // 3. 根据重排序结果重新排列文档
    List<RetrievedDocument> rerankedDocs = new ArrayList<>();
    for (RerankResult result : response.getBody().getResults()) {
        RetrievedDocument doc = docs.get(result.getIndex());
        doc.setRerankScore(result.getRelevance_score());
        rerankedDocs.add(doc);
    }
    
    return rerankedDocs;
}

配置

yaml
molandev:
  rag:
    rerank:
      # 是否启用重排序
      enabled: false
      # 重排序模型
      model: qwen3-rerank
      # API 地址
      api-url: https://dashscope.aliyuncs.com/compatible-api/v1/reranks
      # API Key
      api-key: ${DASHSCOPE_API_KEY}
      # 重排序后返回的结果数量
      top-n: 5

配置项说明

配置项默认值说明
enabledfalse是否启用重排序
modelqwen3-rerank重排序模型名称
api-urlDashScope重排序 API 地址
api-key-API Key (环境变量)
top-n5精排后返回数量

效果对比

阶段数量说明
向量检索20召回阶段,保证覆盖
重排序5精排阶段,提升精度

性能影响

指标无重排序有重排序
延迟~200ms~500ms (含 API 调用)
精度
成本中 (API 费用)

成本考虑

重排序需要调用外部 API,有额外成本:

计费方式

阿里云 DashScope 按调用量计费:

模型单价
qwen3-rerank约 ¥0.01/次 (具体以官方为准)

成本控制

  • 减少 top-n — 重排序文档数量越少,成本越低
  • 按需启用 — 高精度场景才启用重排序
  • 批量处理 — 一次 API 调用处理多个文档

与混合检索的配合

启用重排序时,混合检索会跳过融合得分计算:

java
// 伪代码
if (rerankEnabled) {
    // 直接去重,不计算融合得分
    mergedDocs = deduplicate(keywordResults, vectorResults);
} else {
    // 计算融合得分
    mergedDocs = fuseByRRF(keywordResults, vectorResults);
}

// 后续统一重排序
if (rerankEnabled) {
    mergedDocs = rerankDocuments(query, mergedDocs);
}

原因: 重排序模型会重新打分,初检的融合得分没有意义。


适用场景

场景是否启用说明
简单问答向量检索已足够
技术文档检索包含专业术语,重排序提升精度
客服问答需要精准匹配用户问题
知识探索需要高召回,重排序会减少结果

最佳实践

调优建议

参数建议值说明
top-n3-5不需要太大,保留最相关的即可
top-k (检索)20-30给重排序足够的候选

与其他功能配合

  • 混合检索 — 推荐配合使用,召回更全面
  • 上下文扩展 — 推荐配合使用,语义更完整

下一步