Bắt đầu sử dụng tính năng Tìm kiếm kết hợp trong 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 thực hiện tìm kiếm kết hợp trong AlloyDB bằng cách sử dụng tiện ích RUM (Phương thức cập nhật xếp hạng) và chỉ mục Lân cận gần nhất có thể mở rộng (ScaNN). Bài thực hành này là một phần của bộ bài thực hành 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.

Đ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
  • Tạo các vectơ nhúng bằng Vertex AI
  • Cách tạo chỉ mục vectơ ScaNN để tăng cường tìm kiếm vectơ
  • Cách bật và sử dụng tiện ích RUM để tìm kiếm toàn văn
  • Thực hiện tìm kiếm kết hợp bằng cách kết hợp tìm kiếm toàn văn bản, tìm kiếm vectơ và Reciprocal Rank Fusion (RRF)

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

Đă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 trường học hoặc tài khoản do nơi làm việc cấp.

Tạo một dự án trên Google Cloud

  1. Trong Google Cloud Console, trên trang chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud.
  2. Đảm bảo rằng bạn đã bật tính năng thanh toán cho dự án trên Cloud. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trên một dự án hay không.

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.

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 tập 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 đủ điều kiện dùng thử miễn phí trị giá 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.

Cloud Shell là một môi trường dòng lệnh chạy trong Google Cloud và được tải sẵn các công cụ cần thiết.

  1. Nhấp vào Kích hoạt Cloud Shell ở đầu bảng điều khiển Cloud.
  2. Sau khi kết nối với Cloud Shell, hãy xác minh thông tin xác thực của bạn:
    gcloud auth list
    
  3. Xác nhận rằng dự án của bạn đã được định cấu hình:
    gcloud config get project
    
  4. Nếu dự án của bạn không được thiết lập như mong đợi, hãy thiết lập dự án:
    export PROJECT_ID=<YOUR_PROJECT_ID>
    gcloud config set project $PROJECT_ID
    

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ền tảng này 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 trên đám mây của Google.

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 phải thiết lập quyền truy cập bằng IP riêng cho các dịch vụ như AlloyDB để các dịch vụ này có thể giao tiếp một cách 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ó cung cấp 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 Quyền truy cập vào dịch vụ riêng tư trong VPC cho AlloyDB. Giả định ở đây là chúng ta có mạng VPC "mặc định" trong dự án và mạng này sẽ được dùng cho mọi 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 sử dụng một hàm ngẫu nhiên để tạo mật khẩu

export PGPASSWORD=`openssl rand -hex 12`

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

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

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

echo $PGPASSWORD

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ật khẩu vào đâu đó để có thể sử dụng sau này.

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 AlloyDB

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-hybrid-search làm tên cụm:

export REGION=us-central1
export ADBCLUSTER=alloydb-hybrid-search

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-hybrid-search
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 của 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:~ (alloydb-hybrid-search)$ 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 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:~ (alloydb-hybrid-search)$ export ZONE=us-central1-a
student@cloudshell:~ (talloydb-hybrid-search)$ 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 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:~ (alloydb-hybrid-search)$ gcloud compute ssh instance-1 --zone=us-central1-a
Updating project ssh metadata...working..Updated [https://www.googleapis.com/compute/v1/projects/alloydb-hybrid-search].                                                                                                                                                         
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-hybrid-search
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 tác nhân 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 một cơ sở dữ liệu có tên là quickstart.

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:~$ gcloud storage 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:~$ 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"
COPY 941
student@instance-1:~$ 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"
COPY 263861
student@instance-1:~$ 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"
COPY 4654
student@instance-1:~$

7. Tạo vectơ nhúng

Sau khi nhập dữ liệu, chúng ta có các bảng sau: cymbal_products lưu trữ thông tin về sản phẩm, cymbal_inventory theo dõi kho hàng của từng mặt hàng ở mỗi cửa hàng và cymbal_stores là danh sách các cửa hàng. Để thực hiện tìm kiếm ngữ nghĩa trên các sản phẩm của mình, chúng ta cần tạo các vectơ nhúng cho nội dung mô tả sản phẩm bằng hàm initialize_embeddings. 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.

Để sử dụng chế độ tích hợp này, hãy 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 của thực thể 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.

Chúng tôi sẽ sử dụng tính năng tạo vectơ nhúng hàng loạt để cải thiện hiệu quả. Bạn có thể đọc thêm về các lựa chọn và kỹ thuật tạo vectơ nhúng khác nhau trong hướng dẫn. Để sử dụng tính năng nhúng hàng loạt, chúng ta phải bật goole_ml_integration.enable_faster_embedding_generation

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 việc đó bằng lệnh gcloud:

export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-hybrid-search
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

Quá trình này 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.

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

Trong phiên psql được kết nối với cơ sở dữ liệu, hãy tạo một cột mới để lưu trữ các vectơ nhúng trong cymbal_products

ALTER TABLE cymbal_products ADD COLUMN product_embedding vector(768);

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

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

Cuối cùng, chúng ta cũng muốn các mục nhúng làm mới khi các giá trị cột bị thay đổi bằng cách thêm đối số incremental_refresh_mode vào lệnh gọi hàm. Điều này làm tăng tải cho cơ sở dữ liệu của chúng tôi, nhưng đây là một sự đánh đổi mà chúng tôi thực hiện để tự động đồng bộ hoá các mục nhúng với nội dung. Nếu muốn cập nhật các mục nhúng theo cách thủ công, bạn có thể xem hướng dẫn trong tài liệu.

Giờ đây, khi kết hợp tất cả lại với nhau và tạo các mục nhúng, chúng ta sẽ sử dụng hàm initialize_embeddings và truyền batch_size là 50 làm gợi ý về lô, đồng thời đặt incremental_refresh_mode thành transactional

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à giờ đây, nếu chúng ta chèn một hàng mới vào bảng có giá trị NULL cho cột product_embedding

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") 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);

Giờ đây, khi truy vấn hàng mà chúng ta vừa chèn, chúng ta sẽ thấy cột product_embedding được tự động cập nhật.

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

Kết quả đầu ra sẽ có dạng như sau:

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

Time: 3.295 ms

8. Tạo chỉ mục vectơ

Để cải thiện hiệu suất tìm kiếm vectơ, chúng tôi sẽ thêm một chỉ mục ScaNN.

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 cách sử dụng thuật toán ScaNN của Google.

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. 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 và thêm các tham số điều chỉnh. Bạn có thể đọc về cách điều chỉnh các tham số chỉ mục trong tài liệu.

Chúng ta phải bật cờ scann.enable_preview_features để có thể sửa đổi các tham số điều chỉnh. Trong cloudshell

export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-hybrid-search
gcloud beta alloydb instances update $ADBCLUSTER-pr \
   --database-flags scann.enable_preview_features=on \
   --region=$REGION \
   --cluster=$ADBCLUSTER \
   --project=$PROJECT_ID \
   --update-mode=FORCE_APPLY

Quá trình này có thể mất vài phút nhưng cuối cùng, giá trị cờ sẽ chuyển thành "on". Sau khi đặt cờ, chúng ta có thể chuyển về phiên psql trên VM và tạo chỉ mục bằng các tham số điều chỉnh.

CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products
  USING scann (product_embedding cosine)
  WITH (mode='MANUAL', num_leaves=31, max_num_levels = 2);

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

quickstart_db=> CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products
  USING scann (product_embedding cosine)
  WITH (num_leaves=31, max_num_levels = 2);
CREATE INDEX
quickstart_db=>

Kiểm tra việc sử dụng chỉ mục

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ó đang được sử dụng hay không.

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.product_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 (được chỉnh sửa để cho 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)
...

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

9. Chỉ mục tìm kiếm toàn văn

AlloyDB hỗ trợ tất cả các loại chỉ mục cho tính năng tìm kiếm toàn văn mà PostgreSQL gốc hỗ trợ. Lựa chọn về chỉ mục phụ thuộc vào sự cân bằng giữa tốc độ tìm kiếm, thời gian xây dựng chỉ mục, tốc độ cập nhật và các chức năng tìm kiếm cụ thể cần thiết, chẳng hạn như tìm kiếm cụm từ hoặc xếp hạng mức độ liên quan.

Trong ví dụ này, chúng ta sẽ sử dụng tiện ích RUM để thực hiện các thao tác tìm kiếm toàn văn hiệu quả hơn. RUM cải thiện các chỉ mục GIN tiêu chuẩn bằng cách lưu trữ thông tin vị trí ngay trong chỉ mục, cho phép bạn thực hiện các cụm từ tìm kiếm và xếp hạng mức độ liên quan nhanh hơn mà không cần truy cập vào dữ liệu bảng.

Bạn có thể sử dụng AlloyDB Studio hoặc tiếp tục sử dụng ứng dụng psql để bật tiện ích rum

Tạo chỉ mục RUM

CREATE EXTENSION IF NOT EXISTS rum;

Để tìm kiếm nội dung mô tả sản phẩm trong bảng cymbal_products, chúng ta cần tạo một cột lưu trữ nội dung mô tả sản phẩm dưới dạng tsvector. Cột này tự động lưu trữ văn bản đã xử lý và cải thiện hiệu suất truy vấn.

ALTER TABLE cymbal_products
ADD COLUMN product_search_vector tsvector
GENERATED ALWAYS AS (to_tsvector('english', product_description)) STORED;

Giờ đây, chúng ta có thể tạo một chỉ mục RUM mới cho cột product_search_vector.

CREATE INDEX cymbal_products_rum
ON cymbal_products
USING rum (product_search_vector rum_tsvector_ops);

Để truy vấn bảng bằng chỉ mục, hãy chạy truy vấn sau để tìm các kết quả khớp với "cherry tree". Toán tử <=> tính điểm mức độ liên quan hoặc khoảng cách giữa tài liệu và cụm từ tìm kiếm ngay từ chỉ mục.

SELECT product_name, product_description
FROM cymbal_products
WHERE product_search_vector @@ to_tsquery('english', 'cherry <-> tree')
ORDER BY product_search_vector <=> to_tsquery('english', 'cherry <-> tree');

10. Thực hiện tìm kiếm kết hợp

Hàm google_vector_utils.hybrid_search() cho phép bạn kết hợp kết quả từ nhiều loại tìm kiếm, chẳng hạn như tìm kiếm vectơ và tìm kiếm toàn văn. Hàm này hợp nhất các kết quả được xếp hạng từ mỗi thành phần tìm kiếm thành một danh sách duy nhất, hợp nhất bằng cách sử dụng thuật toán Hợp nhất thứ hạng tương hỗ (RRF). Phương pháp này mang lại kết quả phù hợp hơn so với chỉ sử dụng một loại tìm kiếm.

Hàm hybrid_search() tạo và thực thi một truy vấn SQL duy nhất một cách linh động. Thao tác này sẽ tạo một Biểu thức bảng chung (CTE) cho từng thành phần tìm kiếm mà bạn xác định. Sau đó, hàm này sẽ kết hợp kết quả từ tất cả các CTE và tính toán điểm RRF cuối cùng cho từng tài liệu để tạo ra một danh sách thống nhất, được xếp hạng.

Để sử dụng hàm này, chúng ta phải bật enable_preview_ai_functions trong phiên bản chính. Chạy lệnh sau trong cloudshell

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

Truy vấn sau đây kết hợp câu hỏi tìm kiếm vectơ trước đó với câu hỏi tìm kiếm toàn văn. Đây là một cụm từ tìm kiếm kết hợp rất đơn giản; bạn có thể thử một cụm từ phức tạp hơn, chẳng hạn như sử dụng "cây mọc cao hơn một ngôi nhà" trong thành phần tìm kiếm vectơ và "California" trong thành phần FTS.

SELECT score, id, p.product_name
FROM ai.hybrid_search(
  search_inputs => ARRAY[
      '{
        "data_type": "vector",
        "table_name": "cymbal_products",
        "key_column": "uniq_id",
        "vec_column": "product_embedding",
        "distance_operator": "public.<=>",
        "limit": 5,
        "query_vector": "ai.embedding(''text-embedding-005'', ''cherry'')::vector"
      }'::JSONB,
      '{
        "data_type": "text",
        "table_name": "cymbal_products",
        "key_column": "uniq_id",
        "text_column": "product_search_vector",
        "limit": 5,
        "ranking_function": "<=>",
        "query_text_input": "tree"
      }'::JSONB
  ]
) JOIN cymbal_products p ON id = p.uniq_id;

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

