向量维度从 768 改成 64,存下来的数字少了很多,搜索还能不能用?读完 Matryoshka Representation Learning 的论文,再看 Sentence Transformers 的实现说明,这个问题有一个前提。模型需要专门学过怎样让较短的向量也保留有用信息。
这种表示通常叫套娃嵌入。2022 年的 MRL 论文希望同一份表示能适应不同任务和计算资源。它训练多个粒度的表示,让用户在使用时选择长度。前提就在训练里。随手截掉普通向量后面的大部分数值,并不会自动获得同样的能力。
训练时已经照顾短向量
Sentence Transformers 的说明展示了训练方法。模型输出完整向量以后,训练过程还会检查若干较短前缀的表现,把这些长度对应的损失合在一起。文档举出 768、512、256、128、64 等维度。它们是示例中的训练选择,具体模型支持哪些长度,应当查看该模型说明。
这样做使前面的维度也受到训练约束。部署方可以保留完整结果,或者取所需的前缀来处理后面的任务。Hugging Face 的介绍给出一种用途,先用短向量筛出候选,再用完整向量继续比较。候选少了,后一步要处理的范围也会缩小。
这里有一笔容易算错的账,向量短了,后续保存和比较通常更省,但生成这份向量的编码模型并不会仅因截短就自动变小。Sentence Transformers 文档特意提醒,基础套娃嵌入省的是输出向量的处理和存储。若慢在模型编码,缩短结果未必能解决眼前的等待。
截短以后还有处理条件
Hugging Face 的说明还提到归一化。一个完整向量已经做过归一化,截去部分维度后,剩下的向量未必仍符合原来的归一化条件。如果后续比较依赖这一条件,就需要重新处理。查询与文档也应使用一致的模型和维度,不能一边换了设置,另一边继续沿用旧索引。
实际选维度时,可以先在一小份已标注的检索任务上比较。保存同一模型的完整表示,然后按它支持的长度测短向量。观察应该命中的段落有没有消失,并把困难问题单独列出来。平均结果接近,仍可能掩盖某一类行业缩写或相近产品说明的退步。
论文里的分类与检索实验,说明这种训练方式具备研究价值;Sentence Transformers 还提供了语义相似度任务的对照示例。这些证据各自回答特定任务,不能直接换算成企业知识库的答案准确率。我会把它们当作试验依据,具体上线长度交给自己的问题集决定。
预算比较也要沿着实际存储方式走。若系统为了二次排序同时保存长向量和短向量,总占用就不能只按短向量计算。若只保存短向量,又要接受某些细节以后无法从这份数据里恢复。准备切换时保留原始文档和模型版本,才能在质量不够时重新编码。
对已经能满足业务要求的检索系统,可以从减少向量存储开销的小规模试验开始。先得到一张维度、召回表现和占用空间的对照表,再决定是否值得重建索引。没有测过的最短维度,暂时只是一项可选参数。