此页面介绍了可优化向量索引并改进近似最近邻 (ANN) 查询结果的向量索引编制最佳实践。
对向量搜索选项进行调优
向量索引选项的最佳值取决于您的应用场景、向量数据集和查询向量。您可以通过在 CREATE VECTOR INDEX
语句中创建新的向量索引并设置 index_option_list
,来设置这些值并进行调优。您可能需要执行迭代调优,才能找到最适合特定工作负载的值。
以下是一些有助于您选择合适值的实用指南:
tree_depth
(树级别):如果要编制索引的表包含的行数少于 1000 万,请使用值为2
的tree_depth
。否则,tree_depth
为3
的表最多支持大约 100 亿行。num_leaves
:使用数据集中的行数的平方根。值越大,向量索引构建时间便可能越长。请避免将num_leaves
设置为大于table_row_count
除以 1000 的值,因为这会导致叶节点过小且性能不佳。num_leaves_to_search
:此选项指定搜索的索引叶节点数量。增加num_leaves_to_search
会提高召回率,但也会增加延迟时间和费用。我们建议将CREATE VECTOR INDEX
语句中定义的叶总数的 1% 作为num_leaves_to_search
的值。如果您使用的是过滤条件子句,请增加此值以扩大搜索范围。
如果召回率达到可接受的水平,但查询成本过高,导致最大 QPS 较低,请尝试按照以下步骤增加 num_leaves
:
- 将
num_leaves
设置为其原始值的 k 倍(例如2 * sqrt(table_row_count)
)。 - 将
num_leaves_to_search
设置为其原始值的相同 k 倍。 - 尝试减少
num_leaves_to_search
,以在保持召回率的同时改进成本和 QPS。
提高召回率
如需提高召回率,请考虑对 num_leaves_to_search
值进行调优或重建向量索引。
增加 num_leaves_to_search
值
如果 num_leaves_to_search
值太小,您可能会发现,要为某些查询向量查找最近邻更具挑战性。创建具有更高 num_leaves_to_search
值的新向量索引有助于通过搜索更多叶节点来提高召回率。近期的查询可能包含更多此类具有挑战性的向量。
重建向量索引
向量索引的树结构在创建时会针对数据集进行优化,之后会变为静态。因此,如果在创建初始向量索引后添加了显著不同的向量,则树结构可能不太理想,从而导致召回率不佳。
如需在不停机的情况下重建向量索引,请执行以下操作:
- 在与当前向量索引相同的嵌入列上创建新向量索引,并根据需要更新参数(例如
OPTIONS
)。 - 索引创建完成后,使用
FORCE_INDEX
提示指向新索引,以更新向量搜索查询。这样可确保查询使用新的向量索引。您可能还需要在新查询中对num_leaves_to_search
重新调优。 - 删除过时的向量索引。
后续步骤
详细了解 Spanner 向量索引。
详细了解 Spanner 近似最近邻。
详细了解 GoogleSQL
APPROXIMATE_COSINE_DISTANCE()
、APPROXIMATE_EUCLIDEAN_DISTANCE()
、APPROXIMATE_DOT_PRODUCT()
函数。