1. Introduzione
Ti piace leggere, ma ti senti sopraffatto dalla quantità di scelte? Immagina di avere un'app basata sull'AI che non solo ti consiglia la lettura perfetta, ma ti offre anche un riepilogo conciso in base al genere che preferisci, dandoti un'idea dell'essenza del libro. In questo codelab, ti guiderò nella creazione di un'app di questo tipo con BigQuery e Cloud Functions, basati su Gemini.
Panoramica del progetto
Il nostro caso d'uso si basa su questi quattro componenti chiave:
- Database di libri: il vasto set di dati pubblici di BigQuery dei libri dell'archivio di internet fungerà da catalogo completo di libri.
- Motore di riepilogo AI: Google Cloud Functions, dotato del modello linguistico Gemini Pro, genererà riepiloghi approfonditi personalizzati in base alle richieste degli utenti.
- Integrazione di BigQuery: una funzione remota all'interno di BigQuery che chiama la nostra funzione Cloud per fornire riassunti e temi dei libri on demand.
- Interfaccia utente: un'app web ospitata su Cloud Run che offrirà un'applicazione web per consentire agli utenti di visualizzare i risultati.
Dividiamo l'implementazione in tre codelab:
Codelab 1: utilizza Gemini per creare una funzione Java Cloud per un'applicazione Gemini.
Codelab 2: utilizza Gemini per creare applicazioni di AI generativa solo SQL con BigQuery.
Codelab 3: utilizza Gemini per creare un'applicazione web Java Spring Boot che interagisce con BigQuery.
2. Utilizzare Gemini per creare un'app di AI generativa serverless su Java Cloud Function
Cosa creerai
Creerai un
- Applicazione Java Cloud Functions che implementa Gemini 1.0 Pro per prendere un prompt specifico come input sotto forma di array JSON e restituisce una risposta (valore JSON etichettato "replies").
- Eseguirai i passaggi di build e deployment con l'aiuto di Gemini
3. Requisiti
Di seguito sono riportati i prerequisiti:
Creare il 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.
Attiva Cloud Shell
- Utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione in Google Cloud precaricato con bq:
Nella console Cloud, fai clic su Attiva Cloud Shell nell'angolo in alto a destra: 
- Una volta eseguita la connessione a Cloud Shell, dovresti vedere che il tuo account è già autenticato e il progetto è già impostato sul tuo ID progetto. Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
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>
Consulta la documentazione per i comandi e l'utilizzo di gcloud.
4. Abilitazione di Gemini for Google Cloud e delle API necessarie
Abilita Gemini
- Vai a Gemini for Google Cloud in Marketplace per abilitare l'API. Puoi anche utilizzare il seguente comando:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- Visita la pagina di Gemini e fai clic su "Inizia a chattare".
Importante: segui i passaggi 1 e 2 di questo codelab per iniziare a utilizzare Gemini e per abilitare Gemini nell'IDE di Cloud Shell rispettivamente.
Abilita altre API necessarie
Come facciamo? Chiediamolo a Gemini. Ma prima di farlo, ricorda:
I LLM non sono deterministici. Pertanto, mentre provi questi prompt, la risposta che ricevi potrebbe essere diversa da quelle nello screenshot.
Vai alla console di chat Gemini facendo clic sull'icona "Apri Gemini" nell'angolo in alto a destra, accanto alla barra di ricerca nella console Google Cloud.

