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

1. Wprowadzenie

Omówienie

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

W tej sekcji dowiesz się, jak wdrożyć w języku Python funkcję opartą na zdarzeniach, która używa Gemini do podsumowania zwykłego pliku tekstowego przesłanego do zasobnika Cloud Storage.

Czego się nauczysz

  • Jak wdrożyć funkcję Cloud Run sterowaną zdarzeniami, 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 odbierać zdarzenia z Cloud Storage i wywoływać funkcję Cloud Run
  • Jak używać Gemini do streszczania dokumentów tekstowych przesłanych do Cloud Storage

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

Aktualizacja interfejsu wiersza poleceń gcloud

Ten warsztat wymaga zainstalowania najnowszej wersji interfejsu wiersza poleceń gcloud. Aby zaktualizować interfejs wiersza poleceń, uruchom:

gcloud components update

Włącz interfejsy API

Zanim zaczniesz korzystać z tego ćwiczenia, musisz włączyć kilka interfejsów API. Ten warsztat wymaga korzystania z tych interfejsów API. Aby włączyć te interfejsy API, uruchom 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óre będą używane podczas tego ćwiczenia 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 danych i konta usługi

Utwórz zasobnik 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, które umożliwi odbieranie zdarzenia z Cloud Storage i wywoływanie funkcji 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 przypisz do konta usługi powiązanego z aktywatorem Eventarc rolę Odbiorca zdarzenia Eventarc (roles/eventarc.eventReceiver) w projekcie, 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 umożliwić mu wywoływanie funkcji.

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

Przypisz teraz temu kontu usługi rolę Użytkownik AI Platform, aby mogło ono wykonywać wywołania do Gemini.

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

Przypisz do konta usługi rolę wyświetlającego obiekty Cloud Storage, aby uzyskać 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 przypisania w tym 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 możliwe było otrzymywanie zdarzeń za pomocą Cloud Storage, aktywator wymaga przypisania do konta usługi Google Cloud Storage roli role/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. Utwórz i wdróż funkcję

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

mkdir $SERVICE_NAME && cd $_

Następnie utwórz plik requirements.txt z podaną niżej treścią:

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

Następnie utwórz plik main.py z podaną niżej 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 jest używana do tego, aby usługa Cloud Run skompilowała funkcję w uruchomionej usłudze opartej na kontenerze
  • flaga --function (nowa) jest używana do ustawienia punktu wejścia nowej usługi jako podpisu funkcji, która ma być wywoływana
  • (opcjonalnie) --no-allow-unauthenticated, aby uniemożliwić publiczne wywołanie funkcji

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

Możesz wyświetlić nową usługę crf-vertexai-codelab, uruchamiając to polecenie:

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

5. Tworzenie zdarzenia

Możemy utworzyć w usłudze Eventarc funkcję, która 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

Uwaga: w przypadku flagi --event-filters nie używaj prefiksu gs:// w nazwie zasobnika.

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 konfigurowania usługi Trigger z Cloud Storage za pomocą Eventarc znajdziesz w dokumentacji Cloud Run: https://cloud.google.com/run/docs/tutorials/eventarc.

6. Przetestuj funkcję

Funkcja została wdrożona, a jej aktywator został utworzony, więc możemy ją wywołać.

Utwórz plik i prześlij go do zasobnika Cloud Storage. Możesz to zrobić w interfejsie internetowym Cloud Console 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 Twoja funkcja wywoła Gemini, aby podsumować plik tekstowy. Podsumowanie zostanie wydrukowane w dziennikach.

Możesz wyświetlić logi w Cloud Console dla usługi Cloud Run 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 testowej spowoduje wydrukowanie tego tekstu w logach:

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 sterowaną zdarzeniami, 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 odbierać zdarzenia z Cloud Storage i wywoływać funkcję Cloud Run
  • Jak za pomocą Gemini podsumować dokument w postaci zwykłego tekstu przesłany 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 ramach wersji bezpłatnej), możesz usunąć usługę Cloud Run lub projekt utworzony w kroku 2.

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

Jeśli chcesz 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. Aby wyświetlić listę wszystkich dostępnych projektów, uruchom gcloud projects list.