Effectuer une recherche sémantique et une génération augmentée de récupération

Pour envoyer des commentaires ou demander de l'aide concernant cette fonctionnalité, envoyez un e-mail à l'adresse bq-vector-search@google.com.

Ce tutoriel vous guide tout au long du processus de création et d'utilisation de représentations vectorielles continues de texte, y compris d'utilisation d'index vectoriels pour améliorer les performances de recherche.

Ce tutoriel couvre les tâches suivantes :

  • Créer un modèle distant BigQuery ML sur un grand modèle de langage (LLM) Vertex AI.
  • Utilisation du modèle distant avec la fonction ML.GENERATE_EMBEDDING pour générer des représentations vectorielles continues à partir de texte dans une table BigQuery.
  • Créer un index vectoriel pour indexer les représentations vectorielles continues.
  • Utiliser la fonction VECTOR_SEARCH avec les représentations vectorielles continues pour rechercher du texte similaire.
  • Effectuer une génération augmentée de récupération (RAG) en générant du texte avec la fonction ML.GENERATE_TEXT et en utilisant les résultats de recherche vectorielle pour augmenter la saisie de l'invite et améliorer les résultats.

Ce tutoriel utilise la table publique BigQuery patents-public-data.google_patents_research.publications.

Rôles et autorisations 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
  • Les autorisations IAM requises dans ce tutoriel pour les opérations BigQuery restantes sont incluses dans les deux rôles suivants :

    • Éditeur de données BigQuery (roles/bigquery.dataEditor) pour créer des modèles, des tables et des index.
    • Utilisateur BigQuery (roles/bigquery.user) pour exécuter des tâches BigQuery.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

  • BigQuery ML : les données que vous traitez dans BigQuery sont facturées.
  • Vertex AI : des frais vous sont facturés pour les appels au service Vertex AI représenté par le modèle distant.

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Pour en savoir plus sur les tarifs de BigQuery, consultez la page Tarifs de BigQuery dans la documentation BigQuery.

Pour en savoir plus sur les tarifs de Vertex AI, consultez la page Tarifs de Vertex AI.

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

Pour attribuer au compte de service de la connexion un rôle approprié permettant d'accéder au service Vertex AI, procédez comme suit :

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

    Accéder à IAM et administration

  2. Cliquez sur Accorder l'accès.

  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 le rôle Utilisateur Vertex AI.

  5. Cliquez sur Enregistrer.

Créer le modèle distant pour la génération de représentations vectorielles continues de texte

Créez un modèle distant représentant un modèle de génération de représentations vectorielles continues de texte Vertex AI hébergé :

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

    Accéder à BigQuery

  2. Dans l'éditeur de requête, exécutez l'instruction suivante :

    CREATE OR REPLACE MODEL `bqml_tutorial.embedding_model`
      REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID`
      OPTIONS (ENDPOINT = 'textembedding-gecko@003');
    

    Remplacez les éléments suivants :

    • LOCATION : emplacement de la connexion
    • CONNECTION_ID : ID de votre connexion BigQuery.

      Lorsque vous affichez les détails de la connexion dans la console Google Cloud, CONNECTION_ID correspond à 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).

    L'exécution de la requête prend plusieurs secondes, après quoi le modèle embedding_model apparaît dans l'ensemble de données bqml_tutorial dans le volet Explorateur. Étant donné que la requête utilise une instruction CREATE MODEL pour créer un modèle, il n'y a aucun résultat de requête.

Générer des représentations vectorielles continues de texte

Générer des représentations vectorielles continues de texte à partir d'extraits de brevets à l'aide de la fonction ML.GENERATE_EMBEDDING, puis les écrire dans une table BigQuery afin de pouvoir les rechercher.

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

    Accéder à BigQuery

  2. Dans l'éditeur de requête, exécutez l'instruction suivante :

    CREATE OR REPLACE TABLE `bqml_tutorial.embeddings` AS
    SELECT * FROM ML.GENERATE_EMBEDDING(
      MODEL `bqml_tutorial.embedding_model`,
      (
        SELECT *, abstract AS content
        FROM `patents-public-data.google_patents_research.publications`
        WHERE LENGTH(abstract) > 0 AND LENGTH(title) > 0 AND country = 'Singapore'
      )
    )
    WHERE LENGTH(ml_generate_embedding_status) = 0;
    

La génération de représentations vectorielles continues à l'aide de la fonction ML.GENERATE_EMBEDDING peut échouer en raison des quotas de LLM Vertex AI ou de l'indisponibilité du service. Les détails de l'erreur sont renvoyés dans la colonne ml_generate_embedding_status. Une colonne ml_generate_embedding_status vide indique que la génération de représentations vectorielles continues a réussi.

Pour découvrir d'autres méthodes de génération de représentations vectorielles continues de texte dans BigQuery, consultez le tutoriel Générer des représentations vectorielles continues de texte avec des modèles TensorFlow pré-entraînés.

Créer un index vectoriel

Pour créer un index vectoriel, utilisez l'instruction LDD (langage de définition de données) CREATE VECTOR INDEX :

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, exécutez l'instruction SQL suivante :

    CREATE OR REPLACE VECTOR INDEX my_index
    ON `bqml_tutorial.embeddings`(ml_generate_embedding_result)
    OPTIONS(index_type = 'IVF',
      distance_type = 'COSINE',
      ivf_options = '{"num_lists":500}')
    

Vérifier la création de l'index vectoriel

L'index vectoriel est renseigné de manière asynchrone. Vous pouvez vérifier si l'index est prêt à être utilisé en interrogeant la vue INFORMATION_SCHEMA.VECTOR_INDEXES et en vérifiant que la valeur de la colonne coverage_percentage est supérieure à 0 et la valeur de la colonne last_refresh_time n'est pas NULL.

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, exécutez l'instruction SQL suivante :

    SELECT table_name, index_name, index_status,
    coverage_percentage, last_refresh_time, disable_reason
    FROM `PROJECT_ID.bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES`
    

    Remplacez PROJECT_ID par l'ID du projet.

Effectuer une recherche de similarité textuelle à l'aide de l'index vectoriel

Utilisez la fonction VECTOR_SEARCH pour rechercher les cinq brevets les plus pertinents correspondant à des représentations vectorielles continues générées à partir d'une requête de texte. Le modèle que vous utilisez pour générer les représentations vectorielles continues dans cette requête doit être le même que celui utilisé pour générer les représentations vectorielles continues dans la table à comparer, sinon les résultats de la recherche ne seront pas précis.

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, exécutez l'instruction SQL suivante :

    SELECT query.query, base.publication_number, base.title, base.abstract
    FROM VECTOR_SEARCH(
      TABLE `bqml_tutorial.embeddings`, 'ml_generate_embedding_result',
      (
      SELECT ml_generate_embedding_result, content AS query
      FROM ML.GENERATE_EMBEDDING(
      MODEL `bqml_tutorial.embedding_model`,
      (SELECT 'improving password security' AS content))
      ),
      top_k => 5, options => '{"fraction_lists_to_search": 0.01}')
    

    Le résultat ressemble à ce qui suit :

    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    |            query            | publication_number |                       title                     |                      abstract                   |
    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    | improving password security | SG-120868-A1       | Data storage device security method and a...    | Methods for improving security in data stora... |
    | improving password security | SG-10201610585W-A  | Passsword management system and process...      | PASSSWORD MANAGEMENT SYSTEM AND PROCESS ...     |
    | improving password security | SG-10201901821S-A  | Method and apparatus for unlocking user...      | METHOD AND APPARATUS FOR UNLOCKING USER...      |
    | improving password security | SG-10201902412Q-A  | Password protection question setting method...  | PASSWORD PROTECTION QUESTION SETTING METHOD...  |
    | improving password security | SG-194509-A1       | System and method for web-based...              | A security authentication method comprises...   |
    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    

Créer le modèle distant pour la génération de texte

Créez un modèle distant représentant un modèle de génération de texte Vertex AI hébergé :

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

    Accéder à BigQuery

  2. Dans l'éditeur de requête, exécutez l'instruction suivante :

    CREATE OR REPLACE MODEL `bqml_tutorial.text_model`
      REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID`
      OPTIONS (ENDPOINT = 'text-bison-32k');
    

    Remplacez les éléments suivants :

    • LOCATION : emplacement de la connexion
    • CONNECTION_ID : ID de votre connexion BigQuery.

      Lorsque vous affichez les détails de la connexion dans la console Google Cloud, CONNECTION_ID correspond à 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).

    L'exécution de la requête prend plusieurs secondes, après quoi le modèle text_model apparaît dans l'ensemble de données bqml_tutorial dans le volet Explorateur. Étant donné que la requête utilise une instruction CREATE MODEL pour créer un modèle, il n'y a aucun résultat de requête.

