Générer des représentations vectorielles continues de données textuelles de manière groupée à l'aide d'instructions LMD partitionnées

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 avec SQL et Vertex AI textembedding-gecko model.

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 des importations et des exportations 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)
);

Votre objectif est de générer des représentations vectorielles continues pour la colonne description dans cette pour trouver des articles similaires à recommander aux clients afin d'améliorer leurs achats expérience de la recherche vectorielle.

Enregistrer un modèle de représentation vectorielle continue

GoogleSQL

Enregistrer un modèle de représentation vectorielle continue avec Vertex AI Point de terminaison textembedding-gecko de 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 l'élément suivant :

  • MODEL_NAME: nom du modèle de représentation vectorielle continue
  • PROJECT: projet hébergeant le point de terminaison Vertex AI
  • LOCATION: emplacement du point de terminaison Vertex AI
  • MODEL_VERSION: version du modèle de représentation vectorielle continue textembedding-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 appartenant à un autre projet pour générer et remplir des représentations vectorielles continues que le point de terminaison de production. Réservez le 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 remplacer default_batch_size par l'indice de requête @{remote_udf_max_rows_per_rpc=NEW_NUMBER} Pour en savoir plus sur la default_batch_size pour chaque région, voir 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 la même pièce de texte peut varier en fonction de la version du modèle que vous utilisez ; lequel 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 jeu de données. De plus, la mise à jour de la version du modèle dans le modèle l'instruction de définition 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, 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 le ML.PREDICT GoogleSQL et PostgreSQL Fonction spanner.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 est correctement configuré, et 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 l'élément suivant :

  • 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 l'élément suivant :

  • PROJECT: projet hébergeant le point de terminaison Vertex AI
  • LOCATION: emplacement du point de terminaison Vertex AI
  • MODEL_VERSION: version du modèle de représentation vectorielle continue textembedding-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 le type de données ARRAY<FLOAT32> pour stocker les représentations vectorielles continues générées:

GoogleSQL

ALTER TABLE TABLE_NAME
ADD COLUMN EMBEDDING_COLUMN_NAME ARRAY<FLOAT32>;

Remplacez l'élément suivant :

  • TABLE_NAME: nom de la table source
  • EMBEDDING_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 l'élément suivant :

  • TABLE_NAME: nom de la table source
  • EMBEDDING_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. À demander une augmentation, consultez les augmentations de quotas 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 d'un LMD partitionné. afin de générer des représentations vectorielles continues pour la colonne de données textuelles et de les stocker dans votre base de données. Vous pouvez stocker la version du modèle avec les représentations vectorielles continues. Mer nous vous recommandons d'exécuter cette requête lors d'une période de faible trafic 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 l'élément suivant :

  • TABLE_NAME: nom de la table contenant les données textuelles
  • EMBEDDING_COLUMN_NAME: nom de la colonne dans laquelle vous souhaitez ajouter des représentations vectorielles continues générées
  • DATA_COLUMN_NAME: nom de la colonne contenant les données textuelles
  • MODEL_NAME: nom du modèle de représentation vectorielle continue
  • MAX_ROWS: nombre maximal de lignes par RPC
  • EMBEDDING_VERSION_COLUMN: colonne qui gère la version du modèle de représentation vectorielle continue textembedding-gecko utilisé pour remplir vos représentations vectorielles continues
  • MODEL_VERSION: version du modèle de représentation vectorielle continue textembedding-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 WHERE embedding_column IS NULL filtre pour réexécuter votre requête sans calculer les représentations vectorielles continues des champs déjà calculées.

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 l'élément suivant :

  • TABLE_NAME: nom de la table contenant les données textuelles
  • EMBEDDING_COLUMN_NAME: nom de la colonne dans laquelle vous souhaitez ajouter des représentations vectorielles continues générées
  • DATA_COLUMN_NAME: nom de la colonne contenant les données textuelles
  • PROJECT: projet hébergeant le point de terminaison Vertex AI
  • LOCATION: emplacement du point de terminaison Vertex AI
  • MODEL_VERSION: version du modèle de représentation vectorielle continue textembedding-gecko
  • MAX_ROWS: nombre maximal de lignes par RPC
  • EMBEDDING_VERSION_COLUMN: colonne qui gère la version du modèle de représentation vectorielle continue textembedding-gecko utilisé pour remplir vos représentations vectorielles continues
  • FILTER_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. Selon la quantité de représentations vectorielles continues que vous remplissez, vous devrez peut-être augmentez ce délai pour vous assurer que le LMD partitionné UPDATE a suffisamment de temps pour le terminer. Pour en savoir plus, consultez Configurez 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 lors du remplissage de représentations vectorielles continues données.

Nombre de nœuds

Le LMD partitionné exécute l'instruction LMD donnée sur différentes partitions dans en parallèle. Pour les instances avec un nombre élevé de nœuds, vous pouvez observer des quotas lors de l'exécution d'un LMD partitionné. Si l'outil Vertex AI Les requêtes API sont limitées en raison des limites de quota de l'API Vertex AI, Spanner retente alors l'opération mode de transaction LMD partitionné 20 fois au maximum. Si vous observez un taux élevé d'erreurs de quota dans Vertex AI, puis augmentez le quota pour Vertex AI. Vous pouvez également ajuster le parallélisme à l'aide de l'indice au niveau de l'instruction. @{pdml_max_parallelism=DESIRED_NUMBER} tout en utilisant Google Sql. Les éléments suivants : exemple 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 des jetons pour chaque entrée de texte. Le jeton est différent selon la version de modèle des limites. Chaque requête Vertex AI peut comporter plusieurs textes d'entrée mais le nombre maximal de jetons présents dans une même requête. Pour les bases de données GoogleSQL, si vous rencontrez INVALID_ARGUMENT erreur avec le message "Demande trop volumineuse" essayez de réduire le nombre pour éviter l'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 de réduire le nombre de requêtes envoyées à Vertex AI Spanner. Sachez que l'augmentation de cette limite peut augmenter et l'utilisation de la mémoire de l'instance Spanner. Pour GoogleSQL bases de données, cet indice 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 de Spanner à l'aide du tableau de bord des insights système.

Étape suivante