Crear índices y vectores de consulta

Selecciona una versión de la documentación:

En este documento se explica cómo usar las inserciones almacenadas para generar índices y consultar inserciones. Para obtener más información sobre cómo almacenar las inserciones, consulta Almacenar inserciones de vectores.

Puedes crear índices ScaNN, IVF, IVFFlat y HNSW con AlloyDB.

Antes de empezar

Antes de empezar a crear índices, debes completar los siguientes requisitos previos.

  • Los vectores de inserción se añaden a una tabla de tu base de datos de AlloyDB.

  • La versión vector o posterior de la extensión 0.5.0, basada en pgvector y ampliada por Google para AlloyDB, está instalada.

    CREATE EXTENSION IF NOT EXISTS vector;
    
  • Para generar índices ScaNN, instala la extensión alloydb_scann además de la extensión vector.

    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    

Crear un índice

Puede crear uno de los siguientes tipos de índices para las tablas de su base de datos.

Crear un índice de ScaNN

AlloyDB alloydb_scann, una extensión de PostgreSQL desarrollada por Google que implementa un índice de vecinos más cercanos muy eficiente basado en el algoritmo ScaNN.

El índice ScaNN es un índice de cuantificación basado en árbol para la búsqueda aproximada de vecinos más cercanos. Ofrece un tiempo de creación de índices más corto y un menor uso de memoria en comparación con HNSW. Además, ofrece un QPS más rápido en comparación con HNSW en función de la carga de trabajo.

Índice de árbol de dos niveles ScaNN

Para aplicar un índice de árbol de dos niveles con el algoritmo ScaNN a una columna que contenga incrustaciones de vectores almacenadas, ejecuta la siguiente consulta DDL:

CREATE INDEX INDEX_NAME ON TABLE
  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE);

Haz los cambios siguientes:

  • INDEX_NAME: el nombre del índice que quieras crear (por ejemplo, my-scann-index). Los nombres de los índices se comparten en toda la base de datos. Asegúrate de que cada nombre de índice sea único para cada tabla de tu base de datos.

  • TABLE: la tabla a la que se va a añadir el índice.

  • EMBEDDING_COLUMN: una columna que almacena vector datos.

  • DISTANCE_FUNCTION: la función de distancia que se va a usar con este índice. Elige una de estas opciones:

    • Distancia L2: l2

    • Producto escalar: dot_product

    • Distancia del coseno: cosine

  • NUM_LEAVES_VALUE: el número de particiones que se aplicarán a este índice. Puede ser cualquier valor entre 1 y 1048576. Para obtener más información sobre cómo decidir este valor, consulta Ajustar un índice de ScaNN.

Índice de árbol de tres niveles ScaNN

Para crear un índice de árbol de tres niveles con el algoritmo ScaNN en una columna que contenga inserciones de vectores almacenadas, ejecuta la siguiente consulta DDL:

CREATE INDEX INDEX_NAME ON TABLE
  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);

Haz los cambios siguientes:

  • MAX_NUM_LEVELS: número máximo de niveles del árbol de clústeres de k-means. Usa el valor 1(predeterminado) para la cuantización basada en árbol de dos niveles y 2 para la cuantización basada en árbol de tres niveles.

Una vez que hayas creado el índice, podrás ejecutar consultas de búsqueda de vecinos más cercanos que utilicen el índice siguiendo las instrucciones de Hacer una consulta de vecinos más cercanos con un texto determinado.

Los parámetros de índice deben configurarse para lograr un equilibrio entre las consultas por segundo y la recuperación. Para obtener más información sobre cómo optimizar el índice ScaNN, consulta Optimizar un índice ScaNN.

Para crear este índice en una columna de inserciones que use el tipo de datos real[] en lugar de vector, convierte la columna al tipo de datos vector:

CREATE INDEX INDEX_NAME ON TABLE
  USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);

Sustituye DIMENSIONS por el ancho dimensional de la columna de inserción. Para obtener más información sobre cómo encontrar las dimensiones, consulta la función vector_dims en Funciones de vector.

Para ofrecer una experiencia de búsqueda coherente, habilita el mantenimiento automático al crear un índice de ScaNN. Para obtener más información, consulta Mantener índices vectoriales. Esta función está disponible en versión preliminar.

