核心内容摘要
49爻賶賰賶卮賶卮:一场跨越时空的数字风暴
Embedding 与 Rerank 区别在 RAG检索增强生成流程中Embedding和Rerank是两种不同阶段的检索技术前者负责「把文本变成向量并做初筛」后者负责「在候选结果上再做一次精排」。
下面从定义、输入输出和具体例子说明二者的区别。
核心定义概念作用典型使用阶段Embedding把文本映射成固定维度的向量用于相似度计算和初筛建库 第一轮检索召回Rerank在「查询 若干候选文档」上重新打分、排序做精排第一轮检索之后精排简单说Embedding 负责「找出一批可能相关的」Rerank 负责「在这一批里挑出最相关的」。
输入与输出对比
1 总览表维度EmbeddingRerank输入纯文本单条或多条查询字符串候选文档列表通常来自初筛输出向量一条文本 → 一个向量同一批文档的重新排序或带分数的列表是否依赖查询否只依赖文本本身是必须同时有 query 和 documents匹配范式表示型文本匹配先表示、再比相似度交互型文本匹配先交互、再打分模型类型多为 Bi-Encoder双塔文本 → 向量多为 Cross-Encoder联合/单塔querydoc → 分数
2 Embedding输入输出输入一条或多条文本字符串或字符串列表。
例如机器学习是人工智能的一个分支或[文本1, 文本2, 文本3]。
不包含用户当前的查询query只对「要建库的文档」或「待比对的文本」做编码。
输出向量每条文本对应一个固定维度的浮点数向量。
例如[
12, -
34,
56, ...]维度如
384、
1024 等取决于模型。
多条文本时输出为「向量列表」与输入文本一一对应。
3 Rerank输入输出输入查询query用户当前的问题或检索语句一条字符串。
候选文档列表documents通常是第一轮检索如用 Embedding 向量库得到的 top-k 条文档如 1050 条。
即必须同时有「问什么」和「候选有哪些」。
输出同一批文档的重新排序有时带相关性分数。
格式多为[(doc, score), (doc, score), ...]或直接返回排序后的文档列表。
一般不产生新向量只产生排序/分数。
4 补充表示型 vs 交互型文本匹配以及 Cross-Encoder / Bi-Encoder从文本匹配的范式上看EmbeddingBi-Encoder对应表示型文本匹配RerankCross-Encoder对应交互型文本匹配。
表示型文本匹配Representation-based定义先为每条文本学习一个独立的向量表示即「表示」再通过向量之间的相似度如点积、余弦来衡量两段文本的匹配程度。
查询和文档在建模时不直接接触匹配发生在「表示空间」里——即「先表示再比相似度」。
特点文本的表示与「跟谁比」无关同一段 doc 的向量固定可以预先算好、存进向量库因此适合大规模检索。
对应Embedding / Bi-Encoder双塔即属于表示型文本匹配。
交互型文本匹配Interaction-based定义在判断两条文本是否匹配时让它们在模型内部直接交互例如拼接成一段输入、或通过 attention 让 query 与 doc 的 token 互相可见基于交互后的表示再输出一个匹配分数。
匹配发生在「交互过程」中——即「先交互再打分」。
特点模型能利用 query 与 doc 的细粒度对齐如哪些词对应哪些词判断更准但无法预先为 doc 算一个通用向量每条 (query, doc) 都需单独过模型。
对应Rerank / Cross-Encoder联合/单塔即属于交互型文本匹配。
范式定义简述对应技术表示型先为文本学独立向量再用向量相似度衡量匹配Embedding、Bi-Encoder双塔交互型让两条文本在模型内直接交互再输出匹配分数Rerank、Cross-Encoder联合/单塔下面从模型结构角度再区分 Bi-Encoder 与 Cross-Encoder。
Bi-Encoder双塔含义有「两个塔」——一个编码 query一个编码 document结构可以相同、参数可共享也可不共享。
两条文本分别送入模型各自得到一个向量再通过向量相似度如点积、余弦得到相关性分数。
输入query 一条、doc 一条或先对大量 doc 离线编码好线上只编码 query。
输出每条文本一个向量相关性 两个向量的相似度不经过一个「同时看到 query 和 doc」的层。
特点文档向量可以预先算好、存进向量库检索时只算 query 向量再做相似度所以适合海量召回百万级文档也能毫秒级初筛。
但 query 和 doc 在模型内部没有直接交互只能靠「各自向量在语义空间里是否接近」来近似相关性对复杂问法或细微差异不如 Cross-Encoder 准。
范式即上文所说的表示型文本匹配——先表示、再比相似度。
Cross-Encoder联合编码 / 单塔含义只有一个模型把 query 和 document拼成一段输入例如[CLS] query [SEP] doc [SEP]一起送进同一套 Transformer在内部让 query 和 doc 做充分交互self-attention 会同时看到两边最后在 [CLS] 或最后一层上接一个分类头直接输出一个相关性分数或 0/1 标签。
输入必须是「query 单条 doc」的联合文本一条样本里同时包含两者。
输出一个标量分数或二分类概率表示这条 doc 与这条 query 的相关程度不输出向量也不做向量相似度。
特点模型能利用「query 里的词」和「doc 里的词」的交叉注意力所以对「是否真正回答问题」判断更准适合做精排Rerank。
每条 (query, doc) 都要单独过一次模型无法像 Bi-Encoder 那样把 doc 向量预先存好再批量相似度因此一般只对少量候选如 2050 条做 Cross-Encoder 打分即「先双塔召回再联合精排」。
范式即上文所说的交互型文本匹配——先交互、再打分。
为何叫「双塔」和「联合」叫法对应模型直观理解双塔Bi-Encoderquery 一个「塔」、doc 一个「塔」两路分别编码再汇合相似度像两栋并立的塔。
联合 / 单塔Cross-Encoderquery 和 doc 在同一个模型里一起编码、一起做 attention是「联合输入、一个塔出分数」。
所以Embedding 检索多用 Bi-Encoder双塔Rerank 多用 Cross-Encoder联合/单塔。
前者重速度与规模后者重精度与 query–doc 交互。
具体例子说明
1 场景设定假设有一个 RAG 系统文档库中有以下 5 个片段实际场景中可能是几百上千条Doc1Python 是一种编程语言适合数据科学和机器学习。
Doc2今天北京天气晴朗气温 25 度。
Doc3机器学习常用 Python 和 TensorFlow 进行开发。
Doc4北京是中国的首都有很多名胜古迹。
Doc5深度学习是机器学习的一个子领域。
用户查询query为「用什么语言做机器学习开发」
2 Embedding 的例子作用把每条文档转成向量再通过 query 的向量在向量库里做相似度检索得到「初筛」的候选列表。
输入仅文本无 query 参与编码建库时对 5 条文档分别做 Embedding输入是[Python 是一种编程语言..., 今天北京天气..., 机器学习常用 Python..., ...]用户提问时对query做一次 Embedding输入是用什么语言做机器学习开发输出每条文档一个向量例如示意实际维度更长Doc1 → [
1, -
2,
5,
3, ...] # 384 维 Doc2 → [-
3,
1, -
1,
0, ...] Doc3 → [
2, -
1,
6,
2, ...] ...Query 的向量[
15, -
18,
52,
28, ...]检索过程用 query 向量与所有文档向量算相似度如余弦相似度按分数排序假设得到初筛 top-3Doc3相似度
92Doc1相似度
88Doc5相似度
72这里Embedding 的输入 文本输出 向量排序是向量库/检索器做的不是 Embedding 模型直接输出的。
3 Rerank 的例子作用把「用户问题」和「初筛得到的候选文档」一起送进 Rerank 模型得到更准确的相关性分数并重新排序。
输入必须同时有 query 和 documentsquery用什么语言做机器学习开发documents初筛得到的 3 条或更多例如[ 机器学习常用 Python 和 TensorFlow 进行开发。
, # Doc3 Python 是一种编程语言适合数据科学和机器学习。
, # Doc1 深度学习是机器学习的一个子领域。
# Doc5 ]输出同一批文档的重新排序 分数分数由 Rerank 模型给出通常 01 或类似区间[ (Doc3,
0.
, # 最相关直接提到「Python」「机器学习」「开发」 (Doc1,
0.
, # 次相关提到 Python 和机器学习 (Doc5,
0.
# 较弱只提机器学习没提「语言」或「开发」 ]可以看到Rerank 的输入 query 文档列表输出 排序后的 (文档, 分数) 列表没有新向量。
输入输出小结对应到你的项目结合你项目里的 RAG 流程langchain_rag_demo_framework.py步骤使用技术输入输出文档入库Embedding切好的文本块列表chunks每个 chunk 的向量 → 存入 Chroma用户提问 → 初筛Embedding用户问题queryquery 的向量 → 与库中向量比相似度 → 得到 top-k如 k3文档若加精排Rerankquery 上一步的 3 条文档3 条文档的重新排序 分数→ 再取 top-n 送入大模型所以Embedding输入是「文本」输出是「向量」。
不区分「查询」和「文档」的语义只是分别编码。
Rerank输入是「查询 候选文档列表」输出是「同一批文档的排序及分数」。
为何要区分何时用 RerankEmbedding模型Bi-Encoder双塔对 query 和 doc分别编码计算相似度快适合在海量文档里快速召回例如从 10 万条里筛出 20 条。
Rerank模型Cross-Encoder联合/单塔对query 和 doc 一起建模更准但更慢适合在少量候选上精排例如 20 条里再排成 35 条。
若想进一步理解「双塔」与「联合」的含义可回看上文
4 补充Cross-Encoder 与 Bi-Encoder 详解。
因此常见做法是先用 Embedding 做召回再用 Rerank 做精排兼顾速度和准确率。
你当前 demo 只用了 Embedding 相似度阈值若检索结果不够准可以在 retriever 之后加一层 Rerank再把 Rerank 后的 top-n 作为context传给大模型。
一句话对照EmbeddingRerank输入文本可多条查询 候选文档列表输出向量与文本一一对应文档的重新排序 分数匹配范式表示型文本匹配先表示再比相似度交互型文本匹配先交互再打分例子机器学习→[
1, -
2, ...]query用什么做 ML [DocA, DocB, DocC] → [(DocB,
0.
, (DocA,
0.
, (DocC,
0.