Crea un índice de IVF

Los índices de archivo invertido (IVF) en AlloyDB para PostgreSQL te permiten acelerar las búsquedas de similitud de vectores sobre embeddings almacenadas de alta dimensión mediante la cuantización escalar. Puedes crear índices IVF con la extensión vector para reducir el uso de memoria y acelerar las consultas de vectores con hasta 8,000 dimensiones. Para obtener más información sobre el almacenamiento de embeddings, consulta Almacena embeddings de vectores.

Antes de comenzar

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

  • Los vectores de embedding se agregan a una tabla en tu base de datos de AlloyDB.

  • Se instala la versión 0.5.0 o posterior de la extensión vector basada en pgvector, que Google extendió para AlloyDB.

    CREATE EXTENSION IF NOT EXISTS vector;
    

Crea un índice IVF

`pgvector` de stock pgvector admite la búsqueda de vecino más cercano aproximado mediante la indexación. AlloyDB agrega a esta compatibilidad una característica de cuantización escalar que puedes especificar cuando creas un índice. Cuando está habilitada, la cuantización escalar puede acelerar significativamente las consultas que tienen vectores dimensionales más grandes y te permite almacenar vectores con hasta 8,000 dimensiones.

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

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

Reemplaza lo siguiente:

  • INDEX_NAME: el nombre del índice que deseas 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 agregará el índice.

  • EMBEDDING_COLUMN: una columna que almacena datos vector.

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

    • Distancia de L2: vector_l2_ops

    • Producto interno: vector_ip_ops

    • Distancia de coseno: vector_cosine_ops

  • LIST_COUNT: Es la cantidad de listas que se usarán con este índice. Para obtener más información sobre cómo decidir este valor, consulta Ajusta un índice de IVF.

  • QUANTIZER: el tipo de cuantizador que deseas usar.

    Establece una de las siguientes opciones:

    • SQ8: Recomendado Respuesta de consulta más rápida, pero genera cierta pérdida de recuperación, lo que no afecta las situaciones de producción.
    • FLAT: Respuesta de consulta más lenta y mayor uso de memoria, pero puede alcanzar una pérdida de recuperación insignificante.

    Para crear este índice en una columna de embedding que use el tipo de datos real[] en lugar de vector, convierte la columna en el 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');

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

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

SELECT * FROM pg_stat_progress_create_index;

La columna phase muestra el estado actual de la creación del índice, y la fase building postings indica que la creación del índice está por completarse.

Para ajustar el índice para una recuperación objetivo y un balance de QPS, consulta Ajusta un IVF índice.

Ejecuta una consulta

Después de almacenar y, también, indexar las embeddings en tu base de datos, puedes comenzar a realizar consultas con la pgvector funcionalidad de consultas.

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

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

Reemplaza lo siguiente:

  • TABLE: la tabla que contiene la embedding con la que comparas el texto.

  • EMBEDDING_COLUMN: la columna que contiene las embeddings almacenadas.

  • DISTANCE_FUNCTION_QUERY: la función de distancia que se usará con esta consulta. Elige una de las siguientes opciones según la función de distancia que se usó durante la creación del índice:

    • Distancia de L2: <->

    • Producto interno: <#>

    • Distancia de coseno: <=>

  • EMBEDDING: el vector de embedding del que deseas encontrar los vecinos semánticos almacenados más cercanos.

  • ROW_COUNT: cantidad de filas que se mostrarán.

    Especifica 1 si solo deseas la mejor coincidencia.

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

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

Debido a que embedding() muestra un array real, debes convertir explícitamente la llamada embedding() en vector para usar estos valores con operadores pgvector.

¿Qué sigue?