在 RAG 系统和推荐引擎的底层,向量数据库的性能往往取决于索引结构的选择。当数据规模突破十亿级别,简单的暴力搜索(Brute Force)已无法满足延迟要求,此时必须在内存占用、查询延迟与召回率之间做出精细的工程权衡。FAISS 作为 Meta 开源的向量搜索库,通过组合多种索引策略,为这一难题提供了成熟的解决方案。
核心索引策略的适用边界
FAISS 并非单一索引方法,而是一个索引组件的 "工具箱"。面对十亿级数据,三种核心机制构成了主流的技术选型:
IVF(Inverted File,倒排文件) 是最常用的粗粒度筛选器。它通过 k-means 聚类将向量空间划分为 $n_{list}$ 个聚类中心,每个向量被分配到距离最近的中心对应的倒排列表中。查询时,只需计算查询向量与各聚类中心的距离,然后仅遍历距离最近的 $n_{probe}$ 个列表中的向量。这种 "先粗筛后精排" 的思路,将搜索复杂度从 $O (N)$ 降至 $O (\sqrt {N})$ 量级。
HNSW(Hierarchical Navigable Small World) 是一种基于图的索引结构,通过构建多层导航图实现近似最近邻搜索。在百万级以下数据集上,HNSW 通常能提供最佳的延迟 - 召回权衡。然而,当数据规模达到十亿级别时,HNSW 的内存开销(需要存储图边结构)和构建时间会成为瓶颈。
PQ(Product Quantization,乘积量化) 则是解决内存瓶颈的关键压缩技术。它将高维向量切分为 $m$ 个子向量,每个子向量独立量化到一个码本中。一个 768 维的向量若采用 PQ8x10 配置(8 个子向量,每子向量 10 比特),仅需 80 比特即可存储,压缩率可达原始大小的 1/30。
IVF_PQ:十亿级搜索的标准配方
对于十亿级向量搜索,业界最成熟的方案是 IVF 与 PQ 的组合 —— 即 IVF_PQ 索引。这种组合的工作流程是:先用 IVF 粗量化定位候选区域,再用 PQ 压缩后的残差向量进行精细距离计算。
参数配置直接决定性能表现。根据 Faiss 论文中的经验公式,聚类中心数量 $n_{list}$ 应与数据量的平方根成正比:
$$n_{list} \approx 15\sim20 \times \sqrt{N}$$
对于 10 亿向量,这意味着 $n_{list}$ 应在 15,000 到 20,000 之间。$n_{probe}$ 参数控制查询时访问的倒排列表数,典型初始值为 4 到 16,可根据延迟预算和召回率要求动态调整。
PQ 参数的选择需要在压缩率与精度之间权衡。子向量数 $m$ 通常设为 8 到 16,每个子量化器的比特数常用 8(即 256 个码本中心)。这种配置下,一个 768 维向量仅需 64 到 128 字节存储,而原始 float32 表示需要 3072 字节。
量化技术的层级与选择
FAISS 支持多种量化器,它们构成一个能力层级:
标量量化器(SQ) 是最简单的压缩方案,将每个维度独立量化为 4、6 或 8 比特。SQ8(每维度 8 比特)在 768 维向量上仅需 768 字节,且编码解码速度极快,适合对延迟极度敏感的场景。
乘积量化器(PQ) 通过子空间分解获得更高的压缩效率。PQ6x10 表示将向量分为 6 段,每段量化到 1024 个中心。相比 SQ,PQ 能更好地捕捉向量空间的局部结构,但编码时需要遍历码本,计算开销更高。
残差量化器(RQ)与局部搜索量化器(LSQ) 属于加性量化器家族,通过多级残差逼近原始向量。LSQ 在小码本场景下精度优于 PQ,但在大规模高维数据上,PQ 仍是工程首选。
工程实践中的关键权衡
在实际部署中,三个维度的权衡贯穿始终:
内存 vs 精度:当内存预算紧张时,可采用 SQ6 或 SQ4 替代 PQ,虽然召回率略有下降,但内存占用可再降低 50%。另一种策略是启用残差编码(by_residual),用粗量化中心的信息补偿压缩损失。
延迟 vs 召回率:$n_{probe}$ 是最直接的调参杠杆。从 4 增加到 16,召回率通常可提升 5-10 个百分点,但查询延迟会线性增长。对于实时性要求高的场景,可先以低 $n_{probe}$ 快速返回候选集,再用精确距离重排序。
构建成本 vs 查询性能:IVF 索引的构建需要 k-means 聚类,时间复杂度为 $O (N \times d \times n_{list})$。当 $n_{list}$ 超过 10 万时,可考虑用 HNSW 作为粗量化器,以空间换时间。
GPU 加速与混合部署
对于十亿级搜索,纯 CPU 方案往往难以满足延迟要求。FAISS 的 GPU 实现支持 IVF 索引的批量查询加速,通过将查询向量矩阵与码本矩阵的批量距离计算 offload 到 GPU,可实现数量级的吞吐提升。
在超大规模场景(万亿级),可采用分层架构:用 HNSW 构建千万级粗量化中心,每个中心下挂一个 IVF_PQ 子索引。这种 "索引套索引" 的结构,将单次查询的向量比较次数控制在数万级别。
参数配置速查表
| 数据规模 | 推荐索引 | $n_{list}$ | $n_{probe}$ | PQ 配置 | 单向量内存 |
|---|---|---|---|---|---|
| 1 亿 | IVF_PQ | 4,096 | 8-16 | 8x8 | 64 字节 |
| 10 亿 | IVF_PQ | 16,384 | 16-32 | 8x8 | 64 字节 |
| 10 亿(内存紧张) | IVF_SQ6 | 16,384 | 16-32 | - | 48 字节 |
| 1 亿(高召回) | IVF_PQ | 4,096 | 32-64 | 16x8 | 128 字节 |
索引选择没有银弹。对于十亿级向量,IVF_PQ 仍是平衡内存、延迟与精度的稳妥选择;若数据分布高度聚集且内存充裕,可尝试 HNSW_PQ;而在极限压缩场景下,SQ 系列量化器提供了更激进的内存优化路径。最终决策应基于实际数据分布和延迟召回指标,通过 FAISS 的 benchmark 框架进行参数空间搜索。
参考来源
- Douze M, Guzhva A, Deng C, et al. The Faiss Library[J]. arXiv preprint arXiv:2401.08281, 2024.
- Johnson J, Douze M, Jégou H. Billion-scale similarity search with GPUs[J]. IEEE Transactions on Big Data, 2019.
内容声明:本文无广告投放、无付费植入。
如有事实性问题,欢迎发送勘误至 i@hotdrydog.com。