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 les 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 nous efforcer de rendre la recherche de brevets plus rapide, plus intuitive et incroyablement précise en exploitant Spanner, ainsi que Gemini 1.0 Pro, les embeddings et la recherche vectorielle intégrés.
Ce que vous allez faire
Au cours de cet atelier, vous allez :
- Créer une instance Spanner
- Charger un ensemble de données publiques Google Patents
- Créer un modèle distant pour les embeddings de texte avec le modèle Gemini 1.0 Pro
- Créer des insights génératifs à partir d'un ensemble de données chargé
- Générer des embeddings à partir des insights
- Envoyer des requêtes de recherche de similarités de problèmes à l'ensemble de données
Le diagramme 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 connaî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
Commençons par créer une instance, une base de données et une table Spanner dans lesquelles l'ensemble de données sur les 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 utiliserons les ensembles de données publics Google Patents sur BigQuery comme ensemble de données. Nous utiliserons 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 sur les 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 entre 50 et 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 brevet 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 LDD 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 Text Embedding Gecko 003 model depuis 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 le tableau 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 exécuterons la requête LDD 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 un message d'erreur "Quota dépassé" à cette étape (ce qui peut arriver dans le cas de petits crédits sans frais), essayez d'ignorer l'insertion et d'exécuter uniquement la requête de sélection dans la section sur la solution de contournement ci-dessous.
Section "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
Le tableau inclut les insights générés pour la requête 'Identify the areas of work or keywords in this abstract',.
Remarque : Si vous avez exécuté la requête de la section sur la solution de contournement 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 "Solution de contournement", remplacez le nom de la table dans la requête de sélection ci-dessus par la requête de la section "Solution de contournement". Vous devez donc exécuter la commande 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 identique à 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 tableau, nous pouvons les utiliser pour générer des embeddings. Ces embeddings nous aident à ne pas nous fier à des correspondances exactes de mots clés, mais à générer des résultats basés sur des similitudes conceptuelles.
Remarque : Si vous avez exécuté la requête de la section sur la solution de contournement lors de l'étape précédente, vous pouvez ignorer cette étape et passer à la requête de la section sur la solution de contournement.
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
Le tableau 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 sur les solutions :
Utilisez cette requête si vous avez suivi la section sur la solution de contournement dans 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é. 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é K-Nearest Neighbors. 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 sur la solution de contournement, 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 du voisin le plus proche 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 de notre requête.
Les résultats suivants s'affichent :

Les résultats générés sont assez proches du contexte de la requête.
10. Effectuer un nettoyage
Pour éviter que les ressources utilisées dans cet article 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 réussi à effectuer une recherche de similarité à l'aide de la recherche vectorielle intégrée de Spanner. Vous avez également vu à quel point il est facile de travailler avec 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 k plus proches voisins (KNN) exacte de Spanner, consultez https://cloud.google.com/spanner/docs/find-k-nearest-neighbors.
Pour en savoir plus sur la façon d'effectuer des prédictions en ligne avec SQL à l'aide de l'intégration Vertex AI de Spanner, consultez https://cloud.google.com/spanner/docs/ml.