一句话定义
标量量化(Scalar Quantization)把每个分量独立地从 float32(4 字节)压到更低比特——fp16(2 字节)、int8(1 字节)甚至 4/1 bit——是压缩率与失真之间最温和的权衡:逐维独立、构建零成本、召回损失通常很小。
为什么重要
内存是向量库最贵的资源(见 kp-026 的账本),而 int8 一档就砍掉 75% 向量内存且几乎不动索引结构——这是生产系统里性价比最高的一笔优化。SQ 也是"图导航 + 压缩向量"组合拳(kp-008 案例)里最常用的压缩腿,Qdrant、FAISS、Milvus、pgvector(halfvec) 全线支持。
前置知识
kp-003(度量)、kp-004(三元权衡);二进制表示的基础常识。
核心概念
- affine 量化:每维(或全局)记录 min 与 max,线性映射到整数区间。
- scale 与 zero-point:映射的比例与偏移,反量化时还原。
- fp16 半精度:直接截位存储,几乎无损,压缩率仅 2 倍——"保真优先"的选择。
- int8:1 字节,压缩 4 倍,可整数 SIMD 加速距离计算。
- rescoring(精排):先用量化距离粗排出更大候选集,再用原始浮点距离重排 top 结果,把失真挡在最终排序之外。
原理与机制
affine 量化的映射与还原:
量化: x_q = round( (x - min) / scale ), scale = (max - min) / 255
还原: x̂ = x_q × scale + min
误差上界(每维): |x - x̂| ≤ scale / 2距离计算两种口径:直接在整数域算(int8 全程 SIMD,最快)或反量化回浮点再算。失真来源是均匀量化噪声:对高斯类嵌入分布,int8 每维相对误差约千分之几量级,聚合到 d 维距离后对排序的影响通常只翻转"几乎并列"的候选——这是 int8 实测召回损失常小于 1~3 个百分点的原因。
压缩-失真阶梯(768 维为例):
| 精度 | 每向量字节 | 压缩率 | 典型召回影响 | 用法 |
|---|---|---|---|---|
| float32 | 3072 | 1× | 无损 | 基线 |
| fp16 | 1536 | 2× | ≈0 | 直接替换 |
| int8 | 768 | 4× | <1~3% | +rescoring 或补 efSearch |
| 1 bit | 96 | 32× | 显著,需精排 | 见 kp-031 |
公式或模型
内存账直接收益:
N=1e7, d=768: fp32 29.5GB → int8 7.4GB, 省 22GB
HNSW 图内存不受量化影响(指针仍是 4B), 见 kp-008 公式图示
float32: | 0.7231 | 0.1189 | 1.4472 | … 每维4B
int8: | 185 | 30 | 255 | … 每维1B + 全局(min,max,scale)
还原: 185×scale+min ≈ 0.7231 (误差 ≤ scale/2)实例或案例
Qdrant 对 1 亿条 1536 维向量做 scalar int8 量化并开启 rescoring(量化粗排 4 倍候选 + 原始浮点精排):内存从约 600 GB 降到约 150 GB,recall@10 仅降 0.4 个百分点,p99 反而下降(内存带宽压力减小)。对照组:直接量化不精排,召回掉 2 个百分点——rescoring 就是花少量 CPU 把失真挡回去。
直观类比
把每维"身高测量"从毫米级精度(float32)改成厘米级刻度(int8):绝大多数排序不受影响,只有身高几乎相同的两人可能排错——精排相当于把并列候选人重新用毫米尺量一遍。
常见误区
- "量化后距离可以直接与浮点时代的阈值比较"——量纲变了,业务相似度阈值必须重新标定;比较排序无碍,比绝对值有坑。
- "压缩率越高越好"——int8 以下(4 bit、1 bit)失真非线性上升,必须配 rescoring 与更认真的重测,见 kp-031。
- "量化能省建库时间"——SQ 构建近乎免费,但 HNSW 图结构本身不压缩;图内存要靠降 M 或换磁盘方案(kp-013)。
自测题
- int8 相对 float32 的内存压缩率与典型召回代价?
- 为什么 fp16 常被称为"免费午餐"?
- rescoring 的原理与代价?
答:4 倍压缩;配 rescoring 或补偿 efSearch 时召回损失通常在 1~3 个百分点内,具体以自建评测为准。
答:直接降比特存半精度、无需训练码本、几乎零失真,代价只有 2 倍压缩率——预算允许时是最安全的第一步。
答:量化距离粗排出数倍于 k 的候选,再取原始向量精排 top-k;代价是候选集的浮点距离计算与原始向量访问(内存/IO 略增)。
与其他知识点的关系
kp-012 把"逐维独立量化"升级为"分段子空间码本";kp-026 把本篇压缩率放进总成本账;kp-031 展示把压到 1 bit 后如何用理论修正救回精度。
延伸阅读
Johnson, Douze, Jégou, "Billion-scale similarity search with GPUs"(2017)——量化表示在大规模检索中的工程化实践与精度权衡。