维度决定了什么
向量维度是每段文本被表示成多少个浮点数:维度越高能承载的语义细微差别越多,但存储与计算成本按维数线性上涨。100 万条 768 维向量用 float32 存约占 2.9 GiB,换成 1024 维就接近 3.8 GiB,再乘副本数就是内存下限。压缩手段有 Matryoshka 截断(训练时即支持截短的模型)、半精度与 int8、二值量化,用哪种要以评测结果说话。
基本信息
| float32 存储 | N × dim × 4 字节 |
|---|---|
| 100 万 × 768 维 | 约 2.9 GiB |
| 100 万 × 1024 维 | 约 3.8 GiB |
| 压缩手段 | Matryoshka 截断、半精度、int8 与二值量化 |
| 选型依据 | 自有评测集上的召回结果,而不是维度数字 |
典型使用场景
- 容量规划:按向量条数与维度估算内存,再决定机器规格与副本数
- 成本优化:把 1024 维降到 512 维观察召回变化,判断差价值不值
- 模型选型:同语料下比较不同维度的模型,兼顾精度与延迟
- 混合检索:稀疏向量与稠密向量并存时,稠密侧维度直接影响融合开销
- 缓存与快照:索引体积决定备份与迁移的耗时,维度是最直接的影响项
存储估算
存储估算
def fp32_gib(n, dim):
return n * dim * 4 / (1024 ** 3) # 每条 dim 个 float32
print(round(fp32_gib(1_000_000, 768), 2)) # 约 2.86 GiB
print(round(fp32_gib(1_000_000, 1024), 2)) # 约 3.81 GiB
# 实际部署还要加:副本倍数、索引结构开销、payload 与倒排表
维度区间与取舍
| 维度档位 | 特点 | 适用 |
|---|---|---|
| 128 到 256 | 存储最省,语义粒度较粗 | 海量粗筛或内存受限环境 |
| 384 左右 | 轻量档常见值 | 原型验证与中小语料 |
| 768 到 1024 | 表达力与成本的平衡点 | 通用知识库主力配置 |
| 1536 及以上 | 细节区分力最强 | 高价值小语料,精度优先 |
量化能显著压缩存储但有精度损失,上线前用评测集对比量化前后的召回变化;多数库支持先量化粗筛、再按原始向量精排。
Matryoshka 模型可以把长向量截短到前若干维继续使用(如 1024 截到 512),但截短前需重新归一化,且非此类模型不支持这种截断。
维度还影响检索延迟:向量越大,距离计算与量化索引的构建时间越长。高并发场景下低维度模型往往能换来更高的每秒查询数,值得纳入选型对比。