Bắt đầu sử dụng tính năng Nhúng vectơ bằng AI của AlloyDB

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 sử dụng AlloyDB AI bằng cách kết hợp tính năng tìm kiếm vectơ với các tính năng nhúng của Vertex AI.

17e86406ab251142.pngS

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

  • Hiểu biết cơ bản về Google Cloud, Console
  • Kỹ năng cơ bản về giao diện dòng lệnh và shell google

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

  • Cách triển khai cụm AlloyDB và thực thể chính
  • Cách kết nối với AlloyDB qua máy ảo Google Compute Engine
  • Cách tạo cơ sở dữ liệu và bật AlloyDB AI
  • Cách tải dữ liệu vào cơ sở dữ liệu
  • Cách sử dụng mô hình nhúng Vertex AI trong AlloyDB
  • Cách làm phong phú kết quả bằng mô hình tạo sinh Vertex AI

Bạn cần có

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

2. Thiết lập và 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 dự án mới hoặc sử dụng lại 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ị của những 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 ứng dụng.
  • 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 bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham khảo Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử cách riêng của mình để xem có thể sử dụng hay không. Bạn không thể thay đổi mã này sau bước này và mã vẫn giữ nguyên trong thời gian của dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số 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 chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh phát sinh việc thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạ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 Google Cloud Console, hãy nhấp vào biểu tượng Cloud Shell ở thanh công cụ trên cùng bên phải:

55efc1aaa7a4d3ad.pngS

Sẽ chỉ mất một chút thời gian để cấp phép và kết nối với môi trường. Sau khi hoàn tất, bạn sẽ thấy như sau:

7ffe5cbb04455448.pngS

Máy ảo này chứa 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 mọi công việc trong lớp học lập trình này trong 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ả:

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

gcloud config set project [YOUR-PROJECT-ID]

Đặt biến môi trường PROJECT_ID:

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 \
                       aiplatform.googleapis.com

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

student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$ 
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

Định cấu hình khu vực mặc định để sử dụng các mô hình nhúng của Vertex AI. Đọc thêm về các địa điểm hỗ trợ Vertex AI. Trong ví dụ này, chúng ta sẽ dùng khu vực us-central1.

gcloud config set compute/region us-central1

4. Triển khai 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 không có, chúng ta cần tạo cụm, chỉ định để các dịch vụ nội bộ của Google sử dụng. Sau đó, chúng ta sẽ có thể tạo cụm và phiên bản.

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 tôi có giá trị "mặc định" Mạng VPC trong dự án và mạng này sẽ được dùng cho tất cả hành động.

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 một 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ả dự kiến trên bảng điều khiển:

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

Hãy lưu ý mật khẩu PostgreSQL để sử dụng sau này:

echo $PGPASSWORD

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

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

Xác định tên khu vực và tên cụm AlloyDB. Chúng ta sẽ dùng vùng 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ả 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 đối tượng 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 Cloud shell. Nếu bị ngắt kết nối, bạn sẽ phải xác định lại biến môi trường của 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ả 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. Kết nối với AlloyDB

AlloyDB được triển khai bằng kết nối chỉ dành cho riêng tư, vì vậy, chúng ta cần cài đặt máy ảo có ứng dụng PostgreSQL để làm việc với cơ sở dữ liệu.

Triển khai máy ảo GCE

Tạo một máy ảo GCE trong cùng một khu vực 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

Kết quả 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ả 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.us-central1-a.c.gleb-test-short-001-418811.internal 6.1.0-18-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) 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 phần mềm đang chạy lệnh 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 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable InRelease [5146 B]
Get:2 https://packages.cloud.google.com/apt cloud-sdk-bullseye InRelease [6406 B]   
Hit:3 https://deb.debian.org/debian bullseye InRelease  
Get:4 https://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB]
Get:5 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable/main amd64 Packages [1930 B]
Get:6 https://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
Get:7 https://deb.debian.org/debian bullseye-backports InRelease [49.0 kB]
...redacted...
update-alternatives: using /usr/share/postgresql/13/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode
Setting up postgresql-client (13+225) ...
Processing triggers for man-db (2.9.4-2) ...
Processing triggers for libc-bin (2.31-13+deb11u7) ...

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.

