趋近智
你的 RAG 系统的速度和支持大量用户的能力,通常取决于其向量 (vector)数据库的性能。虽然这些数据库旨在进行快速相似性搜索,但它们并非万能。随着数据集的增长或查询负载的增加,如果不及早优化配置,向量数据库可能成为主要瓶颈。为此,两个主要策略是选择合适的索引方法和实施分片。
向量数据库效率的核心在于其索引和数据分布机制。正确配置这些机制对于最小化延迟和最大化吞吐量 (throughput)是必要的,尤其在系统扩展时。
向量索引是数据结构,它们使得数据库能够快速查找与查询向量相似的向量,而无需与数据集中的每个向量进行穷尽式比较。这通常通过近似最近邻(ANN)搜索算法来实现,这些算法会牺牲少量准确性以换取显著的速度提升。
精确搜索与近似搜索
平面索引(精确搜索):此方法涉及暴力搜索,将查询向量与数据库中的所有其他向量进行比较。它保证找到真正的最近邻(100% 召回率)。然而,其查询时间随数据集大小线性扩展(,其中 是向量数量, 是它们的维度)。这使得它对于大型数据集不实用,但它可能适用于较小的数据集(例如,数万个向量),或者当对准确性要求极高且延迟容忍度高时。一些数据库可能会将其称为 FLAT 或简单地称之为无索引。
近似最近邻(ANN)索引:对于大多数生产 RAG 系统,ANN 索引是首选方案。它们通过组织向量以实现定向搜索,显著降低大型数据集上的搜索延迟。常见类型包括:
倒排文件索引 (IVF):
基于 IVF 的索引,如 IVFFlat 或 IVF_SQ,首先将数据集向量聚类成 个分区(Voronoi 单元),每个分区由一个质心表示。当查询到来时,系统识别 nprobe 个最近的质心,然后仅在与这些选定分区关联的倒排列表(包含向量)中搜索相似向量。
IVF 索引将向量划分为簇。查询与簇质心进行比较,搜索仅限于最近簇中的向量。
nlist:索引构建期间要创建的簇(分区)数量。一个常见的起始点是 到 。nprobe:查询时要搜索的邻近簇数量。较高的 nprobe 会提高召回率但也会增加延迟。nprobe。索引构建时间可能相当长。分层可导航小世界图 (HNSW): HNSW 构建一个多层图结构,其中节点是向量,边表示邻近性。搜索从顶层(最稀疏层)的一个入口点开始,贪婪地向查询向量移动,并转移到更密集的层以进行更精细的搜索。
HNSW 使用多层图。搜索从稀疏的顶层向更密集的基层导航,以查找最近邻。
M:每层每个节点的最大出边数量。更高的 M 意味着更密集的图,更好的召回率,但构建时间和内存消耗更高。efConstruction:(构建效率因子)索引构建期间动态候选列表的大小。更高的值会带来更好的索引质量但构建时间更长。efSearch 或 ef:搜索期间动态候选列表的大小。更高的值以增加延迟为代价提高召回率。基于量化 (quantization)的索引(例如,乘积量化 - PQ,标量量化 - SQ): 这些技术会压缩向量本身,减少其内存占用并加速距离计算(因为计算是在更短的代码上进行的)。
IVF_PQ、IVF_SQ8)。IVF 结构首先缩小搜索空间,然后使用量化表示和专用距离函数(如 PQ 的非对称距离计算)比较这些分区内的压缩向量。选择合适的索引和调优
没有普遍“最佳”的索引。最佳选择取决于你的具体需求:
efSearch 的 HNSW,甚至 Flat(如果可行)。如果可以接受一定的近似,IVF 或基于 PQ 的索引是不错的选择。M 和 efConstruction 较大时,HNSW 构建可能很慢。IVF 构建时间取决于 nlist 和数据集大小。索引类型比较,说明了搜索召回率和查询延迟之间的普遍权衡。实际性能根据数据和配置而异。
索引构建和维护: 构建 ANN 索引是一个计算密集型过程。这个“训练”阶段可能需要数分钟到数小时,具体取决于数据集大小和索引参数。
当你的向量 (vector)数据集超出单台服务器的容量(无论是存储向量/索引的内存,还是处理查询的 CPU),或者你需要将查询吞吐量提高到单个节点所能处理的范围以上时,分片就变得必要。分片涉及将数据水平分区到向量数据库的多个节点或实例上。
分片式向量数据库架构。查询被分发到所有分片,结果被聚合以查找全局最近邻。
分片的工作方式: 大多数现代向量数据库都提供内置分片功能。当查询到来时:
分片考量:
top_k 请求,这个聚合步骤可能会变得明显。分片的好处:
分片内的索引: 每个分片都维护其所持数据的独立索引。前面讨论的索引策略(IVF、HNSW 等)适用于每个分片的本地数据集。这意味着你将为每个分片配置索引参数 (parameter),尽管在集合中这些设置通常在所有分片上保持一致。
严格基准测试:
nlist、nprobe;HNSW 的 M、efConstruction、efSearch;PQ/SQ 的压缩比)。监控你的向量 (vector)数据库:
迭代和优化:
向量数据库优化通常是一个迭代过程。从所选数据库的合理默认值或建议开始,进行基准测试,分析结果,然后调整参数或策略。例如,如果延迟过高但召回率良好,你可以尝试降低 nprobe(对于 IVF)或 efSearch(对于 HNSW)。如果内存有问题,可以考虑量化或增加更多分片。
考量数据特征对索引的影响: 向量的分布可以影响索引性能。高度聚集的数据在某些索引类型下可能与均匀分布的数据表现不同。虽然对向量分布的详细分析是高级主题,但了解它可以帮助你在遇到性能瓶颈时解决问题。
硬件选择: 确保你的向量数据库节点有足够的 RAM,因为许多索引和搜索操作都受内存限制。快速 CPU 也有帮助,特别是对于 HNSW 中的距离计算和图遍历。如果索引或数据溢出到磁盘,通常建议使用 SSD 而不是 HDD。
通过系统地选择和调整索引策略,并在需要扩展时慎重实施分片,你可以确保你的向量数据库仍然是 RAG 系统中高性能的组成部分,即使在严苛的生产负载下也能快速提供相关结果。这种细致的优化直接有助于整个 RAG 流水线的整体响应速度和可扩展性。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•