Làm quen với tính năng Nhúng vectơ trong Cloud SQL cho MySQL

1. Giới thiệu

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách sử dụng tính năng tích hợp Cloud SQL cho MySQL với Vertex AI bằng cách kết hợp tính năng tìm kiếm vectơ với các vectơ nhúng của Vertex AI.

8aa6ba3bc12a1593.png

Đ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 một phiên bản Cloud SQL cho PostgreSQL
  • Cách tạo cơ sở dữ liệu và bật tính năng tích hợp AI của Cloud SQL
  • Cách tải dữ liệu vào cơ sở dữ liệu
  • Cách sử dụng Cloud SQL Studio
  • Cách sử dụng mô hình nhúng Vertex AI trong Cloud SQL
  • Cách sử dụng Vertex AI Studio
  • Cách làm phong phú kết quả bằng mô hình tạo sinh Vertex AI
  • Cách cải thiện hiệu suất bằng chỉ mục vectơ

Bạn cần có

  • Tài khoản Google Cloud và dự án trên Google Cloud
  • Một trình duyệt web như Chrome hỗ trợ Google Cloud Console và Cloud Shell

2. Thiết lập và yêu cầu

Thiết lập dự án

  1. Đăng nhập vào Google Cloud Console. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

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

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

295004821bab6a87.png

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

37d264871000675d.png

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

96d86d3d5655cdbe.png

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

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

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

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

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

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

f54628965f465486.png

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

20e88842cf2a732e.png

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

cdc87f1c57777951.png

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

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

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

Một số lưu ý:

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

Khởi động Cloud Shell

Mặc dù có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên Cloud.

Trên Bảng điều khiển Google Cloud, hãy nhấp vào biểu tượng Cloud Shell trên thanh công cụ ở trên cùng bên phải:

Kích hoạt Cloud Shell

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

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

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

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

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

Bật API

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

Trong thiết bị đầu cuối Cloud Shell, 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 sqladmin.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 sqladmin.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

  • Cloud SQL Admin API (sqladmin.googleapis.com) cho phép bạn tạo, định cấu hình và quản lý các phiên bản Cloud SQL theo phương thức lập trình. Dịch vụ này cung cấp lớp kiểm soát cho dịch vụ cơ sở dữ liệu quan hệ được quản lý hoàn toàn của Google (hỗ trợ MySQL, PostgreSQL và SQL Server), xử lý các tác vụ như cung cấp, sao lưu, khả năng đáp ứng cao và mở rộng quy mô.
  • 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. Tạo một phiên bản Cloud SQL

Tạo phiên bản Cloud SQL có tích hợp cơ sở dữ liệu với Vertex AI.

Tạo mật khẩu cơ sở dữ liệu

Xác định mật khẩu cho người dùng cơ sở dữ liệu mặc định. 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 CLOUDSQL_PASSWORD=`openssl rand -hex 12`

Ghi lại giá trị được tạo cho mật khẩu:

echo $CLOUDSQL_PASSWORD

Tạo phiên bản Cloud SQL cho MySQL

Bạn có thể bật cờ cloudsql_vector khi tạo một phiên bản. Tính năng hỗ trợ vectơ hiện có trên MySQL 8.0 R20241208.01_00 trở lên

Trong phiên Cloud Shell, hãy thực thi:

gcloud sql instances create my-cloudsql-instance \
--database-version=MYSQL_8_4 \
--tier=db-custom-2-8192 \
--region=us-central1 \
--enable-google-ml-integration \
--edition=ENTERPRISE \
--root-password=$CLOUDSQL_PASSWORD

Chúng ta có thể xác minh kết nối bằng cách thực thi từ Cloud Shell

gcloud sql connect my-cloudsql-instance --user=root

Chạy lệnh và nhập mật khẩu vào lời nhắc khi lệnh đã sẵn sàng kết nối.

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

$gcloud sql connect my-cloudsql-instance --user=root
Allowlisting your IP for incoming connection for 5 minutes...done.                                                                                                                           
Connecting to database with SQL user [root].Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 71
Server version: 8.4.4-google (Google)

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Thoát khỏi phiên mysql bằng phím tắt ctrl+d hoặc thực thi lệnh exit

exit

Bật tính năng tích hợp Vertex AI

Cấp các đặc quyền cần thiết cho tài khoản dịch vụ Cloud SQL nội bộ để có thể sử dụng tính năng tích hợp Vertex AI.