Trong cùng một thẻ Cloud Shell, có phiên SSH đã mở cho máy ảo ảo phiên bản 1 của bạn.

Sử dụng giá trị mật khẩu AlloyDB (PGPassword) đã lưu ý và mã cụm AlloyDB để 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ả dự kiến trên bảng điều khiển:

student@instance-1:~$ export PGPASSWORD=CQhOi5OygD4ps6ty
student@instance-1:~$ ADBCLUSTER=alloydb-aip-01
student@instance-1:~$ REGION=us-central1
student@instance-1:~$ INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
gleb@instance-1:~$ psql "host=$INSTANCE_IP user=postgres sslmode=require"
psql (15.6 (Debian 15.6-0+deb12u1), server 15.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=>

Đóng phiên psql:

exit

6. Chuẩn bị cơ sở dữ liệu

Chúng ta cần tạo cơ sở dữ liệu, bật tính năng tích hợp Vertex AI, tạo đối tượng cơ sở dữ liệu và nhập dữ liệu.

Cấp các quyền cần thiết cho AlloyDB

Thêm các quyền của Vertex AI vào tác nhân dịch vụ AlloyDB.

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

4ca978f5142bb6ce.pngS

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

PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"

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

student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-11039]
student@cloudshell:~ (test-project-001-402417)$ gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"
Updated IAM policy for project [test-project-001-402417].
bindings:
- members:
  - serviceAccount:service-4470404856@gcp-sa-alloydb.iam.gserviceaccount.com
  role: roles/aiplatform.user
- members:
...
etag: BwYIEbe_Z3U=
version: 1
 

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

exit

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

Bắt đầu nhanh cơ sở dữ liệu.

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

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

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

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

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

Bật tính năng tích hợp với Vertex AI

Bật tính năng tích hợp với Vertex AI và các phần mở rộng pgvector trong cơ sở dữ liệu.

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

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"

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

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"
CREATE EXTENSION
CREATE EXTENSION
student@instance-1:~$ 

Nhập dữ liệu

Tải dữ liệu đã chuẩn bị xuống rồi nhập vào cơ sở dữ liệu mới.

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

gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"

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

student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
SET
SET
SET
SET
SET
 set_config 
------------
 
(1 row)
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER TABLE
ALTER SEQUENCE
ALTER TABLE
ALTER TABLE
ALTER TABLE
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
COPY 941
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
COPY 263861
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"
COPY 4654
student@instance-1:~$

7. Tính toán các mục nhúng

Sau khi nhập dữ liệu, chúng tôi có dữ liệu sản phẩm trong bảng cymbal_products, kho hàng cho thấy số lượng sản phẩm còn hàng của mỗi cửa hàng trong bảng cymbal_inventory và danh sách các cửa hàng trong bảng cymbal_stores. Chúng tôi cần tính dữ liệu vectơ dựa trên mô tả cho sản phẩm của mình và chúng tôi sẽ sử dụng hàm nhúng để thực hiện điều đó. Chúng ta sẽ dùng hàm tích hợp với Vertex AI để tính toán dữ liệu vectơ dựa trên phần mô tả sản phẩm rồi thêm dữ liệu đó vào bảng. Bạn có thể đọc thêm về công nghệ được sử dụng trong tài liệu này.

Tạo cột nhúng

Kết nối với cơ sở dữ liệu bằng psql và tạo một cột ảo có dữ liệu vectơ bằng cách sử dụng hàm nhúng trong bảng cymbal_products. Hàm nhúng trả về dữ liệu vectơ từ Vertex AI dựa trên dữ liệu được cung cấp trong cột product_description.

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"

