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 entraîner des recherches qui ne trouvent pas de brevets clés ou qui perdent du temps sur des résultats non pertinents.

L'ingrédient secret de cette révolution réside dans 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 en fonction du sens de la requête, et pas seulement des mots spécifiques utilisés. Dans le monde des recherches bibliographiques, cela change la donne. Imaginez trouver un brevet pour un "cardiofréquencemètre portable", même si cette 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 embeddings à partir des insights
  4. Effectuer une recherche de similarité cosinus en temps réel pour le texte de recherche de l'utilisateur
  5. Déployer la solution dans 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 fourni avec 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 avec 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 sur les 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", la compatibilité avec PostgreSQL 15 et la région "us-central1", et définissez la mise en réseau sur "default". Définissez l'ID d'instance sur "patent-instance". Cliquez sur "CREATE CLUSTER" (CRÉER UN CLUSTER). Pour en savoir plus sur la création d'un cluster, consultez la page 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 représentations vectorielles continues. 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 accorder 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 correspond à 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 l'instruction LDD ci-dessous pour ajouter le champ "abstract_embeddings" à la table que vous venez 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.');

Cette commande devrait renvoyer le vecteur d'embeddings, qui ressemble à un tableau de nombres à virgule flottante, 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, effectuons une recherche vectorielle en temps réel pour le texte de recherche de l'utilisateur. Pour le vérifier, exécutez 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 à publier cette application sur le Web ? Procédez comme suit :

  1. Accédez à l'éditeur Cloud Shell, puis cliquez sur l'icône "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, puis attendez que la boîte de dialogue Cloud Code s'affiche. Sélectionnez "Nouvelle application", puis dans le pop-up "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 au dossier de 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. Augmenter le délai avant expiration à 180 secondes
  3. Accédez à l'onglet "CONNEXIONS" :

4e83ec8a339cda08.png

  1. Sous 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 la même que 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 maintenant 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 depuis le 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 la 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 déclencheur" pour le fichier JSON de la requête, saisissez les informations suivantes:

{"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é à l'aide d'AlloyDB, de 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.