01 “RAG”的检索召回流程(快速回顾)
当你向 RAG 系统提出一个问题,系统会:
使用 Embedding 模型 将问题转换为向量。
在向量数据库中检索语义相近的文本片段(chunk),完成初步筛选。
然后使用 Reranking 模型 对这些候选 chunk 进行精排,挑选出相关性排名前几的 chunk,作为上下文和用户问题一起组成 prompt,供大模型生成答案。
明明可以通过向量相似度筛选 chunk,为什么还要用Reranking 模型再“筛一轮”呢?继续往下看。
02 先熟悉一下两个模型的结构特点
Embedding 模型
模型结构: 常见为双塔结构(DualEncoder,也有单塔结构)
这种结构包含两个编码器,在训练时,分别将两段文本输入两个编码器,得到两个向量。再通过计算它们之间的相似度(如余弦相似度)判断这两个文本在语义上是否接近。
直观理解: 模型只关心每段文本分别“说了什么”然后判断它们“像不像”。
训练方法: 通常采用对比学习
训练数据由两类文本对组成:
正样本对: 语义相近的文本对
负样本对: 语义无关的文本对
目标是让模型学会将正样本的向量距离“拉近”、负样本的向量距离“推远”,从而在向量空间中构建出具有语义分布的表示。
使用方式:
输入任意一段文本,模型输出其对应的语义向量。
要判断两段文本是否相关时,只需将它们通过模型分别编码成向量,计算相似度。相似度越高,语义则越接近。
Reranking 模型
模型结构: 常见为交叉编码器(Cross Encoder)
将两段文本拼接在一起作为一个整体输入模型。模型能同时“看到”两段文本中的每个 token,从而理解它们之间的关联和语义对应关系。
例如:
直观理解: 模型不仅关心每段文本分别讲了什么,也关心它们之间的互动和语义对齐,例如是否在讨论同一主题或具有逻辑延续。
训练方法: 常见为回归打分任务
即为每个文本对预测一个相关性分数(一般在 0~1之间,例如 0.95 表示高度相关),目标是尽可能贴近真实得分。
使用方式:
将两段文本拼接后输入模型,输出它们的语义相关性分数。分数越高,代表语义匹配程度越强。
03 “RAG”中为什么要两个模型配合?
到这一步,你可能已经猜到答案了
Embedding 模型: 适合做粗筛
它可以对海量文档的 chunk 提前离线编码,存入向量数据库。
用户问题(query)一来,只需对其编码一次,然后就能通过向量数据库快速计算相似度,从而检索并召回几十个候选 chunk。
效率极高,几十到几百毫秒即可完成,适合处理大规模数据。
Reranking 模型: 适合做精排
将用户问题和每一个候选 chunk 拼接后输入模型实时交叉编码,计算相关性得分。
由于 Reranking 模型的特点,能够更深入理解和捕捉文本的语义相关性。
举个例子:
“我爱吃蔬菜” vs “我以前爱吃蔬菜”
在 Embedding 模型看来可能相似度很高,但Reranking 模型则能更深入地比较其语义差异,看出“过去”与“现在”的差别。
在 RAG 中如果跳过粗筛直接使用 Reranking 模型,那意味着系统要对大量的文本实时进行交叉编码打分,这在实际应用中几乎不可能,计算量太大。
而如果跳过 Reranking 模型,则可能会出现一些“看起来相似但实际不相关”的 chunk 被错误地召回,不仅浪费了LLM 的 token,也影响回答的质量。
04 认识几个常见的“Reranking”模型
BGE-Reranker: 由智源推出,支持多语言,开源,中文表现优异。
Cohere Rerank: 闭源,Cohere 提供商用 API,易于接入,适合企业部署。
monoT5:开源,基于 T5 架构的轻量级模型,英文表现强劲。