Générer des représentations vectorielles continues de texte à l'aide de la fonction ML.GENERATE_EMBEDDING

Ce document explique comment créer un modèle distant BigQuery ML faisant référence à un modèle de fondation de représentation vectorielle continue Vertex AI. Vous utilisez ensuite ce modèle avec la fonction ML.GENERATE_EMBEDDING pour créer des représentations vectorielles continues de texte à l'aide des données d'une table standard BigQuery.

Rôles requis

  • Pour créer une connexion, vous devez disposer du rôle IAM (Identity and Access Management) suivant :

    • roles/bigquery.connectionAdmin
  • Pour accorder des autorisations au compte de service de la connexion, vous devez disposer de l'autorisation suivante :

    • resourcemanager.projects.setIamPolicy
  • Pour créer le modèle à l'aide de BigQuery ML, vous devez disposer des autorisations IAM suivantes :

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata
  • Pour exécuter une inférence, vous devez disposer des autorisations suivantes :

    • bigquery.tables.getData sur la table
    • bigquery.models.getData sur le modèle
    • bigquery.jobs.create

Avant de commencer

  1. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  2. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  3. Activer les API BigQuery, BigQuery Connection, and Vertex AI.

    Activer les API

Créer un ensemble de données

Vous allez créer un ensemble de données BigQuery pour stocker votre modèle de ML :

  1. Dans la console Google Cloud, accédez à la page "BigQuery".

    Accéder à la page "BigQuery"

  2. Dans le volet Explorateur, cliquez sur le nom de votre projet.

  3. Cliquez sur Afficher les actions > Créer un ensemble de données.

    Créer l'ensemble de données

  4. Sur la page Créer un ensemble de données, procédez comme suit :

    • Dans le champ ID de l'ensemble de données, saisissez bqml_tutorial.

    • Pour Type d'emplacement, sélectionnez Multirégional, puis sélectionnez US (plusieurs régions aux États-Unis).

      Les ensembles de données publics sont stockés dans l'emplacement multirégional US. Par souci de simplicité, stockez votre ensemble de données dans le même emplacement.

    • Conservez les autres paramètres par défaut, puis cliquez sur Créer un ensemble de données.

      Créer une page d'ensemble de données

Créer une connexion

Créez une connexion de ressource cloud et obtenez le compte de service de la connexion. Créez la connexion dans le même emplacement que l'ensemble de données que vous avez créé à l'étape précédente.

Sélectionnez l'une des options suivantes :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Pour créer une connexion, cliquez sur Ajouter, puis sur Connexions aux sources de données externes.

  3. Dans la liste Type de connexion, sélectionnez Modèles distants Vertex AI, fonctions distantes et BigLake (ressource Cloud).

  4. Dans le champ ID de connexion, saisissez un nom pour votre connexion.

  5. Cliquez sur Créer une connexion.

  6. Cliquez sur Accéder à la connexion.

  7. Dans le volet Informations de connexion, copiez l'ID du compte de service à utiliser à l'étape suivante.

bq

  1. Dans un environnement de ligne de commande, créez une connexion :

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID
    

    Le paramètre --project_id remplace le projet par défaut.

    Remplacez les éléments suivants :

    • REGION : votre région de connexion
    • PROJECT_ID : ID de votre projet Google Cloud
    • CONNECTION_ID : ID de votre connexion

    Lorsque vous créez une ressource de connexion, BigQuery crée un compte de service système unique et l'associe à la connexion.

    Dépannage : Si vous obtenez l'erreur de connexion suivante, mettez à jour le Google Cloud SDK :

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. Récupérez et copiez l'ID du compte de service pour l'utiliser lors d'une prochaine étape :

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID
    

    Le résultat ressemble à ce qui suit :

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Terraform

Ajoutez la section suivante à votre fichier main.tf.

 ## This creates a cloud resource connection.
 ## Note: The cloud resource nested object has only one output only field - serviceAccountId.
 resource "google_bigquery_connection" "connection" {
    connection_id = "CONNECTION_ID"
    project = "PROJECT_ID"
    location = "REGION"
    cloud_resource {}
}        
Remplacez les éléments suivants :

  • CONNECTION_ID : ID de votre connexion
  • PROJECT_ID : ID de votre projet Google Cloud
  • REGION : votre région de connexion