Para ver el progreso de la indexación, usa la vista pg_stat_progress_create_index:

SELECT * FROM pg_stat_progress_create_index;

En la columna phase se muestra el estado actual de la creación del índice y la fase building index: tree training desaparece una vez que se ha creado el índice.

Para ajustar el índice de forma que se equilibren la precisión y las consultas por segundo, consulta Ajustar un índice ScaNN.

Analizar una tabla indexada

Después de crear el índice ScaNN, ejecuta el comando ANALYZE para actualizar las estadísticas de tus datos.

ANALYZE TABLE;

Crear índices en paralelo

AlloyDB puede generar automáticamente varios procesos de trabajo paralelos, en función de tu conjunto de datos y del tipo de índice que elijas para crear el índice más rápido.

La creación de índices paralela se suele activar cuando se crea un índice ScaNN de tres niveles o si el conjunto de datos supera los 100 millones de filas.

Aunque AlloyDB optimiza automáticamente el número de trabajadores paralelos, puedes ajustar los trabajadores paralelos mediante los parámetros de planificación de consultas de PostgreSQL max_parallel_maintenance_workers, max_parallel_workers y min_parallel_table_scan_size.

Ejecutar una consulta

Una vez que hayas almacenado e indexado las inserciones en tu base de datos, podrás empezar a hacer consultas con la pgvectorfunción de consulta. No puedes ejecutar consultas de búsqueda masivas con la extensión alloydb_scann.

Para encontrar los vecinos semánticos más cercanos de un vector de embedding, puedes ejecutar la siguiente consulta de ejemplo, en la que se define la misma función de distancia que se usó durante la creación del índice.

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
    LIMIT ROW_COUNT

Haz los cambios siguientes:

  • TABLE: la tabla que contiene la inserción con la que se va a comparar el texto.

  • INDEX_NAME: el nombre del índice que quieras usar. Por ejemplo, my-scann-index.

  • EMBEDDING_COLUMN: la columna que contiene las inserciones almacenadas.

  • DISTANCE_FUNCTION_QUERY: la función de distancia que se va a usar con esta consulta. Elige una de las siguientes opciones en función de la función de distancia utilizada al crear el índice:

    • Distancia L2: <->

    • Producto interior: <#>

    • Distancia del coseno: <=>

  • EMBEDDING: el vector de inserción del que quieres encontrar los vecinos semánticos almacenados más cercanos.

  • ROW_COUNT: número de filas que se van a devolver.

    Especifica 1 si solo quieres la mejor coincidencia.

Para obtener más información sobre otros ejemplos de consultas, consulta Consultas.

También puedes usar la función embedding() para traducir el texto a un vector. Aplica el vector a uno de los pgvector operadores de vecinos más cercanos, <-> para la distancia L2, para encontrar las filas de la base de datos con las incrustaciones semánticamente más similares.

Como embedding() devuelve una matriz real, debes convertir explícitamente la llamada embedding() a vector para usar estos valores con operadores pgvector.

  CREATE EXTENSION IF NOT EXISTS google_ml_integration;
  CREATE EXTENSION IF NOT EXISTS vector;

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN::vector
    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
    LIMIT ROW_COUNT

Haz los cambios siguientes:

  • MODEL_ID: ID del modelo que se va a consultar.

    Si usas Vertex AI Model Garden, especifica text-embedding-005 como ID de modelo. Estos son los modelos basados en la nube que AlloyDB puede usar para las incrustaciones de texto. Para obtener más información, consulta Inserciones de texto.

  • Opcional: VERSION_TAG es la etiqueta de versión del modelo que se va a consultar. Añade el prefijo @ a la etiqueta.

    Si usas uno de los modelos en inglés de text-embedding con Vertex AI, especifica una de las etiquetas de versión (por ejemplo, text-embedding-005) que se indican en Versiones del modelo.

    Google recomienda que siempre especifiques la etiqueta de versión. Si no especifica la etiqueta de versión, AlloyDB siempre usará la versión más reciente del modelo, lo que podría dar lugar a resultados inesperados.

  • TEXT: el texto que se va a traducir a una incrustación de vector.

Siguientes pasos