En esta página se describe cómo usar las inserciones almacenadas para generar índices y consultar inserciones mediante un índice IVF
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 IVF
La biblioteca pgvector
admite labúsqueda de vecinos más cercanos aproximados
mediante la indexación. AlloyDB amplía esta compatibilidad con una función de cuantización escalar que puedes especificar al crear un índice.
Cuando se habilita, la cuantificación escalar puede acelerar significativamente las consultas que tienen vectores de dimensiones más grandes y te permite almacenar vectores con hasta 8000 dimensiones.
Para habilitar la cuantización escalar en un índice basado en pgvector
, especifica IVF
como método de índice y SQ8
como cuantizador:
CREATE INDEX INDEX_NAME ON TABLE
USING ivf (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT, quantizer = 'QUANTIZER');
Haz los cambios siguientes:
INDEX_NAME
: el nombre del índice que quieras crear (por ejemplo,my-ivf-index
). Los nombres de los índices se comparten en toda la base de datos. Asegúrate de que cada nombre de índice sea único para cada tabla de tu base de datos.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
LIST_COUNT
: el número de listas que se van a usar con este índice. Para obtener más información sobre cómo decidir este valor, consulta Ajustar un índice de FIV.QUANTIZER
: el tipo de cuantificador que quieras usar.Elige una de las siguientes opciones:
SQ8
: recomendado. Las consultas se responden más rápido, pero se pierde parte de la información, lo que no afecta a los casos prácticos.FLAT
: la respuesta a las consultas es más lenta y el uso de memoria es mayor, pero se puede conseguir una pérdida de recuperación insignificante.
Para crear este índice en una columna de inserciones que use el tipo de datos
real[]
en lugar devector
, convierte la columna al tipo de datosvector
:
CREATE INDEX INDEX_NAME ON TABLE
USING ivf (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT, quantizer = 'SQ8');
Sustituye DIMENSIONS
por el ancho dimensional de la columna de inserción. Para obtener más información sobre cómo encontrar las dimensiones, consulta la función vector_dims
en Funciones de vector.
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 postings
indica que la creación del índice está a punto de completarse.
Para ajustar el índice para conseguir un equilibrio entre la precisión y las consultas por segundo, consulta Ajustar un índice IVF
.
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-scann-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.