Prácticas recomendadas para la búsqueda de vectores

En este documento, se proporcionan recomendaciones para optimizar el rendimiento de la búsqueda de vectores en Spanner.

Comprende los conceptos básicos de Spanner

Para realizar pruebas de rendimiento efectivas de la búsqueda de vectores de Spanner, comprende los conceptos básicos de Spanner. Por ejemplo, volver a ejecutar la misma consulta de inmediato puede ser más rápido debido a las memorias caché. Para probar el rendimiento en una aplicación que usa principalmente datos activos, primero realiza una lectura de calentamiento.

Consulta las siguientes guías:

Spanner procesa las consultas en paralelo según las divisiones de la base de datos. Las pruebas con una carga de consultas de producción sostenida pueden habilitar la división basada en la carga, lo que mejora el rendimiento de las consultas a través de un mayor paralelismo. Para aumentar el paralelismo para la carga futura, considera dividir previamente tu base de datos, en especial para KNN.

Prácticas recomendadas para la búsqueda de vectores

En este documento, se describen las siguientes prácticas recomendadas para la búsqueda de vectores:

Anota la columna de incorporación

Anota la columna de incorporación con vector_length. Esta anotación habilita las optimizaciones de rendimiento para la búsqueda de k‑vecino más cercano (KNN) y es un requisito previo para la búsqueda de vecino más cercano aproximado (ANN).

Usa una consulta de k superior

Para encontrar los vecinos más cercanos, usa una cláusula ORDER BY con LIMIT. Las consultas de k superior están altamente optimizadas para la búsqueda de vectores. Evita filtrar por un umbral de distancia en una cláusula WHERE.

Por ejemplo, no se recomienda lo siguiente:

SELECT d.DocId
FROM Documents AS d
WHERE COSINE_DISTANCE(d.DocEmbedding, @vector) < 1;

En su lugar, usa lo siguiente:

SELECT d.DocId
FROM Documents AS d
ORDER BY COSINE_DISTANCE(d.DocEmbedding, @vector)
LIMIT 10;

Usar una consulta de k superior no solo es más simple porque elimina el ajuste del umbral de distancia, sino que también habilita las optimizaciones de rendimiento especializadas para la búsqueda de vectores.

Usa literales de SQL para la cláusula LIMIT

Si el límite de k superior es fijo, usa un literal de SQL en lugar de un parámetro. Por ejemplo, usa LIMIT 10 en lugar de LIMIT @limit. Esto proporciona al optimizador de consultas de Spanner más información para seleccionar el mejor plan de ejecución de consultas.

Usa el análisis orientado a lotes

Las consultas de búsqueda de vectores son muy pesadas. Para las consultas de KNN, considera usar el análisis orientado a lotes con la scan_method=batch sugerencia de consulta. Este es el método de análisis predeterminado para las consultas de ANN.

Usa KNN para conjuntos de datos pequeños

Si KNN es suficiente para tu presupuesto de latencia, no crees un índice de vectores. KNN es más preciso, evita la creación y los costos de mantenimiento de índices, y puede tener un mejor rendimiento que ANN cuando la cantidad de filas de entrada después de cualquier filtrado es pequeña.

Acelera el KNN filtrado con un índice secundario

Para mejorar el rendimiento de una consulta de KNN filtrada, crea un índice secundario en la columna de filtrado. Por ejemplo, considera la siguiente consulta:

SELECT d.DocId
FROM Documents AS d
WHERE Category = 'toy'
ORDER BY COSINE_DISTANCE(d.DocEmbedding, @vector)
LIMIT 10;

Si la cantidad de documentos por categoría es inferior a unas decenas de miles y tu aplicación puede aceptar una latencia de consulta de 100 ms, crea un índice secundario en la columna Category. Almacena la columna DocEmbedding en el índice:

CREATE INDEX ON Documents(Category) STORING (DocEmbedding);

Esta creación de índice ayuda a acelerar la consulta filtrada.

Usa ANN para conjuntos de datos grandes

Si la cantidad de filas es grande después de evaluar los filtros, crea un índice de vectores y usa la búsqueda de ANN. Existen varias técnicas que pueden acelerar el filtrado con ANN:

  • Almacena columnas de filtrado: Para habilitar el filtrado mientras se atraviesa la búsqueda de vectores, almacena las columnas de filtrado en el índice de vectores. Esto permite que las filas no calificadas se quiten al principio de la ejecución.

    CREATE VECTOR INDEX ON Documents(DocEmbedding) STORING(Category);
    
  • Columnas de filtrado de claves: Para acelerar el filtrado de columnas altamente selectivas que quitan muchos resultados, organiza estas columnas como columnas de claves adicionales en el índice de vectores. Las consultas que especifican igualdad exacta (con el operador =) para estas claves adicionales se aceleran más. Usar la cláusula IN para cualquiera de estas claves adicionales no logra el mismo nivel de aceleración.

    CREATE VECTOR INDEX ON Documents(DocEmbedding, Category);
    
  • Evita almacenar columnas grandes o usarlas como claves: Si lo haces, es posible que se diluyan los bloques de datos para las incorporaciones, lo que podría reducir la eficiencia de lectura. Como alternativa, considera usar una columna hash en el índice y usa la columna grande original como un filtro posterior después de k superior.

  • Crea un índice de vectores filtrado (parcial):Si solo consultas un subconjunto del conjunto de datos y una condición de filtrado define ese subconjunto, como Category = "Tech", crea un índice de vectores filtrado o parcial.