📑 本页目录(点开跳转)
08b · 重排与 Embedding 选型
⏱ 26 分钟 | ⭐ 按错误发生的位置决定优化顺序
🎯 一句话
正确文档已经被召回了、却排在第 15 位被截断 —— 这是 RAG 最常见的失败形态, 而重排是修它性价比最高的一步,是否划算需要用相同任务集比较质量、成本与延迟。 先查故障发生在哪一层:输入前缀、语种、截断或向量版本错了,应先修配置;候选集已有正确资料再比较重排。换 embedding 时还要处理索引迁移。
🎯 环节三:重排候选集里已有的证据
结果对照
🔗 完全是推荐算法第 8 章的「双塔做召回、精排做交叉」。同一套思想。
固定同一候选集比较重排前后,再看答案质量和额外延迟。重排无效时保留简单基线,不凭经验断定它一定优于更换 embedding。
🥊 Cross-Encoder / ColBERT / LLM:三种重排怎么选
"重排"不是一种东西,是三条不同的路线。它们的核心差别只有一个:问题和文档在什么时候相遇。
| 路线 | 交互位置 | 文档预计算 | 主要代价 | 选型依据 |
|---|---|---|---|---|
| 双塔 | 各自编码后比较向量 | 可以 | 编码与索引查询 | 建立召回基线;查询并非零延迟 |
| Cross-Encoder | 问题与文档联合编码 | 不能缓存与查询无关的完整联合编码 | 在线成对推理,可批处理 | 候选相关性、语种与延迟实测 |
| ColBERT | 各自 token 向量的后期交互 | 文档侧可以 | 多向量存储、索引与 MaxSim | 用实际规模比较质量/存储/延迟 |
| LLM 重排 | 读取候选并按任务比较 | 通常需在线推理,缓存取决于服务 | token、输出约束、顺序偏差 | 高价值复杂条件任务的受控对照 |
不固定宣称哪一路最准或几毫秒;硬件、候选数、文本长度、模型和批量会改变结果。机制与实践依据。
ColBERT 的机制值得单独说清楚(它是这三条里最容易讲错的):
算一算
Cross-Encoder:[问题 + 文档] 拼一起进模型 → 一个分数
→ 100 条候选 = 100 对输入;可批处理,在线计算量仍随候选增长
ColBERT:问题编成 Q 个向量,文档编成 D 个向量(每个 token 一个)
分数 = 对每个【问题 token】,取它和所有【文档 token】里最像的那个
的相似度,然后全部加起来 ← 这就是 MaxSim
→ 文档那 D 个向量【可以离线算好存起来】⭐
→ 在线主要是查询编码与向量交互;延迟收益取决于索引、硬件和候选规模
⚠️ 代价是存储爆炸:一个块从「1 个向量」变成「几百个向量」,
索引体积膨胀一个数量级。ColBERTv2 用残差压缩把它压回来一些,
但仍然远大于单向量索引。
🔑 按瓶颈选择:先测简单基线与 Cross-Encoder;需要多向量交互时再评估 ColBERT,需要复杂条件判断时再评估 LLM 重排。三者没有固定的质量排序,ColBERT 也不只是降级方案。
💡 LLM 重排还有一个更划算的用法:不当线上重排器,而当离线评测集的标注器——让它给 100 个问题的召回结果打分,人再抽查 10%。线上跑不起的成本,离线跑得起。
🧭 Embedding 选型:从错误证据决定顺序
先检查文档是否入库、权限是否正确、模型语种与前缀是否匹配,再比较召回、融合与重排。若正确文档根本没进入候选,重排无法找回它;若已在候选里却排错,再做固定候选的重排对照。不存在所有项目都必须走的“切分、混合、重排、最后换 embedding”顺序。
什么时候是真的该换了
| 信号 | 说明 |
|---|---|
| ⭐ 语种不对 | 拿纯英文模型跑中文——这不是"效果差一点",是根本不该出现的配置错误。中文/多语言场景先确认模型的训练语料覆盖 |
| ⭐ 领域词汇完全在分布外 | 医学、法律、化学式、内部工单代号。通用模型没见过这些词,它们的向量互相挤在一起,可能难以区分,需要领域题集与难负例验证 |
| ⚠️ 文本长度对不上 | 模型 max_seq_len 是 512 token,你的块是 1000 字 → 超出部分被静默截断。你以为在检索整块,其实只检索了前半块。这个坑最隐蔽,因为它不报错 |
| 非对称检索没用对姿势 | 「短问题查长文档」是非对称任务,很多模型要求给 query 和 document 加不同的前缀(instruction),不加就掉点。这是配置问题,不是模型问题 |
维度怎么取舍(768 / 1024 / 1536)
算一算
维度 ↑ → 表达能力略强,但【边际收益递减很快】
→ 原始向量存储随维度线性增长;ANN 延迟还取决于索引、硬件与过滤
100 万块 × 1536 维 × 4 字节 = 6.1 GB (还没算索引结构本身)
100 万块 × 768 维 × 4 字节 = 3.1 GB
⭐ 判断顺序(不要反过来):
先量出 1536 维比 768 维在【你自己那 20 个问题】上高几个点,
再问这几个点值不值 2 倍存储 + 更慢的检索。
是否值得,依据业务保留集与资源预算判断。
💡 一个常被忽略的选项:MRL(套娃表示)。有些模型在训练时就让"前 256 维"自己也是一个能用的向量,于是同一份 embedding 可以截断后粗筛、完整维度精算,存储和延迟一起省。选型时留意模型卡上有没有这一条。
MTEB 榜怎么看(榜首≠对你最好)
- ⭐ 看子任务,不看总分。 MTEB 总分把分类、聚类、语义相似度、检索混在一起平均。你只关心 Retrieval 那一栏;中文看 C-MTEB 的检索子集。
- 顺手看"参数量"和"维度"两列。 榜首常是 7B 级的 embedding 模型——它的推理成本可能比你整条检索链路还高。
- ⚠️ 榜单会被刷。 训练数据里混进评测集是这个榜公开的老问题。一个模型只在榜上好、在你那 20 个问题上不好,信你自己的。
- 别忘了迁移成本:换 embedding 意味着全库重算向量 + 重建索引。100 万块重跑一遍是实打实的钱和时间。
什么时候值得领域微调
⭐ 判据不是"效果不够好",而是"通用模型分不开你的两类文档"。
| 情况 | 建议 |
|---|---|
| 领域术语密集,且有一定数量、经核验的「问题 → 正确文档」的真实数据(可以从线上点击日志里挖) | ✅ 值得试 |
| 只有几百条 | 🟡 先试指令前缀和领域词典做查询扩展,先验证低成本的配置修复 |
| 还没定位错误来源 | 先对照简单基线,按漏召回或错排序选择实验 |
🔗 微调 embedding 用的就是对比学习 + in-batch 负采样 + 温度系数,和推荐算法第 8 章的双塔训练是同一套方法,连坑都一样:负样本选错(用"曝光未点击"当负样本会训废)、采样分布与假负例偏差;是否用 LogQ、温度取值要结合具体损失与验证结果。要动手微调之前先去读那一节。
🚨 最后一条是运维铁律:换了 embedding 模型,全库必须重建索引。 新旧模型的向量空间不通用,混在一个索引里检索结果是乱的——而且不报错,只是变差。 需要不停机灰度时,用双索引并行(新旧各一份,按流量切);允许停机时可完整重建后切换,不能混合不同空间。
🔗 想再深一层,去哪一套
| 去哪 | 为什么 |
|---|---|
| 推荐算法 06 · 工业架构-召回粗排精排重排 | ⭐ 同一个漏斗在工业推荐系统里的完整版:每一层该留多少候选、算力怎么分配 |
| 推荐算法 10 · 向量检索与ANN | HNSW / IVF 为什么快、怎么工作 —— 重排之前那一层的底子 |
| AI全栈 07 · 向量检索落地 | ⭐ 「换 embedding 必须全库重建索引」在工程上怎么落:那一章给的是要么停机、要么建新表双写再切换,以及为什么必须存一列 embedding_model |
✅ 检查点
- 为什么说重排是性价比最高的一步?
- Cross-Encoder、ColBERT、LLM 重排三条路线的核心差别是什么?应该依据哪些质量、候选规模与资源证据选择?
- ColBERT 的 MaxSim 是怎么算的?它换来了什么、代价是什么?
- 什么信号说明“该换 embedding 模型了”?换模型有一条什么运维铁律?
👀 答案
- Cross-Encoder 联合编码问题与文档,能做深度相关性比较;是否更准、更划算,必须在固定候选与题集上比较质量、延迟和成本。
- 双塔在向量比较时交互,Cross-Encoder 联合编码,ColBERT 在 token 向量间做后期交互,LLM 按任务读取候选。按实际质量、候选规模、存储与延迟选择,没有永远最好的路线。
- MaxSim 对每个问题 token 取最相似文档 token 的得分,再求和。文档表示可预计算,代价是多向量存储与索引复杂度;延迟和质量优势都需实测。
- 四个信号:语种不对(英文模型跑中文是配置错误不是效果问题)、领域词汇完全在分布外(医学/法律/工单代号)、⚠️块长超过模型
max_seq_len被静默截断(最隐蔽,因为不报错)、非对称检索没加 query/document 前缀。铁律:换 embedding 必须全库重建索引——新旧向量空间不通用,混在一个索引里检索结果会乱且不报错;灰度期要双索引并行。
🛑 可以停在这里
召回对了、也排到前面了 —— 到这里 RAG 的检索侧就基本齐了。
⚠️ 什么时候看下一页:你已经没法凭感觉判断「这次改动到底有没有变好」。那说明该上评估了。
⚡ 走神救援
先记住这几件事
- 召回先找候选,重排再细看问题与文档的匹配程度。
- 不同重排方式在交互深度、预计算、存储和延迟之间取舍。
- 更换 embedding 前检查截断、前缀与语种;新旧空间不能随意混用。
下一节 👉 08c-RAG怎么评估.md