Digita questa domanda nella sezione "Inserisci un prompt qui":
How do I enable the cloud functions api using a gcloud command?
Dovresti ricevere una risposta analoga a:
gcloud services enable cloudfunctions.googleapis.com
Copia il comando (puoi utilizzare l'icona di copia nella parte superiore dello snippet di comando) ed eseguilo nel terminale Cloud Shell per attivare Cloud Functions. Fai lo stesso per Cloud Run, poiché abbiamo bisogno di entrambi per creare e implementare Cloud Functions:
gcloud services enable \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com
5. Preparare il modello Cloud Functions con Gemini
A questo punto, presumo che tu abbia già attivato Gemini nell'IDE di Cloud Shell.
Apri l'editor di Cloud Shell facendo clic sull'icona Apri editor nell'angolo in alto a destra del terminale Cloud Shell (di solito preferisco aprire il terminale e l'editor in schede separate in parallelo, in modo da poter scrivere codice in una e creare in un'altra).

Una volta aperto l'editor, assicurati che il logo di Gemini nell'angolo in basso a destra della console dell'editor sia attivo (e non disattivato). Assicurati inoltre che il progetto Google Cloud nell'angolo in basso a sinistra punti al progetto attivo corrente con cui vuoi lavorare. Se sono inattivi, fai clic, autorizza, seleziona il progetto Google Cloud a cui vuoi che puntino e attivali.
Una volta attivati entrambi, fai clic sul nome del progetto nell'angolo in basso a sinistra e nell'elenco popup che si apre con il titolo "Cloud Code", scorri verso il basso fino a "Nuova applicazione".

In questo elenco, seleziona l'applicazione Cloud Functions. Dall'elenco visualizzato, seleziona Java:

Nell'elenco risultante, digita il nome del progetto "duetai-gemini-calling" anziché helloworld e fai clic su OK.

Evviva! Hai eseguito il bootstrap della tua semplice applicazione Java Cloud Functions con Gemini e non hai fatto molto altro oltre alle configurazioni di abilitazione e attivazione, giusto?
Questa è la struttura del progetto che dovresti vedere:

Al momento, puoi eseguire il deployment della funzione. Ma non è questo il motivo per cui abbiamo iniziato. Procediamo con la creazione dell'implementazione dell'API Gemini Pro in questa funzione Cloud utilizzando l'SDK Java.
Ora creiamo la funzionalità per il nostro caso d'uso, ovvero l'invocazione del modello Gemini Pro in questa Cloud Function. Per farlo, puoi aggiungere altri prompt e sviluppare il codice in modo incrementale con Gemini o scrivere la logica in autonomia. Farò un mix di entrambi.
6. Aggiungere dipendenze
Nella console di chat di Gemini (quella all'interno dell'editor di Cloud Code nel riquadro a sinistra), digita il seguente prompt:
what is the maven dependency for com.google.cloud.vertexai library
Il motivo per cui chiedo specificamente il pacchetto com.google.cloud.vertexai è perché è quello che utilizzo nel mio codice sorgente in cui implemento il codice di chiamata di Gemini.
Ho ottenuto questo risultato:

<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-vertexai</artifactId>
<version>0.1.0</version>
</dependency>
Copia questo codice e incollalo nel file pom.xml, subito prima del tag </dependencies>. Sostituisci la versione con 0.1.0 (puoi rimuovere il tag <version> se utilizzi la BOM Spring Cloud GCP per gestire i numeri di versione di spring-cloud-gcp).
La sezione delle dipendenze dovrebbe essere simile a questa:

Se necessario, aggiorna i numeri di versione in modo che corrispondano a quelli riportati sopra. Come puoi notare, ho incluso anche un'altra dipendenza:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10</version>
</dependency>
7. Modifica l'entry point della funzione e il nome della classe
- Vai al file "launch.json" nella cartella ".vscode". Modifica il nome della funzione da "function-hello-world" a "function-gemini-calling".
- Aggiorna il valore di entryPoint da "cloudcode.helloworld.HelloWorld" a "cloudcode.bookshelf.Bookshelf".
- Ora vai al file della classe Java "HelloWorld.java". Modifica il nome del pacchetto in package cloudcode.bookshelf; nell'errore visualizzato, fai clic sul pulsante giallo e poi sull'opzione "Move HelloWorld.java" (Sposta HelloWorld.java) nel pacchetto cloudcode.bookshelf.

- Aggiorna il nome della classe in Bookshelf e, nell'errore visualizzato, fai clic sulla piccola lampadina gialla e seleziona "Rinomina file in Bookshelf.java". Selezionalo.
8. Crea il metodo che chiama Gemini Pro
Implementiamo questa funzionalità nella classe Bookshelf.java. Sostituisci Bookshelf.java con il codice riportato di seguito:
package cloudcode.bookshelf;
import java.io.BufferedWriter;
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import com.google.cloud.vertexai.VertexAI;
import com.google.cloud.vertexai.api.GenerateContentResponse;
import com.google.cloud.vertexai.api.GenerationConfig;
import com.google.cloud.vertexai.generativeai.preview.GenerativeModel;
import com.google.cloud.vertexai.generativeai.preview.ResponseHandler;
import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.util.Map;
import java.util.LinkedHashMap;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonArray;
public class Bookshelf implements HttpFunction {
private static final Gson gson = new Gson();
@Override
public void service(HttpRequest request, HttpResponse response) throws Exception {
BufferedWriter writer = response.getWriter();
// Get the request body as a JSON object.
JsonObject requestJson = new Gson().fromJson(request.getReader(), JsonObject.class);
JsonArray calls_array = requestJson.getAsJsonArray("calls");
JsonArray calls = (JsonArray) calls_array.get(0);
String context = calls.get(0).toString().replace("\"", "");
//Invoke Gemini model
String raw_result = callGemini(context);
raw_result = raw_result.replace("\n","");
String trimmed = raw_result.trim();
List<String> result_list = Arrays.asList(trimmed);
Map<String, List<String>> stringMap = new LinkedHashMap<>();
stringMap.put("replies", result_list);
// Serialization
String return_value = gson.toJson(stringMap);
writer.write(return_value);
}
public String callGemini(String context) throws IOException{
String res = "";
try (VertexAI vertexAi = new VertexAI("REPLACE_WITH_YOUR_PROJECT_ID", "us-central1"); ) {
GenerationConfig generationConfig =
GenerationConfig.newBuilder()
.setMaxOutputTokens(2048)
.setTemperature(0.4F)
.setTopK(32)
.setTopP(1)
.build();
GenerativeModel model = new GenerativeModel("gemini-pro", generationConfig, vertexAi);
GenerateContentResponse response = model.generateContent(context);
res = ResponseHandler.getText(response);
}catch(Exception e){
System.out.println(e);
}
return res;
}
}
Questa classe prevede l'input nella struttura JSON come segue:
{ "calls": [["YOUR_PROMPT_HERE"]] }
Restituisce una risposta come quella riportata di seguito:
(Json) Map<String, List<String>> {"replies": ["response"]}
Prova l'opzione di chat di Gemini nel riquadro sinistro dell'editor di Cloud Shell per spiegare il codice. In alternativa, puoi selezionare tutto il codice, fare clic sul simbolo della lampadina gialla nell'angolo in alto a sinistra della selezione e scegliere l'opzione "Spiega questo".

9. Esegui il deployment della funzione Cloud Functions
Ora che la funzione Cloud è pronta, chiediamo a Gemini come eseguirne il deployment. Vai alla chat di Gemini nell'editor di Cloud Code e inserisci quanto segue:
How to deploy this Cloud Function with a gcloud command?
Ho ricevuto la seguente risposta:

Ora volevo approfondire la questione. Quindi ho chiesto a Gemini di fornirmi il comando di deployment completo di gcloud functions. La risposta è mostrata di seguito:

Non posso dire se riceverai la stessa risposta, ma ho trovato piuttosto interessante vedere che aggiunge qualche dettaglio in più a sorpresa, come mostrato nell'immagine qui sotto:
Formato del corpo della richiesta:

e
Formato della risposta:

Ora eseguiamo il deployment della funzione eseguendo il comando gcloud che ci ha fornito Gemini. Per questo, dobbiamo aprire il terminale Cloud Shell. Puoi aprirlo in una nuova scheda all'indirizzo https://console.cloud.google.com e assicurarti che sia selezionato il progetto corretto. Apri il terminale Cloud Shell facendo clic sull'icona Attiva Cloud Shell nell'angolo in alto a destra della console e assicurati di trovarti nella cartella del progetto corretta utilizzando il comando riportato di seguito:
cd duetai-gemini-calling
Seguito dal comando riportato di seguito:
gcloud functions deploy bookshelf --runtime java17 --trigger-http --entry-point cloudcode.bookshelf.Bookshelf --allow-unauthenticated
Ti verrà chiesto: "Consenti chiamate non autenticate della nuova funzione [bookshelf]?" Di' "sì" e premi Invio. Dopodiché, se applicabile, ti verranno poste alcune domande e verrà eseguito il deployment della tua funzione Cloud serverless con l'URL di deployment: https://us-central1-*******.cloudfunctions.net/bookshelf.
Ora richiamiamo le Cloud Functions di cui è stato eseguito il deployment e testiamole.
Nota: se hai saltato accidentalmente la domanda "Consenti chiamate non autenticate" o hai selezionato "N", non potrai accedere al risultato di Cloud Functions e visualizzerai un "errore di autorizzazioni" senza concedere impostazioni IAM aggiuntive. Quindi, presta attenzione a questo aspetto.
10. Chiama la funzione Cloud di cui è stato eseguito il deployment
Chiediamo a Gemini. Ho inserito il prompt
How to call the deployed cloud function?
Ho ottenuto il seguente risultato: (potresti o meno visualizzare la stessa risposta esatta, sentiti libero di sperimentare con il prompt e vedere la differenza nelle risposte).

Ho chiesto alla chat domande specifiche su modi alternativi per richiamare la funzione di cui è stato eseguito il deployment, chiamare utilizzando il comando gcloud e così via. Ho inviato il seguente prompt:
how to call the deployed cloud function using gcloud
Ho ricevuto la seguente risposta: 
Puoi utilizzare questa risposta (comando "gcloud functions call") dal terminale con modifiche per adattarla al nostro scenario (in alternativa, prova a passare i parametri nel prompt stesso e vedi se riesci a ottenere la chiamata dettagliata di gcloud functions in risposta):
gcloud functions call bookshelf --region=us-central1 --gen2 --data '{"calls":[["Hello! This is my test prompt."]]}'
Ecco il mio risultato:

11. Esegui la pulizia
Puoi eliminare le funzioni Cloud Functions che hai creato in precedenza facendo clic sul pulsante ELIMINA nella pagina dei dettagli delle funzioni Cloud Functions.
12. Complimenti
Hai creato, sottoposto a deployment e testato correttamente una funzione Cloud Java per chiamare Gemini 1.0 Pro utilizzando Gemini. Questa applicazione prende il prompt di input relativo al consiglio di lettura con il riepilogo e il tema dei libri.