Sentence Transformers v6 让晚交互更容易尝试,但并没有降低成本
Sentence Transformers v6 增加了多向量检索,而其自身结果显示,平均质量仅有适度提升,同时存储成本却大幅增加。
Sentence Transformers 6.0 让尝试 ColBERT 风格的检索变得容易得多。新的 MultiVectorEncoder 可以加载晚交互检查点,分离查询和文档编码,计算 MaxSim 分数,并在库原有的稠密、稀疏和交叉编码器家族之外增加训练与评估支持。
这种便利并不会让多向量检索自动成为检索增强生成系统的升级方案。它为每个文档 token 保留一个向量,而不是为整个文档保留一个向量,因此额外的匹配细节可以换来质量,却要付出索引空间和更高要求的服务路径成本。Sentence Transformers 目前也没有取代 PyLate 的 PLAID 索引和检索层。
相关的权衡是在真实语料上比较质量、延迟和存储。稠密或稀疏系统提供基线;交叉编码器重排器和多向量替代方案可以显示晚交互是否带来足够的检索质量提升,从而值得承担存储、更新和服务成本。库的发布让这种比较更容易,但它不会决定某个特定产品应站在哪一侧。
晚交互保留了单向量压缩掉的细节
稠密检索器将每个查询和文档转成一个向量。向量可以只存储一次并以较低成本比较,但长文档中的名称、标识符、限定条件和主题必须共享一个固定大小的表示。交叉编码器通过把查询和候选文档放在一起处理来保留更多交互,但为每次请求给整个集合评分的成本又太高。
晚交互位于这两种设计之间。它提前编码文档,但为每个 token 保留一个较小的向量。查询时,MaxSim 算子为每个查询 token 找到最佳文档 token 匹配,然后把这些最佳相似度相加。Hugging Face 技术指南将其描述为软对齐:精确标识符可以保留自己的匹配,相关术语仍可通过上下文嵌入对齐。
这既改变了检索器能够注意到的内容,也改变了索引必须存储的内容。
query token best matching document token similarity
"wooden" -> "oak" -> 0.91
"rounded" -> "curved" -> 0.88
"cushions" -> "cushions" -> 0.97
------
fictional MaxSim score for these three tokens 2.76
这条虚构轨迹用于说明算子,而不是测量到的模型结果。每个查询 token 都贡献其最强的文档 token 匹配;真实检查点还各自有前缀、特殊 token、掩码、维度和分数尺度。
| 检索家族 | 存储的表示 | 查询时工作量 | 有用的起点 | 可能使其落选的成本 |
|---|---|---|---|---|
| 稀疏检索 | 词项和倒排记录 | 词法查找 | 精确名称、标识符和透明的基线 | 词汇不匹配和较弱的释义召回 |
| 稠密检索 | 每个文档或分块一个向量 | 向量搜索 | 使用紧凑索引快速生成语义候选 | 一个向量可能模糊稀有或相互竞争的细节 |
| 稠密或稀疏加交叉编码器 | 第一阶段索引,加上对候选短名单的联合评分 | 检索候选,然后与查询一起重新编码 | 候选集召回率良好时的高精度重排 | 重排器延迟随候选深度增长 |
| 多向量晚交互 | 每个保留的文档 token 一个向量 | token 级搜索和 MaxSim 评分 | 细粒度的词项到段落对齐能改善检索的查询 | 索引大小、内存流量、后端复杂度和更新成本 |
没有哪一行是通往下一行的普遍进阶路线。在以标识符为主的数据上,稀疏系统可能胜过时髦的神经检索器。稠密第一阶段加重排器可以在不使用多向量索引的情况下提供被接受的答案。只有当多向量检索能在系统真实预算内改善重要结果时,它才值得升级。
Version 6 增加了模型家族,而不是完整的服务栈
8 月 18 日的发布说明称 MultiVectorEncoder 是继 SentenceTransformer、SparseEncoder 和 CrossEncoder 之后的第四种模型类型。它可以加载原生 Sentence Transformers 和 PyLate 检查点、Stanford ColBERT 检查点,以及受支持的 ColPali 家族视觉文档模型。查询和文档使用不同的方法,因为检查点方案可能分别对两侧应用不同的前缀、长度限制、扩展和 token 掩码。
迁移时,这一区别很重要。对两侧调用通用编码器,可能会悄悄丢弃非对称模型检索方案的一部分。保存的检查点还携带会影响索引和分数的配置选择,因此应记录确切的模型版本,不要把“ColBERT”当作一种可互换的实现。
还有第二道边界。维护者的迁移表表示,MultiVectorEncoder 吸收了 PyLate 的建模、推理、训练和评估工作,但没有 PyLate 的 PLAID 索引和检索器的等价物。使用该服务路径的团队目前必须继续保留 PyLate,或选择并验证另一个后端。同一指南警告,检查点保存兼容性是单向的:旧格式可以加载到 MultiVectorEncoder,但不能保证其保存输出能重新加载到那些库中。
Version 6 也是一次依赖迁移。官方迁移指南将最低版本提高到 Transformers 5.x、PyTorch 2.2+ 和 huggingface-hub 1.x,同时也提高了 NumPy、scikit-learn、训练数据集和 Accelerate 的较低版本要求。它改变了若干分数和工件行为:
- 现在会将半精度稠密和交叉编码器分数向上转换为 float32,以避免饱和或排名打平;
- 旧多进程路径生成的量化索引不具备 bit 兼容性,必须重建;
- 一些每输入的多向量输出现在是矩阵列表,而不是一个可堆叠的张量;以及
- 非对称模型的评估器现在分别调用查询和文档编码器,这可能改变报告的结果。
因此,迁移演练不只是导入测试。重建受影响的索引,在冻结查询上比较排名,验证下游类型和序列化,并保留旧环境和索引以便回滚。
维护者的基准测试说明了为什么平均值不能直接作决定
Hugging Face 比较了两个在相同数据和骨干上训练的 1.49 亿参数模型:128 维的 LateOn 多向量模型和 768 维的 DenseOn 模型。在维护者的 13 数据集 NanoBEIR 测试中,晚交互在九个数据集上胜出,在四个数据集上落败。其平均 nDCG@10——前十个结果上的归一化折损累积增益,这个指标会奖励把高度相关项目放在前面——为 0.6868,而不是 0.6764。这是在该尺度上大约一个百分点的提升,并非普遍胜利。
存储示例就没有那么含糊。对于 4,874 个 Natural Questions 段落,未压缩的 LateOn 表示包含 608,414 个 token 向量,在 float32 中占用 311.5 MB。指南中的 MiniLM 稠密比较占用 7.5 MB。在这个特定示例中,前者空间约为后者的 42 倍。
压缩会改变这个数字,但不会消除决策。同一批 token 向量在指南的 FastPLAID 示例中使用约 92 MB,而分层 token 池化让 float32 表示大致按池化因子缩小。这些都是有用的工程选项,但每一项都会改变后端、表示或保留的信息。它们需要自己的质量和延迟记录行。
较早的同行评审 ColBERTv2 工作从另一个方向证实了同一张力。作者将晚交互原始的空间占用描述为大约大一个数量级,并报告残差压缩带来了 6–10 倍的缩减,同时在其测试基准上改善了结果。这支持把压缩作为严肃的设计工具,但不能把存储比例或质量结果转移到不同的检查点、语料、候选深度或服务实现。
当前的独立测量进一步说明必须固定条件。Retrieval Pareto用明确的质量、p50 查询延迟和索引存储量比较稠密、稀疏、混合和晚交互系统。其方法固定了 A100 40 GB GPU、批大小 1、预热、200 个查询的延迟样本和 top-100 检索;它排除了索引构建、网络开销、磁盘冷启动和应用层重排。这些排除使其各行在内部可解释,却不适合用作另一个生产栈的承诺。
公平的比较有四项严格控制
从代表工作负载的语料快照和查询集开始。包含普通请求、稀有标识符、多约束查询、对新鲜度敏感的材料、含糊措辞和代价高昂的失败。尽可能使用人工相关性判断,并在比较候选模型前将其冻结。
然后在每一行之间保持这些控制一致:
- 输入: 完全相同的语料版本、分块、字段、过滤器、查询集和相关性判断。
- 检索契约: 相同的 top-k 答案要求,以及在可比时相同的候选深度。记录任何家族特有的阶段,不要把它隐藏起来。
- 环境: 相同的硬件、并发度、预热、缓存状态、精度、软件版本和测量窗口。
- 应用决策: 在测量端到端 RAG 质量时,使用相同的答案生成器、提示词、上下文预算、评分器和接受规则。
有些实现无法共享每项设置。这不是假装它们可以的理由。明确记录差异,并在差异可能解释结果时运行第二次消融,例如候选深度 100 对 1,000、压缩与未压缩的多向量索引,或对同一个稠密短名单重排与服务完整晚交互索引之间的比较。
| 字段 | 单位或记录 | 为什么属于决策 |
|---|---|---|
| 检索质量 | nDCG@10、Recall@k、MRR 或适合任务的指标 | 显示相关文档是否进入有用的位置 |
| 最差查询切片 | 每个切片的分数和失败数 | 防止平均值掩盖标识符、长查询或罕见意图 |
| 端到端接受度 | 已接受答案 / 已评估答案 | 测试更好的检索是否改变完成的任务 |
| 查询延迟 | 固定并发度下的 p50 和 p95 毫秒数 | 区分典型响应和尾部行为 |
| 索引大小 | 总字节数和每个文档的字节数 | 让不同语料规模的存储和内存增长可比较 |
| 构建和更新成本 | 墙钟时间、计算时间和文档变更时间 | 捕获离线成本和新鲜度路径 |
| 服务峰值内存 | 声明并发度下的 GiB | 测试索引和评分器是否装得下目标部署 |
| 运营复杂度 | 后端、工件、服务和恢复步骤 | 暴露依赖不受支持或脆弱路径的收益 |
促成升级的规则应在运行前写好。“质量最高者胜出”并不完整,因为增加 200 GB、使 p95 延迟翻倍或破坏每小时更新的 0.5 分提升,可能不会改善产品。一条有用规则会明确最低质量或接受答案提升,以及团队无法承担的每项成本的最高预算。
最小的充分检索系统仍可能是更好的结果
除了“构建完整多向量索引”之外,还有三种合理结果。如果稀疏检索在释义上失败,而稠密检索通过任务门槛,就停在稠密检索。如果稠密或混合第一阶段找到了正确文档,只是排序较弱,就重排一个短名单。如果晚交互改善了决定性查询切片,但完整索引成本过高,就将其作为重排器测试,或把池化和压缩作为单独候选进行评估。
这也是更广泛评估设计发挥作用的地方。向量与嵌入说明(中文)解释了为什么只有在几何结构保留应用所需关系时,相似度才有用。AI 评估指南解释了为什么改变指标可能改变产品决策。版本迁移应保留这两点:新 API 证明实验变得更容易,而不是证明一种表示现在适合所有检索问题。
Sentence Transformers v6 降低了询问晚交互是否值得的成本。它自身的结果表明,答案会因数据集、存储预算、服务后端和查询切片而异,而不只是取决于新 API 是否可用。