work hard work smart

专注于AI+Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

RAG 中为什么需要 Rerank,以及如何使用 Rerank

Posted on 2026-06-20 17:54  work hard work smart  阅读(12)  评论(0)    收藏  举报

RAG 中为什么需要 Rerank,以及如何使用 Rerank

在 RAG 应用中,很多人会把重点放在向量检索、全文检索、Embedding 模型和向量数据库上。

这些确实很重要,但在真实问答场景中,仅仅把相关文档“召回”出来还不够。因为召回结果里面经常会有一些看起来相关、但并不真正适合回答当前问题的内容。

这时候就需要 Rerank。

Rerank 的作用不是替代向量检索,也不是替代全文检索,而是在检索之后,对已经召回的候选内容重新打分、重新排序,选出最适合放进 Prompt 的内容。


一、什么是 Rerank

Rerank,中文通常叫“重排序”或“精排”。

它的作用是:

对召回阶段拿到的一批候选文档,根据用户问题重新计算相关性分数,然后重新排序。

RAG 中一般会分成两个阶段:

第一阶段:召回 Recall
从大量文档中快速找出一批可能相关的内容

第二阶段:精排 Rerank
对这批候选内容重新打分,选出最相关的几条

可以用一句话理解:

召回负责“先找出来”,Rerank 负责“重新排好”。

二、为什么只靠向量检索或全文检索还不够

在 RAG 中,常见的检索方式有两类:

  • 向量检索
  • 全文检索

它们都能召回相关内容,但都有局限。

1. 向量检索的问题

向量检索擅长语义相似,但它不一定能准确判断“这段内容是否真正能回答当前问题”。

例如用户问:

Java 为什么可以跨平台?

向量检索可能召回:

Java 是一种面向对象的编程语言。

这段内容和 Java 有关,但没有回答“为什么可以跨平台”。

更好的内容应该是:

Java 程序会被编译成字节码,字节码运行在 JVM 上,不同操作系统只要有对应 JVM,就可以运行同一份 Java 程序。

向量检索可能都能召回,但排序不一定最合理。


2. 全文检索的问题

全文检索擅长关键词匹配,但它容易被关键词干扰。

例如用户问:

新能源汽车电池如何保养?

全文检索可能因为“新能源汽车”“电池”“保养”等关键词,召回很多内容:

  • 新能源汽车介绍
  • 电池参数说明
  • 保养周期说明
  • 电池养护建议

其中真正最适合回答问题的是“电池养护建议”,但全文检索的初始排序未必能把它排在最前面。


3. 多路检索之后更需要 Rerank

如果系统同时使用:

  • ES 向量检索
  • ES 全文检索
  • SQL 检索
  • 图数据库检索

那么一次查询可能会得到多批结果。

这些结果来自不同检索器,分数体系也不同:

向量相似度分数
全文 BM25 分数
SQL 查询结果
图数据库查询结果

这些结果不能简单按原始分数放在一起比较。

Rerank 的价值就在这里:

把多路召回结果放到同一个问题下重新打分,得到统一排序。

三、Rerank 在 RAG 流程中的位置

Rerank 通常位于“检索之后,注入 Prompt 之前”。

完整流程可以表示为:

用户问题
   |
   v
问题改写
   |
   v
多路检索
   |
   +--> 向量检索 Top 20
   |
   +--> 全文检索 Top 20
   |
   +--> 其他检索 Top 20
   |
   v
合并去重
   |
   v
Rerank 重新排序
   |
   v
取 Top 5 / Top 10
   |
   v
注入 Prompt
   |
   v
大模型生成答案

也就是说,Rerank 不负责从全量文档中查找内容。

它处理的是已经召回出来的一批候选内容。


四、Rerank 的工作原理

Rerank 模型通常接收两个输入:

用户问题 query
候选文档 document

然后输出一个相关性分数:

score = reranker.score(query, document)

例如:

query: Java 为什么可以跨平台?

document A: Java 是一种面向对象的编程语言。
score: 0.52

document B: Java 字节码运行在 JVM 上,不同平台只要安装对应 JVM 就能运行。
score: 0.91

Rerank 之后,document B 会排在 document A 前面。

