Bắt đầu sử dụng tính năng Nhúng vectơ bằng AI 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 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 Vertex AI. Phòng thí nghiệm này là một phần của bộ sưu tập phòng thí nghiệm dành riêng cho các tính năng AI của AlloyDB. Bạn có thể đọc thêm trên trang AlloyDB AI trong tài liệu.

81802d1e350b59bb.png

Đ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à Google Shell

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

  • Cách triển khai cụm AlloyDB và phiên bản chính
  • Cách kết nối với AlloyDB từ 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 AlloyDB Studio
  • Cách sử dụng mô hình nhúng Vertex AI trong AlloyDB
  • Cách sử dụng Vertex AI Studio
  • 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. Thiết lập và yêu cầu

Thiết lập dự án

  1. Đăng nhập vào Google Cloud Console. 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.

Sử dụng tài khoản cá nhân thay vì tài khoản do nơi làm việc hoặc trường học cấp.

  1. Tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Để tạo một dự án mới trong Google Cloud Console, trong tiêu đề, hãy nhấp vào nút Chọn dự án. Thao tác này sẽ mở một cửa sổ bật lên.

295004821bab6a87.png

Trong cửa sổ Chọn một dự án, hãy nhấn vào nút Dự án mới. Thao tác này sẽ mở một hộp thoại cho dự án mới.

37d264871000675d.png

Trong hộp thoại, hãy nhập tên Dự án mà bạn muốn và chọn vị trí.

96d86d3d5655cdbe.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Tên dự án không được các API của Google sử dụng và bạn có thể thay đổi tên này bất cứ lúc nào.
  • Mã dự án là mã duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Bảng điều khiển Google Cloud tự động tạo một mã nhận dạng duy nhất, nhưng bạn có thể tuỳ chỉnh mã này. Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác hoặc cung cấp mã nhận dạng của riêng bạn để kiểm tra xem mã đó có còn trống hay không. 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 của mình. Mã này thường được xác định bằng phần giữ chỗ PROJECT_ID.
  • Để bạn nắm được thông tin, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.

Bật tính năng thanh toán

Để bật tính năng thanh toán, bạn có 2 lựa chọn. Bạn có thể sử dụng tài khoản thanh toán cá nhân hoặc đổi tín dụng theo các bước sau.

Đổi 5 USD tín dụng Google Cloud (không bắt buộc)

Để tham gia hội thảo này, bạn cần có một Tài khoản thanh toán có sẵn một số tín dụng. Nếu dự định sử dụng hệ thống thanh toán của riêng mình, bạn có thể bỏ qua bước này.

  1. Nhấp vào đường liên kết này rồi đăng nhập bằng Tài khoản Google cá nhân.
  2. Bạn sẽ thấy nội dung như sau:

f54628965f465486.png

  1. Nhấp vào nút NHẤP VÀO ĐÂY ĐỂ XEM CÁC KHOẢN TÍN DỤNG. Thao tác này sẽ đưa bạn đến một trang để thiết lập hồ sơ thanh toán. Nếu bạn thấy màn hình đăng ký dùng thử miễn phí, hãy nhấp vào huỷ và tiếp tục liên kết thông tin thanh toán.

20e88842cf2a732e.png

  1. Nhấp vào Xác nhận. Giờ đây, bạn đã kết nối với một Tài khoản thanh toán dùng thử của Google Cloud Platform.

cdc87f1c57777951.png

Thiết lập tài khoản thanh toán cá nhân

Nếu thiết lập thông tin thanh toán bằng tín dụng Google Cloud, bạn có thể bỏ qua bước này.

Để thiết lập tài khoản thanh toán cá nhân, hãy truy cập vào đây để bật tính năng thanh toán trong Cloud Console.

Một số lưu ý:

  • Việc hoàn thành bài thực hành này sẽ tốn ít hơn 3 USD cho các tài nguyên trên đám mây.
  • Bạn có thể làm theo các bước ở cuối bài thực hành này để xoá tài nguyên nhằm tránh bị tính thêm phí.
  • Người dùng mới sẽ đủ điều kiện dùng thử miễn phí 300 USD.

Khởi động Cloud Shell

Mặc dù 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 trên Cloud.

Trên 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:

Kích hoạt Cloud Shell