"score","id","product_name"
"0.00819672631147241","d536e9e823296a2eba198e52dd23e712","Cherry Tree"
"0.015873015873015872","23e41a71d63d8bbc9bdfa1d118cfddc5","Apple Tree"
"0.00819672631147241","dc789a2f87b142e94e6e325689482af9","Oak Tree"
"0.008064521129029258","f5c70d62ccf3118d73863bf3b17edcbe","Cypress Tree"
"0.008064521129029258","b70c44b1a38c0a2329fa583c9109a80f","Peach Tree"

Trong kết quả, bạn sẽ thấy idkey_column được chỉ định, score là giá trị cuối cùng do RRF tính toán. Kết hợp thứ hạng tương hỗ (RRF) là một thuật toán dựa trên thứ hạng, kết hợp nhiều danh sách kết quả tìm kiếm được xếp hạng thành một danh sách được xếp hạng duy nhất bằng cách chỉ định điểm số cho từng tài liệu. Điểm số này dựa trên thứ hạng tương hỗ của RRF trên tất cả các danh sách đóng góp, trong đó những tài liệu có thứ hạng cao hơn sẽ đóng góp nhiều hơn. Khi sử dụng include_json_output => true trong tham số, một cột detail_json sẽ được trả về, trong đó có thông tin chi tiết về cách tính điểm cho từng thành phần.

Mặc dù phương thức tìm kiếm toàn bộ văn bản phù hợp nhất để tìm các cụm từ cụ thể hoặc kết quả khớp chính xác, nhưng tìm kiếm vectơ lại vượt trội trong việc tìm từ đồng nghĩa và ý định ngay cả khi các từ không khớp. Bằng cách hợp nhất hai phương pháp này, tìm kiếm kết hợp đảm bảo rằng người dùng nhận được một bộ kết quả mạnh mẽ, vừa chính xác theo nghĩa đen vừa phù hợp về mặt ngữ nghĩa

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

Huỷ các thực thể và cụm AlloyDB khi bạn hoàn thành 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 các biến dự án và 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-hybrid-search
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.                                                                                                                                                                                                                                                            

Giờ đây, chúng ta có thể hủy 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ày.

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
  • Tạo các vectơ nhúng bằng Vertex AI
  • Cách tạo chỉ mục vectơ ScaNN để tăng cường tìm kiếm vectơ
  • Cách bật và sử dụng tiện ích RUM để tìm kiếm toàn văn
  • Thực hiện tìm kiếm kết hợp bằng cách kết hợp tìm kiếm toàn văn bản, tìm kiếm vectơ và Reciprocal Rank Fusion (RRF)