Trong phiên psql sau khi kết nối với cơ sở dữ liệu, hãy thực thi:

ALTER TABLE cymbal_products ADD COLUMN embedding vector GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;

Lệnh này sẽ tạo cột ảo và điền dữ liệu vectơ vào cột đó.

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

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
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.

quickstart_db=> ALTER TABLE cymbal_products ADD COLUMN embedding vector GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;
ALTER TABLE
quickstart_db=> 

8. Chạy công cụ tìm kiếm tương tự

Bây giờ, chúng ta có thể chạy tìm kiếm bằng cách sử dụng tính năng tìm kiếm tương tự dựa trên các giá trị vectơ được tính toán cho phần mô tả và giá trị vectơ mà chúng ta nhận được cho yêu cầu.

Bạn có thể thực thi truy vấn SQL từ cùng một giao diện dòng lệnh psql hoặc thay vào đó là từ AlloyDB Studio. Mọi đầu ra nhiều hàng và phức tạp đều có thể trông đẹp hơn trong AlloyDB Studio.

Kết nối với AlloyDB Studio

Trong các chương sau, tất cả các lệnh SQL yêu cầu kết nối với cơ sở dữ liệu đều có thể được thực thi thay thế trong AlloyDB Studio. Để chạy lệnh này, bạn cần mở giao diện bảng điều khiển web cho cụm AlloyDB bằng cách nhấp vào phiên bản chính.

ef4bfbcf0ed2ef3a.png

Sau đó, nhấp vào AlloyDB Studio ở bên trái:

5c155cbcd7d43a1.png.

Chọn cơ sở dữ liệu quickstart_db, user postgres và cung cấp mật khẩu được ghi chú khi chúng ta tạo cụm. Sau đó nhấp vào "Xác thực" .

432613065cac864f.png.

Thao tác này sẽ mở giao diện AlloyDB Studio. Để chạy các lệnh trong cơ sở dữ liệu, hãy nhấp vào "Editor 1" (Trình chỉnh sửa 1) ở bên phải.

b36c28f8165119ca.png

Thao tác này sẽ mở ra giao diện để bạn có thể chạy các lệnh SQL

cf43aa20f292797e.png

Nếu bạn muốn sử dụng dòng lệnh psql, hãy làm theo lộ trình thay thế và kết nối với cơ sở dữ liệu từ phiên SSH của máy ảo của bạn như đã mô tả trong các chương trước.

Chạy chế độ Tìm kiếm tương tự từ psql

Nếu phiên cơ sở dữ liệu của bạn bị ngắt kết nối thì hãy kết nối lại với cơ sở dữ liệu bằng psql hoặc AlloyDB Studio.

Kết nối với cơ sở dữ liệu:

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"

Chạy một truy vấn để lấy danh sách các sản phẩm hiện có có liên quan chặt chẽ nhất với yêu cầu của khách hàng. Yêu cầu mà chúng ta sẽ chuyển đến Vertex AI để lấy giá trị vectơ, chẳng hạn như "Loại cây ăn quả nào phát triển tốt ở đây?"

Sau đây là truy vấn mà bạn có thể chạy để chọn 10 mặt hàng đầu tiên phù hợp nhất với yêu cầu của chúng tôi:

SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 10;

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

quickstart_db=> SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 10;
    product_name     |                                   description                                    | sale_price | zip_code |      distance       
