Prácticas recomendadas para la indexación de vectores

En esta página, se describen las prácticas recomendadas para la 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 intentará elegir opciones optimizadas automáticamente. Para los usuarios avanzados que desean ajustar las opciones del índice de vectores para su carga de trabajo específica, pueden establecer y ajustar estos valores creando un nuevo índice de vectores y configurando index_option_list en la instrucción CREATE VECTOR INDEX. Los valores más óptimos para las opciones de tu índice vectorial dependen de tu caso de uso, tu conjunto de datos de vectores y los vectores de búsqueda. Es posible que debas realizar ajustes iterativos para encontrar los mejores valores para tu carga de trabajo específica.

Estas son algunas pautas útiles que puedes seguir cuando elijas valores adecuados:

  • tree_depth (nivel del árbol): Si la tabla que indexas tiene menos de 10 millones de filas, usa un tree_depth de 2. De lo contrario, un tree_depth de 3 admite tablas de hasta 10,000 millones de filas aproximadamente. Si no se especifica, Spanner determinará automáticamente el valor de tree_depth.

  • num_leaves: Recomendamos segmentar para incluir entre 200 y 1,000 filas por hoja. Un valor más grande de num_leaves aumenta el tiempo de compilación del índice de vectores, pero puede reducir el costo de la búsqueda para una recuperación objetivo determinada. Sin embargo, los valores demasiado grandes de num_leaves pueden hacer que el costo de la consulta vuelva a aumentar debido a los gastos generales asociados con la búsqueda en muchos clústeres hoja que son muy pequeños. Si no se especifica, Spanner determina automáticamente el valor de num_leaves.

  • num_branches: Esta opción solo se aplica cuando tree_depth es 3. Recomendamos segmentar para obtener entre 50 y 500 hojas por rama, y num_branches debe ser menor que num_leaves. Un valor más grande de num_branches aumenta el tiempo de compilación del índice de vectores, pero puede reducir el costo de la consulta para una recuperación objetivo determinada. Sin embargo, los valores demasiado grandes de num_branches pueden hacer que el costo de la consulta vuelva a aumentar debido a los gastos generales asociados con la búsqueda en muchos clústeres hoja que son muy pequeños. Si no se especifica, Spanner determina automáticamente el valor de num_branches.

  • num_leaves_to_search: Esta opción especifica cuántos nodos hoja del índice se buscan. Aumentar num_leaves_to_search mejora 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 nodos hoja definidos en la instrucción CREATE VECTOR INDEX como el valor de num_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 un QPS máximo bajo, intenta aumentar num_leaves siguiendo estos pasos:

  1. Establece num_leaves en algún múltiplo k de su valor original (por ejemplo, 2 * (table_row_count / 1000)).
  2. Establece num_leaves_to_search para que sea el mismo múltiplo k de su valor original.
  3. Experimenta con la reducción de num_leaves_to_search para mejorar el costo y las QPS, y mantener la recuperación.

Cómo determinar 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 explícitamente durante la creación del índice, ya que, en ocasiones, Spanner 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 devuelve 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 de num_leaves_to_search o volver a compilar tu índice de vectores.

Si el valor de 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 búsqueda. Crear un nuevo índice de vectores con un valor de num_leaves_to_search aumentado puede ayudar a mejorar la recuperación, ya que se buscan más hojas. Las búsquedas 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, permanece estática. Por lo tanto, si se agregan vectores significativamente diferentes después de crear el índice de vectores inicial, la estructura del árbol podría ser subóptima, lo que generaría una recuperación más deficiente.

Para actualizar tu índice vectorial sin tiempo de inactividad, elige una de las siguientes opciones:

  • Opción 1: Reindexación in situ con las mismas opciones (mediante DDL)

    Si deseas volver a indexar tu índice de vectores de forma local con las mismas opciones de índice, puedes emitir la siguiente instrucción DDL según el dialecto de tu base de datos. La reindexación se produce en segundo plano y permite que continúen las operaciones de lectura y escritura en el índice.

    GoogleSQL

    ALTER VECTOR INDEX IncidentVectorIndex REBUILD;
    

    PostgreSQL

    REINDEX INDEX CONCURRENTLY incidentvectorindex;
    
  • Opción 2: Vuelve a indexar manualmente con opciones modificadas

    Si necesitas cambiar las opciones de indexación (como num_leaves, tree_depth, etcétera), completa los siguientes pasos:

    1. Crea un nuevo índice vectorial en la misma columna de embeddings que el índice vectorial actual y actualiza los parámetros (por ejemplo, OPTIONS) según corresponda. Una vez que se complete la creación del índice, evalúa qué índice tiene un mejor rendimiento.
    2. Spanner decide automáticamente qué índice usar en la ejecución de la consulta. Elige uno de los siguientes métodos para evaluar y comparar tus índices:

      a. Cambia tu aplicación: Puedes actualizar un subconjunto de tus búsquedas para que usen la sugerencia FORCE_INDEX y apunten al nuevo índice para actualizar la búsqueda de vectores. Esto garantiza que la búsqueda use el nuevo índice de vectores. Con este método, es posible que debas volver a ajustar num_leaves_to_search en tu nueva búsqueda.

      b. Cambia tu esquema: Puedes establecer la opción disable_search en uno de tus índices vectoriales. Cuando se establece en true, Spanner inhabilita el índice de vectores. Para ello, ejecuta la instrucción de cambio de esquema ALTER VECTOR INDEX:

         ALTER VECTOR INDEX IncidentVectorIndex SET OPTIONS (disable_search=true);
      

      Este método evita que Spanner use este índice de vectores en tu base de datos. Si tienes dos índices y configuras esta opción en el índice más antiguo, todas las búsquedas usarán el índice nuevo después de que se aplique el cambio de esquema. Si usas la sugerencia FORCE_INDEX para especificar un índice de vectores que tiene la opción disable_search establecida en true, la consulta falla.

    3. Descarta el índice vectorial desactualizado.

¿Qué sigue?