Thông tin về lớp học lập trình này
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 Cloud SQL để tích hợp Vertex AI với MySQL bằng cách kết hợp tính năng tìm kiếm vectơ với các tính năng nhúng Vertex AI.
Điều kiện tiên quyết
- Có kiến thức cơ bản về Google Cloud, bảng điều khiển
- 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 phiên bản Cloud SQL cho MySQL
- 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 mô hình nhúng Vertex AI trong Cloud SQL
- Cách làm phong phú kết quả bằng mô hình tạo sinh của 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 Google Cloud
- Một trình duyệt web như Chrome hỗ trợ Google Cloud Console và Cloud Shell
2. Cách thiết lập và các yêu cầu
Thiết lập môi trường theo tốc độ của riêng bạn
- Đă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.
- Tên dự án là tên hiển thị cho người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn luôn có thể cập nhật thông tin này.
- Mã dự án là duy nhất trên tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi 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ã được tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử dùng email của riêng mình để xem có thể sử dụng hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ được giữ nguyên trong suốt thời gian của dự án. - Xin lưu ý rằng có một giá trị thứ ba là Mã dự án mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu.
- 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 tham gia lớp học lập trình này sẽ không tốn kém nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí sau khi hoàn tất 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ể điều khiển 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 đám mây.
Trong 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:
Quá trình cấp phép và kết nối với môi trường chỉ mất vài phút. Khi hoàn tất, bạn sẽ thấy như sau:
Máy ảo này được tải sẵn tất cả các công cụ phát triển mà bạn cần. Ứng dụng này cung cấp một thư mục gốc 5 GB ổn định và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất mạng và 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 một trình duyệt. Bạn không cần cài đặt gì cả.
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 sqladmin.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com
Kết quả 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.
4. Tạo 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 cho 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 hàm ngẫu nhiên để tạo mật khẩu:
export CLOUDSQL_PASSWORD=`openssl rand -hex 12`
Lưu ý 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 thực thể. Tính năng hỗ trợ vectơ hiện có sẵn cho 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 đang 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 của bạn vào lời nhắc khi đã sẵn sàng kết nối.
Kết quả 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>
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 email của tài khoản dịch vụ nội bộ Cloud SQL và xuất email đó dưới dạng 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 vào Vertex AI cho 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 thực thể trong tài liệu về 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 cơ sở dữ liệu có tên quickstart_db .Để làm việc này, chúng ta có nhiều lựa chọn như ứng dụng cơ sở dữ liệu dòng lệnh như mysql cho mySQL, SDK hoặc Cloud SQL Studio. Chúng ta sẽ 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 của Cymbal Store (Cửa hàng cymbal) hư cấu. Dữ liệu có sẵn ở đị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ả đố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 mạng được uỷ quyền cho thực thể Cloud SQL. Trong màn hình shell trên đám mây, 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 bạn làm việc trên một công cụ khác, sau đó xuất lại biến CLOUDSQL_PASSWORD:
export CLOUDSQL_PASSWORD=...your password defined for the instance...
Bây giờ, chúng ta có thể tạo tất cả các đối tượng bắt buộc 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 màn hình shell trên đám mây, 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ì chính xác trong lệnh trước? Chúng ta đã 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à trình tự.
Bước tiếp theo là tải dữ liệu cymbal_products. Chúng ta sử dụng cùng một tiện ích curl và mysql.
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 trong từng 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 và tệp CSV tương thích với công cụ nhập Cloud SQL có trong bảng điều khiển Cloud, 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 nội dung 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 đó trong cột mới trong 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 ảo nhúng trong bảng cymbal_products bằng hàm nhúng.
ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) using varbinary;
UPDATE cymbal_products SET embedding = mysql.ml_embedding('text-embedding-005', product_description);
Quá trình tạo vectơ nhúng cho 2000 hàng thường mất chưa đến 5 phút, nhưng đôi khi có thể lâu hơn một chút và thường kết thúc nhanh hơn nhiều.
8. Chạy tính năng Tìm kiếm nội dung tương tự
Bây giờ, chúng ta có thể chạy tìm kiếm bằng tính năng tìm kiếm theo mức độ tương đồng dựa trên các giá trị vectơ được tính toán cho nội dung mô tả và giá trị vectơ mà chúng ta tạo cho yêu cầu của mình bằng cách sử dụ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à 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 loại tích hợp sẵn là học viên với mật khẩu giống như mật khẩu chúng ta đã sử 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 đó.
Khi mở trên bảng điều khiển bên phải, chúng ta có thể thấy Cloud SQL Studio. Nhấp vào mục đó.
Thao tác này sẽ mở ra một hộp thoại để bạn cung cấp tên cơ sở dữ liệu và thông tin xác thực của mình:
- Cơ sở dữ liệu: quickstart_db
- Người dùng: học viên
- Password (Mật khẩu): mật khẩu bạn ghi chú cho người dùng
Sau đó, nhấp vào nút "AUTHENTICATE" (XÁC THỰC).
Thao tác này sẽ mở ra cửa sổ tiếp theo, trong đó 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.
Bây giờ, chúng ta đã sẵn sàng chạy truy vấn.
Chạy truy vấn
Chạy truy vấn để lấy danh sách các sản phẩm hiện có liên quan nhất đến yêu cầu của khách hàng. Yêu cầu mà chúng ta sẽ chuyển đến Vertex AI để nhận giá trị vectơ có dạng như "Loại cây ăn quả nào phát triển tốt ở đây?"
Chạy truy vấn bằng cosine_distance để tìm kiếm vectơ KNN (chính xác)
Dưới đâ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 ta 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, sau đó 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.
Dưới đâ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)
Quá trình thực thi truy vấn mất 0,13 giây với hàm cosine_distance.
Chạy truy vấn với approx_distance để tìm kiếm vectơ KNN (chính xác)
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 chúng ta không có chỉ mục ANN cho các nội dung nhúng, thì hệ thống sẽ tự động chuyển về 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;
Dưới đây là danh sách sản phẩm mà 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)
Quá trình thực thi truy vấn chỉ mất 0,12 giây. Chúng ta nhận được kết quả tương tự như đối với hàm cosine_distance.
9. Cải thiện phản hồi LLM bằng dữ liệu đã truy xuất
Chúng ta có thể cải thiện phản hồi LLM AI tạo sinh cho ứ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ị đầu ra có ý nghĩa bằng cách sử dụng kết quả truy vấn được cung cấp như một phần của lời nhắc cho mô hình ngôn ngữ nền tảng tạo sinh Vertex AI.
Để đạt được điều đó, chúng ta cần tạo một tệp JSON chứa kết quả tìm kiếm vectơ, sau đó sử dụng tệp JSON đã tạo đó để bổ sung cho lời nhắc cho mô hình LLM trong Vertex AI nhằm tạo ra kết quả có ý nghĩa. Trong bước đầu tiên, chúng ta tạo JSON, sau đó kiểm thử JSON đó trong Vertex AI Studio và ở bước cuối cùng, chúng ta kết hợp JSON đó vào một câu lệnh SQL có thể được sử 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
Dưới đây là ví dụ về truy vấn sử dụ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;
Dưới đây là JSON dự kiến trong kết quả:
[{"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 đó 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 trong Vertex AI Studio
Mở câu lệnh Vertex AI Studio trong bảng điều khiển trên đám mây.
Bạn có thể đượ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 khác để hoàn tất lớp học lập trình.
Dưới đâ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.
Và đây là giao diện 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.
Và đây là kết quả khi chúng ta chạy câu lệnh bằng các giá trị JSON và sử dụng mô hình gemini-2.0-flash:
Câu trả lời mà chúng tôi nhận được từ mô hình trong ví dụ này là dựa trên kết quả của lượt tìm kiếm ngữ nghĩa và sản phẩm phù hợp nhất có trong mã zip được đề cập.
Chạy lời nhắc trong PSQL
Chúng ta cũng có thể sử dụng tính năng tích hợp AI 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.
Bây giờ, chúng ta có thể sử dụng dữ liệu được tạo trong truy vấn phụ có kết quả JSON để cung cấp dữ liệu đó 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 với 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ả của bạn có thể khác nhau tuỳ thuộc vào phiên bản mô hình và các thông 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"
Kết quả được cung cấp ở định dạng markdown.
10. Tạo chỉ mục kề cận
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. Tuy nhiên, khi bạn có hàng triệu vectơ, quá trình tìm kiếm vectơ có thể chiếm một phần đáng kể thời gian phản hồi và gây ra tải cao cho hệ thống. Để cải thiện điều đó, chúng ta có thể tạo một chỉ mục trên các vectơ của mình.
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 chi tiết về các tham số này trong tài liệu.
CREATE VECTOR INDEX cymbal_products_embedding_idx ON cymbal_products(embedding) USING SCANN DISTANCE_MEASURE=COSINE;
So sánh phản hồi
Bây giờ, 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 một chút nhưng điều này là dự kiến đố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 (đoạn trích):
... -> 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 nó đ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 cách hoạt động của tính năng tìm kiếm ngữ nghĩa 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 màn hình shell trên đám mây, hãy xác định biến dự án và biến môi trường nếu bạn đã bị ngắt kết nối và tất cả các chế độ cài đặt trước đó đều bị mất:
export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)
Xoá thực thể:
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.
Nội dung đã đề cập
- Cách triển khai phiên bản Cloud SQL cho MySQL
- 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 mô hình nhúng Vertex AI trong Cloud SQL
- Cách làm phong phú kết quả bằng mô hình tạo sinh của Vertex AI
- Cách cải thiện hiệu suất bằng chỉ mục vectơ
Thử tham gia 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 cho Postgres