Xây dựng ứng dụng trò chuyện dựa trên LLM và RAG bằng AlloyDB AI và LangChain

1. Giới thiệu

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách triển khai Dịch vụ truy xuất cơ sở dữ liệu GenAI và tạo một ứng dụng tương tác mẫu bằng môi trường đã triển khai.

98c2676cc78880e.png.

Bạn có thể xem thêm thông tin về Dịch vụ truy xuất GenAI và ứng dụng mẫu tại đây.

Điều kiện tiên quyết

  • Có kiến thức cơ bản về Google Cloud Console
  • Kỹ năng cơ bản về giao diện dòng lệnh và Google Cloud Shell

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

  • Cách triển khai cụm AlloyDB
  • Cách kết nối với AlloyDB
  • Cách định cấu hình và triển khai Dịch vụ truy xuất cơ sở dữ liệu AI tạo sinh
  • Cách triển khai ứng dụng mẫu bằng dịch vụ đã triển khai

Bạn cần có

  • Tài khoản Google Cloud và Dự án Google Cloud
  • Một trình duyệt web như Chrome

2. Cách thiết lập và các yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Tên dự án là tên hiển thị cho người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn luôn có thể cập nhật thông tin này.
  • Mã dự án là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã được tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử dùng email của riêng mình để xem có thể sử dụng hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ được giữ nguyên trong suốt thời gian diễn ra dự án.
  • Xin lưu ý rằng có một giá trị thứ ba là Mã dự án mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc tham gia lớp học lập trình này sẽ không tốn kém nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí sau khi hoàn tất hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Khởi động Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trong Đám mây.

Trong Bảng điều khiển Google Cloud, hãy nhấp vào biểu tượng Cloud Shell trên thanh công cụ trên cùng bên phải:

55efc1aaa7a4d3ad.png

Quá trình cấp phép và kết nối với môi trường chỉ mất vài phút. Khi quá trình này hoàn tất, bạn sẽ thấy như sau:

7ffe5cbb04455448.pngS

Máy ảo này được tải sẵn tất cả các công cụ phát triển mà bạn cần. Phiên bản này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Bạn có thể thực hiện tất cả công việc trong lớp học lập trình này trong một trình duyệt. Bạn không cần cài đặt gì cả.

3. Trước khi bắt đầu

Bật API

Kết quả:

Trong Cloud Shell, hãy đảm bảo bạn đã thiết lập mã dự án:

Thông thường, mã dự án sẽ xuất hiện trong dấu ngoặc đơn trong lời nhắc lệnh trong màn hình shell trên đám mây như trong hình:

fa6ee779963405d5.png

gcloud config set project [YOUR-PROJECT-ID]

Sau đó, hãy đặt biến môi trường PROJECT_ID thành mã dự án Google Cloud:

PROJECT_ID=$(gcloud config get-value project)

Bật tất cả dịch vụ cần thiết:

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

Kết quả dự kiến

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. Triển khai cụm AlloyDB

Trước khi tạo cụm AlloyDB, chúng ta cần một dải IP riêng tư có sẵn trong VPC để phiên bản AlloyDB trong tương lai sử dụng. Nếu chưa có, chúng ta cần tạo và chỉ định cho các dịch vụ nội bộ của Google sử dụng. Sau đó, chúng ta có thể tạo cụm và thực thể.

Tạo dải IP riêng tư

Chúng ta cần định cấu hình Quyền truy cập vào dịch vụ riêng tư trong VPC cho AlloyDB. Giả định ở đây là chúng ta có mạng VPC "mặc định" trong dự án và mạng này sẽ được dùng cho mọi thao tác.

Tạo dải IP riêng tư:

gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default

Tạo kết nối riêng tư bằng dải IP được phân bổ:

gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default

Kết quả dự kiến trên bảng điều khiển:

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)$

Tạo cụm AlloyDB

Tạo cụm AlloyDB trong khu vực us-central1.

Xác định mật khẩu cho người dùng postgres. Bạn có thể xác định mật khẩu của riêng mình hoặc sử dụng một hàm ngẫu nhiên để tạo mật khẩu

export PGPASSWORD=`openssl rand -hex 12`

Kết quả đầu ra dự kiến trên bảng điều khiển:

student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`

Ghi lại mật khẩu PostgreSQL để sử dụng sau này:

echo $PGPASSWORD

Kết quả đầu ra dự kiến trên bảng điều khiển:

student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD
bbefbfde7601985b0dee5723

Xác định khu vực và tên cụm AlloyDB. Chúng ta sẽ dùng khu vực us-central1 và alloydb-aip-01 làm tên cụm:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01

Chạy lệnh để tạo cụm:

gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION

Kết quả đầu ra dự kiến trên bảng điều khiển:

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.                                                                                                                                                                                                                                                           

Tạo phiên bản chính AlloyDB

Tạo một thực thể chính AlloyDB cho cụm của chúng ta trong cùng một phiên shell trên đám mây. Nếu bị ngắt kết nối, bạn sẽ cần xác định lại biến môi trường tên cụm và khu vực.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

Kết quả đầu ra dự kiến trên bảng điều khiển:

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. Chuẩn bị máy ảo GCE

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

Vì chúng ta sẽ sử dụng máy ảo để triển khai dịch vụ Truy xuất cơ sở dữ liệu GenAI và lưu trữ một ứng dụng mẫu, nên bước đầu tiên là tạo Tài khoản dịch vụ của Google (GSA). GSA sẽ được máy ảo GCE sử dụng và chúng ta cần cấp cho GSA các đặc quyền cần thiết để hoạt động với các dịch vụ khác.

Trong Cloud Shell, hãy thực thi:

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"

Triển khai máy ảo GCE

Tạo một máy ảo GCE trong cùng một vùng và VPC với cụm AlloyDB.

Trong Cloud Shell, hãy thực thi:

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

Kết quả đầu ra dự kiến trên bảng điều khiển:

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

Cài đặt ứng dụng Postgres

Cài đặt phần mềm ứng dụng PostgreSQL trên máy ảo đã triển khai

Kết nối với máy ảo:

gcloud compute ssh instance-1 --zone=us-central1-a

Kết quả đầu ra dự kiến trên bảng điều khiển:

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:~$ 

Cài đặt lệnh chạy phần mềm bên trong máy ảo:

sudo apt-get update
sudo apt-get install --yes postgresql-client

Kết quả dự kiến trên bảng điều khiển:

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) ...

Kết nối với thực thể

Kết nối với thực thể chính từ máy ảo bằng psql.

Tiếp tục phiên SSH đã mở đến máy ảo của bạn. Nếu bạn đã bị ngắt kết nối, hãy kết nối lại bằng lệnh tương tự như trên.

Sử dụng $PGASSWORD và tên cụm đã ghi chú trước đó để kết nối với AlloyDB từ máy ảo GCE:

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"

Kết quả đầu ra dự kiến trên bảng điều khiển:

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=> 

Thoát khỏi phiên psql và tiếp tục thiết lập kết nối SSH:

exit

Kết quả đầu ra dự kiến trên bảng điều khiển:

postgres=> exit
student@instance-1:~$ 

6. Khởi chạy cơ sở dữ liệu

Chúng ta sẽ sử dụng máy ảo ứng dụng làm nền tảng để điền dữ liệu vào cơ sở dữ liệu và lưu trữ ứng dụng. Bước đầu tiên là tạo cơ sở dữ liệu và điền dữ liệu vào cơ sở dữ liệu đó.

Tạo cơ sở dữ liệu

Tạo cơ sở dữ liệu có tên "assistantdemo".

Trong phiên máy ảo GCE, hãy thực thi:

psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE assistantdemo"  

Kết quả đầu ra dự kiến trên bảng điều khiển:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE assistantdemo"
CREATE DATABASE
student@instance-1:~$  

Bật tiện ích pgVector.

psql "host=$INSTANCE_IP user=postgres dbname=assistantdemo" -c "CREATE EXTENSION vector"  

Kết quả đầu ra dự kiến trên bảng điều khiển:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=assistantdemo" -c "CREATE EXTENSION vector"
CREATE EXTENSION
student@instance-1:~$

Chuẩn bị môi trường Python

Để tiếp tục, chúng ta sẽ sử dụng các tập lệnh Python đã chuẩn bị từ kho lưu trữ GitHub nhưng trước khi làm việc đó, chúng ta cần cài đặt phần mềm cần thiết.

Trong máy ảo GCE, hãy thực thi:

sudo apt install -y python3.11-venv git
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip

Kết quả đầu ra dự kiến trên bảng điều khiển:

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:~$

Xác minh phiên bản Python.

Trong máy ảo GCE, hãy thực thi:

python -V

Kết quả dự kiến trên bảng điều khiển:

(.venv) student@instance-1:~$ python -V
Python 3.11.2
(.venv) student@instance-1:~$ 

Điền cơ sở dữ liệu

Sao chép kho lưu trữ GitHub bằng mã cho dịch vụ truy xuất và ứng dụng mẫu.

Trong máy ảo GCE, hãy thực thi:

git clone https://github.com/GoogleCloudPlatform/genai-databases-retrieval-app.git

Kết quả đầu ra dự kiến trên bảng điều khiển:

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.

Chuẩn bị tệp cấu hình

Trong máy ảo GCE, hãy thực thi:

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

Kết quả đầu ra dự kiến trên bảng điều khiển:

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..."

Điền cơ sở dữ liệu bằng tập dữ liệu mẫu. Lệnh đầu tiên là thêm tất cả các gói bắt buộc vào môi trường ảo Python và lệnh thứ hai là điền dữ liệu vào cơ sở dữ liệu.

Trong máy ảo GCE, hãy thực thi:

pip install -r requirements.txt
python run_database_init.py

Kết quả đầu ra dự kiến trên bảng điều khiển(đã loại bỏ):

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. Triển khai Dịch vụ truy xuất cho Cloud Run

Bây giờ, chúng ta có thể triển khai dịch vụ truy xuất cho Cloud Run. Dịch vụ này chịu trách nhiệm xử lý cơ sở dữ liệu và trích xuất thông tin cần thiết từ cơ sở dữ liệu dựa trên yêu cầu của một ứng dụng AI.

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

Tạo một tài khoản dịch vụ cho dịch vụ truy xuất và cấp các đặc quyền cần thiết.

Mở một thẻ Cloud Shell khác bằng dấu "+" ở trên cùng.

4ca978f5142bb6ce.png

Trong thẻ Cloud shell mới, hãy thực thi:

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"

Kết quả đầu ra dự kiến trên bảng điều khiển:

student@cloudshell:~ (gleb-test-short-003)$ gcloud iam service-accounts create retrieval-identity
Created service account [retrieval-identity].

Đóng thẻ bằng lệnh thực thi "exit" trong thẻ:

exit

Triển khai Dịch vụ truy xuất

Tiếp tục trong thẻ đầu tiên mà bạn đã kết nối với máy ảo thông qua SSH bằng cách triển khai dịch vụ.

Trong phiên SSH của máy ảo, hãy thực thi:

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

Kết quả đầu ra dự kiến trên bảng điều khiển:

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$

Xác minh dịch vụ

Bây giờ, chúng ta có thể kiểm tra xem dịch vụ có chạy chính xác và máy ảo có quyền truy cập vào điểm cuối hay không. Chúng ta sử dụng tiện ích gcloud để lấy điểm cuối của dịch vụ truy xuất. Ngoài ra, bạn có thể kiểm tra trong bảng điều khiển đám mây và thay thế trong lệnh curl "$(gcloud run services list –filter="(retrieval-service)" bằng giá trị từ đó.

Trong phiên SSH của máy ảo, hãy thực thi:

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $(gcloud  run services list --filter="(retrieval-service)" --format="value(URL)")

Kết quả đầu ra dự kiến trên bảng điều khiển:

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$

Nếu chúng ta thấy thông báo "Hello World" (Xin chào thế giới), tức là dịch vụ của chúng ta đang hoạt động và phân phát các yêu cầu.

8. Triển khai ứng dụng mẫu

Bây giờ, khi dịch vụ truy xuất đã khởi động và chạy, chúng ta có thể triển khai một ứng dụng mẫu sẽ sử dụng dịch vụ này. Bạn có thể triển khai ứng dụng trên máy ảo hoặc bất kỳ dịch vụ nào khác như Cloud Run, Kubernetes hoặc thậm chí là trên máy tính xách tay. Ở đây, chúng ta sẽ hướng dẫn cách triển khai ứng dụng trên máy ảo.

Chuẩn bị môi trường

Chúng ta tiếp tục làm việc trên máy ảo bằng chính phiên SSH đó. Để chạy ứng dụng, chúng ta cần thêm một số mô-đun Python. Lệnh này sẽ được thực thi từ thư mục ứng dụng trong cùng một môi trường ảo Python.

Trong phiên SSH của máy ảo, hãy thực thi:

cd ~/genai-databases-retrieval-app/llm_demo
pip install -r requirements.txt

Kết quả đầu ra dự kiến (đã loại bỏ):

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)
...

Chuẩn bị mã ứng dụng khách

Để sử dụng chức năng đặt phòng của ứng dụng, chúng ta cần chuẩn bị mã ứng dụng khách OAuth 2.0 bằng Cloud Console. Đó là khi chúng ta đăng nhập vào ứng dụng vì tính năng đặt phòng đang sử dụng thông tin xác thực của khách hàng để ghi lại dữ liệu đặt phòng trong cơ sở dữ liệu.

Trong Cloud Console, hãy chuyển đến API và Dịch vụ, nhấp vào "Màn hình xin phép OAuth" rồi chọn người dùng "Nội bộ".

2400e5dcdb93eab8.png

Sau đó, nhấn vào "Tạo" rồi làm theo hướng dẫn trên màn hình tiếp theo.

6c34d235156e571f.png

Bạn cần điền vào các trường bắt buộc như "Tên ứng dụng" và "Email hỗ trợ người dùng". Ngoài ra, bạn có thể thêm một miền mà bạn muốn hiển thị trên màn hình yêu cầu đồng ý và cuối cùng là "Thông tin liên hệ của nhà phát triển"

2b7cd51aff915072.pngS

Sau đó, bạn nhấn vào nút "Lưu và tiếp tục" ở cuối trang để chuyển đến trang tiếp theo.

d90c10c88fd347f9.png

Bạn không cần thay đổi gì ở đó trừ phi muốn chỉ định phạm vi. Cuối cùng, bạn xác nhận bằng cách nhấn lại nút "Lưu và tiếp tục". Thao tác này sẽ thiết lập màn hình xin phép trong ứng dụng.

Bước tiếp theo là tạo mã ứng dụng. Trên bảng điều khiển bên trái, hãy nhấp vào "Thông tin xác thực" để chuyển đến thông tin xác thực cho OAuth2.

7ad97432390f224c.png

Tại đây, bạn nhấp vào "Tạo thông tin xác thực" ở trên cùng rồi chọn "Mã ứng dụng khách OAuth". Sau đó, một màn hình khác sẽ mở ra.

325a926431c8f16d.png

Chọn "Ứng dụng web" trong danh sách thả xuống cho loại ứng dụng và đặt URI ứng dụng (và cổng – không bắt buộc) làm "Nguồn gốc JavaScript được uỷ quyền". Ngoài ra, bạn cần thêm vào "URI chuyển hướng được uỷ quyền" máy chủ lưu trữ ứng dụng của mình bằng "/login/google" ở cuối để có thể sử dụng màn hình bật lên uỷ quyền. Trong hình ở trên, bạn có thể thấy rằng tôi đã sử dụng http://localhost làm URI ứng dụng cơ sở của mình.

Sau khi nhấn nút "Tạo", bạn sẽ thấy một cửa sổ bật lên chứa thông tin xác thực của khách hàng.

e91adf03ec31cd15.png

Sau này, chúng ta sẽ cần Mã ứng dụng khách (và Mật khẩu ứng dụng khách (không bắt buộc)) để dùng với ứng dụng

Chạy ứng dụng Trợ lý

Trước khi bắt đầu ứng dụng, chúng ta cần thiết lập một số biến môi trường. Chức năng cơ bản của ứng dụng như truy vấn chuyến bay và tiện nghi sân bay chỉ yêu cầu BASE_URL trỏ ứng dụng đến dịch vụ truy xuất. Chúng ta có thể lấy thông tin này bằng lệnh gcloud .

Trong phiên SSH của máy ảo, hãy thực thi:

export BASE_URL=$(gcloud  run services list --filter="(retrieval-service)" --format="value(URL)")

Kết quả đầu ra dự kiến (đã loại bỏ):

student@instance-1:~/genai-databases-retrieval-app/llm_demo$ export BASE_URL=$(gcloud  run services list --filter="(retrieval-service)" --format="value(URL)")

Để sử dụng các tính năng nâng cao hơn của ứng dụng như đặt vé và thay đổi chuyến bay, chúng ta cần đăng nhập vào ứng dụng này bằng Tài khoản Google. Để làm được điều đó, chúng ta cần cung cấp biến môi trường CLIENT_ID bằng Mã ứng dụng khách OAuth trong chương Chuẩn bị mã ứng dụng khách:

export CLIENT_ID=215....apps.googleusercontent.com

Kết quả dự kiến (đã loại bỏ):

student@instance-1:~/genai-databases-retrieval-app/llm_demo$ export CLIENT_ID=215....apps.googleusercontent.com

Và giờ chúng ta có thể chạy ứng dụng của mình:

python run_app.py

Kết quả đầu ra dự kiến:

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)

Kết nối với Ứng dụng

Bạn có một số cách để kết nối với ứng dụng đang chạy trên máy ảo. Ví dụ: bạn có thể mở cổng 8081 trên máy ảo bằng cách sử dụng các quy tắc tường lửa trong VPC hoặc tạo bộ cân bằng tải có IP công khai. Ở đây, chúng ta sẽ sử dụng một đường hầm SSH đến máy ảo, dịch cổng cục bộ 8080 thành cổng máy ảo 8081.

Đang kết nối từ máy cục bộ

Khi muốn kết nối từ máy cục bộ, chúng ta cần chạy một đường hầm SSH. Bạn có thể thực hiện việc này bằng cách sử dụng gcloud compute ssh:

gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8081:localhost:8081

Kết quả đầu ra dự kiến:

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:~$

Bây giờ, chúng ta có thể mở trình duyệt và sử dụng http://localhost:8081 để kết nối với ứng dụng của chúng ta. Chúng ta sẽ thấy màn hình ứng dụng.

c667b9013afac3f9.png

Kết nối từ Cloud Shell

Ngoài ra, chúng ta có thể sử dụng màn hình shell trên đám mây để kết nối. Mở một thẻ Cloud Shell khác bằng dấu "+" ở trên cùng.

4ca978f5142bb6ce.pngS

Trong màn hình shell trên đám mây mới, hãy lấy URI gốc và chuyển hướng cho ứng dụng web của bạn bằng cách thực thi lệnh gcloud:

echo "origin:"; echo "https://8080-$WEB_HOST"; echo "redirect:"; echo "https://8080-$WEB_HOST/login/google"

Sau đây là kết quả dự kiến:

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

Đồng thời, bạn có thể dùng nguồn gốc và lệnh chuyển hướng URI dưới dạng "Nguồn gốc JavaScript được cho phép" và "URI chuyển hướng được phép" cho thông tin xác thực được tạo trong chương "Chuẩn bị mã ứng dụng khách" để thay thế hoặc thêm vào các giá trị http://localhost:8080 được cung cấp ban đầu.

2c37eeda0a7e2f80.pngS

Trong thẻ shell đám mây mới, hãy bắt đầu đường hầm đến máy ảo bằng cách thực thi lệnh gcloud:

gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081

Bạn sẽ thấy lỗi "Không thể chỉ định địa chỉ được yêu cầu" – vui lòng bỏ qua lỗi này.

Sau đây là kết quả dự kiến:

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:~$

Thao tác này sẽ mở cổng 8080 trên màn hình shell trên đám mây. Bạn có thể dùng cổng này cho tính năng "Xem trước trên web".

Nhấp vào nút "Xem trước trên web" ở trên cùng bên phải của Cloud Shell, rồi chọn "Xem trước trên cổng 8080" trong trình đơn thả xuống

444fbf54dcd4d160.png

Thao tác này sẽ mở một thẻ mới trong trình duyệt web có giao diện ứng dụng. Bạn sẽ thấy được trang "Trợ lý dịch vụ khách hàng của Cymbal Air".

389f0ae2945beed5.png

Đăng nhập vào Ứng dụng

Khi mọi thứ được thiết lập và đơn đăng ký của bạn đang mở, chúng tôi có thể sử dụng nút "Đăng nhập" ở trên cùng bên phải của màn hình đăng ký để cung cấp thông tin đăng nhập của chúng tôi. Bạn không bắt buộc phải làm việc này và chỉ cần làm nếu muốn thử chức năng đặt phòng của ứng dụng.

a1f571371b957129.png

Thao tác này sẽ mở ra một cửa sổ bật lên để chúng ta có thể chọn thông tin xác thực.

Sau khi đăng nhập, ứng dụng đã sẵn sàng và bạn có thể bắt đầu đăng yêu cầu của mình vào trường ở cuối cửa sổ.

Bản minh hoạ này giới thiệu trợ lý dịch vụ khách hàng của Cymbal Air. Cymbal Air là một hãng hàng không chở khách hư cấu. Trợ lý này là một chatbot dựa trên AI giúp khách du lịch quản lý chuyến bay và tra cứu thông tin về trung tâm của Cymbal Air tại Sân bay quốc tế San Francisco (SFO).

Nếu không đăng nhập (không có CLIENT_ID), tính năng này có thể giúp trả lời các câu hỏi của người dùng như:

Chuyến bay tiếp theo đến Denver là khi nào?

Có cửa hàng xa xỉ nào xung quanh cổng C28 không?

Tôi có thể uống cà phê ở đâu gần cổng A6?

Tôi có thể mua quà tặng ở đâu?

Vui lòng đặt chuyến bay đến Denver khởi hành lúc 10:35 sáng

Khi đăng nhập vào ứng dụng, bạn có thể thử các tính năng khác như đặt vé máy bay hoặc kiểm tra xem chỗ ngồi được chỉ định cho bạn là chỗ ngồi bên cửa sổ hay chỗ ngồi ở lối đi.

6e7758f707c67c3e.png

Ứng dụng này sử dụng các mô hình cơ sở mới nhất của Google để tạo phản hồi và bổ sung thông tin về chuyến bay và tiện nghi từ cơ sở dữ liệu AlloyDB đang hoạt động. Bạn có thể đọc thêm về ứng dụng minh hoạ này trên trang GitHub của dự án.

9. Dọn dẹp môi trường

Bây giờ, khi tất cả tác vụ đã hoàn tất, chúng ta có thể dọn dẹp môi trường

Xoá Dịch vụ Cloud Run

Trong Cloud Shell, hãy thực thi:

gcloud run services delete retrieval-service --region us-central1

Kết quả đầu ra dự kiến trên bảng điều khiển:

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].

Xoá Tài khoản dịch vụ cho dịch vụ Cloud Run

Trong Cloud Shell, hãy thực thi:

PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts delete retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com --quiet

Kết quả dự kiến trên bảng điều khiển:

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)$

Huỷ bỏ các phiên bản AlloyDB và cụm khi bạn hoàn tất lớp học lập trình

Xoá cụm AlloyDB và tất cả các phiên bản

Cụm này bị huỷ bằng tuỳ chọn buộc, đồng thời xoá tất cả các thực thể thuộc cụm.

Trong màn hình shell trên đám mây, hãy xác định biến môi trường và dự án nếu bạn đã bị ngắt kết nối và tất cả các chế độ cài đặt trước đó đều bị mất:

gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)

Xoá cụm:

gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force

Kết quả đầu ra dự kiến trên bảng điều khiển:

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.   

Xóa các bản sao lưu AlloyDB

Xoá tất cả bản sao lưu AlloyDB cho cụm:

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

Kết quả đầu ra dự kiến trên bảng điều khiển:

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.                                                                                                                                                                                                                                                            

Bây giờ, chúng ta có thể huỷ bỏ máy ảo

Xoá máy ảo GCE

Trong Cloud Shell, hãy thực thi:

export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
    --zone=$ZONE \
    --quiet

Kết quả đầu ra dự kiến trên bảng điều khiển:

student@cloudshell:~ (test-project-001-402417)$ export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
    --zone=$ZONE \
    --quiet
Deleted 

Xoá Tài khoản dịch vụ cho máy ảo GCE và dịch vụ Truy xuất

Trong Cloud Shell, hãy thực thi:

PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts delete compute-aip@$PROJECT_ID.iam.gserviceaccount.com --quiet

Kết quả đầu ra dự kiến trên bảng điều khiển:

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. 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.

Nội dung đã đề cập

  • Cách triển khai cụm AlloyDB
  • Cách kết nối với AlloyDB
  • Cách định cấu hình và triển khai Dịch vụ truy xuất cơ sở dữ liệu AI tạo sinh
  • Cách triển khai ứng dụng mẫu bằng dịch vụ đã triển khai

11. Khảo sát

Kết quả:

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ đọc qua Đọc và hoàn thành bài tập