向量量化压缩:把RAG内存占用砍到四分之一
先给结论知识库一大向量内存就吃不消原始 float32 存几百万条向量轻松上几十 G。把向量做量化quantizationint8 能省四分之三内存二值化更狠能省到三十多分之一检索速度还快——代价是召回略掉一点点多数场景完全划得来。今天讲清楚 int8 和二值量化怎么落地、精度掉多少。内存是怎么被向量撑爆的算笔账就明白了。一条向量 1024 维float32 每维 4 字节一条就是 4KB。一百万条 chunk光向量本体 4GB五百万条 20GB。这还没算索引结构的开销。我有个项目知识库膨胀到三百多万条机器内存告警天天响加内存条又心疼钱逼着我去研究量化。量化的核心思想很朴素别用那么高的精度存每个维度。float32 的精度对检索这种「比相对远近」的活儿是浪费的降到 int8 甚至 1 bit照样能分出哪个近哪个远。int8 量化最稳的省内存方案把每个维度从 4 字节的浮点压成 1 字节的整数内存直接砍到四分之一。做法是先统计每一维的取值范围把 [min, max] 线性映射到 [-127, 127]。import numpy as np def quantize_int8(vec, vmin, vmax): scale (vmax - vmin) / 254 q np.round((vec - vmin) / scale - 127).astype(np.int8) return q def dequantize_int8(q, vmin, vmax): scale (vmax - vmin) / 254 return (q.astype(np.float32) 127) * scale vmin检索时可以直接在 int8 上算近似距离省内存又省算力。我实测下来recall5 从 0.91 掉到 0.90几乎无感内存从 20GB 降到 5GB。这笔买卖太值了。二值量化省到极致但要配重排更激进的是二值化每维只留 1 bit正数记 1负数记 0。1024 维向量压成 128 字节内存省到三十多分之一距离计算用汉明距离快到飞起。def binarize(vec): return np.packbits(vec 0) # 每维取符号打包成 bit代价就明显了精度掉得多。单靠二值检索 recall 会掉到 0.8 出头不能直接用。正确姿势是两段式先用二值向量快速粗筛出几百个候选快、省内存再对这几百个候选用原始 float 向量精算重排。粗筛省资源精排保精度。方案内存recall5适用float32 原始基准0.91小库、不差钱int8 量化1/40.90多数场景首选二值精排~1/300.89超大库、内存紧我踩的一个坑量化的「码本/范围参数」是从一批数据统计出来的。我一开始拿一小撮样本算 min/max后来知识库新增了一批分布很不一样的文档老范围把新向量压得变形那部分召回突然变差。教训量化范围要拿足够有代表性的全量样本统计知识库结构大改之后最好重新算一遍。说实话这些底层量化我没全自己撸。智能体和知识库搭在一个零代码就能配 RAG 的平台上向量化、存储、检索它托管着量化这种工程优化平台帮你扛掉大半我主要操心切分和召回质量。但你要是知识库体量极大、对内存/成本特别敏感了解量化的取舍仍然有用——至少知道平台帮你省的是哪部分也知道精度为什么会掉那么一丢丢。(底层大模型和 RAG 我走的讯飞星辰 MaaS现成模型和托管知识库直接用没自部署)你们百万级向量库是怎么扛内存的上 int8 还是二值召回掉了多少能接受评论区聊聊。