Crea un'app di ricerca di brevetti con AlloyDB, Ricerca vettoriale e Vertex AI.

1. Panoramica

In diversi settori, la ricerca di brevetti è uno strumento fondamentale per comprendere il panorama della concorrenza, identificare potenziali opportunità di licenza o acquisizione ed evitare di violare brevetti esistenti.

La ricerca di brevetti è vasta e complessa. Esaminare innumerevoli abstract tecnici per trovare innovazioni pertinenti è un'impresa ardua. Le ricerche tradizionali basate sulle parole chiave sono spesso imprecise e dispendiose in termini di tempo. Gli abstract sono lunghi e tecnici, il che rende difficile cogliere rapidamente l'idea principale. Ciò può portare i ricercatori a perdere brevetti chiave o a perdere tempo con risultati non pertinenti.

Il segreto di questa rivoluzione risiede in Vector Search. Invece di fare affidamento su una semplice corrispondenza delle parole chiave, la ricerca di vettori trasforma il testo in rappresentazioni numeriche (embedding). In questo modo, possiamo effettuare ricerche in base al significato della query, non solo alle parole specifiche utilizzate. Nel mondo delle ricerche di letteratura, si tratta di una vera rivoluzione. Immagina di trovare un brevetto per un "cardiofrequenzimetro indossabile" anche se la frase esatta non viene utilizzata nel documento.

Obiettivo

In questo codelab, ci impegneremo a rendere la ricerca di brevetti più rapida, intuitiva e incredibilmente precisa sfruttando AlloyDB, l'estensione pgvector e gli incorporamenti e la ricerca vettoriale in-place di Gemini 1.5 Pro.

Cosa creerai

In questo lab imparerai a:

  1. Crea un'istanza AlloyDB e carica i dati del set di dati pubblico dei brevetti
  2. Attivare le estensioni dei modelli di pgvector e AI generativa in AlloyDB
  3. Genera embedding dagli insight
  4. Esegui una ricerca di similarità di Cosine in tempo reale per il testo di ricerca dell'utente
  5. Esegui il deployment della soluzione in Cloud Functions serverless

Il seguente diagramma rappresenta il flusso di dati e i passaggi coinvolti nell'implementazione.

8b73c40a0d12e194.png

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

Requisiti

  • Un browser, ad esempio Chrome o Firefox
  • Un progetto Google Cloud con la fatturazione abilitata.

2. Prima di iniziare

Creare un progetto

  1. Nella console Google Cloud, nella pagina di selezione del progetto, seleziona o crea un progetto Google Cloud.
  2. Verifica che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è attivata per un progetto .
  3. Utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione in Google Cloud precaricato con bq. Fai clic su Attiva Cloud Shell nella parte superiore della console Google Cloud.

Immagine del pulsante Attiva Cloud Shell

  1. Una volta connesso a Cloud Shell, verifica di aver già eseguito l'autenticazione e che il progetto sia impostato sul tuo ID progetto utilizzando il seguente comando:
gcloud auth list
  1. Esegui il seguente comando in Cloud Shell per verificare che il comando gcloud conosca il tuo progetto.
gcloud config list project
  1. Se il progetto non è impostato, utilizza il seguente comando per impostarlo:
gcloud config set project <YOUR_PROJECT_ID>
  1. Abilita le API richieste. Puoi utilizzare un comando gcloud nel terminale 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

L'alternativa al comando gcloud è tramite la console cercando ciascun prodotto o utilizzando questo link.

Consulta la documentazione per i comandi e l'utilizzo di gcloud.

3. Prepara il database AlloyDB

Creiamo un cluster, un'istanza e una tabella AlloyDB in cui verrà caricato il set di dati dei brevetti.

Creare oggetti AlloyDB

Crea un cluster e un'istanza con ID cluster "patent-cluster", password "alloydb", compatibile con PostgreSQL 15 e la regione "us-central1", la rete impostata su "default". Imposta l'ID istanza su "patent-instance". Fai clic su CREA CLUSTER. I dettagli per creare un cluster sono disponibili in questo link: https://cloud.google.com/alloydb/docs/cluster-create.

Creare una tabella

Puoi creare una tabella utilizzando l'istruzione DDL riportata di seguito in 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) ;

Attivare le estensioni

