Come utilizzare le funzioni di Cloud Run e Gemini per riassumere un file di testo caricato in un bucket Cloud Storage

1. Introduzione

Panoramica

Le funzioni Cloud Run sono un nuovo modo per eseguire il deployment dei carichi di lavoro utilizzando i paradigmi di gestione degli eventi e la firma delle funzioni di GCF che già conosci. Anziché utilizzare la nostra procedura di build e le configurazioni di deployment, le funzioni Cloud Run ti offrono il controllo diretto sul servizio sottostante creato su Cloud Run.

In questa sezione imparerai a eseguire il deployment in Python di una funzione basata su eventi che utilizza Gemini per riassumere un file di testo normale caricato in un bucket Cloud Storage.

Cosa imparerai a fare

  • Eseguire il deployment di una funzione Cloud Run basata su eventi che viene attivata ogni volta che un oggetto viene caricato in un bucket GCS
  • Come creare un account di servizio con i ruoli appropriati per ricevere un evento da Cloud Storage e richiamare la funzione Cloud Run
  • Come utilizzare Gemini per riassumere un documento di testo normale caricato su Cloud Storage

2. Configura le variabili di ambiente e abilita le API

Aggiornare l'interfaccia a riga di comando gcloud

Questo codelab richiede una versione recente di gcloud CLI installata. Puoi aggiornare la CLI eseguendo

gcloud components update

Abilita API

Prima di poter iniziare a utilizzare questo codelab, devi abilitare diverse API. Questo codelab richiede l'utilizzo delle seguenti API. Puoi abilitare queste API eseguendo il seguente comando:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    storage.googleapis.com \
    artifactregistry.googleapis.com \
    eventarc.googleapis.com \
    aiplatform.googleapis.com

Configura le variabili di ambiente

Puoi impostare le variabili di ambiente che verranno utilizzate durante questo codelab.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>

gcloud config set project $PROJECT_ID
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
SERVICE_NAME=crf-vertexai-codelab
BUCKET_NAME=$PROJECT_ID-$SERVICE_NAME
TRIGGER_NAME=$SERVICE_NAME-trigger

3. Crea un bucket di archiviazione e un account di servizio

Crea un bucket di archiviazione

Puoi creare un bucket Cloud Storage eseguendo il seguente comando:

gsutil mb -l us-central1 gs://$BUCKET_NAME

Crea un account di servizio

Per questo esempio, creerai un account di servizio con le autorizzazioni EventArc richieste e il ruolo Invoker di Cloud Run per ricevere un evento da Cloud Storage e richiamare la funzione Cloud Run.

Crea innanzitutto l'account di servizio.

SERVICE_ACCOUNT="crf-vertexai-codelab"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run functions Eventarc service account"

Quindi, concedi il ruolo Event Receiver di Eventarc (roles/eventarc.eventReceiver) nel progetto all'account di servizio associato all'trigger Eventarc in modo che l'trigger possa ricevere eventi dai fornitori di eventi.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/eventarc.eventReceiver

Poi, concedi all'account di servizio il ruolo Invoker di Cloud Run in modo che possa richiamare la funzione.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

Ora concedi all'account di servizio il ruolo Utente AI Platform in modo che possa effettuare chiamate a Gemini.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --role="roles/aiplatform.user"

Concedi all'account di servizio il ruolo Visualizzatore oggetti Storage in modo che possa accedere al file.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --role="roles/storage.objectViewer"

Cloud Pub/Sub richiede il ruolo roles/iam.serviceAccountTokenCreator nel tuo progetto per creare token di identità.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role=roles/iam.serviceAccountTokenCreator

Per ricevere eventi tramite Cloud Storage, il trigger richiede che venga assegnato il ruolo roles/pubsub.publisher all'account di servizio Google Cloud Storage.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:service-$PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com \
  --role=roles/pubsub.publisher

4. crea ed esegui il deployment della funzione

Per prima cosa, crea una directory per il codice sorgente ed esegui cd in quella directory.

mkdir $SERVICE_NAME && cd $_

Quindi, crea un file requirements.txt con i seguenti contenuti:

functions-framework==3.*
google-cloud-aiplatform==1.63.*
google-cloud-storage==2.16.*

A questo punto, crea un file main.py con i seguenti contenuti:

import functions_framework
import vertexai
from vertexai.generative_models import GenerativeModel
from google.cloud import storage

vertexai.init(project="<YOUR_PROJECT_ID>", location="us-central1")

model = GenerativeModel(
    model_name="gemini-1.5-pro-001",
    system_instruction=[
        "Summarize the following document in a single sentence. Do not respond with more than one sentence.",
    ],
)

