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:
- 同时使用向量检索和全文检索
- 检索结果经常“看起来相关,但答非所问”
- 文档数量较多,召回候选内容较杂
- 业务对答案准确性要求高
- Prompt 中经常被塞入无关上下文
- 希望从 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 通常通过 ScoringModel 和 ReRankingContentAggregator 实现。
典型写法是:
ContentAggregator aggregator = ReRankingContentAggregator.builder()
.scoringModel(scoringModel)
.minScore(0.6)
.maxResults(5)
.build();
然后把它配置到 RetrievalAugmentor 中,让它在检索之后、Prompt 注入之前完成重排序。
一句话总结:
召回决定能不能找到相关内容,Rerank 决定哪些内容最值得交给大模型。
作者:Work Hard Work Smart
出处:http://www.cnblogs.com/linlf03/
欢迎任何形式的转载,未经作者同意,请保留此段声明!
浙公网安备 33010602011771号