Créez une application de recherche de brevets avec AlloyDB, Vector Search et Vertex AI.

1. Présentation

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

La recherche sur les brevets est vaste et complexe. Trier 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. Cela peut conduire les chercheurs à passer à côté de brevets clés ou à perdre du temps avec des résultats non pertinents.

La recette secrète de cette révolution est Vector Search. Plutôt que de s'appuyer sur une simple correspondance de mots clés, la recherche vectorielle transforme le texte en représentations numériques (embeddings). Cela nous permet de rechercher des résultats en fonction du sens de la requête, et pas seulement des mots spécifiques utilisés. Dans le monde des recherches littéraires, cela change la donne. Imaginez trouver un brevet pour un « moniteur de fréquence cardiaque portable ». même si l'expression exacte n'est pas utilisée dans le document.

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 AlloyDB, l'extension pgvector, et Gemini 1.5 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 AlloyDB et charger les données de l'ensemble de données public sur les brevets
  2. Activer les extensions pgvector et de modèle d'IA générative dans AlloyDB
  3. Générer des représentations vectorielles continues à partir des insights
  4. Effectuer une recherche par similarité cosinus en temps réel pour le texte de recherche utilisateur
  5. Déployer la solution dans des fonctions Cloud Functions sans serveur

Le diagramme suivant représente le flux de données et les étapes impliquées dans l'implémentation.

8b73c40a0d12e194.png

 High level diagram representing the flow of the Patent Search Application with AlloyDB

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. Activer les API requises. Vous pouvez utiliser une commande gcloud dans le terminal Cloud Shell :
gcloud services enable alloydb.googleapis.com \ 
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudfunctions.googleapis.com \
                       aiplatform.googleapis.com

Vous pouvez également rechercher chaque produit dans la console ou utiliser ce lien.

Consultez la documentation pour connaître les commandes gcloud ainsi que leur utilisation.

3. Préparer votre base de données AlloyDB

Créons un cluster, une instance et une table AlloyDB dans lesquels l'ensemble de données des brevets sera chargé.

Créer des objets AlloyDB

Créez un cluster et une instance avec l'ID de cluster "patent-cluster", le mot de passe "alloydb", compatible avec PostgreSQL 15, la région "us-central1" et la mise en réseau définie sur "default". Définissez l'ID d'instance sur "patent-instance". Cliquez sur CRÉER UN CLUSTER. Pour en savoir plus sur la création d'un cluster, consultez ce lien: https://cloud.google.com/alloydb/docs/cluster-create.

Créer une table

Vous pouvez créer une table à l'aide de l'instruction LDD ci-dessous dans AlloyDB Studio :

CREATE TABLE patents_data ( id VARCHAR(25), type VARCHAR(25), number VARCHAR(20), country VARCHAR(2), date VARCHAR(20), abstract VARCHAR(300000), title VARCHAR(100000), kind VARCHAR(5), num_claims BIGINT, filename VARCHAR(100), withdrawn BIGINT) ;

Activer les extensions

Pour créer l'application de recherche de brevets, nous utiliserons les extensions pgvector et google_ml_integration. L'extension pgvector vous permet de stocker et de rechercher des embeddings vectoriels. L'extension google_ml_integration fournit des fonctions que vous pouvez utiliser pour accéder aux points de terminaison de prédiction Vertex AI afin d'obtenir des prédictions en SQL. Activez ces extensions en exécutant les LDD suivantes :

CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;

Accorder l'autorisation

Exécutez l'instruction ci-dessous pour autoriser l'exécution sur la fonction "embedding" :

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Attribuer le rôle d'utilisateur Vertex AI au compte de service AlloyDB

Dans la console IAM Google Cloud, accordez au compte de service AlloyDB (qui se présente sous la forme service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) l'accès au rôle "Utilisateur Vertex AI". PROJECT_NUMBER aura votre numéro de projet.

Vous pouvez également accorder l'accès à l'aide de la commande gcloud:

PROJECT_ID=$(gcloud config get-value project)


gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"

Modifier la table pour ajouter une colonne "Vecteur" pour stocker les embeddings

Exécutez le LDD ci-dessous pour ajouter le champ abstrait_embeddings à la table que nous venons de créer. Cette colonne permet de stocker les valeurs vectorielles du texte:

ALTER TABLE patents_data ADD column abstract_embeddings vector(768);

4. Charger les données des brevets dans la base de données

