企业知识库的向量检索系统常常面临一个两难:嵌入维度越高,语义区分越精细,但存储成本和检索延迟也随之上升。假设你管理着一个包含数百万条产品文档的库,每条文档用 1024 维向量表示,单条占 4 KB(按 float32 计算),整个库就是数十 GB。如果为了降低延迟把维度砍到 256,通常需要重新训练一个低维嵌入模型,成本高昂且难以应对不同场景对维度的不同需求。
Matryoshka 表示学习(MRL)提供了一条不同的路径:训练一个模型,使其输出的高维向量在截断后依然保持较好的语义质量。这样,同一个模型既可以生成完整的高维向量用于精确排序,也可以直接截取前 256 维用于快速粗筛,无需为每种维度单独训练模型。本文以企业知识库的检索场景为主线,讨论 MRL 的核心机制、训练方法、截断对精度的影响,以及在实际部署中的权衡。
固定维度嵌入的局限
传统嵌入模型在训练时,针对固定的输出维度优化损失函数。例如,一个输出 1024 维向量的模型,其训练目标只关注完整向量的质量。部署时,如果希望降低存储或加快检索,常见的做法是降维,比如使用 PCA 将 1024 维压缩到 256 维。但 PCA 是在训练后对嵌入进行线性变换,它假设数据的主要方差集中在前几个主成分上,而嵌入的语义信息往往分布在整个向量空间中,线性压缩可能会丢失非线性关系。
另一种做法是直接训练一个 256 维的嵌入模型,但这意味着为每种可能的维度需求都维护一个模型,训练和存储成本随维度数量线性增长。更麻烦的是,下游任务对维度的需求可能动态变化:某个应用可能只需要粗粒度的语义匹配,而另一个应用则需要高精度的区分。固定维度模型无法灵活适应这种变化。
MRL 的出发点正是解决这种刚性:它希望一个模型能产出“可伸缩”的嵌入,即向量的前若干维度已经包含足够的信息,后部维度则提供更精细的区分。这样,截断向量不再是一个需要重新训练的妥协方案,而是模型设计的一部分。
嵌套损失:训练的核心机制
MRL 的训练方式并不复杂,它修改了标准的嵌入训练流程。在常规训练中,模型对每个样本生成一个固定维度的向量,然后计算该向量与目标(如相似样本对)之间的损失。MRL 在此基础上增加了一个步骤:除了完整向量,还对向量的多个前缀子集分别计算损失。
以输出维度 768 为例,训练时可以选择一组预设的截断维度,比如 768、512、256、128、64。对每个维度,将嵌入向量的前若干维取出,分别计算损失,最后将所有损失加权求和作为总损失。优化器通过反向传播调整模型权重,使得每个前缀子集都能较好地完成训练目标。
这种嵌套损失的设计,直观上鼓励模型把最重要的信息放在向量的前面。因为前 64 维的损失权重与完整向量相同,模型必须确保仅凭前 64 维就能恢复足够的语义,否则总损失会很高。于是,模型在训练过程中自动将信息按重要性排序,前部维度承载核心语义,后部维度提供补充细节。
在 Sentence Transformers 框架中,这一过程通过 MatryoshkaLoss 实现。它接受一个基础损失(如 CoSENTLoss)和一组维度列表,对每个维度截断后的向量计算损失并相加。训练代码大致如下:
from sentence_transformers import SentenceTransformer
from sentence_transformers.losses import CoSENTLoss, MatryoshkaLoss
model = SentenceTransformer("microsoft/mpnet-base")
base_loss = CoSENTLoss(model=model)
loss = MatryoshkaLoss(
model=model,
loss=base_loss,
matryoshka_dims=[768, 512, 256, 128, 64],
matryoshka_weight=[1, 1, 1, 1, 1],
)
这里,matryoshka_dims 指定了参与损失的截断维度,matryoshka_weight 为每个维度分配权重。训练时,模型对每个样本生成完整向量,然后分别截取前 768、512、256、128、64 维,用基础损失函数计算每个截断向量的损失,最后加权求和。值得注意的是,MRL 的训练开销并不显著增加,因为截断操作只是简单的张量切片,计算量很小,主要开销仍来自基础模型的前向传播。
截断向量的实际效果
MRL 论文(Kusupati 等人,NeurIPS 2022)报告了多个任务上的结果。在 ImageNet-1K 分类任务上,MRL 嵌入可以在保持相同精度的前提下,将嵌入尺寸缩小至原来的约 1/14。在大规模检索任务中,由于向量维度降低,检索速度可提升至原来的 14 倍。这些数字来自论文中的实验,具体效果会因任务和数据集而异。
在实际的知识库检索场景中,截断的影响可以通过一个简单的实验来观察。假设我们有一个包含 10 万条产品描述的库,使用一个 1024 维的 MRL 嵌入模型生成向量。我们可以分别用前 64、128、256、512 维进行最近邻搜索,并评估召回率(即正确结果出现在前 K 个结果中的比例)。通常,维度越低,召回率下降越明显,但下降的速度取决于数据本身的语义复杂度。对于语义区分度高的数据,前 128 维可能已经足够;而对于语义相近的文档,可能需要更多维度才能区分。
需要强调的是,截断后的向量与原始向量在余弦相似度上并不完全一致。MRL 训练使得截断向量在语义上仍然有效,但相似度分数会发生变化。因此,如果系统依赖绝对相似度阈值进行过滤,截断后可能需要重新校准阈值。
两阶段检索:粗筛与精排
MRL 最常见的应用模式是两阶段检索。第一阶段,使用截断的低维向量(如 256 维)在向量数据库中快速检索,得到一个候选集(例如前 100 条)。由于维度低,这一阶段的存储和计算开销较小,可以使用近似最近邻(ANN)索引进一步加速。第二阶段,对候选集中的每条记录,使用完整的 1024 维向量重新计算相似度,进行精排,选出最终的前 10 条。
这种模式的优势在于,低维向量用于快速过滤掉大部分不相关的内容,高维向量只用于少量候选的精确比较,从而在保证精度的同时降低整体延迟。
以下流程图展示了这一过程:
flowchart TD
A[查询文本] --> B[生成完整嵌入 1024 维]
B --> C[截取前 256 维]
C --> D[低维 ANN 检索 候选集 100 条]
D --> E[用完整向量重排序]
E --> F[返回 Top-10 结果]
在这个流程中,查询文本先通过 MRL 模型生成 1024 维向量,然后截取前 256 维用于 ANN 检索。由于低维向量的存储和比较更快,这一步能迅速缩小范围。之后,对候选集使用完整向量计算精确相似度,确保排序质量。
实际部署时,需要为每个文档同时存储低维和高维向量,这增加了存储开销。但低维向量可以存储在更快的索引结构中,高维向量则用于精排,两者配合可以显著降低整体查询延迟。
与替代方案的比较
MRL 并非唯一的降维方案。下表对比了 MRL 与几种常见替代方案的特性:
| 方案 | 训练成本 | 存储开销 | 检索精度 | 灵活性 | 适用场景 |
|---|---|---|---|---|---|
| 固定低维模型 | 每种维度需单独训练 | 低 | 与维度相关 | 低,需重新训练 | 维度需求固定且已知 |
| PCA 降维 | 训练后需拟合 | 低 | 可能损失非线性信息 | 中等,需为每个维度保留变换矩阵 | 对精度要求不高的场景 |
| MRL 截断 | 一次训练,多维度可用 | 中(需存储多份截断向量) | 高,截断后仍保持较好质量 | 高,同一模型支持任意维度 | 维度需求动态变化或需两阶段检索 |
从表中可以看出,MRL 的主要优势在于灵活性:一次训练即可支持多种维度,适合需要动态权衡存储和精度的场景。相比之下,固定低维模型在维度需求明确且不变时可能更简单,但无法适应变化。PCA 虽然实现简单,但可能丢失语义信息,且需要为不同维度保留不同的变换矩阵。
在存储开销方面,MRL 并不直接减少总存储——如果你同时存储多种截断向量,总存储反而增加。但在两阶段检索中,低维向量用于粗筛,高维向量用于精排,实际查询时只需读取低维向量(除非进入精排阶段),因此能降低 I/O 和计算延迟。
训练成本与部署权衡
训练一个 MRL 模型与训练普通嵌入模型相比,计算开销略有增加,因为需要对多个维度计算损失。但正如前面提到的,截断操作本身很轻量,主要开销仍是模型的前向传播。有资料指出,MRL 训练不会带来显著的训练时间开销,这在实践中意味着可以在几乎不增加成本的情况下获得多维度能力。
部署时,需要权衡存储和延迟。假设每个文档存储 1024 维完整向量和 256 维截断向量,总存储为 (1024 + 256) × 4 字节 ≈ 5 KB,相比仅存完整向量的 4 KB 增加了 25%。但查询时,如果使用 ANN 索引,低维向量的比较速度更快,可能将整体延迟降低数倍。具体收益取决于数据规模、索引类型和硬件。
另一个权衡是精度。截断维度越低,召回率可能下降。MRL 论文报告在 ImageNet 上可达到 14 倍的尺寸缩减而不损失精度,但这是特定任务的结果。在文本检索中,效果因数据集而异。因此,部署前应在自己的数据上评估不同截断维度的召回率,找到精度与效率的平衡点。
常见失败模式与注意事项
MRL 并非万能。一个常见的失败模式是截断维度选择不当。如果截断过短,可能丢失关键区分信息,导致召回率显著下降。例如,在区分“苹果公司”和“苹果水果”时,可能需要较多维度才能捕捉到上下文差异。另一个问题是,MRL 模型的训练数据分布与部署数据分布不一致时,截断向量的有效性可能下降。如果训练数据主要来自通用领域,而部署数据是高度专业化的(如法律文书),前部维度可能无法充分编码专业语义。
此外,截断向量的相似度分数与完整向量不同,如果下游系统依赖绝对分数阈值(例如过滤相似度低于 0.7 的文档),截断后可能需要重新调整阈值。还有,MRL 并不改变模型本身的推理成本——生成完整高维向量的计算量与普通模型相同,截断只影响存储和检索阶段。
在实际部署中,建议先在代表性数据集上评估不同截断维度的召回率、延迟和存储占用,选择满足业务需求的维度组合。同时,监控检索质量指标(如召回率、MRR),以便在数据分布变化时及时调整截断策略。
尚未解决的问题
MRL 的一个开放问题是,如何自动选择最优的截断维度组合。目前,维度选择依赖于人工经验或网格搜索。另一个问题是,MRL 训练中不同维度的权重如何分配——均匀权重是否最优,还是应该根据任务重要性调整。此外,MRL 在多模态场景下的表现仍有待深入研究,尽管论文展示了在视觉-语言模型上的初步结果。
对于企业向量检索系统,MRL 提供了一种实用的工具,但并非所有场景都需要它。如果维度需求固定且明确,传统固定维度模型可能更简单;如果维度需求多样且存储敏感,MRL 的灵活性则值得考虑。理解截断对精度的影响和部署权衡,是决定是否采用 MRL 的关键。