Crear un índice IVF

En esta página se describe cómo usar las inserciones almacenadas para generar índices y consultar inserciones mediante un índice IVF con AlloyDB para PostgreSQL. Para obtener más información sobre cómo almacenar inserciones, consulta Almacenar inserciones de vectores.

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;
    

Crear un índice IVF

La biblioteca pgvector admite labúsqueda de vecinos más cercanos aproximados mediante la indexación. AlloyDB amplía esta compatibilidad con una función de cuantización escalar que puedes especificar al crear un índice. Cuando se habilita, la cuantificación escalar puede acelerar significativamente las consultas que tienen vectores de dimensiones más grandes y te permite almacenar vectores con hasta 8000 dimensiones.

Para habilitar la cuantización escalar en un índice basado en pgvector, especifica IVF como método de índice y SQ8 como cuantizador:

CREATE INDEX INDEX_NAME ON TABLE
  USING ivf (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT, quantizer = 'QUANTIZER');

Haz los cambios siguientes:

  • INDEX_NAME: el nombre del índice que quieras crear (por ejemplo, my-ivf-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: vector_l2_ops

    • Producto interior: vector_ip_ops

    • Distancia del coseno: vector_cosine_ops

  • LIST_COUNT: el número de listas que se van a usar con este índice. Para obtener más información sobre cómo decidir este valor, consulta Ajustar un índice de FIV.

  • QUANTIZER: el tipo de cuantificador que quieras usar.

    Elige una de las siguientes opciones:

    • SQ8: recomendado. Las consultas se responden más rápido, pero se pierde parte de la información, lo que no afecta a los casos prácticos.
    • FLAT: la respuesta a las consultas es más lenta y el uso de memoria es mayor, pero se puede conseguir una pérdida de recuperación insignificante.

    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 ivf (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT, quantizer = 'SQ8');

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 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 postings indica que la creación del índice está a punto de completarse.

Para ajustar el índice para conseguir un equilibrio entre la precisión y las consultas por segundo, consulta Ajustar un índice IVF.

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.

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 pgvectoroperadores de vecinos más cercanos<->, en este caso, 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.

Siguientes pasos