Cách sử dụng các hàm trong Cloud Run và Gemini để tóm tắt tệp văn bản đã tải lên bộ chứa Cloud Storage

1. Giới thiệu

Tổng quan

Hàm Cloud Run là một cách mới để triển khai khối lượng công việc bằng cách sử dụng các mô hình sự kiện và chữ ký hàm GCF quen thuộc. Thay vì sử dụng quy trình xây dựng và cấu hình triển khai theo ý kiến của chúng tôi, hàm Cloud Run cho phép bạn kiểm soát trực tiếp Dịch vụ cơ bản được tạo trên Cloud Run.

Trong phần này, bạn sẽ tìm hiểu cách triển khai một hàm dựa trên sự kiện trong Python sử dụng Gemini để tóm tắt một tệp văn bản thuần tuý được tải lên một bộ chứa Cloud Storage.

Kiến thức bạn sẽ học được

  • Cách triển khai một hàm Cloud Run dựa trên sự kiện được kích hoạt bất cứ khi nào một đối tượng được tải lên một bộ chứa GCS
  • Cách tạo một tài khoản dịch vụ có các vai trò phù hợp để nhận một sự kiện từ Cloud Storage và gọi hàm Cloud Run
  • Cách sử dụng Gemini để tóm tắt một tài liệu văn bản thuần tuý được tải lên Cloud Storage

2. Thiết lập biến môi trường và bật API

Cập nhật gcloud CLI

Lớp học lập trình này yêu cầu cài đặt một phiên bản gần đây của gcloud CLI. Bạn có thể cập nhật CLI bằng cách chạy

gcloud components update

Bật API

Trước khi có thể bắt đầu sử dụng lớp học lập trình này, bạn cần bật một số API. Lớp học lập trình này yêu cầu sử dụng các API sau. Bạn có thể bật các API đó bằng cách chạy lệnh sau:

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

Thiết lập biến môi trường

Bạn có thể thiết lập các biến môi trường sẽ được sử dụng trong suốt lớp học lập trình này.

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. Tạo một bộ chứa Storage và một tài khoản dịch vụ

Tạo một bộ chứa Storage

Bạn có thể tạo một bộ chứa Cloud Storage bằng cách chạy lệnh sau:

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

Tạo một tài khoản dịch vụ

Trong ví dụ này, bạn sẽ tạo một tài khoản dịch vụ có các quyền EventArc bắt buộc và vai trò trình gọi Cloud Run để nhận một sự kiện từ Cloud Storage và gọi hàm Cloud Run.

Trước tiên, hãy tạo tài khoản dịch vụ.

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"

Tiếp theo, hãy cấp vai trò Eventarc Event Receiver (Trình nhận sự kiện Eventarc) (roles/eventarc.eventReceiver) trên dự án cho tài khoản dịch vụ được liên kết với điều kiện kích hoạt Eventarc để điều kiện kích hoạt có thể nhận các sự kiện từ nhà cung cấp sự kiện.

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

Sau đó, hãy cấp cho tài khoản dịch vụ vai trò trình gọi Cloud Run để tài khoản đó có thể gọi hàm.

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

Bây giờ, hãy cấp cho tài khoản dịch vụ vai trò Người dùng Nền tảng Trí tuệ nhân tạo để tài khoản đó có thể thực hiện các lệnh gọi đến Gemini.

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

Và cấp cho tài khoản dịch vụ vai trò Người xem đối tượng lưu trữ để tài khoản đó có thể truy cập vào tệp.

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

Cloud Pub/Sub cần vai trò roles/iam.serviceAccountTokenCreator trên dự án của bạn để tạo mã thông báo nhận dạng.

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

Trình kích hoạt của bạn cần vai trò roles/pubsub.publisher được cấp cho tài khoản dịch vụ Google Cloud Storage để nhận các sự kiện thông qua 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. Tạo và triển khai hàm

Trước tiên, hãy tạo một thư mục cho mã nguồn và cd vào thư mục đó.

mkdir $SERVICE_NAME && cd $_

Sau đó, hãy tạo một tệp requirements.txt có nội dung sau:

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

Tiếp theo, hãy tạo một tệp main.py có nội dung sau:

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

Bây giờ, bạn có thể triển khai hàm Cloud Run bằng cách chạy lệnh sau:

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