这和向量检索不同。

向量检索通常是:

query -> embedding
文档 -> embedding
比较两个向量的距离

Rerank 通常是:

把 query 和 document 一起输入模型
让模型直接判断这段 document 对 query 有多相关

因此,Rerank 的判断通常更精细,但成本也更高。


五、召回模型和 Rerank 模型的区别

召回和 Rerank 的目标不一样。

对比项 召回 Recall 重排序 Rerank
处理范围 全量或大规模文档 已召回的小批量候选文档
目标 尽量不要漏掉相关内容 把最相关内容排到最前面
常见方式 向量检索、全文检索、混合检索 Cross-Encoder、BGE Reranker、Cohere Rerank
速度要求 非常高 可以稍慢,但候选数量不能太大
输出结果 Top K 候选内容 重新排序后的 Top N 内容

可以这样理解:

召回阶段追求“广”,Rerank 阶段追求“准”。

所以一个常见策略是:

先召回 Top 50,再 Rerank 出 Top 5。

六、如何在 LangChain4j 中使用 Rerank

在 LangChain4j 的 RAG 流程中,Rerank 通常放在 ContentAggregator 这一层。

ContentRetriever 负责召回内容,ContentAggregator 负责对召回内容进行合并、去重、重排序。

常见代码结构如下:

ScoringModel scoringModel = createScoringModel();

ContentAggregator contentAggregator = ReRankingContentAggregator.builder()
        .scoringModel(scoringModel)
        .minScore(0.6)
        .maxResults(5)
        .build();

然后把它交给 RetrievalAugmentor

RetrievalAugmentor retrievalAugmentor = DefaultRetrievalAugmentor.builder()
        .queryTransformer(queryTransformer)
        .queryRouter(queryRouter)
        .contentAggregator(contentAggregator)
        .contentInjector(contentInjector)
        .build();

这样 LangChain4j 在完成检索之后,就会使用 contentAggregator 对内容进行重排序,再把排序后的内容注入 Prompt。


七、使用 BGE Reranker 的 Java 示例

BGE Reranker 是常见的开源 rerank 模型,中文场景中经常使用 bge-reranker-v2-m3

在 Java 中,可以通过 ONNX 模型在本地运行 reranker。

示例代码如下:

OnnxScoringModel scoringModel = new OnnxScoringModel(
        "model/bge-reranker-model/model_quantized.onnx",
        "model/bge-reranker-model/tokenizer.json",
        8192
);

然后构建重排序聚合器:

ContentAggregator aggregator = ReRankingContentAggregator.builder()
        .scoringModel(scoringModel)
        .minScore(0.5)
        .maxResults(5)
        .build();

如果只是想单独测试 rerank 效果,可以构造一批候选内容:

Query query = new Query("Java 为什么可以跨平台?");

List<Content> contents = List.of(
        Content.from(TextSegment.from("Java 是一种面向对象的编程语言。")),
        Content.from(TextSegment.from("Java 字节码运行在 JVM 上,不同平台只要安装对应 JVM 就可以运行。")),
        Content.from(TextSegment.from("Python 是一种解释型高级编程语言。")),
        Content.from(TextSegment.from("Spring 是 Java 生态中常用的开发框架。"))
);

List<Content> rerankedContents = aggregator.aggregate(
        Map.of(query, List.of(contents))
);

输出 rerank 分数:

for (Content content : rerankedContents) {
    Double score = (Double) content.metadata().get(ContentMetadata.RERANKED_SCORE);
    System.out.println("score=" + score + ", text=" + content.textSegment().text());
}

理想情况下,下面这段内容应该排在更前面:

Java 字节码运行在 JVM 上,不同平台只要安装对应 JVM 就可以运行。

因为它直接回答了“Java 为什么可以跨平台”。


八、minScore 和 maxResults 怎么设置

使用 Rerank 时,常见两个参数是:

.minScore(0.6)
.maxResults(5)

1. minScore

minScore 表示最低相关性分数。

低于这个分数的内容会被过滤掉。

例如:

.minScore(0.6)

表示只保留 rerank 分数大于等于 0.6 的内容。

