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 embedding 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;
    

Crear 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 una

índice de vecinos más cercanos eficiente potenciado por [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 un árbol para la búsqueda aproximada de vecinos más cercanos.

búsqueda del vecino más cercano. Proporciona un tiempo de compilación de índice más bajo y un tamaño

espacio en memoria en comparación con HNSW. Además, proporciona un QPS más rápido en

comparación con HNSW según la carga de trabajo.

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

en una tabla vacía o particionada, es posible que encuentres algunos problemas. Más información

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

Índice de árbol ScaNN 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 DDL:


CREATE INDEX INDEX_NAME ON TABLE

  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)

  WITH (num_leaves=NUM_LEAVES_VALUE);

Reemplaza lo siguiente:

  • INDEX_NAME: Es el nombre del índice que deseas

    create, por ejemplo, my-scann-index Se comparten los nombres de los índices

    en toda tu base de datos. Asegúrate de que cada nombre de índice sea único para cada

    tabla en tu base de datos.

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

  • EMBEDDING_COLUMN: Es una columna que almacena vector.

    o que sean específicos de un dominio.

  • DISTANCE_FUNCTION: Es la función de distancia que se usará.

    con este índice. Elige una de estas opciones:

    • Distancia de L2: l2

    • Producto escalar: dot_product

    • Distancia de coseno: cosine

  • NUM_LEAVES_VALUE: Es la cantidad de particiones a las que se aplicará.

    este índice. Se puede establecer en cualquier valor entre 1 y 1048576. Más información

    Para obtener información sobre cómo decidir este valor, consulta Ajusta un índice de ScaNN.

Índice de árbol ScaNN de tres niveles

Para crear un índice de árbol de tres niveles con el algoritmo de ScaNN en una columna

que contiene embeddings de vectores almacenados, 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);

Reemplaza lo siguiente:

  • MAX_NUM_LEVELS: Es la cantidad máxima de niveles de la

    Árbol de agrupamiento en clústeres con k-means. Se establece en 1(predeterminado) para el modelo basado en un árbol de dos niveles.

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

Después de crear el índice, puedes ejecutar consultas de búsqueda de vecinos más cercanos que

seguir las instrucciones en [Haz una consulta de vecino más cercano

consulta con el texto proporcionado](#query).

Los parámetros del índice deben establecerse para lograr un equilibrio adecuado entre las QPS y

recuperación. Para obtener más información sobre cómo ajustar el índice ScaNN, consulta [Ajusta un índice ScaNN

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

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 [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 después de que se crea el índice.

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

Analiza tu tabla indexada

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


ANALYZE TABLE;

Ejecuta una consulta

Una vez que almacenes y, también, indexes las embeddings en tu base de datos, podrás comenzar a

realizar consultas con la búsqueda de [pgvector

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

Consultas de búsqueda masivas con la extensión alloydb_scann

Para encontrar los vecinos semánticos más cercanos a un vector de embedding, puedes ejecutar el

En el siguiente ejemplo de consulta, se establece 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

Reemplaza lo siguiente:

  • TABLE: la tabla que contiene la embedding con la que se comparará el

    texto.

  • INDEX_NAME: El nombre del índice que deseas usar, por ejemplo,

    Por ejemplo, my-scann-index.

  • EMBEDDING_COLUMN: Es la columna que contiene los

    embeddings.

  • DISTANCE_FUNCTION_QUERY: Es la función de distancia que se usará con este

    consulta. Elige una de las siguientes opciones según la función de distancia que se use.

    durante la creación del índice:

    • Distancia de L2: <->

    • Producto interno: <#>

    • Distancia de coseno: <=>

  • EMBEDDING: Es el vector de incorporación para el que deseas encontrar los vecinos almacenados más cercanos.

    vecinos semánticos de.

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

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

las incorporaciones más similares semánticamente.

Dado que embedding() devuelve un array real, debes convertir de forma explícita la

Llamada embedding() 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

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 las incorporaciones de texto. Para obtener más información, consulta Incorporaciones 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 en inglés 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?