Hoặc bạn có thể nhấn phím G rồi nhấn phím S. Trình tự này sẽ kích hoạt Cloud Shell nếu bạn đang ở trong Google Cloud Console hoặc sử dụng đường liên kết này.

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

Ảnh chụp màn hình cửa sổ dòng lệnh Google Cloud Shell cho thấy môi trường đã kết nối

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nó cung cấp một thư mục chính có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện mọi thao tá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 bất cứ thứ gì.

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

Bật API

Kết quả:

Để sử dụng AlloyDB, Compute Engine, Dịch vụ mạngVertex AI, bạn cần bật các API tương ứng trong dự án Google Cloud của mình.

Bật API

Trong Cloud Shell trên thiết bị đầu cuối, hãy đảm bảo rằng 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ả các API 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.

Giới thiệu về các API

  • API AlloyDB (alloydb.googleapis.com) cho phép bạn tạo, quản lý và mở rộng quy mô các cụm AlloyDB cho PostgreSQL. Đây là một dịch vụ cơ sở dữ liệu tương thích với PostgreSQL, được quản lý hoàn toàn và được thiết kế cho các tải công việc giao dịch và phân tích đòi hỏi khắt khe của doanh nghiệp.
  • Compute Engine API (compute.googleapis.com) cho phép bạn tạo và quản lý máy ảo (VM), đĩa liên tục và chế độ cài đặt mạng. Nền tảng này cung cấp nền tảng Cơ sở hạ tầng dưới dạng dịch vụ (IaaS) cốt lõi cần thiết để chạy các khối lượng công việc và lưu trữ cơ sở hạ tầng cơ bản cho nhiều dịch vụ được quản lý.
  • Cloud Resource Manager API (cloudresourcemanager.googleapis.com) cho phép bạn quản lý siêu dữ liệu và cấu hình của dự án trên Google Cloud theo phương thức lập trình. Việc này giúp bạn sắp xếp tài nguyên, xử lý các chính sách Quản lý danh tính và quyền truy cập (IAM) cũng như xác thực các quyền trong hệ thống phân cấp dự án.
  • Service Networking API (servicenetworking.googleapis.com) cho phép bạn tự động hoá việc thiết lập kết nối riêng tư giữa mạng Virtual Private Cloud (VPC) và các dịch vụ được quản lý của Google. Bạn cần thiết lập quyền truy cập vào IP riêng cho các dịch vụ như AlloyDB để các dịch vụ này có thể giao tiếp an toàn với các tài nguyên khác của bạn.
  • Vertex AI API (aiplatform.googleapis.com) cho phép các ứng dụng của bạn xây dựng, triển khai và mở rộng quy mô các mô hình học máy. Vertex AI cung cấp giao diện hợp nhất cho tất cả các dịch vụ AI của Google Cloud, bao gồm cả quyền truy cập vào các mô hình AI tạo sinh (như Gemini) và hoạt động huấn luyện mô hình tuỳ chỉnh.

Bạn có thể định cấu hình khu vực mặc định để sử dụng các mô hình nhúng Vertex AI (nếu muốn). Đọc thêm về các địa điểm có Vertex AI. Trong ví dụ này, chúng ta sẽ 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 một cụm AlloyDB, chúng ta cần có 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, 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 cấu hình Private Service Access 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 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ả đầu ra 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

Trong phần này, chúng ta sẽ tạo một cụm AlloyDB ở khu vực us-central1.

Xác định mật khẩu cho người dùng postgres. Bạn có thể tự xác định mật khẩu hoặc 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

Sau này, bạn sẽ cần mật khẩu đó để kết nối với phiên bản dưới dạng người dùng postgres. Bạn nên ghi lại hoặc sao chép mã này vào đâu đó để có thể sử dụng sau.

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

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

Tạo Cụm dùng thử miễn phí

Nếu chưa sử dụng AlloyDB, bạn có thể tạo một cụm dùng thử miễn phí:

Xác định khu vực và tên cụm AlloyDB. Chúng ta sẽ 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 \
    --subscription-type=TRIAL

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 \
    --subscription-type=TRIAL
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.                                                                                                                                                                                                                                                           

Tạo một phiên bản 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ẽ cần xác định lại các biến môi trường tên vùng và tên cụm.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=8 \
    --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=8 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

Tạo Cụm AlloyDB chuẩn

