1. Giới thiệu

Lớp học lập trình này cung cấp hướng dẫn triển khai AlloyDB và tận dụng tính năng tích hợp AI để tìm kiếm ngữ nghĩa bằng cách sử dụng các mục nhúng đa phương thức. 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.
Điều kiện tiên quyết
- Có kiến thức cơ bản về Google Cloud Console
- Kỹ năng cơ bản về giao diện dòng lệnh và Cloud Shell
Kiến thức bạn sẽ học được
- Cách triển khai AlloyDB cho Postgres
- Cách sử dụng AlloyDB Studio
- Cách sử dụng tính năng tìm kiếm vectơ đa phương thức
- Cách bật các toán tử AI của AlloyDB
- Cách sử dụng các toán tử AlloyDB AI khác nhau cho tính năng tìm kiếm đa phương thức
- Cách sử dụng AI của AlloyDB để kết hợp kết quả tìm kiếm bằng văn bản và hình ảnh
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 hỗ trợ Google Cloud Console và Cloud Shell
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 do nơi làm việc hoặc trường học cấp.
- 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.

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.

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

- 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.
- 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.
- Bạn sẽ thấy nội dung như sau:

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

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

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:

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:

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
Để sử dụng AlloyDB, Compute Engine, Dịch vụ mạng và Vertex AI, bạn cần bật các API tương ứng trong dự án Google Cloud của mình.
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 dịch vụ cần thiết:
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com \
discoveryengine.googleapis.com \
secretmanager.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.
4. Triển khai AlloyDB
Tạo cụm và phiên bản chính AlloyDB. Quy trình sau đây mô tả cách tạo một cụm và phiên bản AlloyDB bằng Google Cloud SDK. Nếu muốn sử dụng phương pháp dựa trên bảng điều khiển, bạn có thể tham khảo tài liệu tại đây.
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 (Note: Yours will be different!)
Tạo Cụm dùng thử miễn phí
Nếu chưa từng 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. Nếu bạn đã tạo một cụm dùng thử miễn phí ở bước trước, hãy bỏ qua bước này.
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. 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.

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
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.
Trong một thẻ mới, hãy chuyển đến trang Cụm trong AlloyDB for Postgres.
Mở giao diện bảng điều khiển web cho cụm AlloyDB bằng cách nhấp vào phiên bản chính.

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

Chọn cơ sở dữ liệu postgres, 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". Nếu quên ghi lại mật khẩu hoặc mật khẩu không hoạt động, bạn có thể thay đổi mật khẩu. Hãy xem tài liệu về cách thực hiện việc đó.

Thao tác này sẽ mở giao diện AlloyDB Studio. Để chạy các lệnh trong cơ sở dữ liệu, bạn nhấp vào thẻ "Untitled Query" (Truy vấn chưa có tiêu đề) ở bên phải.

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

Tạo cơ sở dữ liệu
Tạo cơ sở dữ liệu bắt đầu nhanh.
Trong Trình chỉnh sửa AlloyDB Studio, hãy thực thi lệnh sau.
Tạo cơ sở dữ liệu:
CREATE DATABASE quickstart_db
Kết quả đầu ra dự kiến:
Statement executed successfully
Kết nối với quickstart_db
Kết nối lại với studio bằng nút chuyển đổi người dùng/cơ sở dữ liệu.

Chọn cơ sở dữ liệu quickstart_db mới trong danh sách thả xuống và sử dụng cùng một người dùng và mật khẩu như trước.

Thao tác này sẽ mở một kết nối mới để bạn có thể làm việc với các đối tượng trong cơ sở dữ liệu quickstart_db.
6. Dữ liệu mẫu
Bây giờ, chúng ta cần tạo các đối tượng trong cơ sở dữ liệu và tải dữ liệu. Chúng ta sẽ sử dụng một cửa hàng "Cymbal" hư cấu với dữ liệu hư cấu.
Trước khi nhập dữ liệu, chúng ta cần bật các tiện ích hỗ trợ kiểu dữ liệu và chỉ mục. Chúng ta cần 2 tiện ích, trong đó một tiện ích hỗ trợ kiểu dữ liệu vectơ và tiện ích còn lại hỗ trợ chỉ mục AlloyDB ScaNN.
Trong AlloyDB Studio, hãy kết nối với quickstart_db để thực thi.
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Tập dữ liệu được chuẩn bị và đặt dưới dạng tệp SQL có thể được tải vào cơ sở dữ liệu bằng giao diện nhập. Trong Cloud Shell, hãy thực thi các lệnh sau:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters import $ADBCLUSTER --region=$REGION --database=quickstart_db --gcs-uri='gs://sample-data-and-media/ecomm-retail/ecom_generic_vectors.sql' --user=postgres --sql
Lệnh này đang sử dụng AlloyDB SDK và tạo một người dùng có tên là agentspace_user, sau đó nhập dữ liệu mẫu trực tiếp từ vùng lưu trữ GCS vào cơ sở dữ liệu, tạo tất cả các đối tượng cần thiết và chèn dữ liệu.
Sau khi nhập, chúng ta có thể kiểm tra các bảng trong AlloyDB Studio. Các bảng nằm trong giản đồ ecomm:

Và xác minh số lượng hàng trong một trong các bảng.
select count(*) from ecomm.products;

Chúng ta đã nhập thành công dữ liệu mẫu và có thể tiếp tục với các bước tiếp theo.
7. Tìm kiếm ngữ nghĩa bằng cách sử dụng tính năng nhúng văn bản
Trong chương này, chúng ta sẽ thử sử dụng tính năng tìm kiếm ngữ nghĩa bằng cách sử dụng tính năng nhúng văn bản và so sánh tính năng này với văn bản Postgres truyền thống và tính năng tìm kiếm toàn văn.
Trước tiên, hãy thử tìm kiếm thông thường bằng cách sử dụng SQL PostgreSQL chuẩn với toán tử LIKE.
Trong AlloyDB Studio kết nối với quickstart_db, hãy thử tìm áo mưa bằng truy vấn sau:
SET session.my_search_var='%wet%conditions%jacket%';
SELECT
name,
product_description,
retail_price, replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM
ecomm.products
WHERE
name ILIKE current_setting('session.my_search_var')
OR product_description ILIKE current_setting('session.my_search_var')
LIMIT
10;
Truy vấn này không trả về hàng nào vì cần có các từ chính xác như điều kiện ẩm ướt và áo khoác trong tên sản phẩm hoặc nội dung mô tả. Và "áo khoác đi mưa" không giống với "áo khoác đi mưa".
Chúng ta có thể thử thêm tất cả các biến thể có thể vào nội dung tìm kiếm. Hãy thử chỉ dùng hai từ. Ví dụ:
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM
ecomm.products
WHERE
name ILIKE '%wet%jacket%'
OR name ILIKE '%jacket%wet%'
OR name ILIKE '%jacket%'
OR name ILIKE '%%wet%'
OR product_description ILIKE '%wet%jacket%'
OR product_description ILIKE '%jacket%wet%'
OR product_description ILIKE '%jacket%'
OR product_description ILIKE '%wet%'
LIMIT
10;
Thao tác đó sẽ trả về nhiều hàng nhưng không phải tất cả đều hoàn toàn khớp với yêu cầu của chúng ta về áo khoác và rất khó để sắp xếp theo mức độ liên quan. Ví dụ: nếu chúng ta thêm nhiều điều kiện khác như "dành cho nam" và các điều kiện khác, thì độ phức tạp của truy vấn sẽ tăng lên đáng kể. Ngoài ra, chúng ta có thể thử tìm kiếm toàn văn bản nhưng ngay cả như vậy, chúng ta vẫn gặp phải những hạn chế liên quan đến từ ngữ chính xác và mức độ liên quan của câu trả lời.
Giờ đây, chúng ta có thể thực hiện một tìm kiếm tương tự bằng cách sử dụng các mục nhúng. Chúng tôi đã tính toán trước các vectơ nhúng cho các sản phẩm của mình bằng nhiều mô hình. Chúng tôi sẽ sử dụng mô hình gemini-embedding-001 mới nhất của Google. Chúng tôi đã lưu trữ các giá trị này trong cột "product_embedding" của bảng ecomm.products. Nếu chúng ta chạy một cụm từ tìm kiếm cho điều kiện tìm kiếm "áo mưa cho nam" bằng cách sử dụng cụm từ tìm kiếm sau:
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_embedding <=> embedding ('gemini-embedding-001','wet conditions jacket for men')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
10;
Kết quả trả về không chỉ có áo khoác cho điều kiện ẩm ướt mà còn được sắp xếp sao cho những kết quả phù hợp nhất xuất hiện ở trên cùng.
Truy vấn có các mục nhúng sẽ trả về kết quả trong khoảng 90 – 150 mili giây, trong đó một phần thời gian được dùng để lấy dữ liệu từ mô hình nhúng trên đám mây. Nếu xem xét kế hoạch thực thi, yêu cầu đối với mô hình sẽ được đưa vào thời gian lập kế hoạch. Phần truy vấn thực hiện việc tìm kiếm khá ngắn. Chỉ mất chưa đến 7 mili giây để tìm kiếm trong 29.000 bản ghi bằng chỉ mục ScaNN của AlloyDB.
Sau đây là kết quả của kế hoạch thực thi:
Limit (cost=2709.20..2718.82 rows=10 width=490) (actual time=6.966..7.049 rows=10 loops=1)
-> Index Scan using embedding_scann on products (cost=2709.20..30736.40 rows=29120 width=490) (actual time=6.964..7.046 rows=10 loops=1)
Order By: (product_embedding <=> '[-0.0020264734,-0.016582033,0.027258193
...
-0.0051468653,-0.012440448]'::vector)
Limit: 10
Thời gian lập kế hoạch: 136,579 mili giây
Thời gian thực thi: 6,791 mili giây
(6 hàng)
Đó là tính năng tìm kiếm dựa trên văn bản bằng cách sử dụng mô hình chỉ nhúng văn bản. Nhưng chúng tôi cũng có hình ảnh cho sản phẩm của mình và có thể sử dụng hình ảnh đó để tìm kiếm. Trong chương tiếp theo, chúng ta sẽ tìm hiểu cách mô hình đa phương thức sử dụng hình ảnh cho hoạt động tìm kiếm.
8. Sử dụng tính năng Tìm kiếm đa phương thức
Mặc dù tìm kiếm ngữ nghĩa dựa trên văn bản rất hữu ích, nhưng việc mô tả các chi tiết phức tạp có thể gặp nhiều khó khăn. Tính năng tìm kiếm đa phương thức của AlloyDB mang lại lợi thế bằng cách cho phép khám phá sản phẩm thông qua dữ liệu đầu vào là hình ảnh. Điều này đặc biệt hữu ích khi hình ảnh minh hoạ làm rõ ý định tìm kiếm hiệu quả hơn so với chỉ có nội dung mô tả bằng văn bản. Ví dụ: "tìm cho tôi một chiếc áo khoác giống như chiếc áo trong hình".
Hãy quay lại ví dụ về áo khoác. Nếu có hình ảnh của một chiếc áo khoác tương tự như chiếc áo tôi muốn tìm, thì tôi có thể chuyển hình ảnh đó đến mô hình nhúng đa phương thức của Google và so sánh với các vectơ nhúng cho hình ảnh sản phẩm của tôi. Trong bảng của chúng tôi, chúng tôi đã tính toán các vectơ nhúng cho hình ảnh sản phẩm trong cột product_image_embedding và bạn có thể thấy mô hình được dùng trong cột product_image_embedding_model.
Đối với hoạt động tìm kiếm, chúng ta có thể sử dụng hàm image_embedding để nhận thông tin nhúng cho hình ảnh và so sánh thông tin đó với thông tin nhúng được tính toán trước. Để bật chức năng này, chúng ta cần đảm bảo rằng mình đang sử dụng đúng phiên bản của tiện ích google_ml_integration.
Hãy xác minh phiên bản hiện tại của tiện ích. Trong AlloyDB Studio, hãy thực thi.
SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
Nếu phiên bản này thấp hơn 1.5.2, hãy chạy quy trình sau.
CALL google_ml.upgrade_to_preview_version();
Sau đó, kiểm tra lại phiên bản của tiện ích. Phiên bản này phải là 1.5.3.
SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
Chúng ta cũng cần bật các tính năng của công cụ truy vấn AI trong cơ sở dữ liệu. Bạn có thể thực hiện việc này bằng cách cập nhật theo cờ phiên bản cho tất cả cơ sở dữ liệu trên phiên bản hoặc chỉ bật cho cơ sở dữ liệu của chúng tôi. Thực thi lệnh sau trong AlloyDB Studio để bật tính năng này cho cơ sở dữ liệu quickstart_db.
ALTER DATABASE quickstart_db SET google_ml_integration.enable_ai_query_engine = 'on';
Giờ đây, chúng ta có thể tìm kiếm bằng hình ảnh. Đây là hình ảnh mẫu của tôi để tìm kiếm, nhưng bạn có thể sử dụng bất kỳ hình ảnh tuỳ chỉnh nào. Bạn chỉ cần tải tệp đó lên bộ nhớ Google hoặc tài nguyên công khai khác và đặt URI vào truy vấn.