Per creare l'app di ricerca di brevetti, utilizzeremo le estensioni pgvector e google_ml_integration. L'estensione pgvector ti consente di archiviare e cercare gli incorporamenti vettoriali. L'estensione google_ml_integration fornisce le funzioni che utilizzi per accedere agli endpoint di previsione di Vertex AI per ottenere le previsioni in SQL. Attiva queste estensioni eseguendo i seguenti DDL:

CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;

Concedi autorizzazione

Esegui l'istruzione riportata di seguito per concedere l'esecuzione alla funzione "embedding":

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Concedi il RUOLO Utente Vertex AI all'account di servizio AlloyDB

Dalla console IAM di Google Cloud, concedi all'account di servizio AlloyDB (che ha il seguente aspetto: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) l'accesso al ruolo "Utente Vertex AI". PROJECT_NUMBER avrà il numero del progetto.

In alternativa, puoi anche concedere l'accesso utilizzando il comando 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"

Modifica la tabella per aggiungere una colonna Vettore per l'archiviazione degli embedding

Esegui il seguente DDL per aggiungere il campo abstract_embeddings alla tabella appena creata. Questa colonna consentirà lo stoccaggio dei valori vettore del testo:

ALTER TABLE patents_data ADD column abstract_embeddings vector(768);

4. Carica i dati dei brevetti nel database

Come set di dati utilizzeremo i set di dati pubblici di Google Patents su BigQuery. Utilizzeremo AlloyDB Studio per eseguire le query. Il repository alloydb-pgvector include lo script insert_into_patents_data.sql che eseguiremo per caricare i dati dei brevetti.

  1. Nella console Google Cloud, apri la pagina AlloyDB.
  2. Seleziona il cluster appena creato e fai clic sull'istanza.
  3. Nel menu di navigazione di AlloyDB, fai clic su AlloyDB Studio. Accedi con le tue credenziali.
  4. Apri una nuova scheda facendo clic sull'icona Nuova scheda a destra.
  5. Copia l'istruzione di query insert dallo script insert_into_patents_data.sql sopra indicato nell'editor. Puoi copiare 50-100 istruzioni INSERT per una rapida dimostrazione di questo caso d'uso.
  6. Fai clic su Esegui. I risultati della query vengono visualizzati nella tabella Risultati.

5. Creare incorporamenti per i dati dei brevetti

Innanzitutto, testiamo la funzione di embedding eseguendo la seguente query di esempio:

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

Dovrebbe restituire il vettore di embedding, che ha la forma di un array di valori float, per il testo di esempio nella query. Ha il seguente aspetto:

25a1d7ef0e49e91e.png

Aggiorna il campo del vettore abstract_embeddings

Esegui la seguente DML per aggiornare gli abstract dei brevetti nella tabella con gli embedding corrispondenti:

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

6. Eseguire la ricerca vettoriale

Ora che la tabella, i dati e gli embedding sono pronti, eseguiamo la ricerca vettoriale in tempo reale per il testo di ricerca dell'utente. Per verificare, esegui la query riportata di seguito:

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;

In questa query,

  1. Il testo di ricerca dell'utente è: "Un nuovo modello di machine learning correlato all'elaborazione del linguaggio naturale".
  2. Lo stiamo convertendo in incorporamenti nel metodo embedding() utilizzando il modello: textembedding-gecko@003.
  3. "<=>" indica l'utilizzo del metodo di distanza SIMILARITÀ COSENO.
  4. Stiamo convertendo il risultato del metodo di embedding in tipo di vettore per renderlo compatibile con i vettori archiviati nel database.
  5. LIMIT 10 indica che stiamo selezionando le 10 corrispondenze più vicine al testo di ricerca.

Di seguito è riportato il risultato:

8e77af965fc787ae.png

Come puoi notare nei risultati, le corrispondenze sono molto simili al testo di ricerca.

7. Trasferisci l'applicazione sul web

Vuoi portare questa app sul web? Procedi nel seguente modo:

  1. Vai all'editor di Cloud Shell e fai clic sull'icona "Cloud Code - Accedi" nell'angolo in basso a sinistra (barra di stato) dell'editor. Seleziona il tuo progetto Google Cloud corrente in cui è attiva la fatturazione e assicurati di aver eseguito l'accesso allo stesso progetto anche da Gemini (nell'angolo a destra della barra di stato).
  2. Fai clic sull'icona Cloud Code e attendi che venga visualizzata la finestra di dialogo Cloud Code. Seleziona Nuova applicazione e nel popup Crea nuova applicazione seleziona l'applicazione Cloud Functions:

a800ee1eb6cb8a5b.png

Nella pagina 2/2 della finestra popup Crea nuova applicazione, seleziona Java: Hello World e inserisci il nome del progetto "alloydb-pgvector" nella posizione che preferisci, quindi fai clic su OK:

5b09446ecf7d4f8d.png

  1. Nella struttura del progetto risultante, cerca pom.xml e sostituiscilo con i contenuti del file del repository. Deve avere queste dipendenze, oltre ad altre due:

2b3a3cdd75a57711.png

  1. Sostituisci il file HelloWorld.java con i contenuti del file repo.

Tieni presente che devi sostituire i valori riportati di seguito con i valori effettivi:

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

Tieni presente che la funzione si aspetta il testo di ricerca come parametro di input con la chiave "search" e in questa implementazione viene restituita una sola corrispondenza più vicina dal database:

// 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. Per eseguire il deployment della funzione Cloud appena creata, esegui il seguente comando dal terminale Cloud Shell. Ricorda di accedere prima alla cartella del progetto corrispondente utilizzando il comando:
cd alloydb-pgvector

Quindi, esegui il comando:

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

PASSAGGIO IMPORTANTE:

Una volta avviato il deployment, dovresti essere in grado di vedere le funzioni nella console Cloud Run Functions di Google. Cerca la funzione appena creata e aprila, modifica le configurazioni e cambia quanto segue:

  1. Vai a Impostazioni di runtime, build, connessioni e sicurezza
  2. Aumenta il timeout a 180 secondi
  3. Vai alla scheda COLLEGAMENTI:

4e83ec8a339cda08.png

  1. Nelle impostazioni In entrata, assicurati che sia selezionata l'opzione "Consenti tutto il traffico".
  2. Nelle impostazioni di uscita, fai clic sul menu a discesa Rete e seleziona l'opzione "Aggiungi nuovo connettore VPC", quindi segui le istruzioni visualizzate nella finestra di dialogo visualizzata:

8126ec78c343f199.png

  1. Fornisci un nome per il connettore VPC e assicurati che la regione corrisponda a quella dell'istanza. Lascia il valore della rete predefinito e imposta la subnet come intervallo IP personalizzato con l'intervallo IP 10.8.0.0 o un valore simile disponibile.
  2. Espandi IMPOSTAZIONI DI SCALING DEL DISPLAY e assicurati che la configurazione sia impostata esattamente come segue:

7baf980463a86a5c.png

  1. Fai clic su CREA e questo connettore dovrebbe essere elencato nelle impostazioni di uscita.
  2. Seleziona il connettore appena creato
  3. Scegli di instradare tutto il traffico attraverso questo connettore VPC.

8. testa l'applicazione

Una volta eseguito il deployment, dovresti vedere l'endpoint nel seguente formato:

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

Puoi testarlo dal terminale Cloud Shell eseguendo il seguente comando:

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

Risultato:

da3dcfac7d024031.png

Puoi anche testarlo dall'elenco Funzioni Cloud. Seleziona la funzione di cui è stato eseguito il deployment e vai alla scheda "TESTING". Nella casella di testo della sezione Configura evento di attivazione per il file JSON della richiesta, inserisci quanto segue:

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

Fai clic sul pulsante TESTA LA FUNZIONE per visualizzare il risultato sul lato destro della pagina:

e21f806d661996ff.png

È tutto. È così semplice eseguire la ricerca vettoriale di similarità utilizzando il modello di embedding sui dati di AlloyDB.

9. Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo post, segui questi passaggi:

  1. Nella console Google Cloud, vai a Gestisci
  2. risorse.
  3. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  4. Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Chiudi per eliminare il progetto.

10. Complimenti

Complimenti! Hai eseguito correttamente una ricerca di similarità utilizzando AlloyDB, pgvector e Vector Search. Combinando le funzionalità di AlloyDB, Vertex AI e Vector Search, abbiamo fatto un enorme passo avanti nel rendere le ricerche nella letteratura accessibili, efficienti e basate sul significato.