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ón0.5.0
, basada enpgvector
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 almacenavector
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 predeterminado16
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 dem
. 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 pgvector
funció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 pgvector
operadores 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
- Crear un índice de ScaNN
- Realizar búsquedas por similitud de vectores
- Ajustar el rendimiento de las consultas vectoriales
- Métricas de índice vectorial
- Consulta cómo crear un asistente de compras inteligente con AlloyDB, pgvector y la gestión de endpoints de modelos.