Nous utiliserons les ensembles de données publics sur les brevets Google dans BigQuery comme ensemble de données. Nous utiliserons AlloyDB Studio pour exécuter nos requêtes. Le dépôt alloydb-pgvector inclut le script insert_into_patents_data.sql que nous allons exécuter pour charger les données sur les brevets.

  1. Dans la console Google Cloud, ouvrez la page AlloyDB.
  2. Sélectionnez le cluster que vous venez de créer, puis cliquez sur l'instance.
  3. Dans le menu de navigation AlloyDB, cliquez sur AlloyDB Studio. Connectez-vous avec vos identifiants.
  4. Ouvrez un nouvel onglet en cliquant sur l'icône Nouvel onglet à droite.
  5. Copiez l'instruction de requête insert du script insert_into_patents_data.sql mentionné ci-dessus dans l'éditeur. Vous pouvez copier 50 à 100 instructions d'insertion pour une démonstration rapide de ce cas d'utilisation.
  6. Cliquez sur Exécuter. Les résultats de votre requête s'affichent dans la table Résultats.

5. Créer des embeddings pour les données sur les brevets

Commençons par tester la fonction d'encapsulation en exécutant l'exemple de requête suivant :

SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');

Cela devrait renvoyer le vecteur de représentations vectorielles continues, qui ressemble à un tableau de valeurs flottantes, pour l'exemple de texte de la requête. Il se présente comme suit :

25a1d7ef0e49e91e.png

Mettre à jour le champ de vecteur abstract_embeddings

Exécutez la LMD ci-dessous pour mettre à jour les résumés des brevets dans le tableau avec les représentations vectorielles continues correspondantes :

UPDATE patents_data set abstract_embeddings = embedding( 'textembedding-gecko@003', abstract);

6. Effectuer une recherche vectorielle

Maintenant que la table, les données et les représentations vectorielles continues sont prêtes, exécutez la recherche vectorielle en temps réel pour le texte de recherche de l'utilisateur. Vous pouvez le tester en exécutant la requête ci-dessous:

SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;

Dans cette requête,

  1. Le texte de recherche de l'utilisateur est "Un nouveau modèle de machine learning lié au traitement du langage naturel".
  2. Nous le convertissons en embeddings dans la méthode embedding() à l'aide du modèle textembedding-gecko@003.
  3. "<=>" représente l'utilisation de la méthode de distance SIMILARITY COSINE.
  4. Nous convertissons le résultat de la méthode d'embedding en type de vecteur pour le rendre compatible avec les vecteurs stockés dans la base de données.
  5. LIMIT 10 indique que nous sélectionnons les 10 correspondances les plus proches du texte de recherche.

Le résultat est le suivant :

8e77af965fc787ae.png

Comme vous pouvez le constater dans vos résultats, les correspondances sont assez proches du texte de recherche.

7. Déployer l'application sur le Web

