避坑!一不留神你的RAG系统中的向量数据库每年就要烧掉几十万RMB!

几天前,我和一位前同事聊天,他们团队负责管理包含十亿条向量数据的向量数据库。为了不至于将磁盘撑爆,他们使用了 HNSW 索引、748 维的嵌入模型。但是老板已经快干不下去了,因为每年的云服务器费用还是高达几万美金!

问题并不在于他们选错了嵌入模型,甚至也不是选错了向量数据库。原因很简单:他们的向量太大了。

为什么十亿个嵌入向量会花这么多钱

以 768 维为例,每个 float32 向量是 768×4 字节 = 3072 字节,所以十亿个就是 3.07 TB 的原始数据。如果再加上大约 15% 的 HNSW 索引开销、元数据等,总共约为 3.5 TB。

在 AWS 上使用 gp3 磁盘,基本费率为 $0.08/GB·月,约等于 $80/TB·月,那么每个节点每月的存储成本约为 $280。但为了实现亚 10 毫秒的向量搜索延迟,通常还需要额外配置 IOPS 和吞吐量 —— 所以实际成本更接近 $400–450/TB·月。以 $450/TB·月计算,3.5 TB 的存储成本约为每月 $1575 每个节点。再加上副本、开发/测试集群、数据摄取管道和计算节点,每个月为搜索所付出的成本轻松就能上五位数。

维度灾难让情况更糟。维度越高,数据越稀疏。为了保持高召回率,索引需要检索更多候选向量,导致 CPU 和 I/O 成本上升。简而言之,每增加一个维度,都是在成本墙上再砌一块砖。

但大型索引真正的成本甚至不是基础设施费用,而是维护成本 —— 你需要一个庞大的搜索团队来构建和维护它。如果你能将索引大小减少 10 倍,你可能可以节省 2–6 名专职的搜索工程师!

向量“欠量化”的成本

“欠量化”就是你保留了比实际需要更多的嵌入维度。2024 年,很多人直接使用模型默认输出 —— 比如 768 或 1536 维 —— 因为大家都认为“越多越好”。更重要的是,当这些搜索流程被搭建时,量化技术还不够成熟,所以最终系统都比当时的最先进技术(SOTA)更臃肿。而向量数据库并没有激励去教育开发者正确使用量化 —— 因为不量化可以让他们赚得更多!

现代基准测试显示,在使用合适的嵌入模型的前提下,64 维的二进制向量在许多搜索任务中能维持与 1024 维向量相近的性能。虽然每维 1 位的二进制量化已经有很大帮助,但它无法拯救一个本身维度就太高的向量。

为了理解量化在互联网规模下所带来的巨大节省,我们来算一算如果你有 20 亿个向量:

748 维,float32:

  • 原始数据:2e9 × 748 × 4 字节 ≈ 5.98 TB

  • 索引后(约 25% 开销):≈ 7.48 TB

128 维,float32:

  • 原始数据:2e9 × 128 × 4 字节 = 1.024 TB

  • 索引后:≈ 1.28 TB

64 维,float32:

  • 原始数据:2e9 × 64 × 4 字节 = 0.512 TB

  • 索引后:≈ 0.64 TB

64 维,二进制(1 bit/维):

  • 原始数据:2e9 × 64 bits ÷ 8 = 16 GB (0.016 TB)

  • HNSW 指针开销:2e9 × 256 B ≈ 0.512 TB

  • 总索引大小:≈ 0.016 + 0.512 = 0.528 TB

这已经是数据量上的数量级压缩,并能显著降低成本、加快搜索速度。更重要的是,这对于一个小型搜索团队来说也更容易管理。

2025 年的量化与磁盘索引新进展

在 2025 年,我们拥有了新的工具,能更安全地实现这些压缩。采用嵌套嵌入(Matryoshka 表示学习)训练的模型,能让前 64 或 128 维承载几乎所有语义信息。你可以直接截断剩余部分,而不需要重新训练一个低维模型。这类模型通常也会被训练得适应二进制或标量量化。

在索引方面,KX (https://kx.com/)的 qHNSW 磁盘引擎将大部分向量数据保存在 SSD 上,只在内存中存放最小化的元数据。数百万个 64 维向量仅占几个 GB,查询时间保持在 200 毫秒以内,CPU 占用也大幅下降。

关键是采用两阶段检索:

1. 先用紧凑、便宜的索引选出前 K 个候选项;

2. 再用交叉编码器(cross-encoder)或 BM25 进行重排序。

这样即使在量化时略微损失了一些精度,也可以通过 rerank 拿回来。真实基准中,召回率下降通常在 5% 以内。更有意义的做法是:先快速构建一个激进量化的索引,再专注于精细调整 reranker —— 毕竟,修改 rerank 服务比重新嵌入 10 亿个数据点容易多了!

降低成本的简单步骤

  • 从小维度开始。尝试使用 64 或 128 维,而不是默认的 768 或 1536 维。

  • 积极进行量化从 float32 转为 int8 或二进制是基本操作;但真正节省成本的,是直接减少维度

  • 使用两阶段检索。先在紧凑的索引上粗略筛选,再对少量候选进行重排序。

  • 如果可能,请严格进行基准测试在每次更改前后测量准确率、延迟和成本。但如果你不打算测试,那就千万别用大维度嵌入——你根本没有证据证明它们在你的数据上表现更好。

  • 不要盲信默认设置很多向量数据库默认使用高维模型和全内存索引。改用磁盘上的 qHNSW,并显式设置维度

向量搜索不是“维度越多越好”或者“占满内存越快”这种游戏——它是一个工程优化问题。在 2025 年,随着成熟的量化技术和磁盘索引方案,你完全可以用一两台机器跑大规模搜索裁剪你的向量,优化你的流程,基础设施的费用将大幅下降。

https://medium.com/kx-systems/the-most-common-vector-search-mistake-is-costing-enterprises-hundreds-of-thousands-dd1ffd0b976d

(文:PyTorch研习社)

发表评论

×

下载每时AI手机APP

 

和大家一起交流AI最新资讯!

立即前往