Crea un'app di ricerca brevetti con Spanner, Vector Search e Gemini 1.0 Pro!

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.

Obiettivo

In questo codelab, ci impegneremo a rendere il processo di ricerca dei brevetti più veloce, intuitivo e incredibilmente preciso sfruttando Spanner e Gemini 1.0 Pro, Embeddings e Vector Search in loco.

Cosa creerai

Nell'ambito di questo lab, imparerai a:

  1. Creazione di un'istanza di Spanner
  2. Carica un set di dati pubblici di Google Brevetti
  3. Crea un modello remoto per gli incorporamenti di testo con il modello Gemini 1.0 Pro
  4. Creare insight generativi dal set di dati caricato
  5. Genera gli embedding dagli approfondimenti
  6. Esegui query di ricerca di similarità sul set di dati

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

14cfdde5e24258a.png

Requisiti

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

2. Prima di iniziare

Crea 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 è abilitata 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 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
  1. Esegui questo 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. Assicurati che le API Vertex AI e Spanner siano abilitate cercandole nella console. In alternativa, puoi utilizzare anche il seguente comando nel terminale Cloud Shell:
gcloud services enable spanner.googleapis.com --project <<YOUR_PROJECT_ID>>
gcloud services enable aiplatform.googleapis.com --project <<YOUR_PROJECT_ID>>

Un'altra alternativa è utilizzare questo link.

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

3. Prepara il database Spanner

Creiamo un'istanza, un database e una tabella Spanner in cui verrà caricato il set di dati sui brevetti.

Creazione di un'istanza di Spanner

  1. Crea un'istanza di Spanner denominata spanner-vertex.
gcloud spanner instances create spanner-vertex \
--config=regional-us-central1 \
--description=spanner-vertex \
--nodes=1

Crea un database

  1. Nella console Google Cloud, apri la pagina Spanner.
  2. Seleziona l'istanza spanner-vertex dall'elenco.
  3. In Database, fai clic su Crea database.
  4. Imposta il nome del database su brevetti.
  5. Fai clic su Crea per creare il database.

Creare una tabella

  1. Nella console Google Cloud, apri la pagina Spanner.
  2. Seleziona l'istanza spanner-vertex dall'elenco.
  3. Seleziona il database patents.
  4. Nella scheda Tabelle, fai clic su Crea tabella. Si apre la pagina di Spanner Studio.
  5. Apri una nuova scheda facendo clic su Nuova scheda dell'editor SQL.
  6. Esegui questa query:
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. Caricare i dati dei brevetti nel database

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

  1. Nella console Google Cloud, apri la pagina Spanner.
  2. Seleziona l'istanza spanner-vertex dall'elenco.
  3. Seleziona il database patents.
  4. Nel menu di navigazione, fai clic su Spanner Studio. Nel riquadro Explorer viene visualizzato un elenco degli oggetti nel database.
  5. Apri una nuova scheda facendo clic su Nuova scheda dell'editor SQL.
  6. Copia l'istruzione della query insert dallo script insert_into_patents_data.sql nell'editor. Puoi copiare 50-100 istruzioni di inserimento per una rapida demo di questo caso d'uso.
  7. Fai clic su Esegui. I risultati della query vengono visualizzati nella tabella Risultati.

5. Crea un modello remoto per Gemini 1.0 Pro

Dopo aver caricato i dati dei brevetti nel database, creeremo un modello remoto che utilizza il modello Gemini 1.0 Pro Vertex AI per generare un insieme riepilogativo di titoli e parole chiave.

Esegui il seguente comando DDL nell'editor di Spanner Studio:

  1. Nel menu di navigazione, fai clic su Spanner Studio. Nel riquadro Explorer viene visualizzato un elenco degli oggetti nel database.
  2. Apri una nuova scheda facendo clic su Nuova scheda dell'editor SQL.
  3. Esegui questa query:
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. Fai clic su Esegui. I risultati della query vengono visualizzati nella tabella Risultati.

6. Crea un modello remoto per gli incorporamenti di testo

Il risultato del passaggio precedente include un riepilogo consolidato composto da un titolo e parole chiave. Convertiremo questa risposta in incorporamenti che ci aiuteranno a generare corrispondenze appropriate quando eseguiamo una query. Utilizzeremo Text Embedding Gecko 003 model da Vertex AI in remoto da Spanner.

  1. Nel menu di navigazione, fai clic su Spanner Studio. Nel riquadro Explorer viene visualizzato un elenco degli oggetti nel database.
  2. Apri una nuova scheda facendo clic su Nuova scheda dell'editor SQL.
  3. Esegui questa query:
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. Fai clic su Esegui. I risultati della query vengono visualizzati nella tabella Risultati.

7. Creare approfondimenti generativi a partire dagli abstract dei brevetti

Creeremo una tabella patents_data_gemini per archiviare gli approfondimenti generativi che genereremo utilizzando il modello Gemini 1.5 Pro che abbiamo creato in precedenza.

Crea la tabella

  1. Nel menu di navigazione, fai clic su Spanner Studio. Nel riquadro Explorer viene visualizzato un elenco degli oggetti nel database.
  2. Apri una nuova scheda facendo clic su Nuova scheda dell'editor SQL.
  3. Esegui questa query:
CREATE TABLE patents_data_gemini (id string(100), gemini_response STRING(MAX)) PRIMARY KEY (id);
  1. Fai clic su Esegui. I risultati della query vengono visualizzati nella tabella Risultati.

Genera insight

Per compilare la tabella con gli approfondimenti generativi, ti consigliamo di utilizzare un'applicazione che utilizza il metodo di scrittura batch o mutazioni. Per questo codelab, eseguiremo la seguente query DDL fino a quattro volte per popolare la tabella.

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
));