Générer du texte augmenté par les résultats de recherche vectorielle

Transmettez les résultats de recherche sous forme d'invites pour générer du texte à l'aide de la fonction ML.GENERATE_TEXT.

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

    Accéder à BigQuery

  2. Dans l'éditeur de requête, exécutez l'instruction suivante :

    SELECT ml_generate_text_llm_result AS generated, prompt
    FROM ML.GENERATE_TEXT(
      MODEL `bqml_tutorial.text_model`,
      (
        SELECT CONCAT(
          'Propose some project ideas to improve user password security using the context below: ',
          STRING_AGG(
            FORMAT("patent title: %s, patent abstract: %s", base.title, base.abstract),
            ',\n')
          ) AS prompt,
        FROM VECTOR_SEARCH(
          TABLE `bqml_tutorial.embeddings`, 'text_embedding',
          (
            SELECT ml_generate_embedding_result, content AS query
            FROM ML.GENERATE_EMBEDDING(
              MODEL `bqml_tutorial.embedding_model`,
             (SELECT 'improving password security' AS content)
            )
          ),
        top_k => 5, options => '{"fraction_lists_to_search": 0.01}')
      ),
      STRUCT(600 AS max_output_tokens, TRUE AS flatten_json_output));
    

    Le résultat ressemble à ce qui suit :

    +------------------------------------------------+------------------------------------------------------------+
    |            generated                           | prompt                                                     |
    +------------------------------------------------+------------------------------------------------------------+
    | **Project Ideas to Improve User Password       | Propose some project ideas to improve user password        |
    | Security**                                     | security using the context below: patent title: Data       |
    |                                                | storage device security method and apparatus, patent       |
    | 1. **Develop a password manager that uses a    | abstract: Methods for improving security in data storage   |
    | synchronization method to keep encrypted       | devices are disclosed. The methods include a ...,          |
    | passwords changing at each transmission...     | patent title: Active new password entry dialog with        |
    | 2. **Create a new password entry dialog that   | compact visual indication of adherence to password policy, |
    | provides a compact visual indication of        | patent abstract: An active new password entry dialog...,   |
    | adherence to password policies.** ...          | patent title: Method and system for protecting a password  |
    | 3. **Develop a system for protecting a         | during an authentication process, patent abstract: A system|
    | password during an authentication process by   | for providing security for a personal password during an   |
    | using representative characters to disguise... | authenticationprocess. The system combines the use of...   |
    +------------------------------------------------+------------------------------------------------------------+
     

Effectuer un nettoyage

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.