Informazioni su questo codelab
1. Panoramica
In diversi settori, la ricerca di brevetti è uno strumento fondamentale per comprendere il panorama competitivo, identificare potenziali opportunità di licenza o acquisizione ed evitare di violare brevetti esistenti.
La ricerca di brevetti è vasta e complessa. Setacciare innumerevoli abstract tecnici per trovare le innovazioni pertinenti è un compito arduo. Le ricerche tradizionali basate su parole chiave sono spesso imprecise e richiedono molto tempo. I riassunti sono lunghi e tecnici, il che rende difficile cogliere rapidamente l'idea principale. Ciò può portare i ricercatori a perdere brevetti chiave o a sprecare tempo su risultati non pertinenti.
L'ingrediente segreto di questa rivoluzione è Vector Search. Anziché basarsi sulla semplice corrispondenza delle parole chiave, la ricerca vettoriale trasforma il testo in rappresentazioni numeriche (incorporamenti). In questo modo, possiamo eseguire ricerche in base al significato della query, non solo alle parole specifiche utilizzate. Nel mondo delle ricerche bibliografiche, questa è una svolta. Immagina di trovare un brevetto per un "cardiofrequenzimetro indossabile" anche se la frase esatta non viene utilizzata nel documento.
Obiettivo
In questo codelab, lavoreremo per rendere il processo di ricerca dei brevetti più veloce, intuitivo e incredibilmente preciso sfruttando AlloyDB, l'estensione pgvector e Gemini 1.5 Pro, Embeddings e Vector Search in loco.
Cosa creerai
Nell'ambito di questo lab, imparerai a:
- Crea un'istanza AlloyDB e carica i dati del set di dati pubblici sui brevetti
- Abilita le estensioni del modello pgvector e di AI generativa in AlloyDB
- Generare gli incorporamenti dagli insight
- Eseguire la ricerca della similarità del coseno in tempo reale per il testo di ricerca dell'utente
- Esegui il deployment della soluzione in Cloud Functions serverless
Il seguente diagramma mostra il flusso di dati e i passaggi coinvolti nell'implementazione.
High level diagram representing the flow of the Patent Search Application with AlloyDB
Requisiti
2. Prima di iniziare
Crea un progetto
- Nella console Google Cloud, nella pagina di selezione del progetto, seleziona o crea un progetto Google Cloud.
- Verifica che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata per un progetto .
- 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.
- Una volta eseguita la connessione a Cloud Shell, verifica di essere già autenticato e che il progetto sia impostato sul tuo ID progetto utilizzando il seguente comando:
gcloud auth list
- Esegui questo comando in Cloud Shell per verificare che il comando gcloud conosca il tuo progetto.
gcloud config list project
- Se il progetto non è impostato, utilizza il seguente comando per impostarlo:
gcloud config set project <YOUR_PROJECT_ID>
- 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 ogni 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 sui brevetti.
Crea un oggetto AlloyDB
Crea un cluster e un'istanza con ID cluster "patent-cluster
", password "alloydb
", compatibile con PostgreSQL 15 e la regione "us-central1
", il networking impostato 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 funzioni che utilizzi per accedere agli endpoint di previsione di Vertex AI per ottenere 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 della funzione "embedding":
GRANT EXECUTE ON FUNCTION embedding TO postgres;
Concedi il ruolo Utente Vertex AI al service account AlloyDB
Dalla console Google Cloud IAM, concedi all'account di servizio AlloyDB (simile a service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) l'accesso al ruolo "Utente Vertex AI". PROJECT_NUMBER conterrà il numero del tuo progetto.
In alternativa, puoi 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 Vector per archiviare gli embedding
Esegui il DDL riportato di seguito per aggiungere il campo abstract_embeddings alla tabella appena creata. Questa colonna consentirà l'archiviazione dei valori vettoriali del testo:
ALTER TABLE patents_data ADD column abstract_embeddings vector(3072);
4. Caricare 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.
- Nella console Google Cloud, apri la pagina AlloyDB.
- Seleziona il cluster appena creato e fai clic sull'istanza.
- Nel menu di navigazione di AlloyDB, fai clic su AlloyDB Studio. Accedi con le tue credenziali.
- Apri una nuova scheda facendo clic sull'icona Nuova scheda a destra.
- Copia l'istruzione della query
insert
dallo scriptinsert_into_patents_data.sql
menzionato sopra nell'editor. Puoi copiare 50-100 istruzioni di inserimento per una rapida demo di questo caso d'uso. - Fai clic su Esegui. I risultati della query vengono visualizzati nella tabella Risultati.
5. Crea incorporamenti per i dati dei brevetti
Innanzitutto, testiamo la funzione di incorporamento eseguendo la seguente query di esempio:
SELECT embedding( 'gemini-embedding-001', 'AlloyDB is a managed, cloud-hosted SQL database service.');
Dovrebbe restituire il vettore di incorporamento, che ha l'aspetto di un array di numeri in virgola mobile, per il testo di esempio nella query. Ecco come appare:
Aggiorna il campo del vettore abstract_embeddings
Esegui il seguente DML per aggiornare i riassunti dei brevetti nella tabella con gli incorporamenti corrispondenti:
UPDATE patents_data set abstract_embeddings = embedding( 'gemini-embedding-001', abstract);
6. Eseguire la ricerca vettoriale
Ora che la tabella, i dati e gli incorporamenti sono pronti, eseguiamo la ricerca vettoriale in tempo reale per il testo di ricerca dell'utente. Puoi testarlo eseguendo la query riportata di seguito:
SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('gemini-embedding-001', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;
In questa query,
- Il testo della ricerca dell'utente è: "Un nuovo modello di machine learning correlato all'elaborazione del linguaggio naturale".
- Lo convertiamo in incorporamenti nel metodo embedding() utilizzando il modello: gemini-embedding-001.
- "<=>" rappresenta l'utilizzo del metodo di distanza COSINE SIMILARITY.
- Stiamo convertendo il risultato del metodo di incorporamento in tipo di vettore per renderlo compatibile con i vettori archiviati nel database.
- LIMIT 10 indica che stiamo selezionando le 10 corrispondenze più vicine al testo di ricerca.
Di seguito è riportato il risultato:
Come puoi notare nei risultati, le corrispondenze sono molto simili al testo di ricerca.
7. Portare l'applicazione sul web
È tutto pronto per portare questa app sul web? Procedi nel seguente modo:
- 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 attuale con la fatturazione abilitata e assicurati di aver eseguito l'accesso allo stesso progetto anche da Gemini (nell'angolo destro della barra di stato).
- Fai clic sull'icona di Cloud Code e attendi la visualizzazione della finestra di dialogo di Cloud Code. Seleziona Nuova applicazione e, nel popup Crea nuova applicazione, seleziona Applicazione Cloud Functions:
Nella pagina 2/2 del popup Crea nuova applicazione, seleziona Java: Hello World e inserisci il nome del tuo progetto come "alloydb-pgvector" nella posizione che preferisci e fai clic su OK:
- Nella struttura del progetto risultante, cerca pom.xml e sostituiscilo con i contenuti del file del repository. Oltre a queste, deve avere anche altre dipendenze:
- Sostituisci il file HelloWorld.java con i contenuti del file repo.
Tieni presente che devi sostituire i valori riportati di seguito con i tuoi dati 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 prevede il testo di ricerca come parametro di input con la chiave "search" e che in questa implementazione viene restituita solo una 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('tgemini-embedding-001', '" + 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);
}
- Per eseguire il deployment della funzione Cloud Functions appena creata, esegui questo comando dal terminale Cloud Shell. Ricorda di passare 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 impostato 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:
- Vai a Impostazioni di runtime, build, connessioni e sicurezza
- Aumenta il timeout a 180 secondi
- Vai alla scheda CONNESSIONI:
- Nelle impostazioni di Ingress, assicurati che sia selezionata l'opzione "Consenti tutto il traffico".
- Nella sezione Impostazioni di uscita, fai clic sul menu a discesa Rete e seleziona l'opzione "Aggiungi nuovo connettore VPC" e segui le istruzioni visualizzate nella finestra di dialogo visualizzata:
- Fornisci un nome per il connettore VPC e assicurati che la regione sia la stessa dell'istanza. Lascia il valore Rete come predefinito e imposta Subnet come intervallo IP personalizzato con l'intervallo IP 10.8.0.0 o un valore simile disponibile.
- Espandi MOSTRA IMPOSTAZIONI SCALATURA e assicurati che la configurazione sia impostata esattamente come segue:
- Fai clic su CREA e il connettore dovrebbe essere elencato nelle impostazioni di uscita.
- Seleziona il connettore appena creato.
- Scegli di instradare tutto il traffico tramite questo connettore VPC.
8. testa l'applicazione
Una volta eseguito il deployment, dovresti visualizzare l'endpoint nel seguente formato:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/patent-search
Puoi testarlo dal terminale Cloud Shell eseguendo il comando seguente:
gcloud functions call patent-search --region=us-central1 --gen2 --data '{"search": "A new Natural Language Processing related Machine Learning Model"}'
Risultato:
Puoi anche testarlo dall'elenco Cloud Functions. 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 JSON della richiesta, inserisci quanto segue:
{"search": "A new Natural Language Processing related Machine Learning Model"}
Fai clic sul pulsante TESTA LA FUNZIONE e vedrai il risultato sul lato destro della pagina:
È tutto. Eseguire la ricerca vettoriale di similarità utilizzando il modello di incorporamento sui dati AlloyDB è semplicissimo.
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:
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 passo avanti gigante nel rendere le ricerche bibliografiche accessibili, efficienti e davvero basate sul significato.