Crea un índice de IVFFLAT

Los índices de archivo invertido plano (IVFFlat) en AlloyDB para PostgreSQL te permiten acelerar las búsquedas de similitud de vectores en las incorporaciones almacenadas, a la vez que minimizan el tiempo de compilación del índice y el uso de memoria. Puedes crear índices IVFFlat con la extensión vector y consultar tus incorporaciones indexadas. 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 embeddings se agregan a una tabla en tu base de datos de AlloyDB.

  • Se instaló la versión 0.5.0 o posterior de la extensión vector que se basa en pgvector, extendida por Google para AlloyDB.

    CREATE EXTENSION IF NOT EXISTS vector;
    

Crea un índice de IVFFlat

El pgvector estándar también proporciona una versión del índice IVF llamada IVFFlat que proporciona un tiempo de compilación más rápido y tiene un espacio en memoria más pequeño en comparación con el índice hnsw.

Para crear un índice de IVFFlat, completa los siguientes pasos:

CREATE INDEX INDEX_NAME ON TABLE
  USING ivfflat (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT);

Reemplaza lo siguiente:

  • INDEX_NAME: el nombre del índice que deseas crear, por ejemplo, my-ivf-index.

  • TABLE: Es la tabla a la que se agregará el índice.

  • EMBEDDING_COLUMN: Es una columna que almacena datos vector.

  • DISTANCE_FUNCTION: Es 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 IVFFlat.

    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 ivfflat ((CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS))) DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT);

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;

En la columna phase, se muestra el estado actual de la creación del índice.

Para ajustar tu índice para un balance de recuperación y QPS objetivo, consulta Ajusta un índice IVFFlat.

Ejecuta una consulta

Después de almacenar e indexar las incorporaciones en tu base de datos, puedes comenzar a realizar consultas con la funcionalidad de consulta de pgvector.

Para encontrar los vecinos semánticos más cercanos de un vector de embedding, puedes ejecutar la siguiente consulta de ejemplo, en la que configuras 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: Es la tabla que contiene la incorporación con la que se comparará el texto.

  • EMBEDDING_COLUMN: Es la columna que contiene las incorporaciones almacenadas.

  • DISTANCE_FUNCTION_QUERY: Es 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ó cuando se creó el índice:

    • Distancia de L2: <->

    • Producto interno: <#>

    • Distancia de coseno: <=>

  • EMBEDDING: es 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 función embedding() para traducir el texto en un vector. Aplica el vector a uno de los operadores de vecino más cercano de pgvector, <-> para la distancia L2, para encontrar las filas de la base de datos con las incorporaciones semánticamente más similares.

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

¿Qué sigue?