Los índices de archivo invertido plano (IVFFlat) en AlloyDB para PostgreSQL te permiten acelerar las búsquedas de similitud de vectores sobre las embeddings almacenadas y, al mismo tiempo, minimizar el tiempo de compilación del índice y el uso de memoria. Puedes crear índices IVFFlat con la extensión vector y consultar tus embeddings indexadas. 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 embedding se agregan a una tabla en tu base de datos de AlloyDB.
Se instala la extensión
vectorversión0.5.0o posterior basada enpgvector, que Google extendió para AlloyDB.CREATE EXTENSION IF NOT EXISTS vector;
Crea un índice IVFFlat
Stock pgvector también proporciona una versión del índice IVF llamada
IVFFlat
que proporciona un tiempo de compilación más rápido y tiene un espacio en memoria más pequeño en
comparación con el índice hnsw.
Para crear un índice IVFFlat, completa los siguientes pasos:
CREATE INDEX INDEX_NAME ON TABLE
USING ivfflat (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT);
Reemplaza lo siguiente:
INDEX_NAME: Es el nombre del índice que deseas crear, por ejemplo,my-ivf-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_opsProducto interno:
vector_ip_opsDistancia de coseno:
vector_cosine_ops
LIST_COUNT: Es la cantidad de listas que se usarán con este índice. Para obtener más información sobre cómo decidir este valor, consulta Ajusta un índice IVFFlat.Para crear este índice en una columna de embedding que use el tipo de datos
real[]en lugar devector, convierte la columna en el tipo de datosvector:
CREATE INDEX INDEX_NAME ON TABLE
USING ivfflat (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT);
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 Funciones
vectoriales.
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.
Para ajustar el índice para una recuperación objetivo y un equilibrio de QPS, consulta Ajusta un
IVFFlat índice.
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 funcionalidad de consulta pgvector.
Para encontrar los vecinos semánticos más cercanos para 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: Es la tabla que contiene la embedding con la que se comparará el texto.INDEX_NAME: Es el nombre del índice que deseas usar, por ejemplo,my-scann-index.EMBEDDING_COLUMN: Es la columna que contiene las embeddings 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ó durante la creación del índice:Distancia de L2:
<->Producto interno:
<#>Distancia de coseno:
<=>
EMBEDDING: Es el vector de embedding para el que deseas encontrar los vecinos semánticos almacenados más cercanos.ROW_COUNT: Es la cantidad de filas que se mostrarán.Especifica
1si solo deseas la mejor coincidencia.
Para obtener más información sobre otros ejemplos de consultas, consulta Consultas.
También puedes usar la embedding() función para traducir el
texto a un vector. Aplicas el vector a uno de los
pgvector operadores de vecino más cercano, <-> para la distancia de L2, para encontrar las filas de la base de datos con las
embeddings semánticamente más similares.
Debido a que embedding() muestra un array real, debes convertir explícitamente la llamada
embedding() en vector para usar estos valores con operadores pgvector.
¿Qué sigue?
- Crea un índice de ScaNN
- Realiza búsquedas de similitud de vectores
- Ajusta el rendimiento de las consultas vectoriales
- Métricas del índice de vectores
- Obtén información para crear un asistente de compras inteligente con AlloyDB, pgvector y la administración de extremos de modelos.