Prêt à transférer cette application sur le Web ? Procédez comme suit :

  1. Accédez à l'éditeur Cloud Shell, puis cliquez sur le bouton "Cloud Code – Se connecter" en bas à gauche (barre d'état) de l'éditeur. Sélectionnez votre projet Google Cloud actuel pour lequel la facturation est activée et assurez-vous d'être également connecté au même projet depuis Gemini (en haut à droite de la barre d'état).
  2. Cliquez sur l'icône Cloud Code et attendez que la boîte de dialogue Cloud Code s'affiche. Sélectionnez "New Application" (Nouvelle application), puis dans la fenêtre pop-up "Create New Application" (Créer une application), sélectionnez l'application Cloud Functions:

a800ee1eb6cb8a5b.png

Sur la page 2/2 de la fenêtre pop-up "Create New Application" (Créer une application), sélectionnez Java: Hello World, saisissez le nom de votre projet "alloydb-pgvector" à l'emplacement de votre choix, puis cliquez sur OK :

5b09446ecf7d4f8d.png

  1. Dans la structure de projet générée, recherchez pom.xml et remplacez-le par le contenu du fichier du dépôt. Il doit comporter ces dépendances en plus de quelques autres :

2b3a3cdd75a57711.png

  1. Remplacez le fichier HelloWorld.java par le contenu du fichier repo.

Notez que vous devez remplacer les valeurs ci-dessous par vos valeurs réelles:

String ALLOYDB_DB = "postgres";
String ALLOYDB_USER = "postgres";
String ALLOYDB_PASS = "*****";
String ALLOYDB_INSTANCE_NAME = "projects/<<YOUR_PROJECT_ID>>/locations/us-central1/clusters/<<YOUR_CLUSTER>>/instances/<<YOUR_INSTANCE>>";
//Replace YOUR_PROJECT_ID, YOUR_CLUSTER, YOUR_INSTANCE with your actual values

Notez que la fonction attend le texte de recherche comme paramètre d'entrée avec la clé "search". Dans cette implémentation, nous ne renvoyons qu'une seule correspondance la plus proche de la base de données :

// Get the request body as a JSON object.
JsonObject requestJson = new Gson().fromJson(request.getReader(), JsonObject.class);
String searchText = requestJson.get("search").getAsString();

//Sample searchText: "A new Natural Language Processing related Machine Learning Model";
BufferedWriter writer = response.getWriter();
String result = "";
HikariDataSource dataSource = AlloyDbJdbcConnector();

try (Connection connection = dataSource.getConnection()) {
   //Retrieve Vector Search by text (converted to embeddings) using "Cosine Similarity" method
   try (PreparedStatement statement = connection.prepareStatement("SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', '" + searchText + "' )::vector LIMIT 1")) {
     ResultSet resultSet = statement.executeQuery();
     resultSet.next();
     String lit = resultSet.getString("literature");
     result = result + lit + "\n";
     System.out.println("Matching Literature: " + lit);
 }
writer.write("Here is the closest match: " + result);
}
  1. Pour déployer la fonction Cloud que vous venez de créer, exécutez la commande suivante dans le terminal Cloud Shell. N'oubliez pas d'accéder d'abord au dossier du projet correspondant à l'aide de la commande suivante:
cd alloydb-pgvector

Exécutez ensuite la commande suivante:

gcloud functions deploy patent-search --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

ÉTAPE IMPORTANTE :

Une fois le déploiement lancé, vous devriez pouvoir voir les fonctions dans la console Google Cloud Run Functions. Recherchez la fonction nouvellement créée, ouvrez-la, modifiez les configurations et modifiez les éléments suivants :

  1. Accéder aux paramètres d'exécution, de compilation, de connexion et de sécurité
  2. Augmentez le délai avant expiration à 180 secondes.
  3. Accédez à l'onglet "CONNEXIONS" :

4e83ec8a339cda08.png

  1. Dans les paramètres d'entrée, assurez-vous que l'option "Autoriser tout le trafic" est sélectionnée.
  2. Sous "Paramètres de sortie", cliquez sur la liste déroulante "Réseau", sélectionnez l'option "Ajouter un connecteur VPC", puis suivez les instructions qui s'affichent dans la boîte de dialogue qui s'affiche :

8126ec78c343f199.png

  1. Attribuez un nom au connecteur VPC et assurez-vous que la région est identique à celle de votre instance. Laissez la valeur "Network" (Réseau) définie par défaut et définissez "Subnet" (Sous-réseau) sur "Custom IP Range" (Plage d'adresses IP personnalisée) avec la plage d'adresses IP 10.8.0.0 ou une autre plage disponible.
  2. Développez "Afficher les paramètres de mise à l'échelle" et assurez-vous que la configuration est exactement la suivante :

7baf980463a86a5c.png

  1. Cliquez sur "CRÉER". Ce connecteur devrait à présent figurer dans les paramètres de sortie.
  2. Sélectionnez le connecteur que vous venez de créer.
  3. Choisissez d'acheminer tout le trafic via ce connecteur VPC.

8. Tester l'application

Une fois le point de terminaison déployé, il doit s'afficher au format suivant :

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/patent-search

Vous pouvez le tester à partir du terminal Cloud Shell en exécutant la commande suivante:

gcloud functions call patent-search --region=us-central1 --gen2 --data '{"search": "A new Natural Language Processing related Machine Learning Model"}'

Résultat :

da3dcfac7d024031.png

Vous pouvez également le tester à partir de la liste Cloud Functions. Sélectionnez la fonction déployée, puis accédez à l'onglet "TESTING" (TEST). Dans la zone de texte de la section "Configurer un événement de déclenchement" pour la requête JSON, saisissez la commande suivante:

{"search": "A new Natural Language Processing related Machine Learning Model"}

Cliquez sur le bouton "TESTER LA FONCTION". Le résultat s'affiche sur la droite de la page :

e21f806d661996ff.png

Et voilà ! Il est si simple d'effectuer une recherche vectorielle de similarité à l'aide du modèle d'embeddings sur les données AlloyDB.

9. 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 à Gérer.
  2. ressources.
  3. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  4. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

10. Félicitations

Félicitations ! Vous avez effectué une recherche de similarités à l'aide d'AlloyDB, pgvector et de la recherche vectorielle. En combinant les fonctionnalités d'AlloyDB, de Vertex AI et de Vector Search, nous avons fait un grand pas en avant pour rendre les recherches bibliographiques accessibles, efficaces et vraiment pertinentes.