Tìm địa chỉ email của tài khoản dịch vụ nội bộ Cloud SQL và xuất địa chỉ đó dưới dạng một biến.

SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL

Cấp quyền truy cập cho Vertex AI vào tài khoản dịch vụ Cloud SQL:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
  --role="roles/aiplatform.user"

Đọc thêm về cách tạo và định cấu hình phiên bản trong tài liệu Cloud SQL tại đây.

5. Chuẩn bị cơ sở dữ liệu

Bây giờ, chúng ta cần tạo một cơ sở dữ liệu và bật tính năng hỗ trợ vectơ.

Tạo cơ sở dữ liệu

Tạo một cơ sở dữ liệu có tên là quickstart_db .Để làm như vậy, chúng ta có nhiều lựa chọn như các ứng dụng cơ sở dữ liệu dòng lệnh (chẳng hạn như mysql cho mySQL), SDK hoặc Cloud SQL Studio. Chúng ta sẽ dùng SDK (gcloud) để tạo cơ sở dữ liệu.

Trong Cloud Shell, hãy thực thi lệnh để tạo cơ sở dữ liệu

gcloud sql databases create quickstart_db --instance=my-cloudsql-instance

6. Tải dữ liệ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 dữ liệu giả định của Cửa hàng Cymbal. Dữ liệu có ở định dạng SQL (đối với giản đồ) và CSV (đối với dữ liệu).

Cloud Shell sẽ là môi trường chính để kết nối với cơ sở dữ liệu, tạo tất cả các đối tượng và tải dữ liệu.

Trước tiên, chúng ta cần thêm IP công khai của Cloud Shell vào danh sách các mạng được uỷ quyền cho phiên bản Cloud SQL. Trong Cloud Shell, hãy thực thi:

gcloud sql instances patch my-cloudsql-instance --authorized-networks=$(curl ifconfig.me)

Nếu phiên của bạn bị mất, hãy đặt lại hoặc nếu bạn làm việc từ một công cụ khác, hãy xuất lại biến CLOUDSQL_PASSWORD:

export CLOUDSQL_PASSWORD=...your password defined for the instance...

Giờ đây, chúng ta có thể tạo tất cả các đối tượng cần thiết trong cơ sở dữ liệu. Để làm như vậy, chúng ta sẽ sử dụng tiện ích mysql của MySQL kết hợp với tiện ích curl để lấy dữ liệu từ nguồn công khai.

Trong Cloud Shell, hãy thực thi:

export INSTANCE_IP=$(gcloud sql instances describe my-cloudsql-instance --format="value(ipAddresses.ipAddress)")
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_mysql_schema.sql | mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db

Chúng ta đã làm gì trong lệnh trước đó? Chúng tôi đã kết nối với cơ sở dữ liệu và thực thi mã SQL đã tải xuống để tạo các bảng, chỉ mục và chuỗi.

Bước tiếp theo là tải dữ liệu cymbal_products. Chúng tôi sử dụng cùng các tiện ích curlmysql.

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_products.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_products FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

Sau đó, chúng ta tiếp tục với cymbal_stores.

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_stores.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_stores FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

Và hoàn tất bằng cymbal_inventory có số lượng của từng sản phẩm ở mỗi cửa hàng.

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_inventory.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_inventory FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

Nếu có dữ liệu mẫu riêng và tệp CSV tương thích với công cụ nhập Cloud SQL có trong Cloud Console, bạn có thể sử dụng công cụ này thay vì phương pháp được trình bày.

7. Tạo mục nhúng

Bước tiếp theo là tạo các mục nhúng cho nội dung mô tả sản phẩm bằng cách sử dụng mô hình textembedding-005 của Google Vertex AI và lưu trữ các mục nhúng đó trong cột mới của bảng cymbal_products.

Để lưu trữ dữ liệu vectơ, chúng ta cần bật chức năng vectơ trong phiên bản Cloud SQL. Thực thi trong Cloud Shell:

gcloud sql instances patch my-cloudsql-instance \
--database-flags=cloudsql_vector=on

Kết nối với cơ sở dữ liệu:

mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db

Và tạo một cột mới embedding trong bảng cymbal_products bằng cách sử dụng hàm nhúng. Cột mới đó sẽ chứa các vectơ nhúng dựa trên văn bản trong cột product_description.

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) using varbinary;
UPDATE cymbal_products SET embedding = mysql.ml_embedding('text-embedding-005', product_description);

