En esta página, se describe cómo usar los embeddings almacenados para generar índices y consultar embeddings con un índice HNSW
con AlloyDB para PostgreSQL.
Para obtener más información sobre el almacenamiento de embeddings, consulta Almacena embeddings de vectores.
Antes de comenzar
Antes de comenzar a crear índices, debes completar los siguientes requisitos previos.
Los vectores de incorporación 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ónvector
basada enpgvector
, que Google extendió para AlloyDB.CREATE EXTENSION IF NOT EXISTS vector;
Crea un índice de HNSW
AlloyDB admite la creación de un índice hnsw
basado en grafos disponible con pgvector
estándar a través de la extensión pgvector
de AlloyDB. Usar un índice hnsw
genera una búsqueda voraz que se desplaza por el gráfico y busca constantemente el vecino más cercano al vector de la búsqueda hasta que encuentra un resultado óptimo. Proporciona un rendimiento de 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 de HNSW, consulta Hierarchical Navigable Small World graphs.
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');
Reemplaza lo siguiente:
INDEX_NAME
: El nombre del índice que deseas crear, por ejemplo,my-hnsw-index
.TABLE
: Es la tabla a la que se agregará el índice.EMBEDDING_COLUMN
: Es una columna que almacena datosvector
.DISTANCE_FUNCTION
: Es la función de distancia que se usará con este índice. Elige una de estas opciones:Distancia de L2:
vector_l2_ops
Producto interno:
vector_ip_ops
Distancia de coseno:
vector_cosine_ops
NUMBER_OF_CONNECTIONS
: Es la cantidad máxima de conexiones desde un nodo en el gráfico. Puedes comenzar con el valor predeterminado como16
y experimentar con valores más altos según el tamaño de tu conjunto de datos.CANDIDATE_LIST_SIZE
: Es el tamaño de una lista de candidatos que se mantiene durante la construcción del grafo y que actualiza constantemente los mejores candidatos actuales para los vecinos más cercanos de un nodo. Establece este valor en 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;
La columna phase
muestra el estado actual de la creación del índice, y la fase building graph
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 hnsw
.
Ejecuta una consulta
Después de almacenar y, también, indexar las embeddings en tu base de datos, puedes comenzar a realizar consultas con la función de consulta de pgvector
.
Para encontrar los vecinos semánticos más cercanos a un vector de embedding, puedes ejecutar la siguiente consulta de ejemplo, en la que estableces 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
: la tabla que contiene la embedding con la que se compara el texto.INDEX_NAME
: Es el nombre del índice que deseas usar, por ejemplo,my-hnsw-index
.EMBEDDING_COLUMN
: la columna que contiene las incorporaciones 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ó para crear el índice:Distancia de 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. Aplicas el vector a uno de los operadores de vecino más cercano pgvector
, <->
para la distancia L2, para encontrar las filas de la base de datos con las embeddings semánticamente más similares.
Debido a que embedding()
devuelve un array real
, debes convertir de forma explícita la llamada embedding()
en vector
para usar estos valores con operadores pgvector
.
¿Qué sigue?
- Crea un índice de ScaNN
- Ejecuta búsquedas de similitud de vectores
- Ajusta el rendimiento de las consultas vectoriales
- Métricas del índice de vectores
- Obtén más información para crear un asistente de compras inteligente con AlloyDB, pgvector y la administración de extremos de modelos.