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

Dans ce tutoriel, vous utilisez un modèle distant avec la fonction AI.GENERATE_EMBEDDING pour générer des représentations vectorielles continues de texte dans une table BigQuery. Vous créez ensuite un index vectoriel pour indexer les représentations vectorielles continues afin d'améliorer les performances de recherche.

Vous utilisez la VECTOR_SEARCH fonction avec les représentations vectorielles continues pour rechercher du texte similaire. La recherche vectorielle est une technique permettant de comparer des objets similaires à l'aide de représentations vectorielles continues, qui sont des vecteurs numériques de grande dimension représentant une entité donnée, comme un extrait de texte.

Enfin, vous effectuez une génération augmentée par récupération (RAG) en générant du texte avec la fonction AI.GENERATE_TEXT. La RAG est un framework d'IA qui combine les points forts des systèmes de récupération d'informations (tels que la recherche et les bases de données) avec les capacités des grands modèles de langage génératifs (LLM). En combinant vos données et vos connaissances du monde avec les compétences linguistiques des LLM, la génération ancrée est plus précise, à jour et adaptée à vos besoins spécifiques.

Ce tutoriel utilise des données de l'ensemble de données public Google Patents Research.

Objectifs

  • Créer un modèle distant BigQuery ML sur un modèle de représentation vectorielle continue Gemini Enterprise Agent Platform.
  • Utiliser le modèle distant avec la fonction AI.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 afin d'améliorer les performances de recherche.
  • Utiliser la fonction VECTOR_SEARCH avec les représentations vectorielles continues pour rechercher du texte similaire.
  • Effectuer une RAG en générant du texte avec la fonction AI.GENERATE_TEXT et en utilisant les résultats de recherche vectorielle pour augmenter la saisie de la requête et améliorer les résultats.

Coûts

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

  • BigQuery ML: You incur costs for the data that you process in BigQuery.
  • Gemini Enterprise Agent Platform: You incur costs for calls to the Agent Platform service that's represented by the remote model.

Obtenez une estimation des coûts en fonction de votre utilisation prévue, utilisez le simulateur de coût.

Les nouveaux Google Cloud utilisateurs de peuvent bénéficier d'un essai sans frais.

Pour en savoir plus, consultez les pages de tarifs suivantes :

Avant de commencer

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

    Rôles requis pour sélectionner ou créer un projet

    • Sélectionner un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
    • Créer un projet : pour créer un projet, vous devez disposer du rôle Créateur de projet (roles/resourcemanager.projectCreator), qui contient l'autorisation resourcemanager.projects.create. Découvrez comment attribuer des rôles.

    Accéder au sélecteur de projet

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

  3. Activez les API BigQuery, Cloud Storage et Gemini Enterprise Agent Platform.

    Rôles requis pour activer les API

    Pour activer les API, vous avez besoin de l'autorisation serviceusage.services.enable. Si vous avez créé le projet, vous disposez probablement déjà de cette autorisation via le rôle Propriétaire (roles/owner). Sinon, vous pouvez obtenir cette autorisation via le rôle Administrateur d'utilisation du service (roles/serviceusage.serviceUsageAdmin). Découvrez comment attribuer des rôles.

    Activer les API

Rôles requis

Pour obtenir les autorisations nécessaires pour suivre ce tutoriel, demandez à votre administrateur de vous accorder les rôles IAM suivants :

Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Créer un ensemble de données

Pour créer un ensemble de données BigQuery, sélectionnez l'une des options suivantes :

Console

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

    Accéder à BigQuery

  2. Dans le volet de gauche, cliquez sur Explorateur:

    Bouton du volet Explorateur mis en évidence.

    Si le volet de gauche ne s'affiche pas, cliquez sur Développer le volet de gauche pour l'ouvrir.

  3. Dans Explorateur, développez votre projet, puis cliquez sur Ensembles de données.

  4. Sur la page Ensembles de données, cliquez sur Créer un ensemble de données.

  5. Dans le volet Créer un ensemble de données, procédez comme suit :

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

    • Dans le champ Emplacement des données, sélectionnez États-Unis.

    Laissez les autres paramètres par défaut tels quels.

  6. Cliquez sur Créer un ensemble de données.

bq

Pour créer un ensemble de données, utilisez la bq mk --dataset commande.

  1. Créez un ensemble de données nommé bqml_tutorial avec l'emplacement des données défini sur US :

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. Vérifiez que l'ensemble de données a été créé :

    bq ls

API

Appelez la datasets.insert méthode avec une ressource d'ensemble de données définie :

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

Créer le modèle distant pour la génération d'embeddings textuels

Dans cette section, vous allez créer un modèle distant représentant un modèle de génération d'embedding textuel Agent Platform hébergé. Lorsque vous créez le modèle, vous utilisez la connexion DEFAULT pour appeler l'API Text embeddings afin d'obtenir des représentations vectorielles continues de texte à l'aide du modèle text-embedding-005. Si vous ne disposez pas d'une connexion par défaut, l'instruction CREATE MODEL en crée une pour vous.

Pour créer le modèle d'embedding textuel, procédez comme suit :

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

    Accéder à BigQuery

  2. Pour créer le modèle, collez cette commande dans l'éditeur de requête, puis cliquez sur Exécuter:

    CREATE OR REPLACE MODEL `bqml_tutorial.embedding_model`
      REMOTE WITH CONNECTION DEFAULT
      OPTIONS (ENDPOINT = 'text-embedding-005');

    L'exécution de la requête prend plusieurs secondes. Une fois l'opération terminée, vous pouvez accéder au modèle embedding_model via le volet Explorateur.

    Vous recevez un message de confirmation semblable à celui-ci : Successfully created model named embedding_model.

Générer des embeddings textuels

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

La génération de représentations vectorielles continues à l'aide de la AI.GENERATE_EMBEDDING fonction peut échouer en raison des quotas de LLM Agent Platform ou de l'indisponibilité du service. En cas d'échec, les détails de l'erreur sont renvoyés dans la colonne status des résultats de la requête.

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

Pour générer des représentations vectorielles continues de texte, collez cette commande dans l'éditeur de requête, puis cliquez sur Exécuter:

  CREATE OR REPLACE TABLE bqml_tutorial.embeddings AS
  SELECT * FROM AI.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(status) = 0;
  

L'exécution de cette requête prend plusieurs minutes. Vous recevez un message de confirmation semblable à celui-ci :This statement created a new table named embeddings.

Créer un index vectoriel

Si vous créez un index vectoriel sur une colonne d'embeddings, une recherche vectorielle effectuée sur cette colonne utilise la technique de recherche approximative du voisin le plus proche. Cette technique améliore les performances de la recherche vectorielle et renvoie des résultats plus approximatifs, mais le rappel est réduit.

Pour créer un index vectoriel, vous utilisez l'instruction LDD (langage de définition de données) CREATE VECTOR INDEX. Pour vérifier que l'index est disponible, interrogez la vue INFORMATION_SCHEMA.VECTOR_INDEXES afin de vérifier que la valeur de la colonne coverage_percentage est supérieure à 0, et que la valeur de la colonne last_refresh_time n'est pas NULL.

Pour créer et vérifier l'index vectoriel, procédez comme suit :

  1. Pour créer l'index vectoriel, collez cette commande dans l'éditeur de requête, et puis cliquez sur Exécuter :

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

    Vous recevez un message de confirmation semblable à celui-ci : The vector index creation on table bqml_tutorial.embeddings was initiated. Please query bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES to check the progress of the index.

    La création d'un index vectoriel ne prend généralement que quelques secondes. Le remplissage asynchrone de l'index vectoriel prend deux à trois minutes supplémentaires.

  2. Pour vérifier que l'index est prêt à être utilisé, collez cette commande dans l' éditeur de requête, puis cliquez sur Exécuter :

    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.

    Une fois la requête exécutée, l'index est disponible si la colonne index_status des résultats indique que l'index est ACTIVE et si la valeur coverage_percentage est 100.

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

Utilisez la VECTOR_SEARCH fonction pour rechercher les brevets pertinents correspondant aux représentations vectorielles continues générées à partir d'une requête de texte.