Việc tạo các mục nhúng vectơ cho 2.000 hàng thường mất dưới 5 phút, nhưng đôi khi có thể lâu hơn một chút và thường hoàn tất nhanh hơn nhiều.

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

Giờ đây, chúng ta có thể chạy tìm kiếm bằng cách sử dụng tính năng tìm kiếm tương tự dựa trên các giá trị vectơ được tính cho nội dung mô tả và giá trị vectơ mà chúng ta tạo cho yêu cầu bằng cùng một mô hình nhúng.

Bạn có thể thực thi truy vấn SQL từ cùng một giao diện dòng lệnh hoặc từ Cloud SQL Studio. Bạn nên quản lý mọi truy vấn phức tạp và có nhiều hàng trong Cloud SQL Studio.

Tạo người dùng

Chúng tôi cần một người dùng mới có thể sử dụng Cloud SQL Studio. Chúng ta sẽ tạo một người dùng là học viên thuộc loại tích hợp với mật khẩu giống như mật khẩu mà chúng ta đã dùng cho người dùng gốc.

Trong Cloud Shell, hãy thực thi:

gcloud sql users create student  --instance=my-cloudsql-instance --password=$CLOUDSQL_PASSWORD --host=%

Khởi động Cloud SQL Studio

Trong bảng điều khiển, hãy nhấp vào phiên bản Cloud SQL mà chúng ta đã tạo trước đó.

27f060eb2764a26a.png

Khi mở trên bảng điều khiển bên phải, chúng ta có thể thấy Cloud SQL Studio. Hãy nhấp vào thẻ đó.

f08ce4794fce5bce.png

Thao tác này sẽ mở một hộp thoại để bạn cung cấp tên cơ sở dữ liệu và thông tin đăng nhập:

  • Cơ sở dữ liệu: quickstart_db
  • Người dùng: học viên
  • Mật khẩu: mật khẩu bạn đã ghi chú cho người dùng

Sau đó, nhấp vào nút "XÁC THỰC".

5c898e4a4a0adb96.png

Thao tác này sẽ mở cửa sổ tiếp theo, nơi bạn nhấp vào thẻ "Trình chỉnh sửa" ở bên phải để mở Trình chỉnh sửa SQL.

983d35d20f8a3dda.png

Giờ đây, chúng ta đã sẵn sàng chạy các truy vấn.

Chạy truy vấn

Chạy một truy vấn để nhận danh sách các sản phẩm hiện có liên quan chặt chẽ nhất đến yêu cầu của khách hàng. Yêu cầu mà chúng ta sẽ truyền đến Vertex AI để nhận giá trị vectơ có dạng "What kind of fruit trees grow well here?" (Loại cây ăn quả nào phát triển tốt ở đây?)