Nếu đây không phải là cụm AlloyDB đầu tiên của bạn trong dự án, hãy tiếp tục tạo một cụm tiêu chuẩn.

Xác định khu vực và tên cụm AlloyDB. Chúng ta sẽ 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 một phiên bản 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ẽ cần xác định lại các biến môi trường tên vùng và tên cụm.

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 cách chỉ sử dụng kết nối riêng tư, vì vậy, chúng ta cần một VM đã cài đặt ứ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ả đầ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 Postgres Client (Máy khách Postgres)

Cài đặt phần mềm máy khách 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 phiên bản

Kết nối với phiên bản chính từ máy ảo bằng psql.

Trong cùng một thẻ Cloud Shell có phiên SSH đã mở đến VM 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ả đầu ra 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 đơn vị hỗ trợ dịch vụ AlloyDB.

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

abc505ac4d41f24e.png

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 cơ sở dữ liệu bắt đầu nhanh.

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 Vertex AI và các tiện ích 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 và nhập vào cơ sở dữ liệu mới.

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

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
gcloud storage 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"
gcloud storage 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"
gcloud storage 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 tôi đã nhận đượ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ó sẵn ở 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 ta cần tính toán dữ liệu vectơ dựa trên nội dung mô tả cho các sản phẩm của mình và sẽ sử dụng hàm embedding cho việc đó. Bằng cách sử dụng hàm này, chúng ta sẽ dùng tính năng tích hợp Vertex AI để tính toán dữ liệu vectơ dựa trên nội dung mô tả sản phẩm và thêm dữ liệu đó vào bảng. Bạn có thể đọc thêm về công nghệ được dùng trong tài liệu này.

Bạn có thể dễ dàng tạo mã này cho một vài hàng, nhưng làm thế nào để tạo mã này một cách hiệu quả nếu có hàng nghìn hàng? Ở đây, tôi sẽ trình bày cách tạo và quản lý các mục nhúng cho các bảng lớn. Bạn cũng có thể đọc thêm về các lựa chọn và kỹ thuật khác trong hướng dẫn.

Bật tính năng Tạo thông tin nhúng nhanh

Kết nối với cơ sở dữ liệu bằng psql từ VM của bạn bằng cách sử dụng IP phiên bản AlloyDB và mật khẩu postgres:

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

Xác minh phiên bản của tiện ích google_ml_integration.

SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';

Phiên bản phải từ 1.5.2 trở lên. Sau đây là ví dụ về kết quả:

quickstart_db=> SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
 extversion 
------------
 1.5.2
(1 row)

Phiên bản mặc định phải là 1.5.2 trở lên, nhưng nếu phiên bản trên phiên bản của bạn cũ hơn thì có thể bạn cần cập nhật. Kiểm tra xem hoạt động bảo trì có bị vô hiệu hoá cho phiên bản này hay không.

Sau đó, chúng ta cần xác minh cờ cơ sở dữ liệu. Bạn cần bật cờ google_ml_integration.enable_faster_embedding_generation. Trong cùng một phiên psql, hãy kiểm tra giá trị của cờ.

show google_ml_integration.enable_faster_embedding_generation;

Nếu cờ ở đúng vị trí, thì đầu ra dự kiến sẽ có dạng như sau:

quickstart_db=> show google_ml_integration.enable_faster_embedding_generation;                          
 google_ml_integration.enable_faster_embedding_generation 
----------------------------------------------------------
 on
(1 row)

Nhưng nếu trạng thái là "tắt", thì chúng ta cần cập nhật phiên bản. Bạn có thể thực hiện việc này bằng bảng điều khiển web hoặc lệnh gcloud như mô tả trong tài liệu. Sau đây là cách thực hiện bằng lệnh gcloud:

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

Có thể mất vài phút nhưng cuối cùng giá trị cờ sẽ chuyển thành "on". Sau đó, bạn có thể chuyển sang các bước tiếp theo.

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 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 từ 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);

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

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

quickstart_db=> ALTER TABLE cymbal_products ADD COLUMN embedding vector(768);
ALTER TABLE
quickstart_db=> 

Giờ đây, chúng ta có thể tạo các mục nhúng bằng cách sử dụng các lô, mỗi lô có 50 hàng. Bạn có thể thử nghiệm với nhiều kích thước lô và xem liệu kích thước đó có làm thay đổi thời gian thực thi hay không. Trong cùng một phiên psql, hãy thực thi:

Bật tính năng đo thời gian để đo thời gian cần thiết:

\timing

Chạy lệnh:

CALL ai.initialize_embeddings(
    model_id => 'text-embedding-005',
    table_name => 'cymbal_products',
    content_column => 'product_description',
    embedding_column => 'embedding',
    batch_size => 50
);

Và kết quả đầu ra trên bảng điều khiển cho thấy thời gian tạo quá trình nhúng là dưới 2 giây:

quickstart_db=> CALL ai.initialize_embeddings(
    model_id => 'text-embedding-005',
    table_name => 'cymbal_products',
    content_column => 'product_description',
    embedding_column => 'embedding',
    batch_size => 50
);
NOTICE:  Initialize embedding completed successfully for table cymbal_products
CALL
Time: 1458.704 ms (00:01.459)
quickstart_db=>

Theo mặc định, các mục nhúng sẽ không được làm mới nếu cột product_description tương ứng được cập nhật hoặc toàn bộ hàng mới được chèn. Tuy nhiên, bạn có thể thực hiện việc này bằng cách xác định tham số incremental_refresh_mode. Hãy tạo cột "product_embeddings" và đặt chế độ tự động cập nhật cho cột này.

ALTER TABLE cymbal_products ADD COLUMN product_embedding vector(768);
CALL ai.initialize_embeddings(
    model_id => 'text-embedding-005',
    table_name => 'cymbal_products',
    content_column => 'product_description',
    embedding_column => 'product_embedding',
    batch_size => 50,
    incremental_refresh_mode => 'transactional'
);

Và bây giờ, nếu chúng ta chèn một hàng mới vào bảng.

INSERT INTO "cymbal_products" ("uniq_id", "crawl_timestamp", "product_url", "product_name", "product_description", "list_price", "sale_price", "brand", "item_number", "gtin", "package_size", "category", "postal_code", "available", "product_embedding", "embedding") VALUES ('fd604542e04b470f9e6348e640cff794', NOW(), 'https://example.com/new_product', 'New Cymbal Product', 'This is a new cymbal product description.', 199.99, 149.99, 'Example Brand', 'EB123', '1234567890', 'Single', 'Cymbals', '12345', TRUE, NULL, NULL);

Chúng ta có thể so sánh sự khác biệt giữa các cột bằng cách sử dụng truy vấn:

SELECT uniq_id,embedding, (product_embedding::real[])[1:5] as product_embedding  FROM cymbal_products WHERE uniq_id='fd604542e04b470f9e6348e640cff794';

Trong kết quả, chúng ta có thể thấy rằng trong khi cột embedding vẫn trống thì cột product_embedding sẽ tự động cập nhật

quickstart_db=> SELECT uniq_id,embedding, (product_embedding::real[])[1:5] as product_embedding  FROM cymbal_products WHERE uniq_id='fd604542e04b470f9e6348e640cff794';
             uniq_id              | embedding |                       product_embedding                       
----------------------------------+-----------+---------------------------------------------------------------
 fd604542e04b470f9e6348e640cff794 |           | {0.015003494,-0.005349732,-0.059790313,-0.0087091,-0.0271452}
(1 row)

Time: 3.295 ms

8. Chạy tính năng Tìm kiếm tương tự

Giờ đây, 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 cho nội dung mô tả và giá trị vectơ mà chúng ta nhận được cho yêu cầu của mình.

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 từ AlloyDB Studio. Mọi đầu ra phức tạp và có 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.

1d7298e7096e7313.png

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

a33131c72ad29478.png

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

4f26532ecdb5bade.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, bạn nhấp vào thẻ "Trình chỉnh sửa 1" ở bên phải.

a127047c343731ff.png

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

9d312d5053c1296c.png

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

