此页面介绍了可优化向量索引并改进近似最近邻 (ANN) 查询结果的向量索引编制最佳实践。
调整向量搜索选项
向量索引选项的最优值取决于您的使用情形、向量数据集和查询向量。您可以通过创建新的向量索引并在 CREATE VECTOR INDEX
语句中设置 index_option_list
来设置和调整这些值。您可能需要执行迭代调优,才能找到最适合特定工作负载的值。
以下是一些有助于您选择合适值的实用指南:
tree_depth
(树级别):如果要编制索引的表包含的行数少于 1, 000 万,请使用tree_depth
为2
的值。否则,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()
函数。