RAG学习之-Rerank 技术详解:从入门到面试

张开发
2026/4/14 23:21:26 15 分钟阅读

分享文章

RAG学习之-Rerank 技术详解:从入门到面试
Rerank 技术详解从入门到面试一站式掌握 RAG 中的重排序技术 —— 从 12 岁能懂的故事到面试官想听的答案目录[核心概念什么是 Rerank](#一核心概念什么是 rerank)[技术原理Bi-Encoder vs Cross-Encoder](#二技术原理 bi-encoder-vs-cross-encoder)[为什么需要 Rerank](#三为什么需要 rerank)[常用 Rerank 模型选型](#四常用 rerank 模型选型)代码实现两阶段检索面试回答模板知识总结一、核心概念什么是 Rerank1.1 12 岁就能听懂的故事 问题你让两个人帮你挑苹果有什么区别第一个人快手阿姨检索30 秒抓了 10 个苹果给你方法看颜色红的拿、看大小大的拿、看位置手边的拿结果快是快但有些苹果看着红其实有伤第二个人品果大师Rerank接过这 10 个苹果开始仔细检查方法摸一摸软硬、闻一闻香味、掂一掂水分、看一看斑点结果告诉你这 10 个里真正最好吃的 3 个是这几个快手阿姨检索品果大师Rerank速度30 秒 10 个 5 分钟 1 个 准确度看外表 ⭐⭐⭐看内在 ⭐⭐⭐⭐⭐能大批量吗可以太慢只能挑少量核心思想Rerank 先快速找一堆候选答案再花时间仔细排序把最好的放在最前面1.2 生活中的例子场景检索Rerank淘宝买东西搜索运动鞋出来 1000 件按销量/好评重新排序展示前 20 个抖音推荐先找一批相关视频根据你的喜好重新排序高考志愿把所有大学列出来按分数/专业/地点排序选前几个1.3 概念定位Rerank重排序技术 │ └── 通常用 Cross-Encoder模型架构来实现问题答案Rerank 是什么一种重排序技术思想Rerank 用什么模型Cross-EncoderBi-Encoder 用于什么第一阶段检索召回二、技术原理Bi-Encoder vs Cross-Encoder2.1 本质定义Bi-Encoder 和 Cross-Encoder 是基于 Transformer Encoder 的两种应用架构它们不是Transformer 原生的设计而是后人基于 Transformer 的用法总结。2.2 结构对比Bi-Encoder双编码器输入 A → 编码器 E → 向量 a ↘ 相似度计算 → 得分 输入 B → 编码器 E → 向量 b ↗ 特点两个输入独立编码无法交互Cross-Encoder交叉编码器输入 A 输入 B → 编码器 E → Self-Attention 交互 → 分数 特点两个输入一起编码充分交互2.3 Self-Attention 交互差异Bi-Encoder无交互句子 A: [我] [喜欢] [苹果] 句子 B: [苹果] [公司] [发布] [手机] │ │ │ │ │ │ │ └─────┴──────┘ └──────┴──────┴──────┘ Self-Attention Self-Attention 只在 A 内部 只在 B 内部 ❌ A 的苹果看不到 B 的苹果Cross-Encoder充分交互输入[我] [喜欢] [苹果] [苹果] [公司] [发布] [手机] │ │ │ │ │ │ │ └─────┴──────┴──────┴──────┴──────┴──────┘ 全局 Self-Attention ✅ A 的苹果能看到 B 的苹果判断是不是同一个意思2.4 形象比喻Bi-EncoderCross-Encoder比喻相亲看照片相亲真人见面做法分别给问题和文档拍照然后对比照片把问题和文档放在一起仔细读速度快 ✅慢 ❌准确度一般高 ✅预计算可以不可以2.5 代码对比Bi-Encoderfromsentence_transformersimportSentenceTransformer modelSentenceTransformer(all-MiniLM-L6-v2)# 分别编码embedding_amodel.encode(问题)embedding_bmodel.encode(文档)# 计算相似度scorecosine_similarity(embedding_a,embedding_b)特征encode()单独调用向量事后计算相似度Cross-Encoderfromsentence_transformersimportCrossEncoder modelCrossEncoder(cross-encoder/ms-marco-MiniLM-L-6-v2)# 一起输入scoremodel.predict([[问题,文档]])特征predict()输入是成对的直接输出分数2.6 对比总结表特性Bi-EncoderCross-Encoder输入方式问题、文档分开编码问题 文档拼在一起编码输出两个向量一个相似度分数预计算✅ 可以提前算文档向量❌ 不能预计算检索速度 快毫秒级 慢秒级准确度⭐⭐⭐ 一般⭐⭐⭐⭐⭐ 很高适用场景大规模检索精排序 Rerank计算复杂度O(n)O(n²)三、为什么需要 Rerank3.1 核心问题向量检索有先天缺陷缺陷 1向量检索是粗匹配用户问Python 怎么读取文件 向量检索返回 ├── ✅ Python 文件操作方法大全 ← 很相关 ├── ❌ Python 入门教程 ← 标题有 Python但内容不相关 ├── ❌ 如何管理你的文件 ← 有文件但讲的是整理文件 └── ✅ Python open() 函数详解 ← 很相关但排在第 8 位问题向量检索只看整体相似度不懂真正的相关性缺陷 2词汇不匹配文档里写使用 open() 函数打开文件 用户问Python 怎么读取文件 → 没有共同关键词向量相似度可能很低但如果有一个模型能理解语义“open()” “读取文件”它就知道这是高度相关的缺陷 3长文本吃亏文档 A整篇都在讲Python 文件操作1000 字 文档 B第一段讲Python 文件操作后面 90% 讲别的2000 字 向量检索可能觉得 B 更相似因为总内容更多 但 A 才是真正相关的3.2 实际数据对比BEIR 基准方法Recall10MRRNDCG5向量检索Bi-Encoder0.450.400.50 RerankCross-Encoder0.650.580.68提升44%45%36%3.3 两阶段检索架构Stage 1: 向量检索快 ├── 从 10 万文档中快速筛选 20 个候选 ├── 耗时10-20ms └── 成本低 Stage 2: Rerank慢但精 ├── 仔细判断 20 个候选的相关性 ├── 耗时50-200ms20 个文档 └── 成本较高 最终给你看 Top-5 最相关的3.4 适用场景✅ 适合用 Rerank 的场景场景原因专业领域问答医疗、法律需要高精度不能出错代码检索变量名不同但功能相同的代码需要被找到长文档检索避免整体相似但内容不相关多语言检索不同语言表达相同意思歧义查询苹果是水果还是公司❌ 可以不用 Rerank 的场景场景原因简单事实查询珠穆朗玛峰多高直接检索就够了延迟敏感Rerank 增加 100-500ms 延迟预算有限Rerank 增加计算成本四、常用 Rerank 模型选型4.1 模型清单总览模型发布者语言特点适用场景BGE-Reranker-base智源中英中文最强平衡速度和精度中文知识库、生产环境BGE-Reranker-large智源中英精度最高稍慢专业领域、质量优先Cohere RerankCohere多语API 服务免部署不想自己部署Jina RerankerJina多语支持长文本长文档检索ms-marco-MiniLMMicrosoft英文轻量快速快速原型、英文场景bge-reranker-v2智源中英最新版支持混合检索复杂检索场景4.2 模型选择指南场景推荐模型中文知识库BGE-Reranker-base英文场景ms-marco-MiniLM 或 BGE长文档1000 字Jina Reranker延迟敏感ms-marco-MiniLM质量优先BGE-Reranker-large不想部署Cohere Rerank资源有限CPUbge-reranker-v2-minilm一句话记忆“中文用 BGE英文用 Marco长文本用 Jina不想部署用 Cohere。”4.3 性能对比中文场景模型Recall10MRR延迟 (20 文档)模型大小BGE-Reranker-large0.680.61250ms1.3GBBGE-Reranker-base0.650.58150ms440MBms-marco-MiniLM0.580.5280ms80MBCohere Rerank0.640.57300ms(API)-无 Rerank基线0.450.40--五、代码实现两阶段检索5.1 完整实现fromsentence_transformersimportSentenceTransformer,CrossEncoderimportnumpyasnpclassTwoStageRetriever:两阶段检索器检索 重排序def__init__(self,embed_model_name:strall-MiniLM-L6-v2,rerank_model_name:strBAAI/bge-reranker-base,top_k_retrieve:int20,top_k_rerank:int5):# Stage 1: Bi-Encoder 用于快速检索self.embedderSentenceTransformer(embed_model_name)# Stage 2: Cross-Encoder 用于精排序self.rerankerCrossEncoder(rerank_model_name)self.top_k_retrievetop_k_retrieve self.top_k_reranktop_k_rerank self.documents[]self.doc_embeddingsNonedefindex(self,documents:list[str]):索引文档self.documentsdocuments# 预先计算所有文档的向量self.doc_embeddingsself.embedder.encode(documents)# 归一化self.doc_embeddingsself.doc_embeddings/np.linalg.norm(self.doc_embeddings,axis1,keepdimsTrue)defretrieve(self,query:str)-list[tuple[str,float]]:两阶段检索# Stage 1: 向量检索快query_embeddingself.embedder.encode([query])query_embeddingquery_embedding/np.linalg.norm(query_embedding)# 计算余弦相似度similaritiesnp.dot(self.doc_embeddings,query_embedding.T).flatten()# 取 Top-20 候选candidate_indicesnp.argsort(similarities)[::-1][:self.top_k_retrieve]candidate_docs[self.documents[i]foriincandidate_indices]# Stage 2: Rerank慢但精pairs[[query,doc]fordocincandidate_docs]rerank_scoresself.reranker.predict(pairs)# 重新排序ranked_resultssorted(zip(candidate_docs,rerank_scores),keylambdax:x[1],reverseTrue)# 返回 Top-5returnranked_results[:self.top_k_rerank]# 使用示例if__name____main__:retrieverTwoStageRetriever()docs[Python 中 open() 函数用于打开文件,Python 入门教程第一个 Hello World 程序,如何管理电脑上的文件和文件夹,Python 文件操作read() write() close() 方法详解,]retriever.index(docs)queryPython 怎么读取文件resultsretriever.retrieve(query)print(f查询{query}\n)fori,(doc,score)inenumerate(results,1):print(f[{i}] (得分{score:.4f}){doc})5.2 关键代码解析# Stage 1: Bi-Encoder 检索query_embeddingself.embedder.encode([query])# 编码查询similaritiesnp.dot(self.doc_embeddings,query_embedding.T)# 矩阵乘法算相似度candidate_indicesnp.argsort(similarities)[::-1][:20]# 取 Top-20# Stage 2: Cross-Encoder Rerankpairs[[query,doc]fordocincandidate_docs]# 构建 (查询文档) 对rerank_scoresself.reranker.predict(pairs)# Cross-Encoder 打分ranked_resultssorted(zip(candidate_docs,rerank_scores),keylambdax:x[1],reverseTrue)六、面试回答模板6.1 30 秒简短版Rerank 的核心思想是先广撒网再精挑选。第一阶段用向量检索快速召回 Top-20 候选文档第二阶段用 Cross-Encoder Rerank 精排序最终返回 Top-5 给 LLM。用少量的时间代价换取检索质量的大幅提升。6.2 2 分钟完整版第一步说问题我发现纯向量检索有几个问题只看向量相似度不懂真正的相关性词汇不匹配时效果差用户说’读文件’文档写’open()长文档容易吃亏第二步说方案我引入了 Rerank 机制采用两阶段架构Stage 1 检索用 Bi-Encoder 从 10 万文档中快速召回 Top-20耗时 10-20ms。Stage 2 Rerank用 Cross-Encoder 对这 20 个文档逐一打分重新排序后取 Top-5耗时 100-200ms。Cross-Encoder 能把问题和文档拼在一起编码通过 Self-Attention 捕捉细粒度语义交互所以更精准。第三步说结果效果提升很明显Recall10从 0.45 提升到 0.6544%MRR从 0.40 提升到 0.5845%延迟增加约 100-200ms在可接受范围内6.3 被追问技术细节问题参考回答Bi-Encoder 和 Cross-Encoder 有什么区别“Bi-Encoder 分别编码快但粗糙Cross-Encoder 拼接编码慢但精准。比喻相亲看照片 vs 真人见面。”为什么不只用 Rerank“Cross-Encoder 不能预计算10 万文档要算 5000 秒。所以先用 Bi-Encoder 快筛 20 个再 Rerank 这 20 个兼顾速度和精度。”用的什么 Rerank 模型“BGE-Reranker-base中文场景效果最好速度和精度平衡。”Rerank 增加多少延迟“每个文档约 5-10ms20 个文档约 100-200ms。相比 LLM 生成的 1-2 秒可以接受。”6.4 加分项说出 Trade-offRerank 不是银弹需要权衡延迟敏感场景实时对话→ 可以不用 Rerank质量优先场景专业问答→ Rerank 是必须的我的项目是知识库问答对准确率要求高所以选择了 Rerank6.5 杀手锏说出踩过的坑我一开始直接用 Cross-Encoder 对所有文档排序结果延迟爆炸5 秒。后来改成两阶段向量检索从 10 万 → 20Rerank 从 20 → 5延迟降到 200ms效果还更好了。这个教训让我理解到好的架构不是堆模型而是让每个模型在自己擅长的位置发挥作用。6.6 万能模板背下来核心思想先粗筛再精排 为什么又快又准难兼得 怎么做Bi-Encoder 快筛 20 个 → Cross-Encoder 精排 5 个 效果Recall10 提升 44%延迟增加 100-200ms 比喻快手阿姨抓苹果 → 品果大师选最好的6.7 面试关键词清单关键词含义Bi-Encoder双编码器向量检索用的Cross-Encoder交叉编码器Rerank 用的两阶段检索Recall RerankRecallK召回率指标MRR / NDCG排序质量指标Self-AttentionCross-Encoder 的核心机制预计算Bi-Encoder 可以提前算文档向量Trade-off速度 vs 精度的权衡七、知识总结7.1 核心要点知识点核心内容Rerank 是什么先粗筛再精排为什么需要向量检索有缺陷需要更精准排序用什么模型Cross-EncoderBi-Encoder 用途第一阶段快速检索效果提升Recall10 提升 40%延迟代价100-200ms常用模型BGE-Reranker-base中文首选7.2 记忆口诀Bi 检索Cross 重排先粗筛再精排中文就用 BGE不想部署 Cohere两阶段是标准做法用时间换精度7.3 一句话金句“Rerank 就是用时间换精度先广撒网再精挑选是工业界提升检索效果的标准做法。”文档整理日期2026-04-14基于 RAG 学习项目整理

更多文章