Ce document explique comment générer et remplir des représentations vectorielles continues de manière groupée pour les données textuelles (STRING
ou JSON
) stockées dans Spanner à l'aide de SQL et du modèle textembedding-gecko
Vertex AI.
Prérequis
Votre base de données Spanner doit contenir une table contenant des données textuelles (STRING
ou JSON
). Pour en savoir plus sur l'importation de données, consultez la présentation de l'importation et de l'exportation Spanner.
Exemple d'utilisation
Supposons que vous disposiez d'une table dans Spanner avec le schéma suivant. Cette table contient des millions d'enregistrements.
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)
);
L'objectif est de générer des représentations vectorielles continues pour la colonne description
de cette table afin de trouver des articles similaires à recommander aux clients pour améliorer leur expérience d'achat à l'aide de la recherche vectorielle.
Enregistrer un modèle de représentation vectorielle continue
GoogleSQL
Enregistrez un modèle de représentation vectorielle continue avec le point de terminaison textembedding-gecko
Vertex AI dans votre base de données 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
)
Remplacez les éléments suivants :
MODEL_NAME
: nom du modèle de représentation vectorielle continuePROJECT
: projet hébergeant le point de terminaison Vertex AILOCATION
: emplacement du point de terminaison Vertex AIMODEL_VERSION
: version du modèle de représentation vectorielle continuetextembedding-gecko
PostgreSQL
Dans le dialecte PostgreSQL, il n'est pas nécessaire d'enregistrer le modèle.
Vous transmettez le nom du point de terminaison directement à l'appel de fonction spanner.ML_PREDICT_ROW
.
Voici quelques bonnes pratiques à suivre:
- Pour maintenir l'isolation des quotas, utilisez un point de terminaison d'un autre projet pour générer et remplir des représentations vectorielles continues que le point de terminaison de production. Réservez le point de terminaison de production pour diffuser le trafic de production.
- Assurez-vous que le point de terminaison du modèle est compatible avec la valeur de
default_batch_size
. Vous pouvez remplacerdefault_batch_size
par l'indicateur de requête@{remote_udf_max_rows_per_rpc=NEW_NUMBER}
. Pour en savoir plus sur la limitedefault_batch_size
pour chaque région, consultez Obtenir des représentations vectorielles continues de texte pour un extrait de texte. - Définissez le point de terminaison avec une version de modèle spécifique (par exemple,
@003
) au lieu de@latest
. En effet, les vecteurs de représentation vectorielle continue générés pour le même texte peuvent différer en fonction de la version du modèle que vous utilisez. C'est pourquoi vous devez éviter d'utiliser différentes versions de modèle pour générer des représentations vectorielles continues dans le même ensemble de données. En outre, la mise à jour de la version du modèle dans l'instruction de définition du modèle ne met pas à jour les représentations vectorielles continues déjà générées avec ce modèle. Pour gérer la version du modèle pour les représentations vectorielles continues, vous pouvez créer une colonne supplémentaire dans la table qui stocke la version du modèle. - Les modèles
textembedding-gecko
réglés personnalisés ne sont pas compatibles avec les fonctions GoogleSQLML.PREDICT
et PostgreSQLspanner.ML_PREDICT_ROW
.
Tester l'intégration de bout en bout du modèle de représentations vectorielles continues
Vous pouvez exécuter une requête pour vérifier que le modèle de représentation vectorielle continue a bien été configuré et que les représentations vectorielles continues sont récupérées. Par exemple, exécutez la requête suivante:
GoogleSQL
SELECT embeddings.values
FROM SAFE.ML.PREDICT(
MODEL MODEL_NAME,
(SELECT description AS content FROM products LIMIT 10)
);
Remplacez les éléments suivants :
MODEL_NAME
: nom du modèle de représentation vectorielle continue
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;
Remplacez les éléments suivants :
PROJECT
: projet hébergeant le point de terminaison Vertex AILOCATION
: emplacement du point de terminaison Vertex AIMODEL_VERSION
: version du modèle de représentation vectorielle continuetextembedding-gecko
Mettre à jour la table source pour inclure des colonnes supplémentaires afin de stocker les représentations vectorielles continues
Ensuite, mettez à jour le schéma de la table source pour inclure une colonne supplémentaire de type de données ARRAY<FLOAT32>
afin de stocker les représentations vectorielles continues générées:
GoogleSQL
ALTER TABLE TABLE_NAME
ADD COLUMN EMBEDDING_COLUMN_NAME ARRAY<FLOAT32>;
Remplacez les éléments suivants :
TABLE_NAME
: nom de la table sourceEMBEDDING_COLUMN_NAME
: nom de la colonne dans laquelle vous souhaitez ajouter des représentations vectorielles continues générées
PostgreSQL
ALTER TABLE TABLE_NAME
ADD COLUMN EMBEDDING_COLUMN_NAME real[];
Remplacez les éléments suivants :
TABLE_NAME
: nom de la table sourceEMBEDDING_COLUMN_NAME
: nom de la colonne dans laquelle vous souhaitez ajouter des représentations vectorielles continues générées
Par exemple, à l'aide de l'exemple de table products
, exécutez la commande suivante:
GoogleSQL
ALTER TABLE Products
ADD COLUMN desc_embed ARRAY<FLOAT32>;
PostgreSQL
ALTER TABLE Products
ADD COLUMN desc_embed real[];
Vous pouvez ajouter une autre colonne pour gérer la version du modèle de représentation vectorielle continue.
GoogleSQL
ALTER TABLE Products
ADD COLUMN desc_embed_model_version INT64;
PostgreSQL
ALTER TABLE Products
ADD COLUMN desc_embed_model_version INT8;
Augmenter le quota pour Vertex AI
Vous devrez peut-être augmenter le quota de l'API Vertex AI pour textembedding-gecko
dans la région qui utilise le modèle. Pour demander une augmentation, consultez la page Augmentations de quota de Vertex AI.
Pour en savoir plus, consultez Quotas et limites de Vertex AI.
Représentations vectorielles continues de remplissage
Enfin, exécutez l'instruction UPDATE
suivante à l'aide du LMD partitionné pour générer des représentations vectorielles continues pour la colonne de données textuelles et les stocker dans votre base de données. Vous pouvez stocker la version du modèle avec les représentations vectorielles continues. Nous vous recommandons d'exécuter cette requête pendant une fenêtre à faible trafic dans votre base de données.
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;
Remplacez les éléments suivants :
TABLE_NAME
: nom de la table contenant les données textuellesEMBEDDING_COLUMN_NAME
: nom de la colonne dans laquelle vous souhaitez ajouter des représentations vectorielles continues généréesDATA_COLUMN_NAME
: nom de la colonne contenant les données textuellesMODEL_NAME
: nom du modèle de représentation vectorielle continueMAX_ROWS
: nombre maximal de lignes par RPCEMBEDDING_VERSION_COLUMN
: colonne qui gère la version du modèle de représentation vectorielle continuetextembedding-gecko
utilisé pour remplir vos représentations vectorielles continuesMODEL_VERSION
: version du modèle de représentation vectorielle continuetextembedding-gecko
FILTER_CONDITION
: condition de filtre partitionnable à appliquer
L'utilisation de SAFE.ML.PREDICT
renvoie NULL
pour les requêtes ayant échoué. Vous pouvez également utiliser SAFE.ML.PREDICT
en combinaison avec un filtre WHERE embedding_column IS NULL
pour réexécuter votre requête sans calculer les représentations vectorielles continues des champs déjà calculés.
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;
Remplacez les éléments suivants :
TABLE_NAME
: nom de la table contenant les données textuellesEMBEDDING_COLUMN_NAME
: nom de la colonne dans laquelle vous souhaitez ajouter des représentations vectorielles continues généréesDATA_COLUMN_NAME
: nom de la colonne contenant les données textuellesPROJECT
: projet hébergeant le point de terminaison Vertex AILOCATION
: emplacement du point de terminaison Vertex AIMODEL_VERSION
: version du modèle de représentation vectorielle continuetextembedding-gecko
MAX_ROWS
: nombre maximal de lignes par RPCEMBEDDING_VERSION_COLUMN
: colonne qui gère la version du modèle de représentation vectorielle continuetextembedding-gecko
utilisé pour remplir vos représentations vectorielles continuesFILTER_CONDITION
: condition de filtre partitionnable à appliquer
Exemple de requête de remplissage pour la table 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;
Voici quelques bonnes pratiques à suivre:
- Le délai avant expiration de gRPC par défaut pour l'API Spanner est d'une heure.
En fonction de la quantité de représentations vectorielles continues que vous remplissez, vous devrez peut-être augmenter ce délai avant expiration pour vous assurer que le LMD partitionné
UPDATE
dispose d'un temps suffisant pour se terminer. Pour en savoir plus, consultez la section Configurer des délais avant expiration personnalisés et des nouvelles tentatives.
Performances et autres considérations
Tenez compte des points suivants pour optimiser les performances lorsque vous remplissez des données de représentation vectorielle continue.
Nombre de nœuds
Le LMD partitionné exécute l'instruction LMD donnée sur différentes partitions en parallèle. Pour les instances avec un nombre élevé de nœuds, vous pouvez observer des erreurs de quota lors de l'exécution du LMD partitionné. Si les requêtes de l'API Vertex AI sont limitées en raison des limites de quota de l'API Vertex AI, Spanner retente ces échecs dans le mode transaction LMD partitionné jusqu'à 20 fois. Si vous constatez un taux élevé d'erreurs de quota dans Vertex AI, augmentez le quota pour Vertex AI.
Vous pouvez également ajuster le parallélisme à l'aide de l'indice @{pdml_max_parallelism=DESIRED_NUMBER}
au niveau de l'instruction lorsque vous utilisez Google Sql. L'exemple suivant définit le parallélisme sur "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;
Taille du texte dans la colonne de données
Le modèle de représentation vectorielle continue Vertex AI limite le nombre maximal de jetons pour chaque entrée de texte. Les limites de jetons varient selon les versions de modèle. Chaque requête Vertex AI peut comporter plusieurs champs de texte d'entrée, mais le nombre maximal de jetons présents dans une seule requête est limité. Pour les bases de données GoogleSQL, si vous rencontrez une erreur INVALID_ARGUMENT
avec le message "La requête est trop volumineuse", essayez de réduire la taille de lot pour éviter cette erreur. Pour ce faire, vous pouvez configurer default_batch_size
ou utiliser l'indice de requête @{remote_udf_max_outstanding_rpcs}
lors de l'enregistrement du modèle.
Nombre de requêtes API envoyées à Vertex AI
Vous pouvez utiliser l'indice de requête @{remote_udf_max_outstanding_rpcs}
pour augmenter ou réduire le nombre de requêtes envoyées à Vertex AI depuis Spanner. Sachez que l'augmentation de cette limite peut augmenter l'utilisation du processeur et de la mémoire de l'instance Spanner. Pour les bases de données GoogleSQL, l'utilisation de cet indicateur de requête remplace la default_batch_size
configurée pour votre modèle.
Surveiller la progression du remplissage
Vous pouvez surveiller le nombre de requêtes, la latence et les octets réseau envoyés à Vertex AI depuis Spanner à l'aide du tableau de bord des insights système.
Étapes suivantes
- Découvrez comment effectuer une recherche vectorielle de similarité en trouvant les K voisins les plus proches.
- Pour en savoir plus sur le machine learning et les représentations vectorielles continues, consultez notre cours intensif sur les représentations vectorielles continues.