惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
爱范儿
爱范儿
Martin Fowler
Martin Fowler
T
The Blog of Author Tim Ferriss
B
Blog RSS Feed
博客园 - 聂微东
G
GRAHAM CLULEY
Engineering at Meta
Engineering at Meta
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
WordPress大学
WordPress大学
Scott Helme
Scott Helme
AI
AI
S
Security Affairs
T
Threat Research - Cisco Blogs
M
MIT News - Artificial intelligence
T
Troy Hunt's Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
AWS News Blog
AWS News Blog
T
Threatpost
Cyberwarzone
Cyberwarzone
www.infosecurity-magazine.com
www.infosecurity-magazine.com
U
Unit 42
V
Vulnerabilities – Threatpost
J
Java Code Geeks
博客园 - Franky
月光博客
月光博客
Blog — PlanetScale
Blog — PlanetScale
NISL@THU
NISL@THU
D
Docker
小众软件
小众软件
N
News and Events Feed by Topic
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
A
Arctic Wolf
D
DataBreaches.Net
云风的 BLOG
云风的 BLOG
Forbes - Security
Forbes - Security
量子位
PCI Perspectives
PCI Perspectives
美团技术团队
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
I
InfoQ
Security Archives - TechRepublic
Security Archives - TechRepublic
有赞技术团队
有赞技术团队
腾讯CDC
P
Proofpoint News Feed
S
Security @ Cisco Blogs
G
Google Developers Blog
C
Cisco Blogs

博客园 - work hard work smart

使用 LangChain + Hugging Face 构建文本向量化服务 SQLAlchemy 使用详解 Python 中使用 Elasticsearch 的完整指南 Qdrant 向量数据库使用指南 OpenEvals 快速入门:LLM 评估指南 DeepEval 快速入门:LLM 应用评估指南 LangSmith 批量评估完全指南 Qwen-Agent 入门指南:快速构建智能体应用 LangSmith 集成实战:从追踪到评估的完整指南 初识 go-zero:一款让你写后端更规范、更高效的 Go 微服务框架 LangChain4j RAG 核心组件与组合方式 如何使用 Elasticsearch 进行全文检索和向量检索 MinerU Docker 部署指南 5 分钟上手:为 Cline 配置一个免费的 MCP 天气服务 Neo4j 图数据库安装与 Spring Boot 集成实战指南 LangFuse 实战指南:用 @observe 三行代码给 LLM 应用加上全链路追踪 Function Call 深度解析:让大模型从"嘴炮"到"实干"的技术革命 Spring AI 提示词模板实战:告别硬编码,实现提示词工程化管理 LangChain4j 实战指南:用 Java 轻松构建 AI 应用 Spring AI 对话短期记忆实战:让大模型拥有"记忆力" Spring AI 提示词工程实战:让大模型更懂你的意图 Spring AI ChatClient 深度解析:优雅构建大模型应用的利器 Spring AI Alibaba DashScopeChatModel 实战 Spring 中 SSE 流式输出的多种实现方式详解 OpenSandbox 实战指南:为 AI Agent 构建安全的代码执行沙箱 在本机启动 LangGraph 开发服务器:完整指南 DeepAgents中Backend的奥秘:让AI Agent拥有文件操作能力 为什么选择 Go 开发 Web 接口?从入门到实践 智能搜索DeepAgent笔记 RAG学习笔记2--系统查询流程 RAG学习笔记1--系统文件导入流程 百炼 WebSearch 快速入门指南 Python 连接 MongoDB 完整指南:从连接配置到增删改查实战 一行命令搞定 MongoDB 开发环境:Docker Compose 部署 + 可视化管理 使用 Attu 可视化管理 Milvus 向量数据库 在 Windows Docker 中快速安装 Milvus 2.5.6 minio使用 Spark 集群搭建 hadoop集群安装 Spring AI Alibaba 入门实战 Windows 安装 OpenClaw 实战指南 MyBatis 核心流程和原理 Idea中安装Claude code插件 Spark 编程 使用Matplotlib 绘制直方图 Flink安装部署 Flume安装 查找导致cpu过高的代码方法 JVisualVM监控远程Java进程 jmap jacoco多模块生成java单元测试报告实践 arthas 使用demo LockSupport Exchanger CyclicBarrier CountDownLatch 手把手教你用python开始第一个机器学习项目
RAG 中为什么需要 Rerank,以及如何使用 Rerank
work hard work smart · 2026-06-20 · via 博客园 - work hard work smart

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 决定哪些内容最值得交给大模型。