Nota:se in questo passaggio viene visualizzato l'errore Quota Exceeded (possibile nel caso di crediti senza costi con margine ridotto), prova a saltare l'inserimento ed esegui solo la query di selezione nella sezione Soluzione alternativa riportata di seguito.

Sezione Soluzione temporanea:

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
))

Osservare gli approfondimenti

La tabella include gli approfondimenti generati per il prompt 'Identify the areas of work or keywords in this abstract', nella query.

Nota:se hai eseguito la query della sezione della soluzione alternativa riportata sopra anziché INSERT DDL, salta questa parte ed esegui l'ultima query SELECT in questa pagina.

Eseguiamo la seguente query per verificare i risultati degli approfondimenti:

select title, abstract, gemini_response from patents_data a inner join patents_data_gemini b
on a.id = b.id;

Vengono visualizzati i seguenti risultati:

6041fab164aaab93.png

Nota:se hai eseguito la query della sezione Soluzione alternativa, sostituisci il nome della tabella nella query di selezione precedente con la query nella sezione Soluzione alternativa. Pertanto, esegui il comando riportato di seguito:

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;

Il risultato dovrebbe essere lo stesso di quello nello screenshot dei risultati riportato sopra.

8. Genera embedding per gli approfondimenti generati

Dopo aver compilato gli approfondimenti nella nostra tabella, possiamo ora utilizzarli per generare incorporamenti. Questi incorporamenti ci aiutano a non fare affidamento su corrispondenze esatte delle parole chiave, ma a generare risultati basati su somiglianze concettuali.

Nota: se hai eseguito la query della sezione della soluzione alternativa nel passaggio precedente, puoi saltare questo passaggio e passare alla query della sezione della soluzione alternativa anche in questo passaggio.

Esegui la seguente query per generare incorporamenti:

  1. Nel menu di navigazione, fai clic su Spanner Studio. Nel riquadro Explorer viene visualizzato un elenco degli oggetti nel database.
  2. Apri una nuova scheda facendo clic su Nuova scheda dell'editor SQL.
  3. Esegui la seguente query per creare la tabella patents_data_embeddings.
CREATE TABLE patents_data_embeddings (id string(100), patents_embeddings ARRAY<FLOAT64>) PRIMARY KEY (id);
  1. Fai clic su Esegui. I risultati della query vengono visualizzati nella tabella Risultati.
  2. Esegui la seguente query per generare gli incorporamenti.
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. Fai clic su Esegui. I risultati della query vengono visualizzati nella tabella Risultati.

Osserva i risultati

La tabella include gli incorporamenti generati per il titolo e il testo estratto.

Eseguiamo la seguente query per verificare i risultati:

select title, abstract, b.patents_embeddings from patents_data a inner join patents_data_embeddings b
on a.id = b.id;

Vengono visualizzati i seguenti risultati:

a1e968bac4ab1cb.png

Sezione Soluzione temporanea:

Utilizza questa query se hai eseguito la sezione della soluzione alternativa in altri passaggi:

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;

In questo modo, dovresti ottenere gli stessi risultati mostrati nello screenshot sopra.

9. Prepararsi alla ricerca vettoriale

Ora che abbiamo generato gli embedding di testo, possiamo preparare la nostra applicazione web per eseguire ricerche vettoriali di somiglianza. In questo codelab, creiamo un'applicazione web che include la logica per fornire risultati di ricerca basati sulla funzionalità di ricerca per similarità K-Nearest Neighbors. Puoi utilizzare questo set di dati preparato con un'app di ricerca per visualizzare l'aspetto dei risultati di ricerca.

Per il nostro codelab, eseguiremo una query di esempio che cerca un prompt, genera risultati in base al contesto e limita i risultati a 10 voci.

Esegui questa query:

  1. Nel menu di navigazione, fai clic su Spanner Studio. Nel riquadro Explorer viene visualizzato un elenco degli oggetti nel database.
  2. Apri una nuova scheda facendo clic su Nuova scheda dell'editor SQL.
  3. Esegui la seguente query per creare la tabella 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. Fai clic su Esegui. I risultati della query vengono visualizzati nella tabella Risultati.

Nota:se hai utilizzato le query nella sezione Soluzione alternativa, a causa di errori di quota in una delle prime istruzioni di inserimento, puoi saltare tutti gli altri passaggi ed eseguire direttamente la query riportata di seguito per osservare i risultati dell'esecuzione della ricerca del vicino più prossimo sugli embedding vettoriali nel database 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;

Osserva i risultati

La query precedente utilizza il metodo COSINE_DISTANCE per trovare le 10 corrispondenze più vicine al nostro prompt.

Vengono visualizzati i seguenti risultati:

d26ca8b8238bdf25.png

I risultati generati sono contestualmente molto vicini al prompt che faceva parte della query.

10. 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 alla pagina Gestisci risorse.
  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina. Se non vuoi eliminare il progetto, elimina solo l'istanza che hai creato in Spanner.
  3. Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Chiudi per eliminare il progetto.

11. Complimenti

Congratulazioni. Hai eseguito correttamente una ricerca di similarità utilizzando la ricerca vettoriale integrata di Spanner. Inoltre, hai visto quanto sia facile lavorare con i modelli di embedding e LLM per fornire funzionalità di AI generativa direttamente utilizzando SQL.

Passaggi successivi

Scopri di più sulla funzionalità di ricerca vettoriale esatta K-Nearest Neighbor (KNN) di Spanner qui: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

Puoi anche scoprire di più su come eseguire previsioni online con SQL utilizzando l'integrazione di Vertex AI di Spanner qui: https://cloud.google.com/spanner/docs/ml