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

Obiettivo

In questo codelab, ci impegneremo a rendere la ricerca di brevetti più rapida, intuitiva e incredibilmente precisa sfruttando Spanner e Gemini 1.0 Pro, Embedding e Ricerca vettoriale in-place.

Cosa creerai

In questo lab imparerai a:

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

Il seguente diagramma rappresenta 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

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. Assicurati che le API Vertex AI e Spanner siano abilitate cercandole nella console. In alternativa, puoi anche utilizzare 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 dei brevetti.

Creazione di un'istanza di Spanner

  1. Crea un'istanza 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 patents.
  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 Tables (Tabelle), fai clic su Create Table (Crea tabella). Si apre la pagina di Spanner Studio.
  5. Apri una nuova scheda facendo clic sulla scheda Nuovo 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. Carica 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. Il riquadro Explorer mostra un elenco degli oggetti nel database.
  5. Apri una nuova scheda facendo clic sulla scheda Nuovo editor SQL.
  6. Copia l'istruzione di query insert dallo script insert_into_patents_data.sql nell'editor. Puoi copiare 50-100 istruzioni INSERT per una rapida dimostrazione di questo caso d'uso.
  7. Fai clic su Esegui. I risultati della query vengono visualizzati nella tabella Risultati.

5. Creare un modello remoto per Gemini 1.0 Pro

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

Esegui il seguente comando DDL in Spanner Studio Editor:

  1. Nel menu di navigazione, fai clic su Spanner Studio. Il riquadro Explorer mostra un elenco degli oggetti nel database.
  2. Apri una nuova scheda facendo clic sulla scheda Nuovo 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 embedding che ci aiuteranno a generare corrispondenze appropriate quando eseguiamo una query. Useremo Text Embedding Gecko 003 model da Vertex AI da remoto da Spanner.

  1. Nel menu di navigazione, fai clic su Spanner Studio. Il riquadro Explorer mostra un elenco degli oggetti nel database.
  2. Apri una nuova scheda facendo clic sulla scheda Nuovo 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 dagli abstract dei brevetti

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

Crea la tabella

  1. Nel menu di navigazione, fai clic su Spanner Studio. Il riquadro Explorer mostra un elenco degli oggetti nel database.
  2. Apri una nuova scheda facendo clic sulla scheda Nuovo 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 approfondimenti generativi, ti consigliamo di utilizzare un'applicazione che utilizzi il metodo di scrittura batch o le mutazioni. Per questo codelab, eseguiremo la seguente query DDL fino a quattro volte per compilare 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 ricevi l'errore Quota Exceeded (Quota superata), prova a saltare l'inserimento ed esegui solo la query di selezione nella sezione della soluzione alternativa di seguito.

Sezione relativa alla soluzione alternativa:

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 insight

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 sopra riportata anziché l'istruzione DDL INSERT, 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 sulla soluzione alternativa, sostituisci il nome della tabella nella query di selezione riportata sopra con la query nella sezione sulla soluzione alternativa. Dovresti quindi eseguire il seguente comando:

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 dello screenshot dei risultati riportato sopra.

8. Genera embedding per gli approfondimenti generati

Dopo aver compilato gli approfondimenti nella nostra tabella, ora possiamo utilizzarli per generare embedding. Questi embedding ci aiutano a non fare affidamento sulle corrispondenze esatte delle parole chiave, ma a generare risultati in base a 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 gli embedding:

  1. Nel menu di navigazione, fai clic su Spanner Studio. Il riquadro Explorer mostra un elenco degli oggetti nel database.
  2. Apri una nuova scheda facendo clic sulla scheda Nuovo 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 embedding.
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 astratto.

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 relativa alla soluzione:

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;

Dovresti ottenere gli stessi risultati mostrati nello screenshot sopra.

9. Prepararsi alla ricerca vettoriale

Ora che abbiamo generato gli incorporamenti di testo, possiamo preparare la nostra applicazione web per eseguire ricerche di vettori di somiglianza. In questo codelab, creeremo un'applicazione web che include la logica per fornire risultati di ricerca in base alla funzionalità di ricerca di somiglianza K-Nearest Neighbors. Puoi utilizzare questo set di dati preparato con un'app di ricerca per visualizzare la modalità di visualizzazione 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. Il riquadro Explorer mostra un elenco degli oggetti nel database.
  2. Apri una nuova scheda facendo clic sulla scheda Nuovo 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 della soluzione alternativa, a causa di errori di quota in una delle prime istruzioni insert, 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ù vicino 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 per il nostro prompt.

Vengono visualizzati i seguenti risultati:

d26ca8b8238bdf25.png

I risultati generati sono abbastanza simili dal punto di vista contestuale 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 semplicemente 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 è 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 K-Nearest Neighbor (esatta) 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 VertexAI di Spanner qui: https://cloud.google.com/spanner/docs/ml