En este documento se explica cómo usar las inserciones almacenadas para generar índices y consultar inserciones. Para obtener más información sobre cómo almacenar inserciones, consulta Almacenar inserciones de vectores.
Puedes crear índices ScaNN
, IVF
, IVFFlat
y HNSW
con AlloyDB.
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
, ampliada por Google para AlloyDB, está instalada.CREATE EXTENSION IF NOT EXISTS vector;
Para generar índices
ScaNN
, instala la extensiónalloydb_scann
además de la extensiónvector
.CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Crear un índice
Puede crear uno de los siguientes tipos de índices para las tablas de su base de datos.
Crear un índice de ScaNN
AlloyDB alloydb_scann
, a
Extensión de PostgreSQL desarrollada por Google que implementa un
índice de vecinos más cercanos eficiente basado en [ScaNN
algorithm](https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md).
El índice ScaNN
es un índice de cuantificación basado en árboles para
búsqueda de vecinos más cercanos. Proporciona un tiempo de creación de índices más corto y un
uso de memoria en comparación con HNSW
. Además, ofrece un CPS más rápido en
comparación con HNSW
en función de la carga de trabajo.
una tabla de tu base de datos de AlloyDB. Si intentas generar un índice ScaNN
en una tabla vacía o con particiones, es posible que tengas algunos problemas. Para obtener más información
Para obtener información sobre los errores generados, consulta Solucionar errores de índice de ScaNN.
Índice de árbol de dos niveles ScaNN
Para aplicar un índice de árbol de dos niveles con el algoritmo ScaNN a una columna
que contenga las inserciones de vectores almacenadas, ejecuta la siguiente consulta DDL:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE);
Haz los cambios siguientes:
INDEX_NAME
: el nombre del índice que quierasCrear (por ejemplo,
my-scann-index
). Los nombres de los índices se compartenen toda tu base de datos. Asegúrate de que cada nombre de índice sea único para cada
de tu base de datos.
TABLE
: la tabla a la que se va a añadir el índice.EMBEDDING_COLUMN
: columna que almacenavector
datos.
DISTANCE_FUNCTION
: la función de distancia que se va a usarcon este índice. Elige una de estas opciones:
Distancia L2:
l2
Producto escalar:
dot_product
Distancia del coseno:
cosine
NUM_LEAVES_VALUE
: número de particiones que se van a aplicareste índice. Puede ser cualquier valor entre 1 y 1048576. Más información
Para saber cómo decidir este valor, consulta Ajustar un índice de
ScaNN
.
Índice de árbol de tres niveles ScaNN
Para crear un índice de árbol de tres niveles usando el algoritmo ScaNN en una columna
que contenga las inserciones de vectores almacenadas, ejecuta la siguiente consulta DDL:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
Haz los cambios siguientes:
MAX_NUM_LEVELS
: número máximo de niveles de laÁrbol de clústeres de k-medias. El valor predeterminado
1
es para la estructura de árbol de dos niveles.cuantización y
2
para la cuantización basada en árboles de tres niveles.
Una vez que hayas creado el índice, podrás ejecutar consultas de búsqueda de vecinos más cercanos que
Aprovecha el índice siguiendo las instrucciones de [Crear un índice de vecinos más cercanos
consulta con el texto proporcionado](#query).
Los parámetros de índice deben configurarse de forma que se consiga un equilibrio entre las consultas por segundo y
Retirada. Para obtener más información sobre cómo optimizar el índice ScaNN
, consulta [Optimizar un índice ScaNN
index](/alloydb/omni/containers/15.7.0/docs/ai/tune-indexes).
Para crear este índice en una columna de inserciones que use el tipo de datos real[]
En lugar de vector
, convierte la columna al tipo de datos vector
:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
Sustituye DIMENSIONS
por la anchura dimensional del
columna de inserción. Para obtener más información sobre cómo encontrar las dimensiones,
Consulta la función vector_dims
en [Vector
functions](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions).
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
La fase building index: tree training
desaparece una vez que se ha creado el índice.
Para ajustar el índice de forma que se equilibren la precisión y las consultas por segundo, consulta Ajustar un índice ScaNN
.
Analizar una tabla indexada
Después de crear el índice ScaNN
, ejecuta el comando ANALYZE
para actualizar las estadísticas de tus datos.
ANALYZE TABLE;
Ejecutar una consulta
Una vez que haya almacenado e indexado las inserciones en su base de datos, podrá empezar a
consultar mediante la consulta [pgvector
functionality](https://github.com/pgvector/pgvector#querying). No puedes ejecutar
consultas de búsqueda masivas mediante la extensión alloydb_scann
.
Para encontrar los vecinos semánticos más cercanos de un vector de inserción, puedes ejecutar la
en la siguiente consulta de ejemplo, donde se define la misma función de distancia que se ha usado
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 que se va a comparar con latexto.
INDEX_NAME
: el nombre del índice que quieras usar. Por ejemplo,Por ejemplo,
my-scann-index
.EMBEDDING_COLUMN
: la columna que contiene elinserciones.
DISTANCE_FUNCTION_QUERY
: la función de distancia que se va a usar con esteconsulta. 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 el vector almacenado más cercano.vecinos semánticos de.
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
También puedes usar la función embedding()
para traducir el
texto en un vector. Aplicas el vector a uno de los
pgvector
operador de vecino más cercano, <->
para la distancia L2, para encontrar las filas de la base de datos con el
las incrustaciones más similares semánticamente.
Como embedding()
devuelve una matriz real
, debes convertir explícitamente el
embedding()
llama a vector
para usar estos valores con pgvector
operadores.
CREATE EXTENSION IF NOT EXISTS google_ml_integration;
CREATE EXTENSION IF NOT EXISTS vector;
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN::vector
<-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
LIMIT ROW_COUNT
Haz los cambios siguientes:
MODEL_ID
: ID del modelo que se va a consultar.Si usas Vertex AI Model Garden, especifica
text-embedding-005
como ID de modelo. Estos son los modelos basados en la nube que AlloyDB puede usar para las incrustaciones de texto. Para obtener más información, consulta Inserciones de texto.Opcional:
VERSION_TAG
: la etiqueta de versión del modelo que se va a consultar. Añade el prefijo@
a la etiqueta.Si usas uno de los modelos en inglés de
text-embedding
con Vertex AI, especifica una de las etiquetas de versión (por ejemplo,text-embedding-005
) que se indican en Versiones del modelo.Google recomienda que siempre especifiques la etiqueta de versión. Si no especifica la etiqueta de versión, AlloyDB siempre usará la versión más reciente del modelo, lo que podría dar lugar a resultados inesperados.
TEXT
: el texto que se va a traducir a una incrustación de vector.
Siguientes pasos
- Ejemplo de flujo de trabajo de una incrustación
- Ajustar el rendimiento de las consultas vectoriales
- Métricas de índice vectorial