如何使用 Cloud Run 函式和 Gemini,針對上傳至 Cloud Storage 值區的文字檔案製作摘要

1. 簡介

總覽

Cloud Run 函式是一種新方法,可使用熟悉的 GCF 事件模式和函式簽章來部署工作負載。您可以直接控管在 Cloud Run 上建立的基礎服務,而非使用我們的建構程序和部署設定。

在本節中,您將瞭解如何在 Python 中部署以事件為準的函式,利用 Gemini 摘要上傳至 Cloud Storage 值區的純文字檔。

課程內容

  • 如何部署事件驅動的 Cloud Run 函式,以便在物件上傳至 GCS 儲存桶時觸發
  • 如何建立具有適當角色的服務帳戶,以便接收 Cloud Storage 事件並叫用 Cloud Run 函式
  • 如何使用 Gemini 摘要上傳至 Cloud Storage 的純文字文件

2. 設定環境變數並啟用 API

更新 gcloud CLI

這個程式碼研究室需要安裝最新版本的 gcloud CLI。您可以執行以下命令來更新 CLI:

gcloud components update

啟用 API

開始使用本程式碼研究室之前,您必須先啟用多個 API。本程式碼研究室需要使用下列 API。您可以執行下列指令來啟用這些 API:

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

設定環境變數

您可以設定將在本程式碼研究室中使用的環境變數。

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. 建立儲存空間值區和服務帳戶

建立儲存空間值區

您可以執行下列指令來建立 Cloud Storage 值區:

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

建立服務帳戶

在本範例中,您將建立具有必要 EventArc 權限和 Cloud Run 叫用者角色的服務帳戶,接收 Cloud Storage 的事件並叫用 Cloud Run 函式。

首先,請建立服務帳戶。

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"

接著,將專案中的 Eventarc 事件接收者角色 (roles/eventarc.eventReceiver) 授予與 Eventarc 觸發條件相關聯的服務帳戶,讓觸發條件能夠接收事件供應者的事件。

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

接著,將 Cloud Run 叫用者角色授予服務帳戶,讓服務帳戶能夠叫用函式。

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

現在,請授予服務帳戶 AI Platform 使用者角色,讓服務帳戶能夠呼叫 Gemini。

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

並授予服務帳戶「Storage 物件檢視者」角色,讓服務帳戶可以存取檔案。

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

Cloud Pub/Sub 需要專案上的 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

您必須將 roles/pubsub.publisher 角色授予 Google Cloud Storage 服務帳戶,這項觸發條件才能透過 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. 建立及部署函式

首先,請建立原始碼目錄,然後切換至該目錄。

mkdir $SERVICE_NAME && cd $_

接著,請使用以下內容建立 requirements.txt 檔案:

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

接下來,請建立含有下列內容的 main.py 檔案:

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

您現在可以執行下列指令,部署 Cloud Run 函式:

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

請注意下列事項:

  • --source 旗標可用於告知 Cloud Run 將函式建構為可執行的容器型服務
  • --function 標記 (新) 用於將新服務的進入點設為要叫用的函式簽章
  • (選用) --no-allow-unauthenticated 可避免您的函式可公開叫用

系統可能會詢問:「透過來源部署時,必須具備 Artifact Registry Docker 存放區來儲存已建構的容器。系統會在 [<YOUR_REGION>] 區域中建立名為 [cloud-run-source-deploy] 的存放區。」接受預設的「是」選項,即可建立存放區。

您可以執行下列指令,查看新的服務 crf-vertexai-codelab

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

5. 建立事件

我們可以建立 Eventarc 觸發條件,以在 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

請注意,如果使用 --event-filters 標記,請勿在值區名稱中使用 gs:// 前置字串。

如果出現 If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent. 錯誤,請稍候幾分鐘,然後再試一次。

如要瞭解如何使用 Eventarc 設定 Cloud Storage 的觸發事件服務,請參閱 Cloud Run 說明文件:https://cloud.google.com/run/docs/tutorials/eventarc

6. 測試函式

函式已部署,觸發條件也已建立,現在可以叫用函式了。

建立檔案並上傳至 Cloud Storage 值區。您可以透過 Cloud 控制台網頁介面或 gsutil CLI 工具完成這項操作,例如:

gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME

檔案上傳成功後,系統會產生事件,函式也會呼叫 Gemini 來摘要純文字檔案。系統會將摘要顯示在記錄檔中。

您可以在 Cloud 控制台中查看 Cloud Run 服務的記錄檔,也可以執行下列指令:

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

舉例來說,上傳 Cloud Run 函式使用者指南的純文字檔案,以便在記錄檔中列印以下私人預覽結果:

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. 恭喜!

恭喜您完成本程式碼研究室!

建議您參考 Cloud Run 函式的說明文件

涵蓋內容

  • 如何部署以事件為準的 Cloud Run 函式,該函式會在每次物件上傳至 GCS 值區時觸發
  • 如何建立具有適當角色的服務帳戶,以便接收 Cloud Storage 事件並叫用 Cloud Run 函式
  • 如何使用 Gemini 摘要上傳至 Cloud Storage 的純文字文件

8. 清除所用資源

為避免產生意外費用 (舉例來說,如果不小心叫用這項 Cloud Run 服務的次數超過免費方案的每月 Cloud Run 叫用分配數量),您可以刪除 Cloud Run 服務,或刪除步驟 2 中建立的專案。

如要刪除 Cloud Run 服務,請前往 Cloud Run Cloud 控制台 (https://console.cloud.google.com/run/),然後刪除您在本程式碼研究室中建立的 crf-vertexai-codelab 服務。

如果選擇刪除整個專案,您可以前往 https://console.cloud.google.com/cloud-resource-manager,選取您在步驟 2 建立的專案,然後選擇「刪除」。如果您刪除專案,就必須在 Cloud SDK 中變更專案。您可以執行 gcloud projects list 來查看所有可用專案的清單。