如何使用 Cloud Run 函数和 Gemini 汇总上传到 Cloud Storage 存储分区的文本文件

如何使用 Cloud Run 函数和 Gemini 对上传到 Cloud Storage 存储分区的文本文件进行总结

关于此 Codelab

subject上次更新时间:8月 30, 2024
account_circleGoogle 员工编写

1. 简介

Cloud Run 函数是一种使用熟悉的 GCF 事件范式和函数签名部署工作负载的新方式。借助 Cloud Run functions,您可以直接控制在 Cloud Run 上创建的底层服务,而无需使用我们的强制性构建流程和部署配置。

在本部分中,您将学习如何使用 Python 部署事件驱动型函数,该函数使用 Gemini 对上传到 Cloud Storage 存储分区的纯文本文件进行总结。

  • 如何部署一个事件驱动的 Cloud Run 函数,以便在有对象上传到 GCS 存储分区时触发该函数
  • 如何创建具有适当角色的服务账号,以接收来自 Cloud Storage 的事件并调用 Cloud Run 函数
  • 如何使用 Gemini 总结上传到 Cloud Storage 的纯文本文档

2. 设置环境变量并启用 API

更新 gcloud CLI

本 Codelab 要求安装较新版本的 gcloud CLI。您可以通过运行以下命令来更新 CLI

gcloud components update

启用 API

在开始使用此 Codelab 之前,您需要先启用几个 API。此 Codelab 需要使用以下 API。您可以通过运行以下命令来启用这些 API:

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

设置环境变量

您可以设置将在此 Codelab 中全程使用的环境变量。

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 Invoker 角色的服务账号,以便从 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 Event Receiver 角色 (roles/eventarc.eventReceiver) 授予与您的 Eventarc 触发器关联的服务账号,以便该触发器可以接收来自事件提供程序的事件。

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

然后,向服务账号授予 Cloud Run Invoker 角色,以便其可以调用函数。

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

现在,向服务账号授予 AI Platform User 角色,以便它可以调用 Gemini。

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

并向服务账号授予 Storage Object Viewer 角色,以便其访问文件。

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

您的触发器需要向 Google Cloud Storage 服务账号授予 roles/pubsub.publisher 角色,才能通过 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,用于防止函数被公开调用

系统可能会提示您“从源代码部署需要有 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 控制台 Web 界面或使用 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 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. 恭喜!

恭喜您完成此 Codelab!

建议您查看 Cloud Run 函数文档

所学内容

  • 如何部署一个事件驱动的 Cloud Run 函数,以便在有对象上传到 GCS 存储分区时触发该函数
  • 如何创建具有适当角色的服务账号,以接收来自 Cloud Storage 的事件并调用 Cloud Run 函数
  • 如何使用 Gemini 对上传到 Cloud Storage 的纯文本文档进行总结

8. 清理

为避免意外产生费用(例如,如果此 Cloud Run 服务的意外调用次数超出了免费层级的 Cloud Run 调用月度配额),您可以删除该 Cloud Run 服务,也可以删除您在第 2 步中创建的项目。

如需删除 Cloud Run 服务,请前往 https://console.cloud.google.com/run/ 访问 Cloud Run Cloud 控制台,然后删除您在此 Codelab 中创建的 crf-vertexai-codelab 服务。

如果您选择删除整个项目,可以前往 https://console.cloud.google.com/cloud-resource-manager,选择您在第 2 步中创建的项目,然后选择“删除”。如果您删除该项目,则需要在 Cloud SDK 中更改项目。您可以通过运行 gcloud projects list 来查看所有可用项目的列表。