Accorder l'accès au compte de service

Autorisez votre compte de service à utiliser la connexion. L'impossibilité de fournir des autorisations génère une erreur. Sélectionnez l'une des options suivantes :

Console

  1. Accédez à la page IAM et administration.

    Accéder à IAM et administration

  2. Cliquez sur Accorder l'accès.

    La boîte de dialogue Ajouter des comptes principaux s'ouvre.

  3. Dans le champ Nouveaux comptes principaux, saisissez l'ID du compte de service que vous avez copié précédemment.

  4. Dans le champ Sélectionner un rôle, sélectionnez Vertex AI, puis Utilisateur Vertex AI.

  5. Cliquez sur Enregistrer.

gcloud

Exécutez la commande gcloud projects add-iam-policy-binding :

gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None

Remplacez les éléments suivants :

  • PROJECT_NUMBER : votre numéro de projet
  • MEMBER : ID du compte de service que vous avez copié précédemment

Créer un modèle

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. À l'aide de l'éditeur SQL, créez un modèle distant :

    CREATE OR REPLACE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`
    REMOTE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
    OPTIONS (ENDPOINT = 'ENDPOINT');
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • DATASET_ID : ID de l'ensemble de données pour contenir le modèle.
    • MODEL_NAME : nom du modèle
    • REGION : région utilisée par la connexion.
    • CONNECTION_ID : ID de votre connexion BigQuery

      Lorsque vous affichez les détails de la connexion dans la console Google Cloud, il s'agit de la valeur de la dernière section de l'ID de connexion complet affiché dans ID de connexion (par exemple, projects/myproject/locations/connection_location/connections/myconnection).

    • ENDPOINT : LLM de représentation vectorielle continue à utiliser. Exemple :ENDPOINT='multimodalembedding'

      Pour certains types de modèles, vous pouvez spécifier une version particulière du modèle en ajoutant @version au nom du modèle. Exemple :textembedding-gecko@001 Pour en savoir plus sur les versions de modèle compatibles avec les différents types de modèles, consultez la page ENDPOINT.

Générer des représentations vectorielles continues de texte à l'aide des données d'une table

Générez des représentations vectorielles continues de texte à l'aide de la fonction ML.GENERATE_EMBEDDING en utilisant les données de texte d'une colonne de table.

En règle générale, vous devez utiliser un modèle textembedding-gecko ou textembedding-gecko-multilingual pour les cas d'utilisation exclusivement basés sur du texte, et un modèle multimodalembedding pour les cas d'utilisation de recherche multimodale, où les représentations vectorielles continues de texte et de contenu visuel sont générées dans le même espace sémantique.

textembedding-gecko*

Générez des représentations vectorielles continues de texte à l'aide d'un modèle distant sur le LLM textembedding-gecko ou textembedding-gecko-multilingual :

SELECT *
FROM ML.GENERATE_EMBEDDING(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  TABLE PROJECT_ID.DATASET_ID.TABLE_NAME,
  STRUCT(FLATTEN_JSON AS flatten_json_output,
    TASK_TYPE AS task_type)
);

Remplacez les éléments suivants :

  • PROJECT_ID : ID de votre projet.
  • DATASET_ID : ID de l'ensemble de données contenant le modèle.
  • MODEL_NAME : nom du modèle distant sur un modèle textembedding-gecko ou textembedding-gecko-multilingual.
  • TABLE_NAME : nom de la table contenant le texte à intégrer. Cette table doit avoir une colonne nommée content. Vous pouvez également utiliser un alias pour utiliser une colonne portant un nom différent.
  • FLATTEN_JSON : BOOL qui indique s'il faut analyser la représentation vectorielle continue dans une colonne distincte. La valeur par défaut est TRUE.
  • TASK_TYPE : littéral de type STRING qui spécifie l'application en aval prévue pour aider le modèle à produire des représentations vectorielles continues de meilleure qualité. TASK_TYPE accepte les valeurs suivantes :
    • RETRIEVAL_QUERY : indique que le texte donné est une requête dans un contexte de recherche ou de récupération.
    • RETRIEVAL_DOCUMENT : indique que le texte donné est un document dans un contexte de recherche ou de récupération.

      Lorsque vous utilisez ce type de tâche, il est utile d'inclure le titre du document dans l'instruction de requête afin d'améliorer la qualité des représentations vectorielles continues. Vous pouvez utiliser l'option title pour spécifier le nom de la colonne contenant le titre du document. Sinon, le titre du document doit se trouver dans une colonne nommée title ou associée à un alias title, par exemple :

            SELECT *
            FROM
              ML.GENERATE_EMBEDDING(
                MODEL mydataset.embedding_model,
                (SELECT abstract as content, header as title, publication_number
                FROM mydataset.publications),
                STRUCT(TRUE AS flatten_json_output, 'RETRIEVAL_DOCUMENT' as task_type)
            );
            
    • SEMANTIC_SIMILARITY : indique que le texte donné sera utilisé pour la similarité textuelle sémantique (STS).
    • CLASSIFICATION : indique que les représentations vectorielles continues seront utilisées pour la classification.
    • CLUSTERING : indique que les représentations vectorielles continues seront utilisées pour le clustering.

multimodalembedding

Générez des représentations vectorielles continues de texte à l'aide d'un modèle distant sur le LLM multimodalembedding :

SELECT *
FROM ML.GENERATE_EMBEDDING(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  TABLE PROJECT_ID.DATASET_ID.TABLE_NAME,
  STRUCT(FLATTEN_JSON AS flatten_json_output)
);

Remplacez les éléments suivants :

  • PROJECT_ID : ID de votre projet.
  • DATASET_ID : ID de l'ensemble de données contenant le modèle.
  • MODEL_NAME : nom du modèle distant sur un modèle multimodalembedding@001.
  • TABLE_NAME : nom de la table contenant le texte à intégrer. Cette table doit avoir une colonne nommée content. Vous pouvez également utiliser un alias pour utiliser une colonne portant un nom différent.
  • FLATTEN_JSON : BOOL qui indique s'il faut analyser la représentation vectorielle continue dans une colonne distincte. La valeur par défaut est TRUE.

Générer des représentations vectorielles continues de texte à l'aide des données d'une requête

Générez des représentations vectorielles continues de texte à l'aide de la fonction ML.GENERATE_EMBEDDING en utilisant les données textuelles fournies par une requête et un modèle distant sur le LLM textembedding-gecko ou textembedding-gecko-multilingual :

En règle générale, vous devez utiliser un modèle textembedding-gecko ou textembedding-gecko-multilingual pour les cas d'utilisation exclusivement basés sur du texte, et un modèle multimodalembedding pour les cas d'utilisation de recherche multimodale, où les représentations vectorielles continues de texte et de contenu visuel sont générées dans le même espace sémantique.

textembedding-gecko*

Générez des représentations vectorielles continues de texte à l'aide d'un modèle distant sur le LLM textembedding-gecko ou textembedding-gecko-multilingual :

SELECT *
FROM ML.GENERATE_EMBEDDING(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  (CONTENT_QUERY),
  STRUCT(FLATTEN_JSON AS flatten_json_output,
    TASK_TYPE AS task_type
  );

Remplacez les éléments suivants :

  • PROJECT_ID : ID de votre projet.
  • DATASET_ID : ID de l'ensemble de données contenant le modèle.
  • MODEL_NAME : nom du modèle distant sur un modèle textembedding-gecko ou textembedding-gecko-multilingual.
  • CONTENT_QUERY : requête dont le résultat contient une colonne STRING appelée content.
  • FLATTEN_JSON : BOOL qui indique s'il faut analyser la représentation vectorielle continue dans une colonne distincte. La valeur par défaut est TRUE.
  • TASK_TYPE : littéral de type STRING qui spécifie l'application en aval prévue pour aider le modèle à produire des représentations vectorielles continues de meilleure qualité. TASK_TYPE accepte les valeurs suivantes :
    • RETRIEVAL_QUERY : indique que le texte donné est une requête dans un contexte de recherche ou de récupération.
    • RETRIEVAL_DOCUMENT : indique que le texte donné est un document dans un contexte de recherche ou de récupération.

      Lorsque vous utilisez ce type de tâche, il est utile d'inclure le titre du document dans l'instruction de requête afin d'améliorer la qualité des représentations vectorielles continues. Vous pouvez utiliser l'option title pour spécifier le nom de la colonne contenant le titre du document. Sinon, le titre du document doit se trouver dans une colonne nommée title ou associée à un alias title, par exemple :

                SELECT *
                FROM
                  ML.GENERATE_EMBEDDING(
                    MODEL mydataset.embedding_model,
                    (SELECT abstract as content, header as title, publication_number
                    FROM mydataset.publications),
                    STRUCT(TRUE AS flatten_json_output, 'RETRIEVAL_DOCUMENT' as task_type)
                );
                
    • SEMANTIC_SIMILARITY : indique que le texte donné sera utilisé pour la similarité textuelle sémantique (STS).
    • CLASSIFICATION : indique que les représentations vectorielles continues seront utilisées pour la classification.
    • CLUSTERING : indique que les représentations vectorielles continues seront utilisées pour le clustering.

multimodalembedding

Générez des représentations vectorielles continues de texte à l'aide d'un modèle distant sur le LLM multimodalembedding :

SELECT *
FROM ML.GENERATE_EMBEDDING(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  (CONTENT_QUERY),
  STRUCT(FLATTEN_JSON AS flatten_json_output)
);

Remplacez les éléments suivants :

  • PROJECT_ID : ID de votre projet.
  • DATASET_ID : ID de l'ensemble de données contenant le modèle.
  • MODEL_NAME : nom du modèle distant sur un modèle multimodalembedding@001.
  • CONTENT_QUERY : requête dont le résultat contient une colonne STRING appelée content.
  • FLATTEN_JSON : BOOL qui indique s'il faut analyser la représentation vectorielle continue dans une colonne distincte. La valeur par défaut est TRUE.

Examples

Les exemples suivants montrent comment appeler la fonction ML.GENERATE_EMBEDDING sur une table et une requête.

Intégrer du texte dans un tableau

L'exemple suivant montre une requête d'intégration de la colonne content de la table text_data :

SELECT *
FROM
  ML.GENERATE_EMBEDDING(
    MODEL `mydataset.embedding_model`,
    TABLE mydataset.text_data,
    STRUCT(TRUE AS flatten_json_output)
  );

Utiliser des représentations vectorielles continues pour classer la similarité sémantique

L'exemple suivant intègre une collection d'avis sur des films et les classe par distance de cosinus à l'avis "Ce film était moyen" à l'aide de la fonction ML.DISTANCE. Une distance plus faible indique une similarité sémantique plus élevée.

WITH movie_review_embeddings AS (
  SELECT *
  FROM
    ML.GENERATE_EMBEDDING(
      MODEL `bqml_tutorial.embedding_model`,
      (
        SELECT "Movie 1" AS title, "This movie was fantastic" AS content
        UNION ALL
        SELECT "Movie 2" AS title, "This was the best movie I've ever seen!!" AS content
        UNION ALL
        SELECT "Movie 3" AS title, "This movie was just okay..." AS content
        UNION ALL
        SELECT "Movie 4" AS title, "This movie was terrible." AS content
      ),
      STRUCT(TRUE AS flatten_json_output)
    )
),
average_review_embedding AS (
  SELECT ml_generate_embedding_result
  FROM
    ML.GENERATE_EMBEDDING(
      MODEL `bqml_tutorial.embedding_model`,
      (SELECT "This movie was average" AS content),
      STRUCT(TRUE AS flatten_json_output)
    )
)
SELECT
  content,
  ML.DISTANCE(
    (SELECT ml_generate_embedding_result FROM average_review_embedding),
    ml_generate_embedding_result,
    'COSINE'
  ) AS distance_to_average_review
FROM
  movie_review_embeddings
ORDER BY distance_to_average_review;

Le résultat est le suivant :

+------------------------------------------+----------------------------+
| content                                  | distance_to_average_review |
+------------------------------------------+----------------------------+
| This movie was fantastic                 | 0.10028859431058901        |
| This movie was terrible.                 |   0.142427236973374        |
| This was the best movie I've ever seen!! | 0.46742391210381995        |
| This movie was just okay...              | 0.47399255715360622        |
+------------------------------------------+----------------------------+