Créer une application de recherche de brevets avec Spanner, Vector Search Gemini 1.0 Pro

1. Présentation

Dans différents secteurs, la recherche sur les brevets est un outil essentiel pour comprendre le paysage concurrentiel, identifier les opportunités de licence ou d'acquisition potentielles, et éviter de porter atteinte aux brevets existants.

La recherche de brevets est vaste et complexe. Passer au crible d'innombrables résumés techniques à la recherche d'innovations pertinentes n'est pas une mince affaire. Les recherches traditionnelles basées sur les mots clés sont souvent inexactes et prennent du temps. Les extraits sont longs et techniques, ce qui rend difficile la compréhension rapide de l'idée principale. Cela peut conduire les chercheurs à passer à côté de brevets clés ou à perdre du temps avec des résultats non pertinents.

Objectif

Dans cet atelier de programmation, nous allons rendre la recherche de brevets plus rapide, plus intuitive et incroyablement précise en exploitant Spanner et Gemini 1.0 Pro, les représentations vectorielles continues et la recherche vectorielle.

Ce que vous allez faire

Au cours de cet atelier, vous allez:

  1. Créer une instance Spanner
  2. Charger un ensemble de données public Google Brevets
  3. Créer un modèle distant pour les représentations vectorielles continues de texte avec le modèle Gemini 1.0 Pro
  4. Créer des insights génératifs à partir d'un ensemble de données chargé
  5. Générer des représentations vectorielles continues à partir des insights
  6. Émettre des requêtes de recherche par similarité sur l'ensemble de données

Le schéma suivant représente le flux de données et les étapes impliquées dans la mise en œuvre.

14cfdde5e24258a.png

Conditions requises

  • Un navigateur tel que Chrome ou Firefox
  • Un projet Google Cloud avec facturation activée.

2. Avant de commencer

Créer un projet

  1. Dans la console Google Cloud, sur la page du sélecteur de projet, sélectionnez ou créez un projet Google Cloud.
  2. 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 .
  3. Vous allez utiliser Cloud Shell, un environnement de ligne de commande exécuté dans Google Cloud et doté de bq. Cliquez sur "Activer Cloud Shell" en haut de la console Google Cloud.

Image du bouton "Activer Cloud Shell"

  1. 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
  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud connaît votre projet.
gcloud config list project
  1. Si votre projet n'est pas défini, utilisez la commande suivante pour le définir :
gcloud config set project <YOUR_PROJECT_ID>
  1. 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

Créons une instance, une base de données et une table Spanner dans lesquelles l'ensemble de données des brevets sera chargé.

Créer une instance Spanner

  1. 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

  1. Dans la console Google Cloud, ouvrez la page Spanner.
  2. Sélectionnez l'instance spanner-vertex dans la liste.
  3. Sous "Bases de données", cliquez sur Créer une base de données.
  4. Définissez le nom de la base de données sur "brevets".
  5. Cliquez sur Créer pour créer la base de données.

Créer une table

  1. Dans la console Google Cloud, ouvrez la page Spanner.
  2. Sélectionnez l'instance spanner-vertex dans la liste.
  3. Sélectionnez la base de données patents.
  4. Dans l'onglet Tables, cliquez sur Créer une table. La page Spanner Studio s'ouvre.
  5. Ouvrez un nouvel onglet en cliquant sur Nouvel onglet de l'éditeur SQL.
  6. 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 des brevets dans la base de données

Nous utiliserons les ensembles de données publics de Google Brevets sur BigQuery. Nous utiliserons Spanner Studio pour exécuter nos requêtes. Le référentiel spanner-gemini-search contient le script insert_into_patents_data.sql que nous allons exécuter pour charger les données des brevets.

  1. Dans la console Google Cloud, ouvrez la page Spanner.
  2. Sélectionnez l'instance spanner-vertex dans la liste.
  3. Sélectionnez la base de données patents.
  4. Dans le menu de navigation, cliquez sur Spanner Studio. Le volet Explorer affiche la liste des objets de votre base de données.
  5. Ouvrez un nouvel onglet en cliquant sur Nouvel onglet de l'éditeur SQL.
  6. Copiez l'instruction de requête insert du script insert_into_patents_data.sql dans l'éditeur. Vous pouvez copier 50 à 100 instructions d'insertion pour une démonstration rapide de ce cas d'utilisation.
  7. Cliquez sur Exécuter. Les résultats de votre requête s'affichent dans la table Résultats.

5. Créer un modèle de télécommande pour Gemini 1.0 Pro

Une fois les données de brevet chargées dans la base de données, nous créerons un modèle distant qui utilise le modèle Vertex AI de Gemini 1.0 Pro pour générer un résumé du titre et des mots clés.

Exécutez la commande LDD suivante dans l'éditeur Spanner Studio:

  1. Dans le menu de navigation, cliquez sur Spanner Studio. Le volet Explorer affiche la liste des objets de votre base de données.
  2. Ouvrez un nouvel onglet en cliquant sur Nouvel onglet de l'éditeur SQL.
  3. 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
);
  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 représentations vectorielles continues de texte

