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 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, 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, a

Extensión de PostgreSQL desarrollada por Google que implementa un

índice de vecinos más cercanos eficiente basado en [ScaNN

algorithm](https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md).

El índice ScaNN es un índice de cuantificación basado en árboles para

búsqueda de vecinos más cercanos. Proporciona un tiempo de creación de índices más corto y un

uso de memoria en comparación con HNSW. Además, ofrece un CPS más rápido en

comparación con HNSW en función de la carga de trabajo.

una tabla de tu base de datos de AlloyDB. Si intentas generar un índice ScaNN

en una tabla vacía o con particiones, es posible que tengas algunos problemas. Para obtener más información

Para obtener información sobre los errores generados, consulta Solucionar errores de índice de ScaNN.

Í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 las 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);

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 tu base de datos. Asegúrate de que cada nombre de índice sea único para cada

    de tu base de datos.

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

  • EMBEDDING_COLUMN: 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: número de particiones que se van a aplicar

    este índice. Puede ser cualquier valor entre 1 y 1048576. Más información

    Para saber 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 usando el algoritmo ScaNN en una columna

que contenga las 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 de la

    Árbol de clústeres de k-medias. El valor predeterminado 1 es para la estructura de árbol de dos niveles.

    cuantización y 2 para la cuantización basada en árboles de tres niveles.

Una vez que hayas creado el índice, podrás ejecutar consultas de búsqueda de vecinos más cercanos que

Aprovecha el índice siguiendo las instrucciones de [Crear un índice de vecinos más cercanos

consulta con el texto proporcionado](#query).

Los parámetros de índice deben configurarse de forma que se consiga un equilibrio entre las consultas por segundo y

Retirada. Para obtener más información sobre cómo optimizar el índice ScaNN, consulta [Optimizar un índice ScaNN

index](/alloydb/omni/kubernetes/15.7.0/docs/ai/tune-indexes).

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 la anchura dimensional del

columna de inserción. Para obtener más información sobre cómo encontrar las dimensiones,

Consulta la función vector_dims en [Vector

functions](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions).

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

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;

Ejecutar una consulta

Una vez que haya almacenado e indexado las inserciones en su base de datos, podrá empezar a

consultar mediante la consulta [pgvector

functionality](https://github.com/pgvector/pgvector#querying). No puedes ejecutar

consultas de búsqueda masivas mediante la extensión alloydb_scann.

Para encontrar los vecinos semánticos más cercanos de un vector de inserción, puedes ejecutar la

en la siguiente consulta de ejemplo, donde se define la misma función de distancia que se ha usado

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 que se va a comparar con la

    texto.

  • INDEX_NAME: el nombre del índice que quieras usar. Por ejemplo,

    Por ejemplo, my-scann-index.

  • EMBEDDING_COLUMN: la columna que contiene el

    inserciones.

  • DISTANCE_FUNCTION_QUERY: la función de distancia que se va a usar con este

    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 el vector almacenado más cercano.

    vecinos semánticos de.

  • 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 en un vector. Aplicas el vector a uno de los

pgvector operador de vecino más cercano, <-> para la distancia L2, para encontrar las filas de la base de datos con el

las incrustaciones más similares semánticamente.

Como embedding() devuelve una matriz real, debes convertir explícitamente el

embedding() llama a vector para usar estos valores con pgvector

operadores.


  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: 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