
多向量晚期交互嵌入模型:Sentence Transformers 统一支持

Sentence Transformers 在 v6.0 更新中新增了第四种模型类型 MultiVectorEncoder,用于 ColBERT 风格的晚期交互检索。此前,PyLate 和 colpali-engine 分别承载了文本和视觉文档的晚期交互检索,但未能融入统一的 API。此次更新将这三类生态统一收编:任何 PyLate 检查点、任何 Stanford-NLP ColBERT 检查点均可直接加载,colpali-engine 的视觉文档检索模型也能通过同一套熟悉的 API 使用。安装只需 pip install -U sentence-transformers,视觉模型需加装 [image] 依赖。
多向量模型与普通稠密模型的不同在于压缩方式。稠密模型将整段文本压成一个向量,查询中的多个要求(如“绿色沙发、木腿、圆靠垫”)必须挤在同一点上,容易丢失细节。多向量模型保留每个 token 的嵌入(经典维度为 128),一篇 9 token 的文档变成 9×128 矩阵。打分时用 MaxSim 算子:对每个查询 token,取它与文档所有 token 的最大相似度,再求和。由于 token 嵌入经过 L2 归一化,每个点积是余弦相似度,总分落在 [-查询token数, 查询token数] 区间。这个算子可视为软对齐:每个查询 token 指向文档中最佳解释它的那个 token。由于 token 嵌入是上下文相关的,对齐不需要词面匹配,例如 lightonai/mLateOn 中“live”与“inhabit”的相似度高达 0.94。
收益与代价都很明确。检索质量提升,特别在文档某一片段才是关键、多条件查询、以及领域外数据上;效果随文档长度增长。代价是索引体积:每 token 一个向量而非每文档一个。用 lightonai/LateOn 编码 4,874 段 Natural Questions 文本,产生 608,414 个 token 向量,平均每段 124.8 个,约为 MiniLM 索引的 42 倍存储。但压缩索引可大幅缩减,同一批向量用 fast-plaid 索引仅占 92 MB(原始 float32 为 311.5 MB)。作为对比,4096 维稠密模型 Qwen3-Embedding-8B 约需 80 MB,所以压缩后的多向量索引与人们已运行的稠密索引体量相当。Token Pooling 能进一步减少向量数量,而 Retrieve and Rerank 则完全不需要构建索引。
API 设计与现有 Sentence Transformers 一致,但查询和文档不对称:必须用 encode_query() 和 encode_document(),二者使用不同前缀、长度上限和 token 掩码。返回的是二维张量列表,每个输入形状为 (token数, 128),无法堆叠成矩形。model.similarity() 计算全量 MaxSim 矩阵,model.similarity_pairwise() 用于配对打分。分数大小受查询 token 数影响,不同模型的分数不可直接比较;可将 similarity_fn_name 设为 meanmaxsim 得到平均余弦相似度。
针对小规模语料,可直接穷举 MaxSim;4,874 段文档编码约 20 秒(RTX 3090),每次搜索约 120 ms。大规模场景推荐使用专用索引:Qdrant(v1.10+)、Weaviate(v1.29+)、Vespa、LanceDB(v0.15.0+)、VectorChord、Milvus v2.6.4 均原生支持多向量检索。文中给出了 fast-plaid、Qdrant、Weaviate、Vespa 四个可运行示例,均能复现穷举 MaxSim 的排序与分数(精确到四位小数),其中 fast-plaid 是近似索引,分数略有偏差。另一种方案是用多向量模型做重排:先用快速双编码器召回 50 个候选,再用 MaxSim 只对候选重排,索引仍是稠密索引,token 向量是瞬时的。
视觉文档检索是晚期交互的优势场景:直接对页面图像做查询,无需 OCR。ColPali 系列模型(如 vidore/colqwen2.5-v0.2)加载后与文本模型使用相同的编码/打分代码,文档 token 数远多于文本(一页约 755 个,而文本段落约 125 个)。音频和视频检索同样可用 ColQwen-Omni 零样本完成,但视频内存占用极高,需要降帧率、降分辨率;原文示例在 0.5 fps 降采样下用 12.5 GB VRAM 得到与全帧率一致的排序。
可解释性由 MaxSim 的分解性质直接给出:每个分数点都归属某个查询 token 与文档 token。Hugging Face 的 interpretability 工具可为图像文档生成标准 ColPali 热力图,文本文档则输出 token 级归因表。Token Pooling(HierarchicalTokenPooling)用层次聚类将文档向量按 pool_factor 压缩,实验显示 pool_factor=2 时平均保留 100.6% 的检索性能,3 时保留 99.0%。推理加速方面,GPU 上 fp16+Flash Attention 是测试中最优配置,吞吐量为 fp32 的 2.44 倍,且无检索质量损失;但带非注意力查询扩展(attend=False)的模型需改用 sdpa 后端。CPU 上 OpenVINO 搭配 int8 量化可再提速,代价约 0.4% 准确率。
评估用 MultiVectorNanoBEIREvaluator,跑 13 个 NanoBEIR 子集。同源对照(LateOn 多向量 vs DenseOn 稠密,同参数 149M)显示多向量在 9/13 数据集上胜出,平均 NDCG@10 高约一个点(0.6868 vs 0.6764)。在完整 BEIR 上差距类似(57.22 vs 56.20),说明收益并非小基准的假象。注意分数与模型配置相关,且 NanoBEIR 是小基准,应结合自身数据评估。
PyLate 和 colpali-engine 用户迁移时,核心 API 变化已在上文映射:encode_query/encode_document 替代 encode(is_query=…),model.similarity 替代 colbert_scores,索引部分保留 PyLate 的 PLAID 或使用新提供的四个数据库方案。保存兼容是单向的:这三个生态的检查点可加载进 MultiVectorEncoder,但 MultiVectorEncoder.save_pretrained 的输出不能被它们加载。支持模型列表以 Hub 上的标签为准,文末给出了文本与视觉模型的性能和 NanoBEIR/NanoViDoRe 评分表。