Le résultat de l'étape précédente comprend un récapitulatif consolidé composé d'un titre et de mots clés. Nous allons convertir cette réponse en représentations vectorielles continues qui nous aideront à générer des correspondances appropriées lors de l'exécution d'une requête. Nous allons utiliser le Text Embedding Gecko 003 model de Vertex AI à distance depuis Spanner.

  1. Dans le menu de navigation, cliquez sur Spanner Studio. Le volet Explorer affiche la liste des objets de votre base de données.
  2. Ouvrez un nouvel onglet en cliquant sur Nouvel onglet de l'éditeur SQL.
  3. 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');
  1. 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 d'extraits 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

  1. Dans le menu de navigation, cliquez sur Spanner Studio. Le volet Explorer affiche la liste des objets de votre base de données.
  2. Ouvrez un nouvel onglet en cliquant sur Nouvel onglet de l'éditeur SQL.
  3. Exécutez la requête suivante :
CREATE TABLE patents_data_gemini (id string(100), gemini_response STRING(MAX)) PRIMARY KEY (id);
  1. Cliquez sur Exécuter. Les résultats de votre requête s'affichent dans la table Résultats.

Générer des insights

Pour insérer des insights génératifs dans la table, nous vous recommandons d'utiliser une application qui utilise la méthode d'écriture par lot ou des mutations. Pour cet atelier de programmation, nous allons exécuter la requête LDD suivante jusqu'à quatre fois afin de 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 obtenez une erreur "Quota dépassé" à cette étape (possible dans le cas de crédits sans frais sans marges), essayez d'ignorer l'insertion et d'exécuter uniquement la requête "Select" dans la section "Solution de contournement" ci-dessous.

Section "Solution de contournement" :

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', de la requête.

Remarque:Si vous avez exécuté la requête de la section de solution ci-dessus au lieu de l'instruction LDD INSERT, ignorez cette partie et exécutez la dernière requête SELECT de cette page à la place.

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;

Vous obtenez les résultats suivants:

6041fab164aaab93.png

Remarque:Si vous avez exécuté la requête de la section de solution de contournement, remplacez le nom de table dans la requête de sélection ci-dessus par la requête de la section de solution de contournement. Vous devez donc exécuter à la place 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 représentations vectorielles continues pour les insights générés

Après avoir rempli les insights de notre table, nous pouvons les utiliser pour générer des représentations vectorielles continues. Ces représentations vectorielles continues nous aident à ne pas nous fier aux correspondances de mots clés exactes, 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 "Solution de contournement" à l'étape précédente, vous pouvez ignorer cette étape et passer également à la requête de la section "Solution de contournement" au cours de cette étape.

Exécutez la requête suivante pour générer des représentations vectorielles continues:

  1. Dans le menu de navigation, cliquez sur Spanner Studio. Le volet Explorer affiche la liste des objets de votre base de données.
  2. Ouvrez un nouvel onglet en cliquant sur Nouvel onglet de l'éditeur SQL.
  3. 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);
  1. Cliquez sur Exécuter. Les résultats de votre requête s'affichent dans la table Résultats.
  2. Exécutez la requête suivante pour générer des représentations vectorielles continues.
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));
  1. 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 des représentations vectorielles continues générées pour le titre et le texte abstrait.

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;

Vous obtenez les résultats suivants:

a1e968bac4ab1cb.png

Section "Solution de contournement" :

Utilisez cette requête si vous avez suivi la section "Solution de contournement" 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 dans la capture d'écran ci-dessus.

9. Se préparer à la recherche vectorielle

Maintenant que nous avons généré des représentations vectorielles continues de textes, nous pouvons préparer notre application Web pour pouvoir effectuer des recherches vectorielles de similarité. Dans cet atelier de programmation, vous allez créer une application Web qui inclut la logique permettant d'obtenir des résultats de recherche basés sur la fonctionnalité de recherche par similarité des k voisins les plus proches. Vous pouvez utiliser cet ensemble de données préparé avec une application de recherche pour visualiser comment les résultats de recherche apparaissent.

Pour cet atelier de programmation, nous allons exécuter un exemple de requête qui recherche une requête, génère des résultats en fonction du contexte et limite les résultats à 10 entrées.

Exécutez la requête suivante :

  1. Dans le menu de navigation, cliquez sur Spanner Studio. Le volet Explorer affiche la liste des objets de votre base de données.
  2. Ouvrez un nouvel onglet en cliquant sur Nouvel onglet de l'éditeur SQL.
  3. 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;
  1. 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 "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 des représentations vectorielles continues 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.

Vous obtenez les résultats suivants:

d26ca8b8238bdf25.png

Les résultats générés sont très proches, d'un point de vue contextuel, de l'invite qui faisait partie 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:

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.
  2. 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.
  3. 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 de travailler avec des modèles de représentation vectorielle continue et des modèles LLM pour fournir une fonctionnalité d'IA générative directement à l'aide de SQL.

Étape suivante

Pour en savoir plus sur la fonctionnalité de voisin exact le plus proche de Spanner (recherche vectorielle KNN), consultez cette page: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

Pour en savoir plus sur la réalisation de prédictions en ligne avec SQL à l'aide de l'intégration de Vertex AI de Spanner, consultez cette page: https://cloud.google.com/spanner/docs/ml.