Và tệp này được tải lên gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png
Tìm kiếm hình ảnh bằng hình ảnh
Trước tiên, chúng ta thử tìm kiếm chỉ bằng hình ảnh:
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_image_embedding <=> google_ml.image_embedding (model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
4;
Chúng tôi cũng tìm được một số áo khoác ấm trong kho hàng. Để xem các hình ảnh, bạn có thể tải chúng xuống bằng SDK đám mây (gcloud storage cp) bằng cách cung cấp cột public_url rồi mở bằng bất kỳ công cụ nào hoạt động với hình ảnh.
|
|
|
|
Tính năng tìm kiếm bằng hình ảnh trả về những mục tương tự như hình ảnh mà chúng ta cung cấp để so sánh. Như tôi đã đề cập, bạn có thể thử tải hình ảnh của riêng mình lên một vùng lưu trữ công khai để xem liệu nó có thể tìm thấy các loại quần áo khác nhau hay không.
Chúng tôi đã sử dụng mô hình "multimodalembedding@001" của Google cho tính năng tìm kiếm bằng hình ảnh. Hàm image_embedding sẽ gửi hình ảnh đến Vertex AI, chuyển đổi hình ảnh đó thành một vectơ rồi trả về để so sánh với các vectơ được lưu trữ cho hình ảnh trong cơ sở dữ liệu của chúng tôi.
Chúng ta cũng có thể kiểm tra bằng "EXPLAIN ANALYZE" (GIẢI THÍCH PHÂN TÍCH) để biết tốc độ hoạt động của chỉ mục ScaNN AlloyDB.
Sau đây là kết quả của kế hoạch thực thi:
Limit (cost=971.70..975.55 rows=4 width=490) (actual time=2.453..2.477 rows=4 loops=1)
-> Index Scan using product_image_embedding_scann on products (cost=971.70..28998.90 rows=29120 width=490) (actual time=2.451..2.475 rows=4 loops=1)
Order By: (product_image_embedding <=> '[0.02119865,0.034206174,0.030682731,
...
,-0.010307034,-0.010053742]'::vector)
Limit: 4
Thời gian lập kế hoạch: 913,322 mili giây
Thời gian thực thi: 2,517 mili giây
(6 hàng)
Và một lần nữa, như trong ví dụ trước, chúng ta có thể thấy rằng hầu hết thời gian được dùng để chuyển đổi hình ảnh thành các mục nhúng bằng cách sử dụng điểm cuối trên đám mây và bản thân tính năng tìm kiếm vectơ chỉ mất 2,5 mili giây.
Tìm kiếm hình ảnh bằng văn bản
Với tính năng tìm kiếm đa phương thức, chúng ta cũng có thể truyền nội dung mô tả bằng văn bản về chiếc áo khoác mà chúng ta đang cố gắng tìm kiếm cho mô hình bằng google_ml.text_embedding cho cùng một mô hình và so sánh với các vectơ nhúng hình ảnh để xem mô hình trả về những hình ảnh nào.
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_image_embedding <=> google_ml.text_embedding (model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
4;
Chúng tôi có một bộ áo khoác phồng có màu xám hoặc màu tối.
|
|
|
|
Chúng tôi đã nhận được một bộ áo khoác hơi khác, nhưng mô hình đã chọn đúng áo khoác dựa trên nội dung mô tả của chúng tôi và tìm kiếm thông qua các vectơ nhúng hình ảnh.
Hãy thử một cách khác để tìm kiếm trong số các nội dung mô tả bằng cách sử dụng tính năng nhúng cho hình ảnh tìm kiếm.
Tìm kiếm văn bản bằng hình ảnh
Chúng tôi đã thử tìm kiếm những hình ảnh truyền qua quá trình nhúng cho hình ảnh của mình và so sánh với các hình ảnh được nhúng đã tính toán trước cho sản phẩm của mình. Chúng tôi cũng đã thử tìm kiếm hình ảnh bằng cách truyền thông tin nhúng cho yêu cầu văn bản và tìm kiếm trong cùng thông tin nhúng cho hình ảnh sản phẩm. Bây giờ, hãy thử sử dụng tính năng nhúng cho hình ảnh và so sánh với tính năng nhúng văn bản cho nội dung mô tả sản phẩm. Tính năng nhúng được lưu trữ trong cột product_description_embedding và sử dụng cùng một mô hình multimodalembedding@001.
Sau đây là truy vấn của chúng tôi:
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_description_embedding <=> google_ml.image_embedding (model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
4;
Và đây là một bộ áo khoác hơi khác với màu xám hoặc màu tối, trong đó một số áo giống nhau hoặc rất giống với áo được chọn theo cách tìm kiếm khác.
|
|
|
|
Truy vấn này sẽ trả về các áo khoác tương tự như ở trên nhưng theo một thứ tự hơi khác. Dựa trên việc nhúng cho hình ảnh, hệ thống có thể so sánh với các thành phần được tính toán cho nội dung mô tả bằng văn bản và trả về đúng bộ sản phẩm.
Tìm kiếm kết hợp văn bản và hình ảnh
Bạn cũng có thể thử nghiệm kết hợp cả văn bản và hình ảnh được nhúng với nhau, chẳng hạn như sử dụng phương pháp kết hợp thứ hạng tương hỗ. Sau đây là ví dụ về một cụm từ tìm kiếm như vậy, trong đó chúng tôi đã kết hợp hai cụm từ tìm kiếm, chỉ định điểm số cho từng thứ hạng và sắp xếp kết quả dựa trên điểm số kết hợp.
WITH image_search AS (
SELECT id,
RANK () OVER (ORDER BY product_image_embedding <=>google_ml.image_embedding(model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector) AS rank
FROM ecomm.products
ORDER BY product_image_embedding <=>google_ml.image_embedding(model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector LIMIT 5
),
text_search AS (
SELECT id,
RANK () OVER (ORDER BY product_description_embedding <=>google_ml.text_embedding(model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour'
)::vector) AS rank
FROM ecomm.products
ORDER BY product_description_embedding <=>google_ml.text_embedding(model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour'
)::vector LIMIT 5
),
rrf_score AS (
SELECT
COALESCE(image_search.id, text_search.id) AS id,
COALESCE(1.0 / (60 + image_search.rank), 0.0) + COALESCE(1.0 / (60 + text_search.rank), 0.0) AS rrf_score
FROM image_search FULL OUTER JOIN text_search ON image_search.id = text_search.id
ORDER BY rrf_score DESC
)
SELECT
ep.name,
ep.product_description,
ep.retail_price,
replace(ep.product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM ecomm.products ep, rrf_score
WHERE
ep.id=rrf_score.id
ORDER by rrf_score DESC
LIMIT 4;
Bạn có thể thử thay đổi các tham số trong truy vấn để xem liệu việc này có thể cải thiện kết quả tìm kiếm hay không.
Đến đây là kết thúc bài thực hành. Để tránh các khoản phí không mong muốn, bạn nên xoá các tài nguyên không dùng đến.
Ngoài ra, bạn có thể sử dụng các toán tử AI khác để xếp hạng kết quả như mô tả trong tài liệu.
9. 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.
10. Xin chúc mừng
Chúc mừng bạn đã hoàn thành lớp học lập trình này. Bạn đã tìm hiểu cách sử dụng tính năng tìm kiếm đa phương thức trong AlloyDB bằng cách sử dụng các hàm nhúng cho văn bản và hình ảnh. Bạn có thể thử kiểm tra tính năng tìm kiếm đa phương thức và cải thiện tính năng này bằng hàm google_ml.rank thông qua lớp học lập trình dành cho các toán tử AI AlloyDB.
Lộ trình học tập trên Google Cloud
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.
- Khám phá toàn bộ chương trình giảng dạy để thu hẹp khoảng cách từ nguyên mẫu đến sản xuất.
- Chia sẻ tiến trình của bạn bằng thẻ bắt đầu bằng #
#ProductionReadyAI.
Nội dung đã đề cập
- Cách triển khai AlloyDB cho Postgres
- Cách sử dụng AlloyDB Studio
- Cách sử dụng tính năng tìm kiếm vectơ đa phương thức
- Cách bật các toán tử AI của AlloyDB
- Cách sử dụng các toán tử AlloyDB AI khác nhau cho tính năng tìm kiếm đa phương thức
- Cách sử dụng AI của AlloyDB để kết hợp kết quả tìm kiếm bằng văn bản và hình ảnh
11. Khảo sát
Kết quả:










