1. 简介
在此 Codelab 中,您将学习如何部署 GenAI Retrieval Service,并使用部署的环境创建示例交互式应用。
您可以点击此处,详细了解 GenAI Retrieval Service 和示例应用。
前提条件
- 对 Google Cloud 控制台有基本的了解
- 具备命令行界面和 Google Cloud Shell 方面的基本技能
学习内容
- 如何部署 AlloyDB 集群
- 如何连接到 AlloyDB
- 如何配置和部署 GenAI Databases Retrieval Service
- 如何使用已部署的服务来部署示例应用
所需条件
- Google Cloud 账号和 Google Cloud 项目
- 网络浏览器,例如 Chrome
2. 设置和要求
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。
- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用
PROJECT_ID
标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。 - 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除项目。Google Cloud 新用户符合参与 300 美元免费试用计划的条件。
启动 Cloud Shell
虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。
在 Google Cloud 控制台 中,点击右上角工具栏中的 Cloud Shell 图标:
预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:
这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。您在此 Codelab 中的所有工作都可以在浏览器中完成。您无需安装任何程序。
3. 准备工作
启用 API
输出如下:
在 Cloud Shell 中,确保项目 ID 已设置:
通常,项目 ID 会显示在 Cloud Shell 命令提示符中的括号内,如下图所示:
gcloud config set project [YOUR-PROJECT-ID]
然后,将 PROJECT_ID 环境变量设置为您的 Google Cloud 项目 ID:
PROJECT_ID=$(gcloud config get-value project)
启用所有必要的服务:
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
vpcaccess.googleapis.com \
aiplatform.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
run.googleapis.com \
iam.googleapis.com
预期输出
student@cloudshell:~ (gleb-test-short-004)$ gcloud services enable alloydb.googleapis.com \ compute.googleapis.com \ cloudresourcemanager.googleapis.com \ servicenetworking.googleapis.com \ vpcaccess.googleapis.com \ aiplatform.googleapis.com \ cloudbuild.googleapis.com \ artifactregistry.googleapis.com \ run.googleapis.com \ iam.googleapis.com Operation "operations/acf.p2-404051529011-664c71ad-cb2b-4ab4-86c1-1f3157d70ba1" finished successfully.
4. 部署 AlloyDB 集群
创建 AlloyDB 集群和主实例。以下步骤介绍了如何使用 Google Cloud SDK 创建 AlloyDB 集群和实例。如果您更喜欢使用控制台方法,可以按照此处的文档操作。
在创建 AlloyDB 集群之前,我们需要在 VPC 中有一个可用的专用 IP 范围,以供未来的 AlloyDB 实例使用。如果没有,我们需要创建一个,并将其分配给 Google 内部服务使用,然后才能创建集群和实例。
创建专用 IP 范围
我们需要在 VPC 中为 AlloyDB 配置专用服务访问配置。这里假设我们的项目中有“默认”VPC 网络,它将用于所有操作。
创建专用 IP 范围:
gcloud compute addresses create psa-range \
--global \
--purpose=VPC_PEERING \
--prefix-length=24 \
--description="VPC private service access" \
--network=default
使用分配的 IP 范围创建专用连接:
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=psa-range \
--network=default
预期的控制台输出:
student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \ --global \ --purpose=VPC_PEERING \ --prefix-length=24 \ --description="VPC private service access" \ --network=default Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range]. student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \ --service=servicenetworking.googleapis.com \ --ranges=psa-range \ --network=default Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully. student@cloudshell:~ (test-project-402417)$
创建 AlloyDB 集群
在本部分中,我们将在 us-central1 区域创建一个 AlloyDB 集群。
为 postgres 用户定义密码。您可以自行定义密码,也可以使用随机函数生成密码
export PGPASSWORD=`openssl rand -hex 12`
预期的控制台输出:
student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`
请记下该 PostgreSQL 密码,以备将来使用。
echo $PGPASSWORD
日后,您需要使用该密码以 postgres 用户身份连接到实例。建议您记下该 ID 或将其复制到某个位置,以备日后使用。
预期的控制台输出:
student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD bbefbfde7601985b0dee5723
创建免费试用集群
如果您之前未使用过 AlloyDB,则可以创建免费的试用集群:
定义区域和 AlloyDB 集群名称。我们将使用 us-central1 区域和 alloydb-aip-01 作为集群名称:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
运行以下命令以创建集群:
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION \
--subscription-type=TRIAL
预期的控制台输出:
export REGION=us-central1 export ADBCLUSTER=alloydb-aip-01 gcloud alloydb clusters create $ADBCLUSTER \ --password=$PGPASSWORD \ --network=default \ --region=$REGION \ --subscription-type=TRIAL Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4 Creating cluster...done.
在同一 Cloud Shell 会话中,为我们的集群创建 AlloyDB 主实例。如果您断开连接,则需要重新定义区域和集群名称环境变量。
gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=8 \
--region=$REGION \
--cluster=$ADBCLUSTER
预期的控制台输出:
student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \ --instance-type=PRIMARY \ --cpu-count=8 \ --region=$REGION \ --availability-type ZONAL \ --cluster=$ADBCLUSTER Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721 Creating instance...done.
创建 AlloyDB Standard 集群
如果这不是项目中第一个 AlloyDB 集群,请继续创建标准集群。
定义区域和 AlloyDB 集群名称。我们将使用 us-central1 区域和 alloydb-aip-01 作为集群名称:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
运行以下命令以创建集群:
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION
预期的控制台输出:
export REGION=us-central1 export ADBCLUSTER=alloydb-aip-01 gcloud alloydb clusters create $ADBCLUSTER \ --password=$PGPASSWORD \ --network=default \ --region=$REGION Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4 Creating cluster...done.
在同一 Cloud Shell 会话中,为我们的集群创建 AlloyDB 主实例。如果您断开连接,则需要重新定义区域和集群名称环境变量。
gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=2 \
--region=$REGION \
--cluster=$ADBCLUSTER
预期的控制台输出:
student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \ --instance-type=PRIMARY \ --cpu-count=2 \ --region=$REGION \ --availability-type ZONAL \ --cluster=$ADBCLUSTER Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721 Creating instance...done.
5. 准备 GCE 虚拟机
创建服务账号
由于我们将使用虚拟机部署 GenAI Databases Retrieval Service 并托管示例应用,因此第一步是创建 Google 服务账号 (GSA)。GSA 将由 GCE 虚拟机使用,我们需要授予它与其他服务协同工作的必要权限。
在 Cloud Shell 中,执行以下命令:
PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts create compute-aip --project $PROJECT_ID
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/cloudbuild.builds.editor"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/artifactregistry.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/storage.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/run.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/alloydb.viewer"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/serviceusage.serviceUsageConsumer"
部署 GCE 虚拟机
在 AlloyDB 集群所在的区域和 VPC 中创建 GCE 虚拟机。
在 Cloud Shell 中,执行以下命令:
export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE \
--create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--service-account=compute-aip@$PROJECT_ID.iam.gserviceaccount.com
预期的控制台输出:
student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a gcloud compute instances create instance-1 \ --zone=$ZONE \ --create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \ --scopes=https://www.googleapis.com/auth/cloud-platform Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/zones/us-central1-a/instances/instance-1]. NAME: instance-1 ZONE: us-central1-a MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.0.2 EXTERNAL_IP: 34.71.192.233 STATUS: RUNNING
安装 Postgres 客户端
在已部署的虚拟机上安装 PostgreSQL 客户端软件
连接到虚拟机:
gcloud compute ssh instance-1 --zone=us-central1-a
预期的控制台输出:
student@cloudshell:~ (test-project-402417)$ gcloud compute ssh instance-1 --zone=us-central1-a Updating project ssh metadata...working..Updated [https://www.googleapis.com/compute/v1/projects/test-project-402417]. Updating project ssh metadata...done. Waiting for SSH key to propagate. Warning: Permanently added 'compute.5110295539541121102' (ECDSA) to the list of known hosts. Linux instance-1 5.10.0-26-cloud-amd64 #1 SMP Debian 5.10.197-1 (2023-09-29) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. student@instance-1:~$
在虚拟机内运行以下命令来安装软件:
sudo apt-get update
sudo apt-get install --yes postgresql-client
预期的控制台输出:
student@instance-1:~$ sudo apt-get update sudo apt-get install --yes postgresql-client Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] Get:4 file:/etc/apt/mirrors/debian-security.list Mirrorlist [39 B] Hit:7 https://packages.cloud.google.com/apt google-compute-engine-bookworm-stable InRelease Get:8 https://packages.cloud.google.com/apt cloud-sdk-bookworm InRelease [1652 B] Get:2 https://deb.debian.org/debian bookworm InRelease [151 kB] Get:3 https://deb.debian.org/debian bookworm-updates InRelease [55.4 kB] ...redacted... update-alternatives: using /usr/share/postgresql/15/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode Setting up postgresql-client (15+248) ... Processing triggers for man-db (2.11.2-2) ... Processing triggers for libc-bin (2.36-9+deb12u7) ...
连接到实例
使用 psql 从虚拟机连接到主实例。
使用已打开的 SSH 会话继续连接到虚拟机。如果您已断开连接,请使用与上面相同的命令重新连接。
使用前面记下的 $PGASSWORD 和集群名称从 GCE 虚拟机连接到 AlloyDB:
export PGPASSWORD=<Noted password>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
psql "host=$INSTANCE_IP user=postgres sslmode=require"
预期的控制台输出:
student@instance-1:~$ export PGPASSWORD=P9... student@instance-1:~$ export REGION=us-central1 student@instance-1:~$ export ADBCLUSTER=alloydb-aip-01 student@instance-1:~$ export INSTANCE_IP=export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)") student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres sslmode=require" psql (13.11 (Debian 13.11-0+deb11u1), server 14.7) WARNING: psql major version 13, server major version 14. Some psql features might not work. SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type "help" for help. postgres=>
退出 psql 会话,同时保持 SSH 连接:
exit
预期的控制台输出:
postgres=> exit student@instance-1:~$
6. 初始化数据库
我们将使用客户端虚拟机作为平台,向数据库填充数据并托管应用。第一步是创建数据库并为其填充数据。
创建数据库
创建一个名为“assistantdemo”的数据库。
在 GCE 虚拟机会话中,执行以下命令:
psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE assistantdemo"
预期的控制台输出:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE assistantdemo" CREATE DATABASE student@instance-1:~$
启用 pgVector 扩展程序。
psql "host=$INSTANCE_IP user=postgres dbname=assistantdemo" -c "CREATE EXTENSION vector"
预期的控制台输出:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=assistantdemo" -c "CREATE EXTENSION vector" CREATE EXTENSION student@instance-1:~$
准备 Python 环境
如要继续,我们将使用 GitHub 代码库中已准备好的 Python 脚本,但在此之前,我们需要安装所需的软件。
在 GCE 虚拟机中,执行以下命令:
sudo apt install -y python3.11-venv git
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
预期的控制台输出:
student@instance-1:~$ sudo apt install -y python3.11-venv git python3 -m venv .venv source .venv/bin/activate pip install --upgrade pip Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: git-man liberror-perl patch python3-distutils python3-lib2to3 python3-pip-whl python3-setuptools-whl Suggested packages: git-daemon-run | git-daemon-sysvinit git-doc git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn ed diffutils-doc The following NEW packages will be installed: git git-man liberror-perl patch python3-distutils python3-lib2to3 python3-pip-whl python3-setuptools-whl python3.11-venv 0 upgraded, 9 newly installed, 0 to remove and 2 not upgraded. Need to get 12.4 MB of archives. After this operation, 52.2 MB of additional disk space will be used. Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] ...redacted... Installing collected packages: pip Attempting uninstall: pip Found existing installation: pip 23.0.1 Uninstalling pip-23.0.1: Successfully uninstalled pip-23.0.1 Successfully installed pip-24.0 (.venv) student@instance-1:~$
验证 Python 版本。
在 GCE 虚拟机中,执行以下命令:
python -V
预期的控制台输出:
(.venv) student@instance-1:~$ python -V Python 3.11.2 (.venv) student@instance-1:~$
填充数据库
克隆包含检索服务和示例应用代码的 GitHub 代码库。
在 GCE 虚拟机中,执行以下命令:
git clone https://github.com/GoogleCloudPlatform/genai-databases-retrieval-app.git
预期的控制台输出:
student@instance-1:~$ git clone https://github.com/GoogleCloudPlatform/genai-databases-retrieval-app.git Cloning into 'genai-databases-retrieval-app'... remote: Enumerating objects: 525, done. remote: Counting objects: 100% (336/336), done. remote: Compressing objects: 100% (201/201), done. remote: Total 525 (delta 224), reused 179 (delta 135), pack-reused 189 Receiving objects: 100% (525/525), 46.58 MiB | 16.16 MiB/s, done. Resolving deltas: 100% (289/289), done.
准备配置文件
在 GCE 虚拟机中,执行以下命令:
cd genai-databases-retrieval-app/retrieval_service
cp example-config.yml config.yml
sed -i s/127.0.0.1/$INSTANCE_IP/g config.yml
sed -i s/my-password/$PGPASSWORD/g config.yml
sed -i s/my_database/assistantdemo/g config.yml
sed -i s/my-user/postgres/g config.yml
cat config.yml
预期的控制台输出:
student@instance-1:~$ cd genai-databases-retrieval-app/retrieval_service cp example-config.yml config.yml sed -i s/127.0.0.1/$INSTANCE_IP/g config.yml sed -i s/my-password/$PGPASSWORD/g config.yml sed -i s/my_database/assistantdemo/g config.yml sed -i s/my-user/postgres/g config.yml cat config.yml host: 0.0.0.0 # port: 8080 datastore: # Example for AlloyDB kind: "postgres" host: 10.65.0.2 # port: 5432 database: "assistantdemo" user: "postgres" password: "P9..."
使用示例数据集填充数据库。第一个命令会将所有必需的软件包添加到我们的 Python 虚拟环境中,第二个命令会将数据填充到数据库中。
在 GCE 虚拟机中,执行以下命令:
pip install -r requirements.txt
python run_database_init.py
预期的控制台输出(已隐去部分信息):
student@instance-1:~/genai-databases-retrieval-app/retrieval_service$ pip install -r requirements.txt python run_database_init.py Collecting asyncpg==0.28.0 (from -r requirements.txt (line 1)) Obtaining dependency information for asyncpg==0.28.0 from https://files.pythonhosted.org/packages/77/a4/88069f7935b14c58534442a57be3299179eb46aace2d3c8716be199ff6a6/asyncpg-0.28.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata Downloading asyncpg-0.28.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.3 kB) Collecting fastapi==0.101.1 (from -r requirements.txt (line 2)) ... database init done. student@instance-1:~/genai-databases-retrieval-app/retrieval_service$
7. 将检索服务部署到 Cloud Run
现在,我们可以将检索服务部署到 Cloud Run。该服务负责处理数据库,并根据 AI 应用的请求从数据库中提取必要信息。
创建服务账号
为检索服务创建服务账号并授予必要的权限。
使用顶部的“+”号打开另一个 Cloud Shell 标签页。
在新的 Cloud Shell 标签页中,执行以下命令:
export PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts create retrieval-identity
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
预期的控制台输出:
student@cloudshell:~ (gleb-test-short-003)$ gcloud iam service-accounts create retrieval-identity Created service account [retrieval-identity].
在标签页中执行命令“exit”,关闭该标签页:
exit
部署检索服务
在通过 SSH 连接到虚拟机的第一个标签页中,继续部署该服务。
在虚拟机 SSH 会话中,执行以下命令:
cd ~/genai-databases-retrieval-app
gcloud alpha run deploy retrieval-service \
--source=./retrieval_service/\
--no-allow-unauthenticated \
--service-account retrieval-identity \
--region us-central1 \
--network=default \
--quiet
预期的控制台输出:
student@instance-1:~/genai-databases-retrieval-app$ gcloud alpha run deploy retrieval-service \ --source=./retrieval_service/\ --no-allow-unauthenticated \ --service-account retrieval-identity \ --region us-central1 \ --network=default This command is equivalent to running `gcloud builds submit --tag [IMAGE] ./retrieval_service/` and `gcloud run deploy retrieval-service --image [IMAGE]` Building using Dockerfile and deploying container to Cloud Run service [retrieval-service] in project [gleb-test-short-003] region [us-central1] X Building and deploying... Done. ✓ Uploading sources... ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/6ebe74bf-3039-4221-b2e9-7ca8fa8dad8e?project=1012713954588]. ✓ Creating Revision... ✓ Routing traffic... Setting IAM Policy... Completed with warnings: Setting IAM policy failed, try "gcloud beta run services remove-iam-policy-binding --region=us-central1 --member=allUsers --role=roles/run.invoker retrieval-service" Service [retrieval-service] revision [retrieval-service-00002-4pl] has been deployed and is serving 100 percent of traffic. Service URL: https://retrieval-service-onme64eorq-uc.a.run.app student@instance-1:~/genai-databases-retrieval-app$
验证服务
现在,我们可以检查服务是否正常运行,以及虚拟机是否有权访问端点。我们使用 gcloud 实用程序获取检索服务端点。或者,您也可以在 Cloud 控制台中查看该值,并在 curl 命令中将 $(gcloud run services list –filter="(retrieval-service)" 替换为该值。
在虚拟机 SSH 会话中,执行以下命令:
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $(gcloud run services list --filter="(retrieval-service)" --format="value(URL)")
预期的控制台输出:
student@instance-1:~/genai-databases-retrieval-app$ curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $(gcloud run services list --filter="(retrieval-service)" --format="value(URL)") {"message":"Hello World"}student@instance-1:~/genai-databases-retrieval-app$
如果我们看到“Hello World”消息,则表示我们的服务已启动并正在处理请求。
8. 部署示例应用
现在,我们已启动并运行检索服务,可以部署将使用该服务的示例应用了。该应用可以部署在虚拟机或任何其他服务(如 Cloud Run、Kubernetes)上,甚至可以在本地部署到笔记本电脑上。下面我们将介绍如何在虚拟机上部署该应用。
准备好环境
我们继续使用相同的 SSH 会话在虚拟机上进行操作。为了运行我们的应用,我们需要添加一些 Python 模块。该命令将从同一 Python 虚拟环境中的应用目录中执行。
在虚拟机 SSH 会话中,执行以下命令:
cd ~/genai-databases-retrieval-app/llm_demo
pip install -r requirements.txt
预期输出(已隐去部分信息):
student@instance-1:~$ cd ~/genai-databases-retrieval-app/llm_demo pip install -r requirements.txt Collecting fastapi==0.104.0 (from -r requirements.txt (line 1)) Obtaining dependency information for fastapi==0.104.0 from https://files.pythonhosted.org/packages/db/30/b8d323119c37e15b7fa639e65e0eb7d81eb675ba166ac83e695aad3bd321/fastapi-0.104.0-py3-none-any.whl.metadata Downloading fastapi-0.104.0-py3-none-any.whl.metadata (24 kB) ...
准备客户 ID
如需使用应用的预订功能,我们需要使用 Cloud 控制台准备 OAuth 2.0 客户端 ID。否则,我们将无法使用 Google 凭据登录该应用进行预订。我们需要它来记录数据库中的预订数据。
在 Cloud 控制台中,前往“API 和服务”,然后点击“OAuth 同意屏幕”。这将打开 Oauth 概览页面,我们在其中点击“开始”。
在下一页上,提供应用名称、用户支持电子邮件地址,然后点击“下一步”。
在下一个屏幕上,我们为应用选择“内部”,然后再次点击“下一步”。
然后,再次提供联系电子邮件地址,然后点击“下一步”
然后,我们同意 Google API 服务政策,并点击“创建”按钮。
这会将我们引导至可创建 OAuth 客户端的页面。
在屏幕上,从下拉菜单中选择“Web 应用”,将“Cymbal Air”作为应用,然后点击“添加 URI”按钮。
这些 URI 代表应用的可信来源,具体取决于您尝试从哪里访问应用。我们将“https://localhost:8081”作为已获授权的 URI,将“https://localhost:8081/login/google”作为重定向 URI。如果您在浏览器中输入“https://localhost:8081”作为连接的 URI,这些值就会起作用。例如,当您通过计算机的 SSH 隧道连接时。我稍后会向您展示具体操作。
点击“创建”按钮后,您会看到一个弹出式窗口,其中包含客户端凭据。系统会记录凭据。您可以随时复制客户端 ID,以便在启动应用时使用。
稍后,您会看到提供该客户 ID 的位置。
运行助理应用
在启动应用之前,我们需要设置一些环境变量。应用的基本功能(例如查询航班和机场服务设施)只需要 BASE_URL,用于将应用指向检索服务。我们可以使用 gcloud 命令获取该 ID。
在虚拟机 SSH 会话中,执行以下命令:
export BASE_URL=$(gcloud run services list --filter="(retrieval-service)" --format="value(URL)")
预期输出(已隐去部分信息):
student@instance-1:~/genai-databases-retrieval-app/llm_demo$ export BASE_URL=$(gcloud run services list --filter="(retrieval-service)" --format="value(URL)")
如需使用应用的更高级功能(例如预订和更改航班),我们需要使用 Google 账号登录应用,为此,我们需要使用“准备客户端 ID”章节中的 OAuth 客户端 ID 提供 CLIENT_ID 环境变量:
export CLIENT_ID=215....apps.googleusercontent.com
预期输出(已隐去部分信息):
student@instance-1:~/genai-databases-retrieval-app/llm_demo$ export CLIENT_ID=215....apps.googleusercontent.com
现在,我们可以运行应用了:
python run_app.py
预期输出:
student@instance-1:~/genai-databases-retrieval-app/llm_demo$ python main.py INFO: Started server process [28565] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8081 (Press CTRL+C to quit)
连接到应用
您可以通过多种方式连接到虚拟机上运行的应用。例如,您可以在 VPC 中使用防火墙规则打开虚拟机上的端口 8081,或创建具有公共 IP 的负载均衡器。在这里,我们将使用通向虚拟机的 SSH 隧道将本地端口 8080 转换为虚拟机端口 8081。
从本地机器连接
当我们想从本地机器连接时,需要运行 SSH 隧道。您可以使用 gcloud compute ssh 执行此操作:
gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8081:localhost:8081
预期输出:
student-macbookpro:~ student$ gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081 Warning: Permanently added 'compute.7064281075337367021' (ED25519) to the list of known hosts. Linux instance-1.us-central1-c.c.gleb-test-001.internal 6.1.0-21-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. student@instance-1:~$
现在,我们可以打开浏览器,并使用 http://localhost:8081 连接到我们的应用。我们应该会看到应用界面。
从 Cloud Shell 连接
或者,我们也可以使用 Google Cloud Shell 进行连接。使用顶部的“+”号打开另一个 Cloud Shell 标签页。
在新标签页中,执行 gcloud 命令,获取 Web 客户端的来源和重定向 URI:
echo "origin:"; echo "https://8080-$WEB_HOST"; echo "redirect:"; echo "https://8080-$WEB_HOST/login/google"
预期输出如下:
student@cloudshell:~ echo "origin:"; echo "https://8080-$WEB_HOST"; echo "redirect:"; echo "https://8080-$WEB_HOST/login/google" origin: https://8080-cs-35704030349-default.cs-us-east1-rtep.cloudshell.dev redirect: https://8080-cs-35704030349-default.cs-us-east1-rtep.cloudshell.dev/login/google
并将 URI 的来源和重定向用作“准备客户端 ID”章节中创建的凭据的“已获授权的 JavaScript 来源”和“已获授权的重定向 URI”,替换或添加到原始提供的 http://localhost:8080 值。
在“OAuth 2.0 客户端 ID”页面上,点击“Cymbal Air”。
输入 Cloud Shell 的来源和重定向 URI,然后点击“保存”按钮。
在新 Cloud Shell 标签页中执行 gcloud 命令,启动通向虚拟机的隧道:
gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081
如果系统显示“无法分配请求的地址”错误,请忽略该错误。
预期输出如下:
student@cloudshell:~ gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081 bind [::1]:8081: Cannot assign requested address inux instance-1.us-central1-a.c.gleb-codelive-01.internal 6.1.0-21-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sat May 25 19:15:46 2024 from 35.243.235.73 student@instance-1:~$
它会在 Cloud Shell 上打开端口 8080,该端口可用于“网页预览”。
点击 Cloud Shell 右上角的“网页预览”按钮,然后从下拉菜单中选择“Preview on port 8080”
系统会在网络浏览器中打开一个包含应用界面的新标签页。您应该能看到“Cymbal Air Customer Service Assistant”页面。
登录应用
一切设置完毕并打开应用后,我们可以使用应用屏幕右上角的“登录”按钮提供凭据。这项操作是可选的,只有在您想试用应用的预订功能时才需要执行。
系统随即会打开一个弹出式窗口,供我们选择凭据。
登录后,应用即会准备就绪,您可以开始在窗口底部的字段中发布请求。
此演示展示了 Cymbal Air 客户服务助理。Cymbal Air 是一家虚构的客运航空公司。该助理是一个 AI 聊天机器人,可帮助旅客管理航班,以及查询 Cymbal Air 位于旧金山国际机场 (SFO) 的航空枢纽的相关信息。
无需登录(无需 CLIENT_ID),它可以帮助回答用户的问题,例如:
飞往丹佛的下一趟航班是什么时候?
C28 号登机口附近有没有奢侈品商店?
A6 号登机口附近在哪里可以喝杯咖啡?
我可以在哪里购买礼物?
请预订凌晨 10:35 起飞的丹佛航班
登录应用后,您可以尝试其他功能,例如预订航班或查看为您分配的是靠窗座还是靠走道座。
该应用使用最新的 Google 基础模型来生成回答,并通过来自 AlloyDB 运营数据库的航班和酒店设施相关信息来扩充回答内容。如需详细了解此演示版应用,请访问项目的 GitHub 页面。
9. 清理环境
现在,所有任务都已完成,我们可以清理环境了
删除 Cloud Run 服务
在 Cloud Shell 中,执行以下命令:
gcloud run services delete retrieval-service --region us-central1
预期的控制台输出:
student@cloudshell:~ (gleb-test-short-004)$ gcloud run services delete retrieval-service --region us-central1 Service [retrieval-service] will be deleted. Do you want to continue (Y/n)? Y Deleting [retrieval-service]...done. Deleted service [retrieval-service].
删除 Cloud Run 服务的服务账号
在 Cloud Shell 中,执行以下命令:
PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts delete retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com --quiet
预期的控制台输出:
student@cloudshell:~ (gleb-test-short-004)$ PROJECT_ID=$(gcloud config get-value project) Your active configuration is: [cloudshell-222] student@cloudshell:~ (gleb-test-short-004)$ gcloud iam service-accounts delete retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com --quiet deleted service account [retrieval-identity@gleb-test-short-004.iam.gserviceaccount.com] student@cloudshell:~ (gleb-test-short-004)$
完成实验后销毁 AlloyDB 实例和集群
删除 AlloyDB 集群和所有实例
系统会通过强制选项销毁集群,该选项还会删除属于该集群的所有实例。
如果您已断开连接且之前的所有设置都已丢失,请在 Cloud Shell 中定义项目和环境变量:
gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)
删除集群:
gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
预期的控制台输出:
student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force All of the cluster data will be lost when the cluster is deleted. Do you want to continue (Y/n)? Y Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f Deleting cluster...done.
删除 AlloyDB 备份
删除集群的所有 AlloyDB 备份:
for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
预期的控制台输出:
student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f Deleting backup...done.
现在我们可以销毁虚拟机了
删除 GCE 虚拟机
在 Cloud Shell 中,执行以下命令:
export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
--zone=$ZONE \
--quiet
预期的控制台输出:
student@cloudshell:~ (test-project-001-402417)$ export GCEVM=instance-1 export ZONE=us-central1-a gcloud compute instances delete $GCEVM \ --zone=$ZONE \ --quiet Deleted
删除 GCE 虚拟机和检索服务的服务账号
在 Cloud Shell 中,执行以下命令:
PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts delete compute-aip@$PROJECT_ID.iam.gserviceaccount.com --quiet
预期的控制台输出:
student@cloudshell:~ (gleb-test-short-004)$ PROJECT_ID=$(gcloud config get-value project) gcloud iam service-accounts delete compute-aip@$PROJECT_ID.iam.gserviceaccount.com --quiet Your active configuration is: [cloudshell-222] deleted service account [compute-aip@gleb-test-short-004.iam.gserviceaccount.com] student@cloudshell:~ (gleb-test-short-004)$
10. 恭喜
恭喜您完成此 Codelab。
所学内容
- 如何部署 AlloyDB 集群
- 如何连接到 AlloyDB
- 如何配置和部署 GenAI Databases Retrieval Service
- 如何使用已部署的服务来部署示例应用
11. 调查问卷
输出如下: