En este documento, se explica cómo generar y reabastecer incorporaciones de vectores de forma masiva
para datos textuales (STRING
o JSON
) que se almacenan en
Spanner con SQL y Vertex AI textembedding-gecko
model.
Requisitos previos
Debes tener una tabla en tu base de datos de Spanner que contenga
datos textuales (STRING
o JSON
) Para obtener más información sobre la importación de datos,
consulta la descripción general de la importación y exportación de Spanner.
Ejemplo de caso de uso
Supongamos que tienes una tabla en Spanner con el siguiente esquema. Esta tabla contiene millones de registros.
GoogleSQL
CREATE TABLE Products (
product_id INT64 NOT NULL,
name STRING(MAX),
description STRING(MAX)
) PRIMARY KEY(product_id);
PostgreSQL
CREATE TABLE Products (
product_id INT8 NOT NULL,
name TEXT,
description TEXT,
PRIMARY KEY(product_id)
);
Tu objetivo es generar incorporaciones vectoriales para la columna description
de esta
para encontrar artículos similares y recomendarles a los clientes que mejoren sus compras
tu experiencia con la búsqueda de vectores.
Registra un modelo de incorporación
GoogleSQL
Registra un modelo de incorporación con Vertex AI
Extremo textembedding-gecko
en la base de datos de Spanner:
CREATE MODEL MODEL_NAME
INPUT(
content STRING(MAX)
)
OUTPUT(
embeddings STRUCT<values ARRAY<FLOAT32>>
)
REMOTE OPTIONS(
endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
default_batch_size = 5
)
Reemplaza lo siguiente:
MODEL_NAME
: Es el nombre del modelo de incorporación.PROJECT
: Es el proyecto que aloja el extremo de Vertex AI.LOCATION
: Es la ubicación del extremo de Vertex AI.MODEL_VERSION
: Es la versión del modelo de incorporacióntextembedding-gecko
.
PostgreSQL
En el dialecto PostgreSQL, no es necesario registrar el modelo.
Debes pasar el nombre del extremo directamente a la llamada a función spanner.ML_PREDICT_ROW
.
Para conocer las prácticas recomendadas, ten en cuenta lo siguiente:
- Si quieres mantener el aislamiento de las cuotas, usa un extremo en un proyecto diferente para generar y reabastecer incorporaciones que el extremo de producción. Reserva el extremo de producción para entregar el tráfico de producción.
- Asegúrate de que el extremo del modelo admita el valor de
default_batch_size
. Puedes anular eldefault_batch_size
con la sugerencia de la consulta@{remote_udf_max_rows_per_rpc=NEW_NUMBER}
Para obtener información sobre el límite dedefault_batch_size
para cada región, consulta Obtén incorporaciones de texto para un fragmento de texto. - Define el extremo con una versión específica del modelo (p.ej.,
@003
) en lugar de@latest
Esto se debe a que los vectores de incorporación generados para la misma pieza del texto puede variar según la versión del modelo que uses; cuál por lo que debes evitar el uso de diferentes versiones del modelo para generar incorporaciones en el mismo conjunto de datos. Además, actualizar la versión del modelo en el modelo definición no actualiza las incorporaciones que ya se generaron con este modelo. Una forma de administrar la versión del modelo para las incorporaciones es crear una columna adicional en la tabla que almacena la versión del modelo. - Los modelos
textembedding-gecko
ajustados personalizados no son compatibles con GoogleSQLML.PREDICT
y PostgreSQL Funciónspanner.ML_PREDICT_ROW
.
Prueba la integración de extremo a extremo del modelo de incorporaciones
Puedes ejecutar una consulta para probar que el modelo de incorporación se configuró correctamente. y se recuperan las incorporaciones. Por ejemplo, ejecuta la siguiente consulta:
GoogleSQL
SELECT embeddings.values
FROM SAFE.ML.PREDICT(
MODEL MODEL_NAME,
(SELECT description AS content FROM products LIMIT 10)
);
Reemplaza lo siguiente:
MODEL_NAME
: Es el nombre del modelo de incorporación.
PostgreSQL
SELECT spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description))))
FROM Products
LIMIT 10;
Reemplaza lo siguiente:
PROJECT
: Es el proyecto que aloja el extremo de Vertex AI.LOCATION
: Es la ubicación del extremo de Vertex AI.MODEL_VERSION
: Es la versión del modelo de incorporacióntextembedding-gecko
.
Actualiza la tabla de origen para incluir columnas adicionales en las que se almacenarán las incorporaciones
A continuación, actualiza el esquema de la tabla de origen para incluir una columna adicional del
tipo de datos ARRAY<FLOAT32>
para almacenar las incorporaciones generadas:
GoogleSQL
ALTER TABLE TABLE_NAME
ADD COLUMN EMBEDDING_COLUMN_NAME ARRAY<FLOAT32>;
Reemplaza lo siguiente:
TABLE_NAME
: Es el nombre de la tabla de origen.EMBEDDING_COLUMN_NAME
: Es el nombre de la columna a la que deseas agregar las incorporaciones generadas.
PostgreSQL
ALTER TABLE TABLE_NAME
ADD COLUMN EMBEDDING_COLUMN_NAME real[];
Reemplaza lo siguiente:
TABLE_NAME
: Es el nombre de la tabla de origen.EMBEDDING_COLUMN_NAME
: Es el nombre de la columna a la que deseas agregar las incorporaciones generadas.
Por ejemplo, con el ejemplo de la tabla products
, ejecuta lo siguiente:
GoogleSQL
ALTER TABLE Products
ADD COLUMN desc_embed ARRAY<FLOAT32>;
PostgreSQL
ALTER TABLE Products
ADD COLUMN desc_embed real[];
Puedes agregar otra columna para administrar la versión del modelo de incorporación.
GoogleSQL
ALTER TABLE Products
ADD COLUMN desc_embed_model_version INT64;
PostgreSQL
ALTER TABLE Products
ADD COLUMN desc_embed_model_version INT8;
Aumenta la cuota de Vertex AI
Es posible que debas aumentar la cuota de la API de Vertex AI para
textembedding-gecko
en la región que usa el modelo. Para
solicitar un aumento, consulta la sección Aumentos de cuota de Vertex AI.
Para obtener más información, consulta Cuotas y límites de Vertex AI.
Incorporaciones de reabastecimiento
Por último, ejecuta la siguiente declaración UPDATE
con DML particionado
generar incorporaciones para la columna de datos textuales y almacenarlas
en tu base de datos. Puedes almacenar la versión del modelo junto con las incorporaciones. Mié
te recomendamos ejecutar esta consulta durante una ventana de poco tráfico en tu
en la base de datos.
GoogleSQL
UPDATE TABLE_NAME
SET
TABLE_NAME.EMBEDDING_COLUMN_NAME = (
SELECT embeddings.values
FROM SAFE.ML.PREDICT(
MODEL MODEL_NAME,
(SELECT TABLE_NAME.DATA_COLUMN_NAME AS content)
) @{remote_udf_max_rows_per_rpc=MAX_ROWS}
),
TABLE_NAME.EMBEDDING_VERSION_COLUMN = MODEL_VERSION
WHERE FILTER_CONDITION;
Reemplaza lo siguiente:
TABLE_NAME
: Es el nombre de la tabla con los datos de texto.EMBEDDING_COLUMN_NAME
: Es el nombre de la columna a la que deseas agregar las incorporaciones generadas.DATA_COLUMN_NAME
: Es el nombre de la columna con los datos textuales.MODEL_NAME
: Es el nombre del modelo de incorporación.MAX_ROWS
: Es la cantidad máxima de filas por RPC.EMBEDDING_VERSION_COLUMN
: Es la columna que administra la versión del modelo de incorporacióntextembedding-gecko
que se usa para reabastecer tus incorporaciones.MODEL_VERSION
: Es la versión del modelo de incorporacióntextembedding-gecko
.FILTER_CONDITION
: Es una condición de filtro particionable que deseas aplicar.
Usar SAFE.ML.PREDICT
muestra NULL
para las solicitudes fallidas. También puedes usar
SAFE.ML.PREDICT
en combinación con un WHERE embedding_column IS NULL
filtro para volver a ejecutar tu consulta sin calcular las incorporaciones de los campos
ya procesados.
PostgreSQL
UPDATE TABLE_NAME
SET
EMBEDDING_COLUMN_NAME = spanner.FLOAT32_ARRAY(spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', DATA_COLUMN_NAME)))
) /*@ remote_udf_max_rows_per_rpc=MAX_ROWS */ ->'predictions'->0->'embeddings'->'values'),
EMBEDDING_VERSION_COLUMN = MODEL_VERSION
WHERE FILTER_CONDITION;
Reemplaza lo siguiente:
TABLE_NAME
: Es el nombre de la tabla con los datos de texto.EMBEDDING_COLUMN_NAME
: Es el nombre de la columna a la que deseas agregar las incorporaciones generadas.DATA_COLUMN_NAME
: Es el nombre de la columna con los datos textuales.PROJECT
: Es el proyecto que aloja el extremo de Vertex AI.LOCATION
: Es la ubicación del extremo de Vertex AI.MODEL_VERSION
: Es la versión del modelo de incorporacióntextembedding-gecko
.MAX_ROWS
: Es la cantidad máxima de filas por RPC.EMBEDDING_VERSION_COLUMN
: Es la columna que administra la versión del modelo de incorporacióntextembedding-gecko
que se usa para reabastecer tus incorporaciones.FILTER_CONDITION
: Es una condición de filtro particionable que deseas aplicar.
Ejemplo de una consulta de reabastecimiento para la tabla products
:
GoogleSQL
UPDATE products
SET
products.desc_embed = (
SELECT embeddings.values
FROM SAFE.ML.PREDICT(
MODEL gecko_model,
(SELECT products.description AS content)
) @{remote_udf_max_rows_per_rpc=200}
),
products.desc_embed_model_version = 3
WHERE products.desc_embed IS NULL;
PostgreSQL
UPDATE products
SET
desc_embed = spanner.FLOAT32_ARRAY(spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko@003',
JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description)))
) /*@ remote_udf_max_rows_per_rpc=200 */ ->'predictions'->0->'embeddings'->'values'),
desc_embed_model_version = 3
WHERE desc_embed IS NULL;
Para conocer las prácticas recomendadas, ten en cuenta lo siguiente:
- El tiempo de espera predeterminado de gRPC para la API de Spanner es de una hora.
Según la cantidad de incorporaciones que reabastezcas, es posible que debas
aumenta este tiempo de espera para asegurarte de que el DML particionado
UPDATE
tenga tiempo suficiente para completarla. Para obtener más información, consulta Configura tiempos de espera y reintentos personalizados.
Rendimiento y otras consideraciones
Ten en cuenta lo siguiente para optimizar el rendimiento cuando reabasteces las incorporaciones de datos no estructurados.
Cantidad de nodos
El DML particionado ejecuta la declaración DML determinada en diferentes particiones
en paralelo. En las instancias con una gran cantidad de nodos, es posible que observes la cuota
errores durante la ejecución de un DML particionado. Si el panel de Vertex AI
Las solicitudes a la API se limitan debido a los límites de cuota de la API de Vertex AI
Spanner reintenta estas fallas según la
modo de transacción de DML particionado
un máximo de 20 veces. Si observas una tasa alta de errores de cuota
Vertex AI y, luego, aumenta la cuota de Vertex AI.
También puedes ajustar el paralelismo con la sugerencia a nivel de instrucción.
@{pdml_max_parallelism=DESIRED_NUMBER}
mientras se usa Google SQL Lo siguiente
En este ejemplo, se configura el paralelismo en '5':
GoogleSQL
@{pdml_max_parallelism=5} UPDATE products
SET products.desc_embed =(
SELECT embeddings.values
FROM SAFE.ML.PREDICT(MODEL gecko_model, (
SELECT products.value AS CONTENT
)
)
@{remote_udf_max_rows_per_rpc=200}
),
products.desc_embed_model_version = 003
WHERE products.desc_embed IS NULL;
Tamaño del texto en la columna de datos
El modelo de incorporación de Vertex AI tiene límites en la cantidad máxima de
tokens para cada entrada de texto. Las diferentes versiones del modelo tienen tokens diferentes
límites. Cada solicitud de Vertex AI puede tener varios textos de entrada
campos, pero hay un límite en la cantidad máxima de tokens presente
en una sola solicitud. Para las bases de datos de GoogleSQL, si encuentras un
Error INVALID_ARGUMENT
con el mensaje "La solicitud es demasiado grande" intenta reducir el
el tamaño del lote para evitar el error. Para hacerlo, puedes configurar default_batch_size
o usa la sugerencia de consulta @{remote_udf_max_outstanding_rpcs}
cuando registres el modelo.
Cantidad de solicitudes a la API enviadas a Vertex AI
Puedes usar la sugerencia de consulta @{remote_udf_max_outstanding_rpcs}
para aumentar o
para disminuir la cantidad de solicitudes enviadas a Vertex AI
Spanner Ten en cuenta que aumentar este límite puede incrementar la capacidad
y el uso de memoria de la instancia de Spanner. Para GoogleSQL
bases de datos, usar esta sugerencia de consulta anula los default_batch_size
configurados
para tu modelo.
Supervisa el progreso del reabastecimiento
Puedes supervisar la cantidad de solicitudes, latencia y bytes de red enviados a Vertex AI desde Spanner con el panel de estadísticas del sistema.
¿Qué sigue?
- Aprende cómo realizar una búsqueda de vector de similitud buscando el valor K más cercano vecinos.
- Obtén más información sobre el aprendizaje automático y las incorporaciones en nuestra curso intensivo sobre incorporaciones.