Creación de índices

En esta página se describe cómo usar las inserciones almacenadas para generar índices y consultar inserciones mediante un índice HNSW con AlloyDB para PostgreSQL. Para obtener más información sobre cómo almacenar inserciones, consulta Almacenar inserciones de vectores.

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 y ampliada por Google para AlloyDB, está instalada.

    CREATE EXTENSION IF NOT EXISTS vector;
    

Crear un índice HNSW

AlloyDB admite la creación de un hnswíndice basado en grafos disponible con stock pgvector mediante la extensión pgvector de AlloyDB. Usar un índice hnsw da como resultado una búsqueda voraz que se desplaza por el gráfico buscando constantemente el vecino más cercano al vector de consulta hasta que encuentra un resultado óptimo. Ofrece un rendimiento de las consultas más rápido, pero tiempos de compilación más lentos en comparación con IVF.

Para obtener más información sobre el algoritmo HNSW, consulta Gráficos de mundo pequeño navegables jerárquicos.

Para crear un índice hnsw, ejecuta la siguiente consulta:

CREATE INDEX INDEX_NAME ON TABLE
  USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (m = NUMBER_OF_CONNECTIONS, ef_construction = 'CANDIDATE_LIST_SIZE');

Haz los cambios siguientes:

  • INDEX_NAME: el nombre del índice que quieras crear (por ejemplo, my-hnsw-index).

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

  • EMBEDDING_COLUMN: una 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: vector_l2_ops

    • Producto interior: vector_ip_ops

    • Distancia del coseno: vector_cosine_ops

  • NUMBER_OF_CONNECTIONS: número máximo de conexiones por nodo del gráfico. Puede empezar con el valor predeterminado 16 y probar con valores más altos en función del tamaño de su conjunto de datos.

  • CANDIDATE_LIST_SIZE: tamaño de una lista de candidatos que se mantiene durante la construcción del gráfico y que actualiza constantemente los mejores candidatos actuales para los vecinos más cercanos de un nodo. Asigna a este valor cualquier valor superior al doble del valor de m. Por ejemplo, 64.

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 y la fase building graph desaparece una vez que se ha creado el índice.

Para ajustar el índice de forma que se consiga un equilibrio entre la precisión y las consultas por segundo, consulta Ajustar un índice hnsw.

Ejecutar una consulta

Una vez que hayas almacenado e indexado las inserciones en tu base de datos, podrás empezar a hacer consultas con la pgvectorfunción de consulta.

Para encontrar los vecinos semánticos más cercanos de un vector de embedding, puedes ejecutar la siguiente consulta de ejemplo, en la que se define 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

Haz los cambios siguientes:

  • TABLE: la tabla que contiene la inserción con la que se va a comparar el texto.

  • INDEX_NAME: el nombre del índice que quieras usar. Por ejemplo, my-hnsw-index.

  • EMBEDDING_COLUMN: la columna que contiene las inserciones almacenadas.

  • DISTANCE_FUNCTION_QUERY: la función de distancia que se va a usar con esta 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 los vecinos semánticos almacenados más cercanos.

  • 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 a un vector. Aplica el vector a uno de los pgvectoroperadores de vecinos más cercanos<->, en este caso, la distancia L2, para encontrar las filas de la base de datos con las incrustaciones semánticamente más similares.

Como embedding() devuelve una matriz real, debes convertir explícitamente la llamada embedding() a vector para usar estos valores con operadores pgvector.

Siguientes pasos