Crea índices y consulta vectores

Selecciona una versión de la documentación:

En este documento, se muestra cómo usar embeddings almacenados para generar índices y consultar embeddings. Para obtener más información sobre el almacenamiento de embeddings, consulta Almacena embeddings de vectores.

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

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 basada en pgvector, que Google extendió para AlloyDB.

    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;
    

Crea un índice

Puedes crear uno de los siguientes tipos de índices para las tablas de tu base de datos.

Crea un índice de ScaNN

AlloyDB alloydb_scann, una extensión de PostgreSQL desarrollada por Google que implementa un índice de vecino más cercano muy eficiente con la tecnología del algoritmo ScaNN.

El índice ScaNN es un índice de cuantización basado en árboles para la búsqueda de vecinos más cercanos aproximados. Proporciona un tiempo de compilación de índices más bajo y un espacio en memoria más pequeño en comparación con HNSW. Además, proporciona QPS más rápidas en comparación con HNSW según la carga de trabajo.

Índice ScaNN de árbol de dos niveles

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

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

Reemplaza lo siguiente:

  • INDEX_NAME: El nombre del índice que deseas 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: 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 L2: l2

    • Producto escalar: dot_product

    • Distancia de coseno: cosine

  • NUM_LEAVES_VALUE: Es la cantidad de particiones que se aplicarán a este índice. Se puede establecer en cualquier valor entre 1 y 1048576. Para obtener más información sobre cómo decidir este valor, consulta Ajusta un índice 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 embeddings de vectores almacenados, ejecuta la siguiente consulta de 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);

Reemplaza lo siguiente:

  • MAX_NUM_LEVELS: Es la cantidad máxima de niveles del árbol de agrupamiento de K-means. Establece en 1(predeterminado) para la cuantización basada en árboles de dos niveles y en 2 para la cuantización basada en árboles de tres niveles.

Después de crear el índice, puedes ejecutar consultas de búsqueda del vecino más cercano que usen el índice siguiendo las instrucciones en Realiza una consulta de vecino más cercano con texto determinado.

Los parámetros de índice se deben configurar para lograr un equilibrio adecuado entre las QPS y la recuperación. Para obtener más información sobre cómo ajustar el índice ScaNN, consulta Ajusta un índice ScaNN.

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 scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);

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 de vectores.

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 index: tree training desaparece después de que se crea el índice.

Para ajustar tu índice en función de un equilibrio entre la recuperación y las QPS objetivo, consulta Cómo ajustar un índice de ScaNN.

Analiza tu tabla indexada

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

ANALYZE TABLE;

Compila índices en paralelo

AlloyDB puede generar automáticamente varios trabajadores paralelos, según tu conjunto de datos y el tipo de índice que elijas para compilar tu índice más rápido.

La compilación de índices paralela suele activarse cuando creas un índice de ScaNN de 3 niveles o si tu conjunto de datos supera los 100 millones de filas.

Aunque AlloyDB optimiza automáticamente la cantidad de trabajadores paralelos, puedes ajustarlos con los parámetros de planificación de consultas de PostgreSQL max_parallel_maintenance_workers, max_parallel_workers y min_parallel_table_scan_size.

Ejecuta una consulta

Después de almacenar y, también, indexar las incorporaciones en tu base de datos, puedes comenzar a realizar consultas con la funcionalidad de consulta de pgvector. No puedes ejecutar consultas de búsqueda masiva 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 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.

  • INDEX_NAME: Es el nombre del índice que deseas usar, por ejemplo, my-scann-index.

  • EMBEDDING_COLUMN: la columna que contiene las embeddings 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 L2: <->

    • Producto interno: <#>

    • Distancia de coseno: <=>

  • EMBEDDING: Es el vector de incorporación 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 a 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.

  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

Reemplaza lo siguiente:

  • MODEL_ID: el ID del modelo que se consultará.

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

  • Opcional: VERSION_TAG: Es la etiqueta de la versión del modelo que se consultará. Agrega @ a la etiqueta.

    Si usas uno de los modelos de 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 enfáticamente que siempre especifiques la etiqueta de versión. Si no especificas la etiqueta de versión, AlloyDB siempre usará la versión del modelo más reciente, lo que podría generar resultados inesperados.

  • TEXT: es el texto que se traducirá en una embedding de vector.

¿Qué sigue?