向量搜索通过将高维向量组织到能够进行高效相似性比较的结构中来索引数据。核心思想是将向量映射到一个索引中,该索引将相似项分组在一起,从而减少进行详尽比较的需要。大多数方法使用聚类、基于树的层次结构或基于图的导航来实现这一点[1][4][8]。例如,在 IVFFlat(带有平面压缩的倒排文件)中,向量首先使用 k-means 等算法聚类成组。在搜索期间,系统会识别查询向量的最近聚类中心,并且只比较这些聚类内的向量,从而显著减少计算量[8]。类似地,HNSW(分层可导航小世界)构建了一个多层图,其中每一层都允许“跳转”到相邻节点,从而实现对数时间搜索复杂度[4]。
具体技术因速度和精度之间的权衡而异。乘积量化 (PQ) 将向量分成子向量并将其压缩成紧凑的代码,从而在较低内存使用下进行近似距离计算[4][8]。像 Milvus 这样的平台结合了这些方法:用户可以选择精确搜索(例如,IndexFlatL2
,它计算所有成对距离)或像 IndexIVFFlat
这样的近似方法以获得更快的结果[5][8]。例如,阿里巴巴的 Proxima 通过改进聚类和搜索路径选择来优化召回率和延迟[2]。实际实现还涉及向量归一化、降维和硬件加速(例如,Faiss 中的 GPU 支持)等步骤[8]。
部署考量包括平衡索引构建时间、内存使用和查询性能。在 Elasticsearch 中,向量字段定义为 dense_vector
,搜索使用脚本化的相似性度量,例如余弦距离[10]。对于动态数据,像 MongoDB 的 RAG 这样的系统使用增量索引来更新向量,而无需完全重建[7]。开发人员必须根据数据集大小和精度要求配置参数,例如聚类数量(IVFFlat 中的 nlist
)或图连接(HNSW 中的 efConstruction
)[4][8]。像 Faiss 和 Milvus 这样的开源工具提供 API 来简化这些优化[5][8]。