重排序
重排序是对初检结果进行精细化排序,提升结果相关性的关键步骤。
原理
重排序模型能够深度理解查询与文档的相关性,比向量相似度更精准。
为什么需要重排序?
向量检索的相似度计算基于向量空间距离,无法深度理解语义:
查询: "分布式锁如何实现可重入?"
初检结果 (向量相似度):
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配置项说明
| 配置项 | 默认值 | 说明 |
|---|---|---|
enabled | false | 是否启用重排序 |
model | qwen3-rerank | 重排序模型名称 |
api-url | DashScope | 重排序 API 地址 |
api-key | - | API Key (环境变量) |
top-n | 5 | 精排后返回数量 |
效果对比
| 阶段 | 数量 | 说明 |
|---|---|---|
| 向量检索 | 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-n | 3-5 | 不需要太大,保留最相关的即可 |
top-k (检索) | 20-30 | 给重排序足够的候选 |
与其他功能配合
- 混合检索 — 推荐配合使用,召回更全面
- 上下文扩展 — 推荐配合使用,语义更完整