Jak używać Gemini i funkcji Cloud Run do podsumowywania pliku tekstowego przesłanego do zasobnika Cloud Storage

1. Wprowadzenie

Przegląd

Funkcje Cloud Run to nowy sposób wdrażania zbiorów zadań z wykorzystaniem znanych paradygmatów obsługi zdarzeń i sygnatury funkcji GCF. Zamiast korzystać z naszego procesu kompilacji i konfiguracji wdrożenia, funkcje Cloud Run zapewniają bezpośrednią kontrolę nad usługą utworzoną w Cloud Run.

W tej sekcji dowiesz się, jak wdrożyć funkcję sterowaną zdarzeniami w Pythonie, która używa Gemini do podsumowywania pliku tekstowego przesłanego do zasobnika Cloud Storage.

Czego się nauczysz

  • Jak wdrożyć funkcję Cloud Run opartą na zdarzeniach, która jest wywoływana za każdym razem, gdy obiekt jest przesyłany do zasobnika GCS
  • Jak utworzyć konto usługi z odpowiednimi rolami, aby otrzymywać zdarzenia z Cloud Storage i wywoływać funkcję Cloud Run
  • Jak używać Gemini do podsumowywania dokumentu w formacie zwykłego tekstu przesłanego do Cloud Storage

2. Konfigurowanie zmiennych środowiskowych i włączanie interfejsów API

Aktualizowanie gcloud CLI

To ćwiczenie wymaga zainstalowania najnowszej wersji interfejsu gcloud CLI. Aby zaktualizować interfejs CLI, uruchom

gcloud components update

Włącz interfejsy API

Zanim zaczniesz korzystać z tego ćwiczenia w Codelabs, musisz włączyć kilka interfejsów API. W tym ćwiczeniu musisz użyć tych interfejsów API: Możesz włączyć te interfejsy API, uruchamiając to polecenie:

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

Konfigurowanie zmiennych środowiskowych

Możesz ustawić zmienne środowiskowe, których będziesz używać podczas naszych ćwiczeń z programowania.

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. Tworzenie zasobnika Cloud Storage i konta usługi

Utworzenie zasobnika na dane

Zasobnik Cloud Storage możesz utworzyć, uruchamiając to polecenie:

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

Tworzenie konta usługi

W tym przykładzie utworzysz konto usługi z wymaganymi uprawnieniami EventArc i rolą wywołującego Cloud Run, aby otrzymywać zdarzenia z Cloud Storage i wywoływać funkcję Cloud Run.

Najpierw utwórz konto usługi.

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"

Następnie przyznaj w projekcie rolę Odbiorca zdarzeń Eventarc (roles/eventarc.eventReceiver) kontu usługi powiązanemu z aktywatorem Eventarc, aby aktywator mógł odbierać zdarzenia od dostawców zdarzeń.

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

Następnie przypisz do konta usługi rolę wywołującego Cloud Run, aby mogło wywoływać funkcję.

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

Teraz przypisz kontu usługi rolę użytkownika AI Platform, aby mogło ono wykonywać wywołania Gemini.

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

Następnie przypisz do konta usługi rolę wyświetlającego obiekty Cloud Storage, aby umożliwić mu dostęp do pliku.

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

Aby można było tworzyć tokeny tożsamości, Cloud Pub/Sub wymaga w Twoim projekcie roli roles/iam.serviceAccountTokenCreator.

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

Aby aktywator mógł otrzymywać zdarzenia za pośrednictwem Cloud Storage, do konta usługi Google Cloud Storage musi być przypisana rola roles/pubsub.publisher.

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

4. Tworzenie i wdrażanie funkcji

Najpierw utwórz katalog kodu źródłowego i przejdź do niego.

mkdir $SERVICE_NAME && cd $_

Następnie utwórz plik requirements.txt o tej treści:

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

Następnie utwórz plik main.py o tej treści:

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

Teraz możesz wdrożyć funkcję Cloud Run, uruchamiając to polecenie:

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

Uwaga:

  • Flaga --source informuje Cloud Run, że funkcja ma zostać skompilowana w usługę opartą na kontenerze, którą można uruchomić.
  • Flaga --function (nowa) służy do ustawiania punktu wejścia nowej usługi jako sygnatury funkcji, którą chcesz wywołać.
  • (opcjonalnie) --no-allow-unauthenticated, aby uniemożliwić publiczne wywoływanie funkcji.

Może pojawić się pytanie „Wdrażanie ze źródła wymaga repozytorium Dockera w Artifact Registry do przechowywania skompilowanych kontenerów. Utworzone zostanie repozytorium o nazwie [cloud-run-source-deploy] w regionie [<YOUR_REGION>]. Zaakceptuj domyślną odpowiedź „yes”, aby utworzyć repozytorium.

Aby wyświetlić nową usługę crf-vertexai-codelab, uruchom to polecenie:

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

5. Tworzenie zdarzenia

Możemy utworzyć aktywator Eventarc, który będzie wysyłać wiadomości do naszej funkcji za każdym razem, gdy obiekt zostanie sfinalizowany w 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

Pamiętaj, że w przypadku flagi --event-filters w nazwie zasobnika nie należy używać prefiksu gs://.

Jeśli pojawi się błąd If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent., poczekaj kilka minut i spróbuj ponownie.

Szczegółowy samouczek dotyczący konfigurowania usługi aktywatora z Cloud Storage za pomocą Eventarc znajdziesz w dokumentacji Cloud Run: https://cloud.google.com/run/docs/tutorials/eventarc

6. Testowanie funkcji

Po wdrożeniu funkcji i utworzeniu aktywatora możemy wywołać funkcję.

Utwórz plik i prześlij go do zasobnika Cloud Storage. Możesz to zrobić w interfejsie internetowym konsoli Cloud lub za pomocą narzędzia wiersza poleceń gsutil, np.

gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME

Po przesłaniu pliku zostanie wygenerowane zdarzenie, a funkcja wywoła Gemini, aby podsumować plik tekstowy. Podsumowanie zostanie zapisane w logach.

Logi usługi Cloud Run możesz wyświetlić w Cloud Console lub uruchomić to polecenie:

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

Na przykład przesłanie pliku tekstowego z przewodnikiem użytkownika funkcji Cloud Run w ramach prywatnej wersji podglądowej spowoduje wydrukowanie w logach tych informacji:

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

Gratulujemy ukończenia ćwiczenia!

Zalecamy zapoznanie się z dokumentacją funkcji Cloud Run.

Omówione zagadnienia

  • Jak wdrożyć funkcję Cloud Run opartą na zdarzeniach, która jest wywoływana za każdym razem, gdy obiekt jest przesyłany do zasobnika GCS
  • Jak utworzyć konto usługi z odpowiednimi rolami, aby otrzymywać zdarzenia z Cloud Storage i wywoływać funkcję Cloud Run
  • Jak używać Gemini do podsumowywania dokumentu w formacie zwykłego tekstu przesłanego do Cloud Storage

8. Czyszczenie danych

Aby uniknąć przypadkowych opłat (np. jeśli ta usługa Cloud Run zostanie przypadkowo wywołana więcej razy niż miesięczny limit wywołań Cloud Run w warstwie bezpłatnej), możesz usunąć usługę Cloud Run lub projekt utworzony w kroku 2.

Aby usunąć usługi Cloud Run, otwórz konsolę Cloud Run w konsoli Cloud pod adresem https://console.cloud.google.com/run/ i usuń usługę crf-vertexai-codelab utworzoną w tym ćwiczeniu.

Jeśli zdecydujesz się usunąć cały projekt, otwórz stronę https://console.cloud.google.com/cloud-resource-manager, wybierz projekt utworzony w kroku 2 i kliknij Usuń. Jeśli usuniesz projekt, musisz zmienić projekty w Cloud SDK. Listę wszystkich dostępnych projektów możesz wyświetlić, uruchamiając polecenie gcloud projects list.