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 GCF và chữ ký hàm quen thuộc. Thay vì sử dụng quy trình xây dựng và cấu hình triển khai có sẵn, các 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. Hàm này sử dụng Gemini để tóm tắt một tệp văn bản thuần tuý đã tải lên bộ chứa Cloud Storage.

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

  • Cách triển khai 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 bộ chứa GCS
  • Cách tạo tài khoản dịch vụ có vai trò thích hợp để nhận sự kiện từ Cloud Storage và gọi hàm Cloud Run
  • Cách sử dụng Gemini để tóm tắ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 bạn đã cài đặt phiên bản gcloud CLI gần đây. 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 sẽ cần bật một số API. Lớp học lập trình này yêu cầu bạn 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 vùng chứa bộ nhớ và một tài khoản dịch vụ

Tạo bộ chứa lưu trữ

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ò 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 trình kích hoạt Eventarc để trình kích hoạt có thể nhận 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 này 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 AI để tài khoản này có thể thực hiện lệnh gọi đến Gemini.

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

Đồng thời, hãy 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 này 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

Điều kiện kích hoạt của bạn cần có vai trò roles/pubsub.publisher được cấp cho tài khoản dịch vụ Google Cloud Storage để nhận sự kiện 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 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 tạo 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 truy cậ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 gọi công khai

Bạn có thể được hỏi "Việc triển khai từ nguồn yêu cầu kho lưu trữ Docker của Cấu phần phần mềm để lưu trữ các vùng chứa đã tạo. Hệ thống sẽ tạo một kho lưu trữ có tên [cloud-run-source-deploy] trong khu vực [<YOUR_REGION>]." Chấp nhận lựa chọn 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 ý rằng đối với cờ --event-filters, khô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., vui lòng đợi vài phút rồi thử lại.

Bạn có thể xem hướng dẫn chi tiết về cách thiết lập dịch vụ Điều kiện kích hoạt từ Cloud Storage bằng Eventarc trong tài liệu về 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 một điều kiện kích hoạt, chúng ta hiện đã có thể gọi hàm đó.

Tạo một tệp rồi 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 của Cloud Console hoặc sử dụng công cụ dòng lệnh 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 tệp văn bản thuần tuý của hướng dẫn sử dụng các hàm Cloud Run lên đối với bản xem trước ở chế độ riêng tư sẽ dẫn đến những 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!

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

Nội dung đã đề cập

  • Cách triển khai một hàm Cloud Run do sự kiện điều khiển được kích hoạt bất cứ khi nào một đối tượng được tải lên bộ chứa GCS
  • Cách tạo tài khoản dịch vụ có vai trò thích hợp để nhận sự kiện từ Cloud Storage và gọi hàm Cloud Run
  • Cách sử dụng Gemini để tóm tắ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í do nhầm lẫn (ví dụ: nếu dịch vụ Cloud Run này vô tình được gọi nhiều lần hơn mức phân bổ số lần gọi Cloud Run hằng tháng trong cấp 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 truy cập vào Cloud Console của Cloud Run 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ể truy cập vào 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 sẽ cần thay đổi các dự án trong SDK trên đám mây. Bạn có thể xem danh sách tất cả dự án hiện có bằng cách chạy gcloud projects list.