---------------------+----------------------------------------------------------------------------------+------------+----------+---------------------
 Cherry Tree         | This is a beautiful cherry tree that will produce delicious cherries. It is an d |      75.00 |    93230 |   0.287184013172779
 Toyon               | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 | 0.30574073611569963
 Secateurs           | These secateurs are perfect for pruning small branches and vines.                |      15.00 |    93230 |  0.3264385326189635
 Trimming Shears     | These trimming shears are perfect for trimming hedges and bushes.                |      20.00 |    93230 | 0.33293036535756393
 Cypress Tree        | This is a beautiful cypress tree that will provide shade and privacy. It is an e |      75.00 |    93230 | 0.33485770716129326
 Madrone             | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an |      50.00 |    93230 |  0.3354408801293012
 California Redwood  | This is a beautiful redwood tree that can grow to be over 300 feet tall. It is a |    1000.00 |    93230 |  0.3427243109636263
 California Lilac    | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d |       5.00 |    93230 |  0.3427628377929176
 California Sycamore | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is  |     300.00 |    93230 |  0.3430208475356905
 Maple Tree          | This is a beautiful maple tree that will produce colorful leaves in the fall. It |     100.00 |    93230 |  0.3432609589330091
(10 rows)

quickstart_db=> 

9. Cải thiện câu trả lời

Bạn có thể cải thiện phản hồi cho ứng dụng bằng cách sử dụng kết quả của truy vấn và chuẩn bị đầu ra có ý nghĩa bằng cách sử dụng kết quả truy vấn được cung cấp trong câu lệnh dành cho mô hình ngôn ngữ nền tảng tạo sinh của Vertex AI.

Để đạt được mục tiêu đó, chúng tôi dự định tạo JSON bằng kết quả tìm kiếm vectơ, sau đó sử dụng JSON đã tạo đó làm câu lệnh cho mô hình LLM (mô hình ngôn ngữ lớn) dạng văn bản trong Vertex AI nhằm tạo ra một kết quả có ý nghĩa. Ở bước đầu tiên, chúng ta tạo JSON, sau đó sẽ kiểm thử trong Vertex AI Studio và trong bước cuối cùng, chúng ta kết hợp JSON vào câu lệnh SQL để dùng được trong ứng dụng.

Tạo kết quả ở định dạng JSON

Sửa đổi truy vấn để tạo kết quả ở định dạng JSON và chỉ trả về một hàng để truyền đến Vertex AI

Dưới đây là ví dụ về truy vấn:

WITH trees as (
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id as product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

Và đây là JSON dự kiến trong kết quả:

[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]

Chạy câu lệnh trong Vertex AI Studio

Chúng ta có thể sử dụng JSON đã tạo để cung cấp trong lời nhắc đưa ra mô hình văn bản dựa trên AI tạo sinh trong Vertex AI Studio

Mở Vertex AI Studio trong Cloud Console.

e514b176aef7945e.png

54712e5ade7121f.png.

Yêu cầu này có thể yêu cầu bạn bật các API bổ sung nhưng bạn có thể bỏ qua yêu cầu này. Chúng tôi không cần thêm API nào để hoàn tất phòng thí nghiệm của mình.

Dưới đây là câu lệnh mà chúng ta sẽ sử dụng:

Bạn là một cố vấn thân thiện giúp tìm sản phẩm dựa trên nhu cầu của khách hàng.

Dựa trên yêu cầu của khách hàng, chúng tôi đã tải một danh sách các sản phẩm liên quan chặt chẽ đến nội dung tìm kiếm.

Danh sách ở định dạng JSON kèm theo danh sách các giá trị như {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}

Đây là danh sách sản phẩm:

[đặt cho JSON của chúng tôi]

Khách hàng hỏi "Cây nào đang phát triển tốt nhất ở đây?"

Bạn nên cung cấp thông tin về sản phẩm, giá và một số thông tin bổ sung theo câu lệnh

Và đây là kết quả khi chúng ta chạy lời nhắc bằng các giá trị JSON và sử dụng mô hình gemini-1.5-flash:

30e5072cd2975685.pngS

Sau đây là câu trả lời chúng ta nhận được từ mô hình trong ví dụ này. Xin lưu ý rằng câu trả lời của bạn có thể khác do mô hình và thông số thay đổi theo thời gian:

"Tôi thấy bạn đang tìm một cây phát triển tốt trong khu vực của mình. Theo mã bưu chính 93230 của bạn, Cây anh đào có vẻ là một lựa chọn tuyệt vời!

Nó được mô tả là một cây đẹp cho quả anh đào ngon. Sản phẩm này hiện đang được bán với giá 750.000 VND.

Mặc dù tôi không có thông tin chi tiết cụ thể về tốc độ phát triển của cây anh đào ở khu vực của bạn, nhưng tôi có thể cho bạn biết rằng cây anh đào thường thích đất thoát nước tốt và có ánh nắng mặt trời đầy đủ.

Để đảm bảo kết quả tốt nhất, bạn nên tham khảo ý kiến của chuyên gia vườn ươm hoặc chuyên gia làm vườn tại địa phương để họ có thể đưa ra lời khuyên phù hợp hơn cho vị trí và điều kiện đất đai cụ thể của bạn. Họ cũng có thể giúp bạn chọn giống tốt nhất theo nhu cầu của mình và cung cấp các mẹo về cách trồng và chăm sóc."

Chạy lời nhắc trong PSQL

Chúng ta có thể sử dụng tính năng tích hợp AI AlloyDB với Vertex AI để nhận được cùng một phản hồi từ mô hình tạo sinh bằng SQL ngay trong cơ sở dữ liệu. Nhưng để sử dụng mô hình gemini-1.5-flash chúng ta cần phải đăng ký nó trước.

Nâng cấp tiện ích này lên phiên bản 1.3. Kết nối với cơ sở dữ liệu quickstart_db từ pSQL như mô tả trước đây (hoặc sử dụng AlloyDB Studio) và thực thi:

ALTER EXTENSION google_ml_integration UPDATE TO '1.3'

Sau đó, chúng tôi cần đặt cờ cơ sở dữ liệu google_ml_integration.enable_model_support thành "on". Để thực hiện việc đó, bạn có thể sử dụng giao diện bảng điều khiển web của AlloyDB hoặc chạy lệnh gcloud sau.

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
ADBCLUSTER=alloydb-aip-01
gcloud beta alloydb instances update $ADBCLUSTER-pr \
  --database-flags google_ml_integration.enable_model_support=on \
  --region=$REGION \
  --cluster=$ADBCLUSTER \
  --project=$PROJECT_ID \
  --update-mode=FORCE_APPLY

Lệnh này cần khoảng 3 đến 5 phút để thực thi trong nền. Sau đó, bạn có thể xác minh cờ mới trong phiên psql hoặc sử dụng AlloyDB Studio kết nối với cơ sở dữ liệu quickstart_db.

show google_ml_integration.enable_model_support;

Kết quả dự kiến từ phiên psql là "on":

postgres=> show google_ml_integration.enable_model_support;
 google_ml_integration.enable_model_support 
--------------------------------------------
 on
(1 row)

Sau đó, chúng ta cần đăng ký hai mô hình. Mô hình đầu tiên là mô hình text-embedding-004 đã được sử dụng. Bạn cần đăng ký tài khoản này vì chúng tôi đã bật khả năng đăng ký của mô hình.

Để đăng ký mô hình, hãy chạy trong psql hoặc AlloyDB Studio, đoạn mã sau:

CALL
  google_ml.create_model(
    model_id => 'text-embedding-004',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-004',
    model_type => 'text_embedding',
    model_auth_type => 'alloydb_service_agent_iam',
    model_in_transform_fn => 'google_ml.vertexai_text_embedding_input_transform',
    model_out_transform_fn => 'google_ml.vertexai_text_embedding_output_transform');

Mô hình tiếp theo chúng ta cần đăng ký là gemini-1.5-flash-001. Mô hình này sẽ được sử dụng để tạo dữ liệu đầu ra thân thiện với người dùng.

CALL
  google_ml.create_model(
    model_id => 'gemini-1.5-flash-001',
    model_request_url => 'https://$REGION-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/publishers/google/models/gemini-1.5-flash-001:streamGenerateContent',
    model_provider => 'google',
    model_auth_type => 'alloydb_service_agent_iam');

Bạn luôn có thể xác minh danh sách mô hình đã đăng ký bằng cách chọn thông tin từ google_ml.model_info_view.

select model_id,model_type from google_ml.model_info_view;

Sau đây là kết quả mẫu

quickstart_db=> select model_id,model_type from google_ml.model_info_view;
        model_id         |   model_type   
-------------------------+----------------
 textembedding-gecko     | text_embedding
 textembedding-gecko@001 | text_embedding
 text-embedding-004      | text_embedding
 gemini-1.5-flash-001    | generic
(4 rows)

Bây giờ, chúng ta có thể sử dụng tệp JSON được tạo trong truy vấn con để cung cấp mã đó dưới dạng một phần của lời nhắc cho mô hình văn bản AI tạo sinh bằng SQL.

Trong phiên psql hoặc AlloyDB Studio đến cơ sở dữ liệu, hãy chạy truy vấn

WITH trees AS (
SELECT
        cp.product_name,
        cp.product_description AS description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id AS product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci ON
        ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON
        cs.store_id = ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-004',
        'What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1),
prompt AS (
SELECT
        'You are a friendly advisor helping to find a product based on the customer''s needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","product_description":"some description","sale_price":10}
Here is the list of products:' || json_agg(trees) || 'The customer asked "What kind of fruit trees grow well here?"
You should give information about the product, price and some supplemental information' AS prompt_text
FROM
        trees),
response AS (
SELECT
        json_array_elements(google_ml.predict_row( model_id =>'gemini-1.5-flash-001',
        request_body => json_build_object('contents',
        json_build_object('role',
        'user',
        'parts',
        json_build_object('text',
        prompt_text)))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
FROM
        prompt)
SELECT
        string_agg(resp::text,
        ' ')
FROM
        response;

Và đây là kết quả dự kiến. Kết quả của bạn có thể khác nhau tuỳ thuộc vào phiên bản mô hình và các thông số.:

--------------------------------------------------------------------------------------------------------
 "I" " see you're interested in fruit trees! Based on your location, I found" " one great option:\n\n**Cherry Tree:** \n\nThis beautiful cherry tree will" " produce delicious cherries. It's a deciduous tree, meaning it loses its leaves in the fall, and can grow up to 15 feet tall. The" " leaves are a vibrant dark green in the summer, turning a beautiful red in the fall. \n\nCherry trees are known for their beauty and ability to provide shade" " and privacy. They prefer a cool, moist climate and sandy soil, making them a good fit for your area. \n\nThe Cherry Tree is currently on sale for $75.00.\n\nWould you like to know more about" " the Cherry Tree, or are you interested in exploring other fruit tree options? \n" ""
(1 row)

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

Huỷ bỏ các phiên bản và cụm AlloyDB khi bạn hoàn tất phòng thí nghiệm này

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

Cụm bị huỷ bỏ bằng lực lựa chọn, thao tác này cũng sẽ xoá tất cả các thực thể thuộc cụm.

Trong Cloud shell, hãy xác định các biến dự án và môi trường nếu bạn đã bị ngắt kết nối và tất cả các chế độ cài đặt trước đó 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ả 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ả 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ả 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 

11. Xin chúc mừng

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

Nội dung đã đề cập

  • Cách triển khai cụm AlloyDB và thực thể chính
  • Cách kết nối với AlloyDB qua máy ảo Google Compute Engine
  • Cách tạo cơ sở dữ liệu và bật AlloyDB AI
  • Cách tải dữ liệu vào cơ sở dữ liệu
  • Cách sử dụng mô hình nhúng Vertex AI trong AlloyDB
  • Cách làm phong phú kết quả bằng mô hình tạo sinh Vertex AI

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