近似最近邻(ANN)算法,例如HNSW、IVF或LSH,需要进行配置以优化其性能。这些算法并非神秘的黑盒;它们会公开一些参数,允许用户微调其行为,直接影响搜索准确性(召回率)、查询速度(延迟)、资源消耗(内存、CPU)以及索引构建时间之间的平衡。理解这些参数对于部署一个符合特定需求的有效向量搜索系统十分重要。可以把调优想象成调整机器上的旋钮。调整一个旋钮可能会让机器运行更快,但精度可能降低。另一个旋钮可能会提高精度,但代价是消耗更多能量。同样地,ANN参数也控制着这些权衡。主要权衡:召回率与性能大多数ANN调优都围绕着前面提到的主要权衡:召回率: 算法找到了多少百分比的真实近邻?召回率越高,准确性也越高。性能: 这通常指查询延迟(搜索有多快?),但也包括索引时间和内存占用。通常来说,提高召回率的参数也会增加延迟和资源使用。调优的目标是找到一个“最佳点”,以满足你的应用需求。例如,一个电商推荐系统可能会优先考虑低延迟以获得良好用户体验,接受略低的召回率;而一个用于科学文献搜索的系统则可能优先考虑高召回率,可以容忍略高的延迟。索引构建参数(构建时)有些参数是在你初次构建ANN索引时设定的。它们会影响索引本身的结构,并影响构建时间以及潜在的搜索质量。HNSW M:这个参数定义了HNSW图中每个节点在单层内可以连接的最大邻居数(边数)。影响: M值越高,生成的图越密集,路径也越多。这通常能提高搜索时获得高召回率的可能性,并使索引更有效,但这会增加存储索引所需的内存,并大幅增加构建所需的时间。较低的值可以节省内存并加快构建速度,但可能会限制可达到的最大召回率。典型值范围为8到64。HNSW ef_construction:这个参数控制着索引构建期间用于跟踪候选邻居以便链接的动态列表大小。它影响着算法在插入新向量时如何检查潜在连接。影响: 值越高,会生成更高质量的图结构(更好的召回潜力),因为考虑了更多的候选邻居。然而,这会大幅增加索引构建时间。较低的值可以加快构建速度,但可能导致图结构不够理想,从而可能限制搜索时可达到的召回率。典型值范围可能从100到2000,通常远大于M。IVF nlist:这定义了在索引创建期间,向量空间被划分成的聚类(Voronoi单元)的数量。影响: nlist值越高,每个聚类的向量越少,这可能会加快搜索过程,因为在所选聚类中需要比较的向量更少。但是,如果nlist过高,向量可能会分布过于稀疏,查找查询向量的正确聚类变得更困难,可能降低召回率。较低的nlist意味着每个聚类的向量更多,这会增加聚类内部的搜索时间,但可能提高召回率,因为相关向量更有可能位于被搜索的聚类中。nlist的选择通常取决于数据集大小,旨在达到一个平衡(例如,$4 \sqrt{N}$ 到 $16 \sqrt{N}$,其中 $N$ 是向量数量,但这只是一个粗略的经验法则)。LSH 参数(一般):LSH变体通常包含哈希表数量(L)或使用的哈希函数数量(k)等参数。影响: 增加表或函数的数量通常会提高将相似项哈希到相同桶的概率(召回率更高),但也会增加索引大小和查询期间的计算成本,因为可能需要检查更多的桶。搜索参数(查询时)其他参数是在你执行搜索查询时设定的。它们直接控制着查询时对已构建索引结构的检查。HNSW ef_search (或 ef):这个参数控制着搜索阶段使用的动态列表的大小。它确定了在图中检查多少个入口点或路径以查找查询向量的最近邻。影响: 这通常是查询时调整召回率-延迟权衡的最重要参数。增加ef_search会使图结构内的搜索更彻底,从而提高召回率,但也会增加查询延迟。降低它会加快搜索速度,但会降低召回率。它的值必须至少是你想要检索的邻居数量(k)。典型值范围从略高于k(例如40)到数百,具体取决于所需的召回率。IVF nprobe:这指定了在搜索期间要检查的附近聚类(Voronoi单元)的数量。在确定最接近查询向量的聚类后,搜索会扩展到包含额外的nprobe - 1个附近聚类。影响: 这直接控制搜索范围。小的nprobe(例如1)非常快,但如果查询向量落在聚类边界附近,则可能错过相关向量。增加nprobe可以通过搜索更多潜在相关聚类来提高召回率,但会线性增加搜索延迟,因为需要比较更多的向量。典型值范围从1到nlist的10%左右,具体取决于所需的召回率和可接受的延迟。LSH 参数(一般):LSH中的查询时调优可能涉及决定检查多少个桶或设置相似性阈值。影响: 与IVF中的nprobe类似,检查更多候选桶会增加找到真实邻居(召回率)的机会,但需要更长时间。实际调优过程调优ANN参数通常是一个迭代的、经验性的过程:明确要求: 清晰地说明你的目标。目标召回率是多少(例如95%)?最大可接受延迟是多少(例如50毫秒)?内存限制有哪些?建立基线: 使用向量数据库或库提供的默认参数,或从常见的经验值开始。使用代表性的验证数据集和查询集测量基线召回率和延迟。选择参数: 专注于对主要权衡(例如,HNSW的ef_search对召回率与延迟的影响,IVF的nprobe对召回率与延迟的影响)有最直接影响的参数。迭代与测量: 一次调整一个参数(或者如果计算可行,使用网格搜索等系统方法),并重新评估召回率和延迟。记录结果。可视化: 绘制不同参数设置下的召回率与延迟图对于理解这些权衡并选择最佳配置非常有帮助。{"layout": {"title": "召回率与延迟权衡(示例:HNSW ef_search)", "xaxis": {"title": "查询延迟(毫秒)"}, "yaxis": {"title": "召回率@10", "range": [0.7, 1.0]}, "legend": {"title": "ef_search"}}, "data": [{"type": "scatter", "mode": "lines+markers", "name": "ef=20", "x": [10], "y": [0.80]}, {"type": "scatter", "mode": "lines+markers", "name": "ef=40", "x": [18], "y": [0.88]}, {"type": "scatter", "mode": "lines+markers", "name": "ef=80", "x": [30], "y": [0.94]}, {"type": "scatter", "mode": "lines+markers", "name": "ef=160", "x": [55], "y": [0.97]}, {"type": "scatter", "mode": "lines+markers", "name": "ef=320", "x": [95], "y": [0.985]}]}此图显示了查询时参数(HNSW中的ef_search)与所得召回率和延迟之间的典型关系。增加参数通常会提高召回率,但也会增加延迟,并且通常在参数值较高时,召回率的提升会变得不那么明显。请记住,最佳参数可能在很大程度上取决于:所使用的具体ANN算法。向量的维度。数据的固有结构和分布。数据集的大小。你运行所在的硬件。因此,为某个数据集或用例调整的参数可能不适合其他情况。使用相关数据进行持续评估对于在向量搜索应用中获得准确性和性能之间的理想平衡是很重要的。