Nhúng đa phương thức trong AlloyDB

1. Giới thiệu

a7e7c1d2afe05e68.png

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 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ử AI AlloyDB 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 môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Tên dự án là tên hiển thị cho những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn luôn có thể cập nhật thông tin này.
  • Mã dự án là giá trị 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). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã 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 bạn có thể thử tên người dùng của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ tồn tại trong suốt thời gian của dự án.
  • Để 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.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Khởi động Cloud Shell

Mặc dù 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:

55efc1aaa7a4d3ad.png

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:

7ffe5cbb04455448.png

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

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

gcloud config set project [YOUR-PROJECT-ID]

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

PROJECT_ID=$(gcloud config get-value project)

Bật tất cả 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.

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 chế độ cài đặt 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 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ã 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 cụm và khu vực.

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 cụm và khu vực.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

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

student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

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

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

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, bạn cần mở giao diện bảng điều khiển web cho cụm AlloyDB bằng cách nhấp vào phiên bản chính.

ef4bfbcf0ed2ef3a.png

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

5c155cbcd7d43a1.png

Chọn cơ sở dữ liệu 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".

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

b36c28f8165119ca.png

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

cf43aa20f292797e.png

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.

e826ad973eb23a74.png

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.

1ca70c59b5aea8c1.png

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 chứa 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:

9ee57986d4cdf20f.png

Và xác minh số lượng hàng trong một trong các bảng.

51c3c55881157da3.png

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.

Nếu chúng ta cố gắng 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 tôi 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 từ 90 đến 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.

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
 Planning Time: 136.579 ms
 Execution Time: 6.791 ms
(6 rows)

Đó 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ả 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, bạn đã tính toán được các mục 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 để lấy 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.4.4, 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.4.4.

Đâ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ớ của Google hoặc một tài nguyên công khai khác rồi đặt URI vào truy vấn.

9f33ca0c73ea2b19.png

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.

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 tôi 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ơ đã 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 AlloyDB ScaNN.

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
 Planning Time: 913.322 ms
 Execution Time: 2.517 ms
(6 rows)

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 với 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 công cụ này đã 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 các 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 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.

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 thông số trong truy vấn để xem liệu cách 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 phần 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 lớp học

Xoá cụm AlloyDB và tất cả các phiên bả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 về các toán tử AI AlloyDB.

Nội dung đã đề cập

  • Cách triển khai AlloyDB cho Postgres
  • 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ử AI AlloyDB 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ả:

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