1. Présentation
Dans différents secteurs, la recherche de brevets est un outil essentiel pour comprendre le paysage concurrentiel, identifier les opportunités potentielles de licence ou d'acquisition, et éviter d'enfreindre les brevets existants.
La recherche de brevets est vaste et complexe. Passer au crible d'innombrables résumés techniques pour trouver des innovations pertinentes est une tâche ardue. Les recherches traditionnelles basées sur des mots clés sont souvent inexactes et chronophages. Les résumés sont longs et techniques, ce qui rend difficile la compréhension rapide de l'idée principale. Les chercheurs peuvent ainsi passer à côté de brevets clés ou perdre du temps sur des résultats non pertinents.
Objectif
Dans cet atelier de programmation, nous allons rendre le processus de recherche de brevets plus rapide, plus intuitif et incroyablement précis en tirant parti de Spanner, de Gemini 1.0 Pro intégré, des embeddings et de la recherche vectorielle.
Objectifs de l'atelier
Dans cet atelier, vous allez :
- créer une instance Spanner ;
- charger un ensemble de données public Google Patents ;
- créer un modèle distant pour les embeddings textuels avec le modèle Gemini 1.0 Pro ;
- créer des insights génératifs à partir de l'ensemble de données chargé ;
- générer des embeddings à partir des insights ;
- envoyer des requêtes de recherche de similarités à l'ensemble de données.
Le schéma suivant représente le flux de données et les étapes impliquées dans l'implémentation.

Conditions requises
2. Avant de commencer
Créer un projet
- Dans la console Google Cloud, sur la page du sélecteur de projet, sélectionnez ou créez un projet Google Cloud.
- Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier si la facturation est activée sur un projet .
- Vous allez utiliser Cloud Shell, un environnement de ligne de commande exécuté dans Google Cloud et fourni avec bq. Cliquez sur Activer Cloud Shell en haut de la console Google Cloud.

- Une fois connecté à Cloud Shell, vérifiez que vous êtes déjà authentifié et que le projet est défini sur votre ID de projet à l'aide de la commande suivante :
gcloud auth list
- Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud reconnaît votre projet.
gcloud config list project
- Si votre projet n'est pas défini, utilisez la commande suivante pour le définir :
gcloud config set project <YOUR_PROJECT_ID>
- Assurez-vous que les API Vertex AI et Spanner sont activées en les recherchant dans la console. Vous pouvez également utiliser la commande suivante dans le terminal Cloud Shell :
gcloud services enable spanner.googleapis.com --project <<YOUR_PROJECT_ID>>
gcloud services enable aiplatform.googleapis.com --project <<YOUR_PROJECT_ID>>
Vous pouvez également utiliser ce lien.
Consultez la documentation pour connaître les commandes gcloud ainsi que leur utilisation.
3. Préparer votre base de données Spanner
Nous allons créer une instance, une base de données et une table Spanner dans lesquelles l'ensemble de données de brevets sera chargé.
Créer une instance Spanner
- Créez une instance Spanner nommée
spanner-vertex.
gcloud spanner instances create spanner-vertex \
--config=regional-us-central1 \
--description=spanner-vertex \
--nodes=1
Créer une base de données
- Dans la console Google Cloud, ouvrez la page Spanner.
- Sélectionnez l'instance
spanner-vertexdans la liste. - Sous "Bases de données", cliquez sur Créer une base de données.
- Définissez le nom de la base de données sur "patents".
- Cliquez sur Créer pour créer la base de données.
Créer une table
- Dans la console Google Cloud, ouvrez la page Spanner.
- Sélectionnez l'instance
spanner-vertexdans la liste. - Sélectionnez la base de données
patents. - Dans l'onglet Tables, cliquez sur Créer une table. La page Spanner Studio s'ouvre.
- Ouvrez un nouvel onglet en cliquant sur Nouvel onglet de l'éditeur SQL.
- Exécutez la requête suivante :
CREATE TABLE patents_data (
id string(25), type string(25), number string(20), country string(2), date string(20), abstract string(300000), title string(100000),kind string(5), num_claims numeric, filename string(100), withdrawn numeric,
) PRIMARY KEY (id);
4. Charger les données de brevets dans la base de données
Nous allons utiliser l'ensemble de données public Google Patents sur BigQuery. Nous allons utiliser Spanner Studio pour exécuter nos requêtes. Le dépôt spanner-gemini-search inclut le script insert_into_patents_data.sql que nous allons exécuter pour charger les données de brevets.
- Dans la console Google Cloud, ouvrez la page Spanner.
- Sélectionnez l'instance
spanner-vertexdans la liste. - Sélectionnez la base de données
patents. - Dans le menu de navigation, cliquez sur Spanner Studio. Le volet Explorateur affiche la liste des objets de votre base de données.
- Ouvrez un nouvel onglet en cliquant sur Nouvel onglet de l'éditeur SQL.
- Copiez l'instruction de requête
insertà partir du scriptinsert_into_patents_data.sqldans l'éditeur. Vous pouvez copier 50 à 100 instructions d'insertion pour une démonstration rapide de ce cas d'utilisation. - Cliquez sur Exécuter. Les résultats de votre requête s'affichent dans la table Résultats.
5. Créer un modèle distant pour Gemini 1.0 Pro
Une fois les données de brevets chargées dans la base de données, nous allons créer un modèle distant qui utilise le modèle Gemini 1.0 Pro Vertex AI pour générer un ensemble résumé de titres et de mots clés.
Exécutez la commande DDL suivante dans l'éditeur Spanner Studio :
- Dans le menu de navigation, cliquez sur Spanner Studio. Le volet Explorateur affiche la liste des objets de votre base de données.
- Ouvrez un nouvel onglet en cliquant sur Nouvel onglet de l'éditeur SQL.
- Exécutez la requête suivante :
CREATE MODEL gemini_pro_model INPUT(
prompt STRING(MAX),
) OUTPUT(
content STRING(MAX),
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<<YOUR_PROJECT_ID>>/locations/us-central1/publishers/google/models/gemini-pro',
default_batch_size = 1
);
- Cliquez sur Exécuter. Les résultats de votre requête s'affichent dans la table Résultats.
6. Créer un modèle distant pour les embeddings textuels
Le résultat de l'étape précédente inclut un résumé consolidé composé d'un titre et de mots clés. Nous allons convertir cette réponse en embeddings qui nous aideront à générer des correspondances appropriées lorsque nous exécuterons une requête. Nous allons utiliser le Text Embedding Gecko 003 model de Vertex AI à distance depuis Spanner.
- Dans le menu de navigation, cliquez sur Spanner Studio. Le volet Explorateur affiche la liste des objets de votre base de données.
- Ouvrez un nouvel onglet en cliquant sur Nouvel onglet de l'éditeur SQL.
- Exécutez la requête suivante :
CREATE MODEL text_embeddings INPUT(content STRING(MAX))
OUTPUT(
embeddings
STRUCT<
statistics STRUCT<truncated BOOL, token_count FLOAT64>,
values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<<YOUR_PROJECT_ID>>/locations/us-central1/publishers/google/models/textembedding-gecko@003');
- Cliquez sur Exécuter. Les résultats de votre requête s'affichent dans la table Résultats.
7. Créer des insights génératifs à partir de résumés de brevets
Nous allons créer une table patents_data_gemini pour stocker les insights génératifs que nous allons générer à l'aide du modèle Gemini 1.5 Pro que nous avons créé précédemment.
Créer la table
- Dans le menu de navigation, cliquez sur Spanner Studio. Le volet Explorateur affiche la liste des objets de votre base de données.
- Ouvrez un nouvel onglet en cliquant sur Nouvel onglet de l'éditeur SQL.
- Exécutez la requête suivante :
CREATE TABLE patents_data_gemini (id string(100), gemini_response STRING(MAX)) PRIMARY KEY (id);
- Cliquez sur Exécuter. Les résultats de votre requête s'affichent dans la table Résultats.
Générer des insights
Pour remplir la table avec des insights génératifs, nous vous recommandons d'utiliser une application qui utilise la méthode d'écriture par lot ou de mutations. Pour cet atelier de programmation, nous allons exécuter la requête DDL suivante jusqu'à quatre fois pour remplir la table.
INSERT INTO patents_data_gemini (id, gemini_response)
SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b where id not in (select id from patents_data_gemini) limit 50
));
Remarque : Si vous recevez une erreur "Quota Exceeded" (Quota dépassé) à cette étape (ce qui est possible dans le cas de crédits sans frais à faible marge), essayez d'ignorer l'insertion et d'exécuter uniquement la requête de sélection dans la section de solution ci-dessous.
Section de solution :
SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
))
Observer les insights
La table inclut les insights générés pour l'invite 'Identify the areas of work or keywords in this abstract', dans la requête.
Remarque : Si vous avez exécuté la requête de la section de solution ci-dessus au lieu de l'instruction INSERT DDL, ignorez cette partie et exécutez plutôt la dernière requête SELECT de cette page.
Exécutons la requête suivante pour vérifier les résultats des insights :
select title, abstract, gemini_response from patents_data a inner join patents_data_gemini b
on a.id = b.id;
Les résultats suivants s'affichent :

Remarque : Si vous avez exécuté la requête de la section de solution, remplacez le nom de la table dans la requête de sélection ci-dessus par la requête de la section de solution. Vous exécuterez donc la requête ci-dessous :
select title, abstract, gemini_response from patents_data a inner join (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
))) b
on a.id = b.id;
Le résultat doit être le même que celui de la capture d'écran ci-dessus.
8. Générer des embeddings pour les insights générés
Une fois les insights renseignés dans notre table, nous pouvons les utiliser pour générer des embeddings. Ces embeddings nous aident à ne pas nous appuyer sur des correspondances exactes de mots clés, mais à générer des résultats basés sur des similarités conceptuelles.
Remarque : Si vous avez exécuté la requête de la section de solution à l'étape précédente, vous pouvez ignorer cette étape et passer à la requête de la section de solution.
Exécutez la requête suivante pour générer des embeddings :
- Dans le menu de navigation, cliquez sur Spanner Studio. Le volet Explorateur affiche la liste des objets de votre base de données.
- Ouvrez un nouvel onglet en cliquant sur Nouvel onglet de l'éditeur SQL.
- Exécutez la requête suivante pour créer la table
patents_data_embeddings.
CREATE TABLE patents_data_embeddings (id string(100), patents_embeddings ARRAY<FLOAT64>) PRIMARY KEY (id);
- Cliquez sur Exécuter. Les résultats de votre requête s'affichent dans la table Résultats.
- Exécutez la requête suivante pour générer des embeddings.
INSERT INTO patents_data_embeddings (id, patents_embeddings)
SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM patents_data_gemini));
- Cliquez sur Exécuter. Les résultats de votre requête s'affichent dans la table Résultats.
Observer les résultats
La table inclut les embeddings générés pour le titre et le texte résumé.
Exécutons la requête suivante pour vérifier les résultats :
select title, abstract, b.patents_embeddings from patents_data a inner join patents_data_embeddings b
on a.id = b.id;
Les résultats suivants s'affichent :

Section de solution :
Utilisez cette requête si vous avez effectué la section de solution lors d'autres étapes :
select title, abstract, b.patents_embeddings from patents_data a inner join
(SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
)))))) b
on a.id = b.id;
Vous devriez obtenir les mêmes résultats que ceux affichés dans la capture d'écran ci-dessus.
9. Préparer la recherche vectorielle
Maintenant que nous avons généré des embeddings textuels, nous pouvons préparer notre application Web pour effectuer des recherches vectorielles de similarités. Dans cet atelier de programmation, nous allons créer une application Web qui inclut la logique permettant de fournir des résultats de recherche basés sur la fonctionnalité de recherche de similarités des k plus proches voisins. Vous pouvez utiliser cet ensemble de données préparé avec une application de recherche pour visualiser l'apparence des résultats de recherche.
Pour notre atelier de programmation, nous allons exécuter un exemple de requête qui recherche une invite, génère des résultats en fonction du contexte et limite les résultats à 10 entrées.
Exécutez la requête suivante :
- Dans le menu de navigation, cliquez sur Spanner Studio. Le volet Explorateur affiche la liste des objets de votre base de données.
- Ouvrez un nouvel onglet en cliquant sur Nouvel onglet de l'éditeur SQL.
- Exécutez la requête suivante pour créer la table
patents_data_embeddings.
SELECT a.id, a.title, a.abstract, 'A new Natural Language Processing related Machine Learning Model' search_text, COSINE_DISTANCE(c.patents_embeddings,
(SELECT embeddings.values
FROM ML.PREDICT(
MODEL text_embeddings,
(SELECT 'A new Natural Language Processing related Machine Learning Model' as content)))) as distance
FROM patents_data a inner join patents_data_gemini b on a.id = b.id
inner join patents_data_embeddings c on a.id = c.id
ORDER BY distance
LIMIT 10;
- Cliquez sur Exécuter. Les résultats de votre requête s'affichent dans la table Résultats.
Remarque : Si vous avez utilisé les requêtes de la section de solution en raison d'erreurs de quota dans l'une des premières instructions d'insertion, vous pouvez ignorer toutes les autres étapes et exécuter directement la requête ci-dessous pour observer les résultats de la recherche des plus proches voisins sur les embeddings vectoriels dans la base de données Spanner :
SELECT a.id, a.title, a.abstract, 'A new Natural Language Processing related Machine Learning Model' search_text, COSINE_DISTANCE(c.patents_embeddings,
(SELECT embeddings.values
FROM ML.PREDICT(
MODEL text_embeddings,
(SELECT 'A new Natural Language Processing related Machine Learning Model' as content)))) as distance
FROM patents_data a inner join (SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b
)))))) c on a.id = c.id
ORDER BY distance
LIMIT 2;
Observer les résultats
La requête précédente utilise la méthode COSINE_DISTANCE pour trouver les 10 correspondances les plus proches pour notre invite.
Les résultats suivants s'affichent :

Les résultats générés sont très proches du contexte de l'invite qui faisait partie de la requête.
10. Effectuer un nettoyage
Pour éviter que les ressources utilisées dans cet atelier soient facturées sur votre compte Google Cloud, procédez comme suit :
- Dans la console Google Cloud, accédez à la page Gérer les ressources.
- Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer. Si vous ne souhaitez pas supprimer le projet, supprimez simplement l'instance que vous avez créée dans Spanner.
- Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.
11. Félicitations
Félicitations ! Vous avez effectué une recherche de similarités à l'aide de la recherche vectorielle intégrée de Spanner. Vous avez également vu à quel point il est facile d'utiliser des modèles d'embedding et de LLM pour fournir des fonctionnalités d'IA générative directement à l'aide de SQL.
Étape suivante
Pour en savoir plus sur la fonctionnalité de recherche des plus proches voisins exacts (recherche vectorielle KNN) de Spanner, consultez la page https://cloud.google.com/spanner/docs/find-k-nearest-neighbors.
Pour en savoir plus sur l'exécution de prédictions en ligne avec SQL à l'aide de l'intégration Vertex AI de Spanner, consultez la page https://cloud.google.com/spanner/docs/ml.