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

Ce document explique comment générer et remplir de manière groupée des représentations vectorielles continues pour des données textuelles (STRING ou JSON) stockées dans Spanner à l'aide de SQL et du modèle Vertex AI textembedding-gecko.

Prérequis

Votre base de données Spanner doit comporter 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,
  name STRING(MAX),
  description STRING(MAX)
) PRIMARY KEY(product_id);

Votre 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 afin d'améliorer leur expérience d'achat à l'aide de la recherche vectorielle.

Enregistrer un modèle de représentation vectorielle continue

Tout d'abord, vous devez enregistrer un modèle de représentation vectorielle continue avec le point de terminaison textembedding-gecko Vertex AI dans votre base de données Spanner:

GoogleSQL

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 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

Tenez compte des bonnes pratiques suivantes:

  • 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 accepte la valeur de default_batch_size. Vous pouvez remplacer default_batch_size avec l'indice de requête @{remote_udf_max_rows_per_rpc=NEW_NUMBER}. Pour en savoir plus sur la limite default_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 la même portion de texte peuvent différer selon 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. De plus, 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 afin de stocker la version du modèle.
  • Les modèles textembedding-gecko réglés personnalisés ne sont pas compatibles avec la fonction ML.PREDICT de GoogleSQL.

Tester l'intégration de bout en bout du modèle de représentations vectorielles continues

Après avoir enregistré un modèle de représentation vectorielle continue, vous pouvez exécuter une requête à l'aide du modèle textembedding-gecko défini avec ML.PREDICT pour vérifier que le modèle de représentation vectorielle continue est bien 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

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 du 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 source.
  • EMBEDDING_COLUMN_NAME: nom de la colonne dans laquelle vous souhaitez ajouter les 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>;

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;

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 section Augmenter les quotas de Vertex AI.

Pour en savoir plus, consultez la page 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 stocker les représentations vectorielles continues 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 au cours d'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 textuelles
  • EMBEDDING_COLUMN_NAME: nom de la colonne dans laquelle vous souhaitez ajouter les 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ée 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 partitionable que vous souhaitez 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.

Voici un 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.value AS CONTENT
        )
  )
      @{remote_udf_max_rows_per_rpc=200}
),
products.desc_embed_model_version = 003
WHERE products.desc_embed IS NULL;

Tenez compte des bonnes pratiques suivantes:

  • Le délai avant expiration 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 de suffisamment de temps pour s'achever. Pour en savoir plus, consultez la section Configurer les délais avant expiration et les nouvelles tentatives personnalisés.
  • Vous ne pouvez utiliser le LMD partitionné que pour stocker les représentations vectorielles continues générées dans la même table que la table de données source.

Performances et autres considérations

Tenez compte des points suivants pour optimiser les performances lors du remplissage de données de représentations vectorielles continues.

Nombre de nœuds

Le LMD partitionné exécute l'instruction LMD donnée sur différentes partitions en parallèle. Pour les instances comportant un grand nombre de nœuds, vous pouvez constater des erreurs de quota lors de l'exécution du LMD partitionné. Si les requêtes API Vertex AI sont limitées en raison des limites de quota de l'API Vertex AI, Spanner retente ces échecs en mode de transaction LMD partitionné pour un maximum de 20 fois. Si vous observez un taux élevé d'erreurs de quota dans Vertex AI, augmentez le quota pour Vertex AI.

Taille du texte dans la colonne de données

Le modèle de représentation vectorielle continue de Vertex AI limite le nombre maximal de jetons pour chaque entrée de texte. Les versions de modèle ont des limites de jetons différentes. Chaque requête Vertex AI peut comporter plusieurs champs de texte d'entrée, mais le nombre maximal de jetons par requête est limité. Pour les bases de données GoogleSQL, si vous rencontrez une erreur INVALID_ARGUMENT avec le message "Request is trop large", essayez de réduire la taille de lot pour éviter l'erreur. Pour ce faire, vous pouvez configurer default_batch_size ou utiliser l'indice de requête remote_udf_max_rows_per_rpc 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 qu'augmenter 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 indice de requête remplace la valeur 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