如果 minScore 设置太高,可能导致没有内容被保留。

如果设置太低,又可能把不相关内容注入 Prompt。

实践中可以从下面的值开始调试:

0.5 ~ 0.7

具体要结合模型输出分布和业务效果调整。


2. maxResults

maxResults 表示最多保留多少条内容。

例如:

.maxResults(5)

表示 rerank 后最多保留 5 条。

这个参数很重要,因为最终内容会注入 Prompt。

如果保留太多:

  • Prompt 变长
  • 成本增加
  • 无关信息干扰模型
  • 大模型可能抓不住重点

如果保留太少:

  • 上下文不足
  • 答案可能缺少依据

常见配置可以从:

Top 3 ~ Top 8

开始调试。


九、Rerank 的成本和注意事项

Rerank 能提升质量,但不是免费的。

1. Rerank 会增加延迟

Rerank 需要对每个候选文档和 query 重新打分。

如果候选内容太多,比如一次拿 200 条去 rerank,延迟会明显增加。

更合理的方式是:

召回 Top 20 ~ Top 50
Rerank 后取 Top 5

不要把全量文档都交给 Rerank。


2. Rerank 适合放在粗召回之后

Rerank 不适合代替召回。

它应该处理的是小批量候选内容。

推荐流程是:

向量检索 / 全文检索 / 混合检索
   |
   v
候选内容 Top K
   |
   v
Rerank
   |
   v
最终内容 Top N

3. Rerank 需要关注输入长度

候选文档太长时,rerank 模型可能会截断文本,导致评分不准确。

所以文档切片大小也会影响 rerank 效果。

一般建议:

  • 切片不要过长
  • 保留必要上下文
  • 避免把整篇长文直接作为一个候选 document

4. Rerank 分数不能跨模型直接比较

不同 rerank 模型的分数分布可能不同。

同样是 0.6,在不同模型里含义可能不一样。

所以 minScore 不要照搬,需要结合实际效果调试。


十、什么时候一定要用 Rerank

以下场景非常适合使用 Rerank:

  1. 同时使用向量检索和全文检索
  2. 检索结果经常“看起来相关,但答非所问”
  3. 文档数量较多,召回候选内容较杂
  4. 业务对答案准确性要求高
  5. Prompt 中经常被塞入无关上下文
  6. 希望从 Top 20 / Top 50 中挑出最适合回答的 Top 5

如果只是一个非常小的知识库,或者检索结果本身已经非常准确,Rerank 不是必须的。

但对于生产级 RAG,Rerank 通常是提升答案质量的重要环节。


十一、Rerank 和混合检索的关系

混合检索通常负责召回,Rerank 负责精排。

可以这样组合:

用户问题
   |
   v
ES 向量检索 Top 20
ES 全文检索 Top 20
   |
   v
合并去重
   |
   v
Rerank
   |
   v
Top 5 注入 Prompt

混合检索解决的是:

如何尽可能召回相关内容

Rerank 解决的是:

如何把最适合回答问题的内容排到前面

两者并不冲突,反而经常一起使用。


十二、总结

Rerank 是 RAG 中非常关键的一步。

它不是用来替代向量检索或全文检索的,而是用来提升检索结果质量的。

可以把 RAG 检索链路理解成:

粗召回:向量检索 / 全文检索 / 混合检索
   |
   v
精排序:Rerank
   |
   v
上下文注入:Prompt
   |
   v
答案生成:LLM

Rerank 的核心价值是:

  • 过滤掉看似相关但不真正有用的内容
  • 把最能回答问题的内容排在前面
  • 减少无关上下文对大模型的干扰
  • 提升 RAG 答案的准确性和稳定性

在 LangChain4j 中,Rerank 通常通过 ScoringModelReRankingContentAggregator 实现。

典型写法是:

ContentAggregator aggregator = ReRankingContentAggregator.builder()
        .scoringModel(scoringModel)
        .minScore(0.6)
        .maxResults(5)
        .build();

然后把它配置到 RetrievalAugmentor 中,让它在检索之后、Prompt 注入之前完成重排序。

一句话总结:

召回决定能不能找到相关内容,Rerank 决定哪些内容最值得交给大模型。