向量量化对比:int8与二进制量化在召回率及存储方面的差异
测量int8和二进制量化对嵌入向量的召回率及存储空间的影响,分析二进制量化为何会导致数据丢失,以及如何选择合适的压缩级别。
缩小嵌入向量大小听起来像是能轻松省钱的办法,很多指南也只讲到这一步。但快速测试表明,“安全”与“激进”的压缩方式之间的差距远比那些指南所承认的要大。
重点如下:Int8量化通常能在将存储空间减少4倍的同时,保持95%或更高的检索精度。而二进制量化则可实现32倍的存储空间缩减,但除非嵌入模型是为此类量化方式训练的,否则检索精度可能会下降三分之一甚至更多。这两种方法并非处于同一连续体上,其表现差异极大,为模型选择不当的方法很可能会悄悄破坏搜索质量。
量化是通过以较低的精度存储每个维度来实现的。可以从32位浮点数转为8位整数(标量量化),甚至进一步做到每个维度仅用1位(二进制量化)。其节省效果十分显著:使用二进制量化时内存占用可减少多达24倍,使用标量量化时可减少3.75倍;而当语料库中的向量数量超过数百万时,这种优势会更加明显,这在2026年的智能体内存和企业RAG系统中已越来越常见。
具体数据表现
测试语料库为合成数据:包含2,000个向量,每个向量有768个维度,这些向量被分为20个松散的簇,以模拟真实的语义结构。在应用两种量化方式后,检索精度会针对未压缩的float32基准值以recall@10指标进行衡量。首先是int8量化,它会根据数值的绝对值大小进行缩放并将其四舍五入到int8范围内:
def quantize_int8(vecs):
scale = np.max(np.abs(vecs))
q = np.round(vecs / scale * 127).astype(np.int8)
return q.astype(np.float32) / 127 * scale
其次是二进制量化,它仅保留每个数值的符号信息:
def quantize_binary(vecs):
return (vecs > 0).astype(np.float32) * 2 - 1
测试结果如下:
Format | Recall@10 vs float32 | Storage (MB) | Reduction
----------------------------------------------------------------------
float32 | 1.000 (baseline) | 6.144 | 1x
int8 | 0.961 | 1.536 | 4.0x
binary | 0.326 | 0.192 | 32.0x
在存储空间减少4倍的情况下,Int8仍能保持96%的检索准确率,这对大多数生产系统而言已经是非常不错的表现。而二进制格式虽然在未经量化优化的通用嵌入模拟中实现了32倍的压缩率,但其召回率却降到了32.6%——这绝非四舍五入造成的误差,意味着浮点索引本应返回的每三个相关结果中就有大约两个丢失了。
为何二进制格式的兼容性更差
这取决于能够保留的信息量。Int8能为每个维度保留精细的数值,这样的分辨率足以保持向量之间的大部分相对几何结构。而二进制格式仅保留符号信息,完全丢弃了幅度数据,对嵌入空间的简化程度要严厉得多。
不过这并非自然法则,而是取决于模型本身。独立测试表明,某些嵌入架构几乎感觉不到二进制量化的影响,其质量仍可保持在浮点级水平的98%左右;而其他类型的架构则受影响更大,质量仅能达到87%-92%,具体数值还与模型规模有关。决定它们差异的关键在于该模型是否经过训练,能够承受量化处理。
该如何选择
- 将int8设为默认选项。这样虽然会损失少量精度,但损失程度易于预测,而且节省的空间在大型索引中依然足够重要。
- 仅在与二进制量化兼容的模型上使用该格式。目前供应商已提供具备量化感知功能的嵌入版本,因为通用嵌入在二进制压缩下性能会大幅下降。部署前请确认所使用的模型确实经过相关验证,切勿认为该技术在任何情况下都安全可靠。
常见问题
使用int8会损失多少精度?通常损失很小,与完整的float32相比召回率损失一般低于5%,但存储空间可减少约4倍。
二进制量化安全吗?只有经过训练、能够承受这种量化的嵌入模型才是安全的。普通模型可能会损失三分之一的检索精度甚至更多,而具备量化感知能力的模型则能保持98%以上的浮点级质量。
能节省多少存储空间?使用int8格式大约可节省4倍的空间。二进制格式则可实现24-32倍的节省,但精度方面的损失更为显著且难以预测。
需要重新对所有数据做嵌入处理吗?并非必须。如上面的代码所示,可以在事后对现有的float32嵌入数据进行量化处理。不过,那些从压缩角度出发进行训练的模型,通常会比事后才量化的现成嵌入模型表现更好。
最后需要提醒一点:此处的语料库是合成性的且采用聚类结构,仅用于演示。实际的检索效果取决于您的嵌入模型、数据结构以及查询模式,因此在确定压缩级别之前,请先在自己的数据上进行测试。