L'argument top_k détermine le nombre de correspondances à renvoyer, dans ce cas cinq. L'option fraction_lists_to_search détermine le pourcentage de listes d'index vectoriel à rechercher. L'index vectoriel que vous avez créé comporte 500 listes. La valeur fraction_lists_to_search de .01 indique donc que cette recherche vectorielle analyse cinq de ces listes. Une valeur fraction_lists_to_search inférieure, comme indiqué ici, offre un rappel plus faible et des performances plus rapides.

Pour en savoir plus sur les listes d'index vectoriel, consultez l'num_lists option d'index vectoriel.

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 que vous utilisez pour générer les représentations vectorielles continues dans la table que vous comparez. Sinon, les résultats de la recherche ne seront pas précis.

Pour effectuer une recherche de similarité textuelle, collez cette commande dans l'éditeur de requête, puis cliquez sur Exécuter:

  SELECT query.query, base.publication_number, base.title, base.abstract
  FROM VECTOR_SEARCH(
    TABLE bqml_tutorial.embeddings, 'embedding',
    (
    SELECT embedding, content AS query
    FROM AI.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-148888-A1       | Improved system and method for...               | IMPROVED SYSTEM AND METHOD FOR RANDOM...        |
| improving password security | SG-194267-A1       | Method and system for protecting a password...  | A system for providing security for a...        |
| improving password security | SG-120868-A1       | Data storage device security...                 | Methods for improving security in data...       |
+-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+

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

Pour créer un modèle distant représentant un modèle de génération de texte Agent Platform hébergé, collez cette commande dans l'éditeur de requête, puis cliquez sur Exécuter :

  CREATE OR REPLACE MODEL bqml_tutorial.text_model
    REMOTE WITH CONNECTION DEFAULT
    OPTIONS (ENDPOINT = 'gemini-2.5-flash');
  

Vous recevez un message de confirmation semblable à celui-ci : Successfully created model named text_model.

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

Transmettez les résultats de recherche sous forme de requêtes pour générer du texte à l'aide de la AI.GENERATE_TEXT fonction.

Pour augmenter les résultats de la recherche vectorielle, collez cette commande dans l'éditeur de requête, puis cliquez sur Exécuter :

  SELECT result AS generated, prompt
  FROM AI.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, 'embedding',
        (
          SELECT embedding, content AS query
          FROM AI.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));
  

Le résultat ressemble à ce qui suit :

+------------------------------------------------+------------------------------------------------------------+
|            generated                           | prompt                                                     |
+------------------------------------------------+------------------------------------------------------------+
| These patents suggest several project ideas to | Propose some project ideas to improve user password        |
| improve user password security.  Here are      | security using the context below: patent title: Active     |
| some, categorized by the patent they build     | new password entry dialog with compact visual indication   |
| upon:                                          | of adherence to password policy, patent abstract:          |
|                                                | An active new password entry dialog provides a compact     |
| **I. Projects based on "Active new password    | visual indication of adherence to password policies. A     |
| entry dialog with compact visual indication of | visual indication of progress towards meeting all          |
| adherence to password policy":**               | applicable password policies is included in the display    |
|                                                | and updated as new password characters are being...        |
+------------------------------------------------+------------------------------------------------------------+

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

  1. Dans la Google Cloud console, 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 Arrêter pour supprimer le projet.

Vous pouvez également conserver le projet et supprimer les ressources utilisées dans ce tutoriel en procédant comme suit :

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans le volet de gauche, développez votre projet, puis cliquez sur Ensembles de données.

  3. Pour l'ensemble de données bqml_tutorial, cliquez sur Ouvrir les actions > Supprimer.

  4. Dans la boîte de dialogue Supprimer l'ensemble de données, cliquez sur Supprimer pour confirmer l'opération.

  5. Dans le volet de gauche, cliquez sur Connexions.

  6. Pour la connexion __default_cloudresource_connection__, cliquez sur Ouvrir les actions > Supprimer.

  7. Dans la boîte de dialogue Supprimer la connexion, saisissez delete, puis cliquez sur Supprimer pour confirmer l'opération.

Étape suivante