# Triggered by a change in a storage bucket
@functions_framework.cloud_event
def hello_gcs(cloud_event):
    data = cloud_event.data

    # download the file
    storage_client = storage.Client()
    blob = storage_client.bucket(data["bucket"]).get_blob(data["name"])
    #print(blob)

    doc = blob.download_as_text()
    contents = [doc]

    response = model.generate_content(contents)
    print(response.text)

    print(f"Response from Model: {response.text}")

Ora puoi eseguire il deployment della funzione Cloud Run eseguendo il seguente comando:

gcloud beta run deploy $SERVICE_NAME \
      --source . \
      --function hello_gcs \
      --region $REGION \
      --no-allow-unauthenticated \
      --service-account $SERVICE_ACCOUNT_ADDRESS

Tieni presente quanto segue:

  • il flag --source viene utilizzato per indicare a Cloud Run di compilare la funzione in un servizio basato su container eseguibile
  • Il flag --function (nuovo) viene utilizzato per impostare il punto di ingresso del nuovo servizio come la firma della funzione che vuoi che venga richiamata
  • (Facoltativo) --no-allow-unauthenticated per impedire l'invocazione pubblica della funzione

Ti potrebbe essere chiesto "Il deployment dall'origine richiede un repository Docker Artifact Registry per archiviare i container creati. Verrà creato un repository denominato [cloud-run-source-deploy] nella regione [<YOUR_REGION>]." Accetta il valore predefinito Sì per creare il repository.

Puoi visualizzare il nuovo servizio crf-vertexai-codelab eseguendo il seguente comando:

gcloud beta run services describe $SERVICE_NAME --region $REGION

5. Creare l'evento

Possiamo creare un attivatore Eventarc per inviare messaggi alla nostra funzione ogni volta che un oggetto viene finalizzato in Google Cloud Storage:

BUCKET_REGION=$REGION

gcloud eventarc triggers create $TRIGGER_NAME \
     --location=$REGION \
     --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$BUCKET_REGION \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=$BUCKET_NAME" \
     --service-account=$SERVICE_ACCOUNT_ADDRESS

Tieni presente che per il flag --event-filters non devi utilizzare il prefisso gs:// nel nome del bucket.

Se viene visualizzato un errore If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent., attendi qualche minuto prima di riprovare.

Un tutorial dettagliato sulla configurazione del servizio Trigger da Cloud Storage utilizzando Eventarc è disponibile nella documentazione di Cloud Run all'indirizzo https://cloud.google.com/run/docs/tutorials/eventarc

6. Testa la funzione

Ora che abbiamo eseguito il deployment della funzione e creato un trigger, siamo pronti per invocarla.

Crea un file e caricalo nel tuo bucket Cloud Storage. È possibile farlo tramite l'interfaccia web della console Cloud o utilizzando lo strumento dell'interfaccia a riga di comando gsutil, ad esempio.

gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME

Una volta caricato il file, verrà generato un evento e la funzione chiamerà Gemini per riepilogare il file di testo normale. Il riepilogo verrà stampato nei log.

Puoi visualizzare i log in Cloud Console per il servizio Cloud Run oppure puoi eseguire il seguente comando:

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE_NAME AND textPayload: Response"

Ad esempio, il caricamento di un file di testo normale della guida utente delle funzioni Cloud Run per l'anteprima privata genera il seguente messaggio nei log:

Response from Model: Cloud Run functions offer a new way to deploy serverless workloads with familiar Google Cloud Functions paradigms while providing control over the underlying Cloud Run service. 

7. Complimenti!

Complimenti per aver completato il codelab.

Ti consigliamo di consultare la documentazione relativa alle funzioni Cloud Run.

Argomenti trattati

  • Come eseguire il deployment di una funzione Cloud Run basata su eventi che viene attivata ogni volta che un oggetto viene caricato in un bucket GCS
  • Come creare un account di servizio con i ruoli appropriati per ricevere un evento da Cloud Storage e richiamare la funzione Cloud Run
  • Come utilizzare Gemini per riassumere un documento di testo normale caricato su Cloud Storage

8. Esegui la pulizia

Per evitare addebiti involontari (ad esempio, se questo servizio Cloud Run viene invocato inavvertitamente più volte rispetto alla allocazione mensile di invocazioni Cloud Run nel livello senza costi), puoi eliminare il servizio Cloud Run o il progetto creato nel passaggio 2.

Per eliminare i servizi Cloud Run, vai alla console Cloud Run all'indirizzo https://console.cloud.google.com/run/ ed elimina il servizio crf-vertexai-codelab che hai creato in questo codelab.

Se scegli di eliminare l'intero progetto, puoi andare alla pagina https://console.cloud.google.com/cloud-resource-manager, selezionare il progetto creato nel passaggio 2 e scegliere Elimina. Se elimini il progetto, dovrai modificare i progetti nel tuo Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo gcloud projects list.