Sau đây là truy vấn mà bạn có thể chạy để chọn 5 mục đầu tiên phù hợp nhất với yêu cầu của chúng tôi bằng cách sử dụng hàm cosine_distance:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cosine_distance(cp.embedding ,@query_vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 5;

Sao chép và dán truy vấn vào trình chỉnh sửa Cloud SQL Studio rồi nhấn nút "RUN" (CHẠY) hoặc dán truy vấn đó vào phiên dòng lệnh kết nối với cơ sở dữ liệu quickstart_db.

a8be9da7d5c2b176.png

Sau đây là danh sách các sản phẩm được chọn trùng khớp với cụm từ tìm kiếm.

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set (0.13 sec)

Việc thực thi truy vấn mất 0,13 giây với hàm cosine_distance.

Bây giờ, chúng ta sẽ chạy cùng một truy vấn nhưng sử dụng tính năng tìm kiếm KNN bằng hàm approx_distance. Nếu không có chỉ mục ANN cho các vectơ nhúng, thì hệ thống sẽ tự động quay lại tìm kiếm chính xác ở chế độ nền:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 5;

Sau đây là danh sách các sản phẩm do truy vấn trả về.

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set, 1 warning (0.12 sec)

Truy vấn chỉ mất 0,12 giây để thực thi. Chúng ta nhận được kết quả tương tự như hàm cosine_distance.

9. Cải thiện câu trả lời của LLM bằng dữ liệu đã truy xuất

Chúng tôi có thể cải thiện câu trả lời của LLM AI tạo sinh cho một ứng dụng khách bằng cách sử dụng kết quả của truy vấn đã thực thi và chuẩn bị một đầu ra có ý nghĩa bằng cách sử dụng kết quả truy vấn được cung cấp làm một phần của câu lệnh cho mô hình ngôn ngữ cơ sở tạo sinh của Vertex AI.

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

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

Sửa đổi truy vấn để tạo đầu ra ở định dạng JSON và chỉ trả về một hàng để chuyển đến Vertex AI

Sau đây là ví dụ về truy vấn bằng tính năng tìm kiếm ANN:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
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
        (approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine')) ASC
LIMIT 1)
SELECT json_arrayagg(json_object('product_name',product_name,'description',description,'sale_price',sale_price,'zip_code',zip_code,'product_id',product_id)) FROM trees;

Và đây là JSON dự kiến trong đầu ra:

[{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}]

Chạy câu lệnh trong Vertex AI Studio

Chúng ta có thể sử dụng JSON đã tạo để cung cấp JSON này như một phần của câu lệnh cho mô hình văn bản AI tạo sinh trong Vertex AI Studio

Mở câu lệnh Vertex AI Studio trong Cloud Console.

d48549b1b0f449b4.png

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

Đưa ra một câu lệnh trong Studio.

2a6f5a338fefd229.png

Sau đây là câu lệnh mà chúng ta sẽ sử dụng:

You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[place your JSON here]
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

Sau đây là cách hiển thị khi chúng ta thay thế phần giữ chỗ JSON bằng phản hồi từ truy vấn:

You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

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

62fccb783d4d4985.png

Câu trả lời mà chúng tôi nhận được từ mô hình trong ví dụ này là kết quả của việc sử dụng kết quả tìm kiếm ngữ nghĩa và sản phẩm phù hợp nhất có trong mã bưu chính được đề cập.

Chạy câu lệnh trong SQL

Chúng ta cũng có thể sử dụng tính năng tích hợp AI của Cloud SQL với Vertex AI để nhận được phản hồi tương tự từ một mô hình tạo sinh bằng cách sử dụng SQL ngay trong cơ sở dữ liệu.

Giờ đây, chúng ta có thể sử dụng kết quả JSON được tạo trong một truy vấn phụ để cung cấp kết quả đó dưới dạng một phần của câu lệnh cho mô hình văn bản AI tạo sinh bằng SQL.

Trong phiên mysql hoặc Cloud SQL Studio đến cơ sở dữ liệu, hãy chạy truy vấn

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
WITH trees AS (
SELECT
        cp.product_name,
        cp.product_description AS description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id AS product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci ON
        ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON
        cs.store_id = ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
         (approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine')) ASC
LIMIT 1),
prompt AS (
SELECT
       CONCAT( 'You are a friendly advisor helping to find a product based on the customer''s needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","product_description":"some description","sale_price":10}
Here is the list of products:', json_arrayagg(json_object('product_name',trees.product_name,'description',trees.description,'sale_price',trees.sale_price,'zip_code',trees.zip_code,'product_id',trees.product_id)) , 'The customer asked "What kind of fruit trees grow well here?"
You should give information about the product, price and some supplemental information') AS prompt_text
FROM
        trees),
response AS (
SELECT
       mysql.ML_PREDICT_ROW('publishers/google/models/gemini-2.0-flash-001:generateContent',
        json_object('contents',
        json_object('role',
        'user',
        'parts',
        json_array(
        json_object('text',
        prompt_text))))) AS resp
FROM
        prompt)
SELECT
JSON_EXTRACT(resp, '$.candidates[0].content.parts[0].text')
FROM
        response;

Sau đây là kết quả mẫu. Kết quả đầu ra của bạn có thể khác tuỳ thuộc vào phiên bản mô hình và các tham số:

"Okay, I see you're looking for fruit trees that grow well in your area. Based on the available product, the **Malus Domestica** (Apple Tree) is a great option to consider!\n\n* **Product:** Malus Domestica (Apple Tree)\n* **Description:** This classic apple tree grows to about 30 feet tall and provides beautiful seasonal color with green leaves in summer and fiery colors in the fall. It's known for its strength and provides good shade. Most importantly, it produces delicious apples!\n* **Price:** \\$100.00\n* **Growing Zones:** This particular apple tree is well-suited for USDA zones 4-8. Since your zip code is 93230, you are likely in USDA zone 9a or 9b. While this specific tree is rated for zones 4-8, with proper care and variety selection, apple trees can still thrive in slightly warmer climates. You may need to provide extra care during heat waves.\n\n**Recommendation:** I would recommend investigating varieties of Malus Domestica suited to slightly warmer climates or contacting a local nursery/arborist to verify if it is a good fit for your local climate conditions.\n"

Đầu ra được cung cấp ở định dạng markdown.

10. Tạo chỉ mục lân cận gần nhất

Tập dữ liệu của chúng tôi tương đối nhỏ và thời gian phản hồi chủ yếu phụ thuộc vào các lượt tương tác với mô hình AI. Nhưng khi bạn có hàng triệu vectơ, tính năng tìm kiếm vectơ có thể chiếm một phần đáng kể trong thời gian phản hồi và gây tải lớn cho hệ thống. Để cải thiện, chúng ta có thể tạo một chỉ mục trên các vectơ.

Tạo chỉ mục ScANN

Chúng ta sẽ thử loại chỉ mục ScANN cho kiểm thử.

Để tạo chỉ mục cho cột nhúng, chúng ta cần xác định phép đo khoảng cách cho cột nhúng. Bạn có thể đọc thông tin chi tiết về các tham số trong tài liệu.

CREATE VECTOR INDEX cymbal_products_embedding_idx ON cymbal_products(embedding) USING SCANN DISTANCE_MEASURE=COSINE;

So sánh câu trả lời

Giờ đây, chúng ta có thể chạy lại truy vấn tìm kiếm vectơ và xem kết quả

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 5;

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

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set (0.08 sec)

Chúng ta có thể thấy rằng thời gian thực thi chỉ khác nhau một chút, nhưng điều này là bình thường đối với một tập dữ liệu nhỏ như vậy. Điều này sẽ dễ nhận thấy hơn nhiều đối với các tập dữ liệu lớn có hàng triệu vectơ.

Và chúng ta có thể xem kế hoạch thực thi bằng lệnh EXPLAIN:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
EXPLAIN ANALYZE SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 5;

Kế hoạch thực thi (trích dẫn):

...
-> Nested loop inner join  (cost=443 rows=5) (actual time=1.14..1.18 rows=5 loops=1)
                                -> Vector index scan on cp  (cost=441 rows=5) (actual time=1.1..1.1 rows=5 loops=1)
                                -> Single-row index lookup on cp using PRIMARY (uniq_id=cp.uniq_id)  (cost=0.25 rows=1) (actual time=0.0152..0.0152 rows=1 loops=5)

...

Chúng ta có thể thấy rằng truy vấn này đang sử dụng tính năng quét chỉ mục vectơ trên cp (bí danh cho bảng cymbal_products).

Bạn có thể thử nghiệm với dữ liệu của riêng mình hoặc kiểm thử các cụm từ tìm kiếm khác nhau để xem tính năng tìm kiếm ngữ nghĩa hoạt động như thế nào trong MySQL.

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

Xoá phiên bản Cloud SQL

Huỷ phiên bản Cloud SQL khi bạn hoàn tất lớp học lập trình

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 đó:

export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)

Xoá phiên bản:

gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID

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

student@cloudshell:~$ gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID
All of the instance data will be lost when the instance is deleted.

Do you want to continue (Y/n)?  y

Deleting Cloud SQL instance...done.                                                                                                                
Deleted [https://sandbox.googleapis.com/v1beta4/projects/test-project-001-402417/instances/my-cloudsql-instance].

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.

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.

Nội dung đã đề cập

  • Cách triển khai một phiên bản Cloud SQL cho PostgreSQL
  • Cách tạo cơ sở dữ liệu và bật tính năng tích hợp AI của Cloud SQL
  • Cách tải dữ liệu vào cơ sở dữ liệu
  • Cách sử dụng Cloud SQL Studio
  • Cách sử dụng mô hình nhúng Vertex AI trong Cloud SQL
  • Cách sử dụng Vertex AI Studio
  • Cách làm phong phú kết quả bằng mô hình tạo sinh Vertex AI
  • Cách cải thiện hiệu suất bằng chỉ mục vectơ

Hãy thử lớp học lập trình tương tự cho AlloyDB hoặc lớp học lập trình cho Cloud SQL for Postgres

13. Khảo sát

Kết quả:

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ đọc qua Đọc và hoàn thành bài tập