En esta sección se describe cómo invocar predicciones y consultar e indexar incrustaciones con la extensión pgvector. Estas funciones de IA basadas en aprendizaje automático están disponibles a través de AlloyDB AI, que es un conjunto de funciones de AlloyDB para PostgreSQL que te permiten aplicar la potencia semántica y predictiva de los modelos de aprendizaje automático a tus datos.
Consulta más información sobre AlloyDB AI en https://cloud.google.com//alloydb/docs/ai.
Invocar predicciones
Para integrar Vertex AI con AlloyDB Omni y ejecutar predicciones en modelos almacenados en Vertex AI, sigue estos pasos.
Antes de empezar
- Habilita las predicciones online de Vertex AI en GDC.
Ejecuta el siguiente comando para crear un secreto de Kubernetes basado en la clave de cuenta de servicio que has descargado en los pasos anteriores. Asegúrate de crear el secreto de Kubernetes en el mismo espacio de nombres que el recurso
DBCluster
.kubectl create secret generic SECRET_NAME \ --from-file=PATH_TO_SERVICE_ACCOUNT_KEY/private-key.json \ -n NAMESPACE
Haz los cambios siguientes:
SECRET_NAME
: el nombre del secreto que se usa al crear un manifiesto deDBCluster
para permitir que AlloyDB Omni acceda a las funciones de Distributed Cloud AI. Por ejemplo,vertex-ai-key-alloydb
.PATH_TO_SERVICE_ACCOUNT_KEY
: la ruta a la ubicación donde has descargado la clave de la cuenta de servicioprivate-key.json
.NAMESPACE
: el espacio de nombres del clúster de la base de datos.
Instala el operador de AlloyDB Omni siguiendo los pasos que se indican en Elegir un tipo de motor de base de datos y crear un clúster de base de datos.
Crea un clúster de base de datos con AlloyDB AI y asigna
vertexAIKeyRef
al secreto de Kubernetes creado en los pasos anteriores en el campogoogleMLExtension
del manifiestoDBCluster
.apiVersion: v1 kind: Secret metadata: name: db-pw-DBCLUSTER_NAME namespace: USER_PROJECT type: Opaque data: DBCLUSTER_NAME: "BASE64_PASSWORD" --- apiVersion: DBENGINE_NAME.dbadmin.gdc.goog/v1 kind: DBCluster metadata: name: DBCLUSTER_NAME namespace: USER_PROJECT spec: primarySpec: adminUser: passwordRef: name: db-pw-DBCLUSTER_NAME features: googleMLExtension: config: vertexAIKeyRef: SECRET_NAME version: "DB_VERSION" resources: memory: DB_MEMORY cpu: DB_CPU disks: - name: DataDisk size: DB_DATA_DISK
Sustituye las siguientes variables:
DBCLUSTER_NAME
: el nombre del clúster de la base de datos.USER_PROJECT
: el nombre del proyecto de usuario en el que se creará el clúster de bases de datos.BASE64_PASSWORD
: la codificación base64 de la contraseña de administrador de la base de datos.DBENGINE_NAME
: el nombre del motor de la base de datos. Su valor debe seralloydbomni
.DB_VERSION
: la versión del motor de la base de datos.DB_MEMORY
: la cantidad de memoria asignada al clúster de la base de datos, por ejemplo,5Gi
.DB_CPU
: la cantidad de CPUs asignadas al clúster de la base de datos. Por ejemplo,2
.DB_DATA_DISK
: la cantidad de espacio asignado al clúster de bases de datos, por ejemplo,10 Gi
.
Aplica el archivo de manifiesto.
kubectl apply -f DB_CLUSTER_YAML
Haz los cambios siguientes:
DB_CLUSTER_YAML
: el nombre de este archivo de manifiesto del clúster de bases de datos. Por ejemplo,alloydb-omni-db-cluster.yaml
.
Instala la extensión
google_ml_integration
.CREATE EXTENSION google_ml_integration CASCADE;
Invocar una predicción
Invoca una predicción online mediante un endpoint de modelo de Vertex AI ejecutando la siguiente función SQL ml_predict_row()
:
SELECT ml_predict_row('PREDICTION_ENDPOINT/PROJECT_NAMESPACE/ORGANIZATION/ZONE/DNS/DNS_SUFFIX', '{ "instances": [ INSTANCES ], "parameters":
PARAMETERS');
Haz los cambios siguientes:
PREDICTION_ENDPOINT
: el nombre completo del endpoint de Vertex AIPROJECT_NAMESPACE
: el espacio de nombres en el que se implementa el endpoint de Vertex AIORGANIZATION
: el nombre de la organización en la que se ha implementado el endpoint de Vertex AIZONE
: la zona en la que se ha implementado tu endpoint de Vertex AIDNS
: el DNS de tu organizaciónDNS_SUFFIX
: el sufijo del objeto DNSINSTANCES
: las entradas de la llamada de predicción, en formato JSONPARAMETERS
: los parámetros de la llamada de predicción, en formato JSON
Consultas e incrustaciones indexadas con pgvector
La extensión pgvector
PostgreSQL te permite usar operadores y funciones específicos de vectores cuando almacenas, indexas y consultas incrustaciones de texto en tu base de datos.
AlloyDB ofrece optimizaciones para trabajar con pgvector
,
que te permiten crear índices que pueden acelerar determinadas consultas que
incluyen incrustaciones.
Consulta más información sobre cómo usar AlloyDB como LLM y cómo generar y almacenar inserciones vectoriales basadas en un LLM en https://cloud.google.com/alloydb/docs/ai/work-with-embeddings#index.
Crear índices y consultar vectores con ScaNN
En esta sección se explica cómo usar las inserciones almacenadas para generar índices y consultar inserciones. Puedes crear ScaNN
índices 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
y ampliada por Google para AlloyDB, está instalada.CREATE EXTENSION IF NOT EXISTS vector;
Para generar índices
ScaNN
, instala la extensiónpostgres_ann
además de la extensiónvector
.CREATE EXTENSION IF NOT EXISTS postgres_ann;
Crear un índice de ScaNN
Puedes crear un ScaNN
índice para las tablas de tu base de datos.
AlloyDB postgres_ann
, una extensión de PostgreSQL desarrollada por Google que implementa un índice de vecinos más cercanos muy eficiente basado en el algoritmo ScaNN.
El índice ScaNN
es un índice de cuantificación basado en árbol para la búsqueda aproximada de vecinos más cercanos. Ofrece un tiempo de compilación de índice bajo y un tamaño de memoria reducido. Además, proporciona un QPS rápido en función de la carga de trabajo.
Í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 incrustaciones 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 quieras crear (por ejemplo,my-scann-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:
l2
Producto escalar:
dot_product
Distancia del coseno:
cosine
NUM_LEAVES_VALUE
: el número de particiones que se aplicarán a este índice. Puede ser cualquier valor entre 1 y 1048576.
Índice de árbol de tres niveles ScaNN
Para crear un índice de árbol de tres niveles con el algoritmo ScaNN en una columna que contenga 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 del árbol de clústeres de k-means. Usa el valor1
(predeterminado) para la cuantización basada en árbol de dos niveles y2
para la cuantización basada en árbol de tres niveles.
Una vez que hayas creado el índice, podrás ejecutar consultas de búsqueda de vecinos más cercanos que utilicen el índice siguiendo las instrucciones de Hacer una consulta de vecinos más cercanos con un texto determinado.
Los parámetros de índice deben configurarse para lograr un equilibrio entre las consultas por segundo y la recuperación.
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 el ancho dimensional de la columna de inserción.
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 index: tree training
desaparece una vez que se ha creado el índice.
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 función de consulta pgvector
. No puedes ejecutar consultas de búsqueda masivas con la extensión postgres_ann
.
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.
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, <->
para la distancia L2, para encontrar las filas de la base de datos con las
incrustaciones semánticamente más similares. Ten en cuenta que primero debes registrar el modelo Gecko de inserción de texto para usar esta función.
Como embedding()
devuelve una matriz real
, debes convertir explícitamente la llamada embedding()
a vector
para usar estos valores con operadores pgvector
.
CREATE EXTENSION 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
textembedding-gecko@003
como ID de modelo. Estos son los modelos basados en la nube que Distributed Cloud puede usar para las inserciones de texto.Opcional:
VERSION_TAG
es 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
textembedding-gecko
con Vertex AI, especifica una de las etiquetas de versión (por ejemplo,textembedding-gecko@003
).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.
Métricas de índice vectorial
En esta sección se enumeran las métricas relacionadas con los índices vectoriales que generas en AlloyDB. Puede consultar estas métricas con la pg_stat_ann_indexes
vista que está disponible cuando instala la extensión postgres_ann
.
Métricas de usabilidad
Las métricas de usabilidad incluyen métricas que le ayudan a comprender el estado de la utilización del índice con métricas como la configuración del índice y el número de análisis del índice.
Nombre de la métrica | Tipo de datos | Descripción |
---|---|---|
relid |
OID |
Identificador único de la tabla que contiene el índice vectorial. |
indexrelid |
OID |
Identificador único del índice vectorial. |
schemaname |
NAME |
Nombre del esquema al que pertenece el índice. |
relname |
NAME |
Nombre de la tabla que contiene el índice. |
indexrelname |
NAME |
Nombre del índice. |
indextype |
NAME |
Tipo de índice. Este valor siempre es postgres_ann . |
indexconfig |
TEXT[] |
Configuración, como el recuento de hojas y el cuantificador, definida para el índice cuando se creó. |
indexsize |
TEXT |
Tamaño del índice. |
indexscan |
BIGINT |
Número de análisis de índice iniciados en el índice. |
Métricas de ajuste
Las métricas de ajuste te ofrecen información valiosa sobre la optimización de tus índices, lo que te permite aplicar recomendaciones para mejorar el rendimiento de las consultas.
Nombre de la métrica | Tipo de datos | Descripción |
---|---|---|
insertcount |
BIGINT |
Número de operaciones de inserción en el índice. Esta métrica también incluye cualquier número de filas que existieran antes de que se creara el índice. |
updatecount |
BIGINT |
Número de operaciones de actualización en el índice. Esta métrica no tiene en cuenta las actualizaciones HOT. |
deletecount |
BIGINT |
Número de operaciones de eliminación en el índice. |
distribution |
JSONB |
Distribuciones de vectores en todas las particiones del índice. Los siguientes campos muestran la distribución:
Nota: Debido a las características inherentes del algoritmo de clustering K-means, siempre habrá cierto grado de varianza en la distribución de vectores entre particiones, incluso cuando se cree el índice inicialmente. |
Recomendación de ajuste basada en las métricas
- Mutation
- Las métricas
insertcount
,updatecount
ydeletecount
muestran los cambios o las mutaciones en el vector del índice. - El índice se crea con un número específico de vectores y particiones. Cuando se realizan operaciones como insertar, actualizar o eliminar en el índice vectorial, solo afectan al conjunto inicial de particiones en las que residen los vectores. Por lo tanto, el número de vectores de cada partición fluctúa a lo largo del tiempo, lo que puede afectar al recuerdo, a las QPS o a ambos.
- Si observas que las consultas de búsqueda de ANN son lentas o imprecisas (por ejemplo, si el QPS es bajo o la recuperación es deficiente) con el tiempo, te recomendamos que revises estas métricas. Un número elevado de mutaciones en relación con el número total de vectores podría indicar la necesidad de volver a indexar.
- Distribución
- La métrica
distribution
muestra las distribuciones de vectores en todas las particiones. - Cuando creas un índice, se crea con un número específico de vectores y particiones fijas. El proceso de partición y la distribución posterior se realizan en función de esta consideración. Si se añaden vectores adicionales, se particionan entre las particiones existentes, lo que da como resultado una distribución diferente a la que había cuando se creó el índice. Como la distribución final no tiene en cuenta todos los vectores simultáneamente, puede que se vean afectados la recuperación, las consultas por segundo o ambos.
- Si observa un descenso gradual en el rendimiento de sus consultas de búsqueda de ANN, como tiempos de respuesta más lentos o una menor precisión en los resultados (medida por QPS o recuperación), le recomendamos que compruebe esta métrica y vuelva a indexar.