Chạy tính năng 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, 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 để nhận danh sách các sản phẩm hiện có liên quan chặt chẽ nhất đến yêu cầu của khách hàng. Yêu cầu mà chúng ta sẽ truyền đến Vertex AI để nhận giá trị vectơ có dạng "What kind of fruit trees grow well here?" (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ục đầ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-005','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;

Sau đây là kết quả đầu ra 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-005','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 một ứng dụng khách bằng cách sử dụng kết quả của truy vấn và chuẩn bị một đầu ra có ý nghĩa bằng cách sử dụng kết quả truy vấn được cung cấp làm một phần của câu lệnh cho mô hình ngôn ngữ cơ bản tạo sinh Vertex AI.

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

Tạo đầu ra ở định dạng JSON

Sửa đổi truy vấn để tạo đầu ra ở định dạng JSON và chỉ trả về một hàng để chuyể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-005','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 đầu ra:

[{"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 JSON này như một phần của câu lệnh cho mô hình văn bản AI tạo sinh trong Vertex AI Studio

Mở Vertex AI Studio trong bảng điều khiển đám mây.

d48549b1b0f449b4.png

Có thể bạn sẽ được yêu cầu đồng ý với các điều khoản sử dụng nếu chưa từng sử dụng tính năng này. Nhấn vào nút "Đồng ý và tiếp tục"

Viết câu lệnh của bạn trong giao diện.

2a6f5a338fefd229.png

Có thể bạn sẽ được yêu cầu bật các API bổ sung nhưng bạn có thể bỏ qua yêu cầu này. Chúng ta không cần thêm API nào để hoàn thành bài thực hành này.

Sau đây là câu lệnh mà chúng ta sẽ dùng với đầu ra JSON của câu hỏi ban đầu về cây:

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

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 có liên quan chặt chẽ đến cụm từ 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"}

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

{"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"}

Khách hàng hỏi "Cây nào 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

d1bde56c910a1627.png

Sau đây là kết quả khi chúng ta chạy câu lệnh với các giá trị JSON và sử dụng mô hình gemini-2.5-flash-light:

9371b7552a73e2bf.png

Sau đây là câu trả lời mà chúng tôi 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:

"Dựa trên các sản phẩm hiện có, đây là những thông tin tôi có thể cung cấp cho bạn về "Cherry Tree":

Sản phẩm: Cherry Tree

Giá: 75 USD

Nội dung mô tả: Đây là một cây anh đào đẹp, sẽ cho ra những quả anh đào thơm ngon.

Để xác định cây nào "phát triển tốt nhất ở đây", tôi cần thêm thông tin. Bạn có biết những loại cây nào khác mà chúng ta có thể so sánh không, hoặc bạn có quan tâm đến một khía cạnh cụ thể nào đó của việc "phát triển tốt nhất" (ví dụ: tốc độ tăng trưởng nhanh nhất, sản lượng trái cây cao nhất, khả năng chịu đựng trong khí hậu cụ thể của bạn)?"

Chạy câu lệnh trong PSQL

Chúng ta có thể sử dụng tính năng tích hợp AI của AlloyDB với Vertex AI để nhận được cùng một câu trả lờ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, trước tiên chúng ta cần đăng ký mô hình này.

Xác minh tiện ích google_ml_integration. Ứng dụng này phải có phiên bản 1.4.2 trở lên.

Kết nối với cơ sở dữ liệu quickstart_db từ psql như đã trình bày trước đó (hoặc sử dụng AlloyDB Studio) và thực thi:

SELECT extversion from pg_extension where extname='google_ml_integration';

Kiểm tra cờ cơ sở dữ liệu google_ml_integration.enable_model_support.

show google_ml_integration.enable_model_support;

Kết quả đầu ra 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)

Nếu thấy "off" thì chúng ta 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 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_faster_embedding_generation=on,google_ml_integration.enable_model_support=on \
  --region=$REGION \
  --cluster=$ADBCLUSTER \
  --project=$PROJECT_ID \
  --update-mode=FORCE_APPLY

Lệnh này mất khoảng 1 đến 3 phút để thực thi trong nền. Sau đó, bạn có thể xác minh lại cờ này.

Đối với truy vấn của mình, chúng ta cần 2 mô hình. Mô hình đầu tiên là mô hình text-embedding-005 đã được sử dụng và mô hình thứ hai là một trong các mô hình Gemini chung của Google.

Chúng ta bắt đầu từ mô hình nhúng văn bản. Để đăng ký lượt chạy mô hình trong psql hoặc AlloyDB Studio, hãy dùng đoạn mã sau:

CALL
  google_ml.create_model(
    model_id => 'text-embedding-005',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-005',
    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-2.0-flash-001. 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-2.5-flash',
    model_request_url => 'publishers/google/models/gemini-2.5-flash: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-005      | text_embedding
 gemini-2.5-flash        | generic
(4 rows)

Giờ đây, chúng ta có thể sử dụng JSON được tạo trong một truy vấn phụ để cung cấp JSON đó 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-005',
        '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-2.5-flash',
        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ả đầu ra của bạn có thể khác tuỳ thuộc vào phiên bản mô hình và các tham số:

"Hello there! I can certainly help you with finding a great fruit tree for your area.\n\nBased on what grows well, we have a wonderful **Cherry Tree** that could be a perfect fit!\n\nThis beautiful cherry tree is an excellent choice for producing delicious cherries right in your garden. It's an deciduous tree that typically" " grows to about 15 feet tall. Beyond its fruit, it offers lovely aesthetics with dark green leaves in the summer that transition to a beautiful red in the fall, making it great for shade and privacy too.\n\nCherry trees generally prefer a cool, moist climate and sandy soil, and they are best suited for USDA Zones" " 4-9. Given the zip code you're inquiring about (93230), which is typically in USDA Zone 9, this Cherry Tree should thrive wonderfully!\n\nYou can get this magnificent tree for just **$75.00**.\n\nLet me know if you have any other questions!" "

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 mức độ tương tác với các mô hình AI. Nhưng 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ể trong thời gian phản hồi của chúng tôi và gây tải cao cho hệ thống. Để cải thiện, chúng ta có thể tạo một chỉ mục trên các vectơ.

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 nữa. Tiện ích alloydb_scann cung cấp một 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ạn có thể tạo chỉ mục ở chế độ THỦ CÔNG hoặc TỰ ĐỘNG. Chế độ THỦ CÔNG được bật theo mặc định và bạn có thể tạo chỉ mục cũng như duy trì chỉ mục đó như bất kỳ chỉ mục nào khác. Nhưng nếu bật chế độ TỰ ĐỘNG, bạn có thể tạo chỉ mục mà không cần bảo trì. Bạn có thể đọc chi tiết về tất cả các lựa chọn trong tài liệu. Tại đây, tôi sẽ hướng dẫn bạn cách bật chế độ TỰ ĐỘNG và tạo chỉ mục. Trong trường hợp này, chúng ta không có đủ hàng để tạo chỉ mục ở chế độ TỰ ĐỘNG, vì vậy, chúng ta sẽ tạo chỉ mục ở chế độ THỦ CÔNG.

Trong ví dụ sau, tôi sẽ để hầu hết các tham số ở trạng thái mặc định và chỉ cung cấp một số phân vùng (num_leaves) 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 câu trả lời

Giờ đây, chúng ta có thể chạy truy vấn tìm kiếm vectơ ở chế độ EXPLAIN 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-005','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 (đã chỉnh sửa để rõ ràng hơ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 "Index Scan using cymbal_products_embeddings_scann on 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-005','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":"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úng ta có thể thấy rằng kết quả là cây Anh đào giống như kết quả hàng đầu trong tìm kiếm không có chỉ mục. Đôi khi, điều này có thể không xảy ra và phản hồi có thể trả về không phải cùng một cây mà là một số cây khác từ trên cùng. Vì vậy, chỉ mục này mang lại cho chúng ta 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ử các chỉ mục khác nhau có sẵn cho các vectơ và nhiều phòng thí nghiệm cũng như ví dụ khác có tích hợp langchain trên trang tài liệu.

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

Huỷ các phiên bản và cụm AlloyDB khi bạn hoàn tất bài thực hành.

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

Nếu bạn đã dùng phiên bản dùng thử của AlloyDB. Đừng xoá cụm dùng thử nếu bạn có kế hoạch kiểm thử các phòng thí nghiệm và tài nguyên khác bằng cụm dùng thử. Bạn sẽ không thể tạo một cụm thử nghiệm khác trong cùng một dự án.

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

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

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.   

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ỷ VM

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

Phòng thí nghiệm này thuộc Lộ trình học tập về AI sẵn sàng cho sản xuất trên Google Cloud.

Nội dung đã đề cập

  • Cách triển khai cụm AlloyDB và phiên bản chính
  • Cách kết nối với AlloyDB từ 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 AlloyDB Studio
  • Cách sử dụng mô hình nhúng Vertex AI trong AlloyDB
  • Cách sử dụng Vertex AI Studio
  • 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ả:

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