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

1. 簡介

總覽

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

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

課程內容

  • 如何部署事件驅動型 Cloud Run 函式,在物件上傳至 GCS bucket 時觸發
  • 如何建立具備適當角色的服務帳戶,以便接收 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 bucket:

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

如要透過 Cloud Storage 接收事件,您的觸發條件必須將 roles/pubsub.publisher 角色授予 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. 建立及部署函式

首先,請建立原始碼的目錄,然後 cd 到該目錄。

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,避免函式可公開叫用

系統可能會詢問「Deploying from source requires an Artifact Registry Docker repository to store built containers. 系統會在 [<YOUR_REGION>] 區域中建立名為 [cloud-run-source-deploy] 的存放區。接受預設的「yes」來建立存放區。

執行下列指令,即可查看新服務 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 旗標時,請勿在 bucket 名稱中使用 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 bucket。您可以使用 Cloud 控制台網頁介面或 gsutil CLI 工具完成這項操作,例如:

gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME

檔案上傳成功後,系統會產生事件,函式也會呼叫 Gemini,為純文字檔建立摘要。摘要會列印到記錄檔。

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

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

舉例來說,上傳 Cloud Run functions 使用者指南的純文字檔 (私人搶先版),會在記錄中列印下列內容:

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 functions 說明文件

涵蓋內容

  • 如何部署事件驅動型 Cloud Run 函式,在物件上傳至 GCS bucket 時觸發
  • 如何建立具備適當角色的服務帳戶,以便接收 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