Xin lưu ý những điều sau:

  • cờ --source được dùng để yêu cầu Cloud Run xây dựng hàm thành một dịch vụ dựa trên vùng chứa có thể chạy
  • cờ --function (mới) được dùng để đặt điểm nhập của dịch vụ mới thành chữ ký hàm mà bạn muốn gọi
  • (không bắt buộc) --no-allow-unauthenticated để ngăn hàm của bạn có thể được gọi công khai

Bạn có thể được hỏi "Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository named [cloud-run-source-deploy] in region [<YOUR_REGION>] will be created." Chấp nhận giá trị mặc định là có để tạo kho lưu trữ.

Bạn có thể xem dịch vụ mới crf-vertexai-codelab bằng cách chạy lệnh sau:

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

5. Tạo sự kiện

Chúng ta có thể tạo một điều kiện kích hoạt Eventarc để gửi thông báo đến hàm của mình mỗi khi một đối tượng được hoàn tất trong 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

Xin lưu ý đối với cờ --event-filters, đừng sử dụng tiền tố gs:// trong tên bộ chứa.

Nếu bạn thấy lỗi If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent. (Nếu bạn mới bắt đầu sử dụng Eventarc, có thể mất vài phút trước khi tất cả các quyền cần thiết được truyền đến Tác nhân dịch vụ), vui lòng đợi vài phút rồi thử lại.

Bạn có thể tìm thấy hướng dẫn chi tiết về cách thiết lập dịch vụ Trình kích hoạt từ Cloud Storage bằng Eventarc trong tài liệu Cloud Run tại đây: https://cloud.google.com/run/docs/tutorials/eventarc

6. Kiểm thử hàm

Sau khi triển khai hàm và tạo điều kiện kích hoạt, giờ đây, chúng ta đã sẵn sàng gọi hàm.

Tạo một tệp và tải tệp đó lên bộ chứa Cloud Storage. Bạn có thể thực hiện việc này thông qua giao diện web Cloud Console hoặc bằng công cụ CLI gsutil, ví dụ:

gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME

Khi tệp được tải lên thành công, một sự kiện sẽ được tạo và hàm của bạn sẽ gọi Gemini để tóm tắt tệp văn bản thuần tuý. Nội dung tóm tắt sẽ được in vào nhật ký.

Bạn có thể xem nhật ký trong Cloud Console cho dịch vụ Cloud Run hoặc chạy lệnh sau:

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

Ví dụ: việc tải một tệp văn bản thuần tuý của hướng dẫn sử dụng hàm Cloud Run cho bản xem trước riêng tư sẽ dẫn đến kết quả sau được in vào nhật ký:

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. Xin chúc mừng!

Chúc mừng bạn đã hoàn thành lớp học lập trình này!

Bạn nên xem lại tài liệu về hàm Cloud Run

Nội dung chúng ta đã đề cập

  • Cách triển khai một hàm Cloud Run dựa trên sự kiện được kích hoạt bất cứ khi nào một đối tượng được tải lên một bộ chứa GCS
  • Cách tạo một tài khoản dịch vụ có các vai trò phù hợp để nhận một sự kiện từ Cloud Storage và gọi hàm Cloud Run
  • Cách sử dụng Gemini để tóm tắt một tài liệu văn bản thuần tuý được tải lên Cloud Storage

8. Dọn dẹp

Để tránh bị tính phí ngoài ý muốn (ví dụ: nếu dịch vụ Cloud Run này vô tình được gọi nhiều lần hơn hạn mức gọi Cloud Run hằng tháng của bạn trong gói miễn phí), bạn có thể xoá dịch vụ Cloud Run hoặc xoá dự án mà bạn đã tạo ở Bước 2.

Để xoá các dịch vụ Cloud Run, hãy chuyển đến Cloud Run Cloud Console tại https://console.cloud.google.com/run/ rồi xoá dịch vụ crf-vertexai-codelab mà bạn đã tạo trong lớp học lập trình này.

Nếu chọn xoá toàn bộ dự án, bạn có thể chuyển đến https://console.cloud.google.com/cloud-resource-manager, chọn dự án mà bạn đã tạo ở Bước 2 rồi chọn Xoá. Nếu xoá dự án, bạn cần thay đổi dự án trong Cloud SDK. Bạn có thể xem danh sách tất cả các dự án hiện có bằng cách chạy gcloud projects list.