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 AI AlloyDB bằng cách kết hợp tính năng tìm kiếm vectơ với các mục nhúng AI Vertex.
Đ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à 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 AI AlloyDB
- 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
- Cách cải thiện hiệu suất bằng chỉ mục vectơ
Bạn cần có
- Tài khoản Google Cloud và dự án trê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
- Đă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.
- 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 thông tin này.
- Mã dự án là duy nhất trên 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ử 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 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.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. 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 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:
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. Sau khi hoàn tất, bạn sẽ thấy như sau:
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 bằng 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 Vertex AI. Đọc thêm về các vị trí có Vertex AI. Trong ví dụ này, chúng ta đang 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 có một dải IP riêng tư có sẵn trong VPC để thực thể 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ả đầu ra 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 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ả 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 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ả đầ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. 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ả đầ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.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 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ả đầu ra 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ở đến máy ảo instance-1.
Sử dụng giá trị mật khẩu AlloyDB (PGPASSWORD) đã ghi chú và mã nhận dạng 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 một cơ sở dữ liệu, bật tính năng tích hợp Vertex AI, tạo các đố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 quyền 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.
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ả đầu ra 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
Tạo hướng dẫn bắt đầu nhanh về 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ả đầ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 quickstart_db" CREATE DATABASE student@instance-1:~$
Bật tính năng tích hợp 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ả đầu ra 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ả đầu ra 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 ta có dữ liệu sản phẩm trong bảng cymbal_products, kho hàng cho biết số lượng sản phẩm còn hàng trong mỗi cửa hàng trong bảng cymbal_inventory và danh sách 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.
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(768) 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(768) GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED; ALTER TABLE quickstart_db=>
8. Chạy tính năng Tìm kiếm nội dung 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 kết quả phức tạp và nhiều hàng đề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, bạn có thể thực thi tất cả các lệnh SQL yêu cầu kết nối với cơ sở dữ liệu 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.
Sau đó, nhấp vào AlloyDB Studio ở bên trái:
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 nút "Xác thực" .
Thao tác này sẽ mở giao diện AlloyDB Studio. Để chạy các lệnh trong cơ sở dữ liệu, bạn nhấp vào thẻ "Trình chỉnh sửa 1" ở bên phải.
Thao tác này sẽ mở ra giao diện mà bạn có thể chạy các lệnh SQL
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 truy vấn để lấy danh sách các sản phẩm hiện có liên quan nhất đến yêu cầu của khách hàng. Yêu cầu mà chúng ta sẽ chuyển đến Vertex AI để nhận giá trị vectơ có dạng 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.43922018972266397 Meyer Lemon Tree | Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by | 34 | 93230 | 0.4685112926118228 Toyon | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e | 10.00 | 93230 | 0.4835677149651668 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.4947204525907498 California Peppertree | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e | 25.00 | 93230 | 0.5054166905547247 California Black Walnut | This is a beautiful walnut tree that can grow to be over 80 feet tall. It is a d | 100.00 | 93230 | 0.5084219510932597 California Sycamore | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is | 300.00 | 93230 | 0.5140519790508755 Coast Live Oak | This is a beautiful oak tree that can grow to be over 100 feet tall. It is an ev | 500.00 | 93230 | 0.5143126438081371 Fremont Cottonwood | This is a beautiful cottonwood tree that can grow to be over 100 feet tall. It i | 200.00 | 93230 | 0.5174774727252058 Madrone | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an | 50.00 | 93230 | 0.5227400803389093
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 điều đó, chúng tôi dự định tạo một tệp JSON chứa kết quả tìm kiếm vectơ, sau đó sử dụng tệp JSON đã tạo đó để bổ sung cho câu lệnh cho mô hình LLM văn bản trong Vertex AI nhằm tạo ra 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
Sau đâ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;
Dưới đâ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 bảng điều khiển trên đám mây.
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 với danh sách các giá trị như {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Dưới đâ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' dưới dạng 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:
Sau đây là câu trả lời mà 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à các tham số thay đổi theo thời gian:
"Tôi thấy bạn đang tìm một loại cây phát triển tốt ở khu vực của bạn. Dựa trên mã zip của bạn, 93230, có vẻ như Cherry Tree 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 giảm giá còn 75 USD.
Mặc dù tôi không có thông tin 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à nhiều ánh nắng.
Để đảm bảo kết quả tốt nhất, bạn nên tham khảo ý kiến của một chuyên gia làm vườn hoặc vườn ươm 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 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 bạn 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 cách sử dụ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 mở rộng lên phiên bản 1.4.1 (nếu phiên bản hiện tại thấp hơn). Kết nối với cơ sở dữ liệu quickstart_db từ psql như đã hiển thị trước đó (hoặc sử dụng AlloyDB Studio) và thực thi:
SELECT extversion from pg_extension where extname='google_ml_integration';
Nếu giá trị được trả về nhỏ hơn 1.4.1, hãy thực thi:
ALTER EXTENSION google_ml_integration UPDATE TO '1.4.1';
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 sẽ mất khoảng 3 đến 5 phút để thực thi ở chế độ 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à "bật":
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ý mô hình này vì chúng tôi đã bật các tính năng đăng ký 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');
Và mô hình tiếp theo mà chúng ta cần đăng ký là gemini-1.5-flash-002. Mô hình này sẽ được dùng để tạo đầu ra thân thiện với người dùng.
CALL
google_ml.create_model(
model_id => 'gemini-1.5-flash-002',
model_request_url => 'https://$REGION-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/publishers/google/models/gemini-1.5-flash-002:streamGenerateContent',
model_provider => 'google',
model_auth_type => 'alloydb_service_agent_iam');
Bạn luôn có thể xác minh danh sách các 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 dữ liệu được tạo trong truy vấn phụ JSON để cung cấp dữ liệu đó dưới dạng một phần của câu lệnh 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-002',
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ố.:
"That" "'s a great question! Based on your location (assuming you're" " in zip code 93230), I have a suggestion for a" " fruit tree that should thrive.\n\nWe have the **Cherry Tree** available.\n\n**Product Name:** Cherry Tree\n\n**Description:** This is a beautiful cherry" " tree that will produce delicious cherries. It's a deciduous tree (meaning it loses its leaves in the fall) growing to about 15 feet tall." " The leaves are dark green in summer, turning a beautiful red in the fall. Cherry trees are known for their beauty, shade, and privacy.\n\n**Sale Price:** $75.00\n\n**Important Considerations for Growing" " Cherry Trees:**\n\n* **Climate:** Cherry trees prefer a cool, moist climate, and 93230 falls within a suitable range (USDA zones 4-9). However, it's always a good idea to" " check the specific microclimate of your property (sun exposure, drainage etc.).\n* **Soil:** They do best in sandy soil. If your soil is different, you may need to amend it to improve drainage.\n* **Pollination:** Many cherry varieties require a second, compatible cherry tree for proper pollination" ". Check the specific pollination needs of this variety before purchase if you want a significant cherry yield.\n\nThis cherry tree is a beautiful addition to any yard and will provide you with delicious cherries if you can meet its needs. Would you like to know more about its pollination requirements, or perhaps see if we have any other" " fruit trees suitable for your area?\n" ""
10. Tạo chỉ mục vectơ
Tập dữ liệu của chúng tôi khá nhỏ và thời gian phản hồi chủ yếu phụ thuộc vào hoạt động tương tác với các mô hình AI. Tuy nhiên, khi bạn có hàng triệu vectơ, phần tìm kiếm vectơ có thể chiếm một phần đáng kể thời gian phản hồi và gây ra tải cao cho hệ thống. Để cải thiện điều đó, chúng ta có thể tạo một chỉ mục trên các vectơ của mình.
Tạo chỉ mục ScaNN
Để tạo chỉ mục SCANN, chúng ta cần bật thêm một tiện ích. Tiện ích alloydb_scann cung cấp cho chúng ta giao diện để làm việc với chỉ mục vectơ loại ANN bằng thuật toán Google ScaNN.
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Kết quả đầu ra dự kiến:
quickstart_db=> CREATE EXTENSION IF NOT EXISTS alloydb_scann; CREATE EXTENSION Time: 27.468 ms quickstart_db=>
Bây giờ, chúng ta có thể tạo chỉ mục. Trong ví dụ sau, tôi sẽ để hầu hết các tham số theo mặc định và chỉ cung cấp một số phân vùng (num_ rờis) cho chỉ mục:
CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products
USING scann (embedding cosine)
WITH (num_leaves=31, max_num_levels = 2);
Bạn có thể đọc về cách điều chỉnh các tham số chỉ mục trong tài liệu.
Kết quả đầu ra dự kiến:
quickstart_db=> CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products USING scann (embedding cosine) WITH (num_leaves=31, max_num_levels = 2); CREATE INDEX quickstart_db=>
So sánh phản hồi
Bây giờ chúng ta có thể chạy truy vấn tìm kiếm vectơ ở chế độ GIẢI THÍCH và xác minh xem chỉ mục đã được sử dụng hay chưa.
EXPLAIN (analyze)
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;
Kết quả đầu ra dự kiến:
Aggregate (cost=16.59..16.60 rows=1 width=32) (actual time=2.875..2.877 rows=1 loops=1) -> Subquery Scan on trees (cost=8.42..16.59 rows=1 width=142) (actual time=2.860..2.862 rows=1 loops=1) -> Limit (cost=8.42..16.58 rows=1 width=158) (actual time=2.855..2.856 rows=1 loops=1) -> Nested Loop (cost=8.42..6489.19 rows=794 width=158) (actual time=2.854..2.855 rows=1 loops=1) -> Nested Loop (cost=8.13..6466.99 rows=794 width=938) (actual time=2.742..2.743 rows=1 loops=1) -> Index Scan using cymbal_products_embeddings_scann on cymbal_products cp (cost=7.71..111.99 rows=876 width=934) (actual time=2.724..2.724 rows=1 loops=1) Order By: (embedding <=> '[0.008864171,0.03693164,-0.024245683,-0.00355923,0.0055611245,0.015985578,...<redacted>...5685,-0.03914233,-0.018452475,0.00826032,-0.07372604]'::vector) -> Index Scan using walmart_inventory_pkey on cymbal_inventory ci (cost=0.42..7.26 rows=1 width=37) (actual time=0.015..0.015 rows=1 loops=1) Index Cond: ((store_id = 1583) AND (uniq_id = (cp.uniq_id)::text))
Từ đầu ra, chúng ta có thể thấy rõ rằng truy vấn đang sử dụng "Quét chỉ mục bằng cymbal_products_embeddings_scann trên cymbal_products".
Và nếu chúng ta chạy truy vấn mà không có explain:
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;
Kết quả đầu ra dự kiến:
[{"product_name":"Meyer Lemon Tree","description":"Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by ","sale_price":34,"zip_code":93230,"product_id":"02056727942aeb714dc9a2313654e1b0"}]
Chúng ta có thể thấy kết quả hơi khác và không trả về cây Cherry đứng đầu trong kết quả tìm kiếm không có chỉ mục mà là lựa chọn thứ hai là cây Meyer Lemon. Vì vậy, chỉ mục cung cấp cho chúng tôi hiệu suất nhưng vẫn đủ chính xác để mang lại kết quả tốt.
Bạn có thể thử nhiều chỉ mục có sẵn cho các vectơ cũng như các phòng thí nghiệm và ví dụ khác có tích hợp chuỗi ngôn ngữ trên trang tài liệu.
11. 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 tuỳ chọn, thao tác này cũng sẽ xoá tất cả các thực thể của 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.
Xoá 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
12. 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 AI AlloyDB
- 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
- Cách cải thiện hiệu suất bằng chỉ mục vectơ
13. Khảo sát
Kết quả: