En esta página, se describen las prácticas recomendadas de indexación de vectores que optimizan tus índices de vectores y mejoran los resultados de las consultas de vecino más cercano aproximado (ANN).
Ajusta las opciones de búsqueda de vectores
Si no especificas ninguna opción de índice de vectores, Spanner intenta elegir las opciones optimizadas automáticamente. Para los usuarios avanzados que desean ajustar las
opciones de índice de vectores para su carga de trabajo específica, puedes configurar y ajustar estos
valores creando un índice de vectores nuevo y configurando las
index_option_list
en la instrucción CREATE VECTOR INDEX. Los valores más óptimos para las opciones de índice de vectores dependen de tu caso de uso, el conjunto de datos de vectores y los vectores de consulta. Es posible que debas realizar un ajuste iterativo para encontrar los mejores valores para tu carga de trabajo específica.
Estas son algunas instrucciones útiles que debes seguir cuando elijas los valores adecuados:
tree_depth(nivel de árbol): Si la tabla que indexas tiene menos de 10 millones de filas, usa untree_depthde2. De lo contrario, untree_depthde3admite tablas de hasta aproximadamente 10 mil millones de filas. Si no se especifica, Spanner determinará automáticamente el valor detree_depth.num_leaves: Recomendamos segmentar de 200 a 1,000 filas por hoja. Un valor más grande denum_leavesaumenta el tiempo de compilación del índice de vectores, pero puede reducir el costo de la consulta para una recuperación de destino determinada. Sin embargo, los valores demasiado grandes denum_leavespueden hacer que el costo de la consulta vuelva a aumentar debido a las sobrecargas asociadas con la búsqueda de muchos clústeres de hojas que son muy pequeños. Si no se especifica, Spanner determinará automáticamente el valor denum_leaves.num_branches: Esta opción solo se aplica cuandotree_depthes 3. Recomendamos segmentar de 50 a 500 hojas por rama, ynum_branchesdebe ser menor quenum_leaves. Un valor más grande denum_branchesaumenta el tiempo de compilación del índice de vectores, pero puede reducir el costo de la consulta para una recuperación de destino determinada. Sin embargo, los valores demasiado grandes denum_branchespueden hacer que el costo de la consulta vuelva a aumentar debido a las sobrecargas asociadas con la búsqueda de muchos clústeres de hojas que son muy pequeños. Si no se especifica, Spanner determinará automáticamente el valor denum_branches.num_leaves_to_search: Esta opción especifica cuántos nodos hoja del índice se buscan. Aumentarnum_leaves_to_searchmejora la recuperación, pero también aumenta la latencia y el costo. Recomendamos usar un número que sea el 1% de la cantidad total de hojas definidas en la instrucciónCREATE VECTOR INDEXcomo el valor denum_leaves_to_search. Si usas una cláusula de filtro, aumenta este valor para ampliar la búsqueda.
Si se logra una recuperación aceptable, pero el costo de la consulta es demasiado alto, lo que genera una QPS máxima baja, intenta aumentar num_leaves siguiendo estos pasos:
- Establece
num_leavesen algún múltiplokde su valor original (por ejemplo,2 * (table_row_count / 1000)). - Establece
num_leaves_to_searchpara que sea el mismo múltiplo k de su valor original. - Experimenta con la reducción de
num_leaves_to_searchpara mejorar el costo y la QPS mientras mantienes la recuperación.
Determina los valores de las opciones de búsqueda de vectores
Para determinar los parámetros tree_depth, num_leaves y num_branches que Spanner usa para el índice de vectores, consulta la vista INFORMATION_SCHEMA.INDEX_OPTIONS. Los valores de los parámetros pueden diferir ligeramente de los valores que especificaste de forma explícita durante la creación del índice, ya que Spanner a veces los ajusta para que se adapten mejor a tus datos.
Si no especificaste estos parámetros, la vista INFORMATION_SCHEMA.INDEX_OPTIONS muestra los valores que eligió Spanner.
Ejecuta esta consulta para mostrar los valores de los parámetros:
SELECT
opt.option_name,
opt.option_type,
opt.option_value
FROM
INFORMATION_SCHEMA.INDEX_OPTIONS AS opt
WHERE
opt.index_name = @vector_index_name;
La consulta muestra filas que incluyen option_name: system_optimized_tree_depth, system_optimized_num_leaves y system_optimized_num_branches, que reflejan los parámetros que usa el índice.
Mejora la recuperación
Para mejorar la recuperación, considera ajustar el valor num_leaves_to_search o volver a compilar el índice de vectores.
Aumenta el valor num_leaves_to_search
Si el valor num_leaves_to_search es demasiado pequeño, es posible que te resulte más difícil encontrar los vecinos más cercanos para algunos vectores de consulta. Crear un índice de vectores nuevo con un valor num_leaves_to_search aumentado puede ayudar a mejorar la recuperación mediante la búsqueda de más hojas. Las consultas recientes pueden contener más de estos vectores desafiantes.
Vuelve a compilar el índice de vectores
La estructura de árbol del índice de vectores se optimiza para el conjunto de datos en el momento de la creación y, luego, es estática. Por lo tanto, si se agregan vectores significativamente diferentes después de crear el índice de vectores inicial, la estructura de árbol podría ser subóptima, lo que generaría una recuperación más deficiente.
Para volver a compilar el índice de vectores sin tiempo de inactividad, haz lo siguiente:
- Crea un índice de vectores nuevo en la misma columna de embeddings que el índice de vectores actual y actualiza los parámetros (por ejemplo,
OPTIONS) según corresponda. Una vez que se complete la creación del índice, puedes evaluar cuál de los dos índices funciona mejor. Si es así, continúa con el siguiente paso. De lo contrario, quita el índice de vectores desactualizado. Spanner decide automáticamente qué índice usar en la ejecución de la consulta. Spanner proporciona dos formas que te permiten especificar el índice que se usará. Elige uno de los siguientes métodos para evaluar y comparar tus índices:
a. Cambia tu aplicación: Puedes actualizar un subconjunto de tus consultas para que usen la
FORCE_INDEXsugerencia para que apunten al índice nuevo y actualicen la consulta de búsqueda de vectores. Esto garantiza que la consulta use el índice de vectores nuevo. Con este método, es posible que debas volver a ajustarnum_leaves_to_searchen tu consulta nueva.b. Cambia tu esquema: Puedes configurar la opción
disable_searchen uno de tus índices de vectores. Cuando se establece entrue, Spanner inhabilita el índice de vectores. Para ello, ejecuta la instrucción de cambio de esquemaALTER VECTOR INDEX:ALTER VECTOR INDEX IncidentVectorIndex SET OPTIONS (disable_search=true);Este método impide que Spanner use este índice de vectores en tu base de datos. Si tienes dos índices y estableces esta opción en el índice más antiguo, todas las consultas usarán el índice nuevo después de que se aplique el cambio de esquema. Si usas la sugerencia
FORCE_INDEXpara especificar un índice de vectores que tiene la opcióndisable_searchestablecida entrue, la consulta fallará.Quita el índice de vectores desactualizado.
¿Qué sigue?
Obtén más información sobre los índices de vectores de Spanner .
Obtén más información sobre los vecinos más cercanos aproximados de Spanner approximate nearest neighbors.
Obtén más información sobre las funciones GoogleSQL
APPROXIMATE_COSINE_DISTANCE(),APPROXIMATE_EUCLIDEAN_DISTANCE(),APPROXIMATE_DOT_PRODUCT().Obtén más información sobre las instrucciones GoogleSQL
VECTOR INDEX.