1. Введение
В этой практической работе вы узнаете, как использовать интеграцию Cloud SQL для MySQL AI, чтобы выполнять семантический поиск с помощью эмбеддингов, и как повысить производительность, используя индекс для векторных данных.

Требования
- Базовое представление о Google Cloud и консоли Google Cloud.
- Базовый опыт работы с интерфейсом командной строки и Cloud Shell.
Что вы узнаете
- Как развернуть экземпляр Cloud SQL для MySQL
- Как создать базу данных и включить интеграцию Cloud SQL AI
- Как загрузить данные в базу данных
- Как использовать Cloud SQL Studio
- Как использовать модель встраивания Vertex AI в Cloud SQL
- Как использовать Agent Platform Studio
- Как дополнить результат с помощью модели Gemini Enterprise Agent Platform
- Как повысить производительность с помощью векторного индекса
Что вам понадобится
- Аккаунт Google Cloud и проект Google Cloud.
- браузер, например Chrome;
2. Настройка и требования
Настройка проекта
- Войдите в консоль Google Cloud. Если у вас нет аккаунта Gmail или Google Workspace, создайте аккаунт Google.
Используйте личный аккаунт вместо рабочего или учебного.
- Создайте новый проект или используйте существующий. Чтобы создать проект в консоли Google Cloud, нажмите Выбрать проект на панели инструментов.

В окне "Выбрать проект" нажмите кнопку "Новый проект". Откроется диалоговое окно для нового проекта.

В диалоговом окне введите название проекта и выберите местоположение.

- Название проекта – это отображаемое название для участников проекта. Название проекта не используется API Google и может быть изменено в любое время.
- Идентификатор проекта уникален для всех проектов Google Cloud и неизменяем (его нельзя изменить после установки). Консоль Google Cloud автоматически генерирует уникальный идентификатор, но вы можете его изменить. Если вам не нравится сгенерированный идентификатор, вы можете сгенерировать другой или указать свой и проверить, доступен ли он. В большинстве практических работ вы ссылаетесь на идентификатор проекта, который обычно обозначается плейсхолдером
. - Для справки: есть ещё третье значение – номер проекта, который используется некоторыми API. Подробную информацию об этих значениях можно найти в документации по созданию проектов и управлению ими.
Включить оплату
Чтобы включить оплату, у вас есть два варианта. Вы можете использовать личный платежный аккаунт или активировать бонусы, выполнив описанные ниже действия.
Как активировать бонусы Google Cloud (необязательно)
Чтобы провести этот семинар, вам нужен платежный аккаунт с бонусом. Чтобы начать, используйте бонусы, предоставленные организаторами семинара или указанные в баннере в верхней части этой практической работы. Если вы уже подключены к платежному аккаунту, пропустите этот шаг.
Как настроить личный платежный аккаунт
Если вы настроили оплату с помощью бонусов Google Cloud, пропустите этот шаг.
Чтобы настроить личный платежный аккаунт, включите платежи в консоли Google Cloud Billing.
Примечания
- Для выполнения этой практической работы требуются ресурсы Google Cloud стоимостью менее 5 долларов США.
- Чтобы избежать дополнительных расходов, удалите ресурсы, следуя инструкциям в конце этой практической работы.
- Новые пользователи могут воспользоваться бесплатной пробной версией с бонусом в размере 300 долларов США.
- Новые и существующие пользователи могут начать работу с Cloud SQL, используя бесплатный пробный экземпляр Cloud SQL.
Запустите Cloud Shell
Хотя вы можете управлять Google Cloud удаленно со своего компьютера, в этой практической работе вы будете использовать Google Cloud Shell – среду командной строки, работающую в облаке.
В консоли Google Cloud нажмите на значок Cloud Shell на панели инструментов в правом верхнем углу.

Вы также можете нажать G, а затем S в консоли Google Cloud или открыть Cloud Shell.
Инициализация и подключение к среде занимают всего несколько минут. После этого вы увидите подключенный терминал:

На этой виртуальной машине установлены все необходимые инструменты разработки. Она предлагает постоянный домашний каталог объемом 5 ГБ и работает на платформе Google Cloud, что повышает производительность сети и аутентификацию. Всю работу в рамках этого практического занятия можно выполнить в браузере.
3. Подготовка
Включить API
Чтобы использовать Cloud SQL, Compute Engine, Service Networking и Gemini Enterprise Agent Platform, включите соответствующие API в проекте Google Cloud.
В терминале Cloud Shell убедитесь, что идентификатор проекта задан:
gcloud config get project
Если возвращается пустая строка, задайте значение с помощью следующей команды:
gcloud config set project [YOUR-PROJECT-ID]
Задайте переменную среды PROJECT_ID:
PROJECT_ID=$(gcloud config get-value project)
Включите все необходимые API:
gcloud services enable sqladmin.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com
Ожидаемый результат
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.
Подробную информацию о каждом включенном API можно найти в документации.
4. Создайте экземпляр Cloud SQL
Создайте экземпляр Cloud SQL с интеграцией базы данных Gemini Enterprise Agent Platform.
Создать пароль базы данных
Задайте пароль для пользователя базы данных по умолчанию. Вы можете задать собственный пароль или использовать функцию случайного выбора, чтобы сгенерировать его:
export CLOUDSQL_PASSWORD=`openssl rand -hex 16`
Показать сгенерированный пароль:
echo $CLOUDSQL_PASSWORD
Запишите сгенерированный пароль, чтобы использовать его позже.
Создание экземпляра Cloud SQL для MySQL
Экземпляры Cloud SQL можно создавать разными способами, в том числе с помощью консоли Google Cloud, Terraform или Google Cloud CLI (gcloud). В этой практической работе мы будем использовать gcloud. Чтобы узнать, как создать экземпляр с помощью других инструментов, ознакомьтесь с документацией.
Флаг cloudsql_vector можно включить при создании экземпляра. Поддержка векторов доступна для MySQL 8.0 R20241208.01_00 и более поздних версий.
В сеансе Cloud Shell выполните следующую команду:
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
Подключитесь к экземпляру с помощью gcloud sql connect. При появлении запроса введите пароль:
gcloud sql connect my-cloudsql-instance --user=root
Ожидаемый результат:
$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>
Выйдите из сеанса mysql, нажав Ctrl + D или введя exit:
exit
Как включить интеграцию с Gemini Enterprise Agent Platform
Предоставьте необходимую роль IAM сервисному аккаунту Cloud SQL, чтобы включить интеграцию с Gemini Enterprise Agent Platform.
Получите адрес электронной почты сервисного аккаунта Cloud SQL и экспортируйте его как переменную среды:
SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL
Назначьте роль roles/aiplatform.user сервисному аккаунту Cloud SQL:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
--role="roles/aiplatform.user"
Подробнее о создании и настройке экземпляров читайте в документации Cloud SQL.
5. Подготовка базы данных
Создайте базу данных и включите поддержку векторов.
Создать базу данных
Создайте базу данных с названием quickstart_db. Вы можете создавать базы данных с помощью клиентов баз данных (например, mysql), Google Cloud CLI или Cloud SQL Studio. На этом шаге используйте gcloud.
Чтобы создать базу данных, в Cloud Shell выполните следующую команду:
gcloud sql databases create quickstart_db --instance=my-cloudsql-instance
6. Загрузить данные
Создайте таблицы в базе данных и загрузите данные, используя файлы набора данных вымышленного магазина Cymbal Store, хранящиеся в общедоступном сегменте Cloud Storage в формате CSV.
Cloud Shell будет вашей основной средой для подключения к базе данных, создания всех объектов и загрузки данных.
Добавьте общедоступный IP-адрес Cloud Shell в список авторизованных сетей для экземпляра Cloud SQL.
В Cloud Shell выполните следующую команду:
gcloud sql instances patch my-cloudsql-instance --authorized-networks=$(curl ifconfig.me)
Если сеанс прерван или сброшен или вы работаете в другом инструменте, экспортируйте переменную CLOUDSQL_PASSWORD ещё раз:
export CLOUDSQL_PASSWORD=...your password defined for the instance...
Создайте необходимые объекты базы данных. Используйте mysql вместе с curl, чтобы скачать и применить схему из общедоступного источника.
В Cloud Shell выполните следующую команду:
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
Разбивка по командам. На предыдущем шаге вы подключились к базе данных и запустили скрипт SQL, чтобы создать таблицы, индексы и последовательности.
Затем заполните базу данных cymbal_products, выполнив команды curl и 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;"
Продолжите работу с 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;"
и cymbal_inventory, в которой указано количество каждого товара в каждом магазине.
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;"
Необязательно. Если у вас есть собственный набор данных, вы можете импортировать совместимые CSV-файлы с помощью инструмента импорта в консоли Google Cloud.
7. Создать представления
Создайте эмбеддинги для описаний товаров с помощью модели text-embedding-005 из Gemini Enterprise Agent Platform и сохраните их как векторные данные.
Чтобы хранить векторные данные, необходимо включить векторную функциональность в экземпляре Cloud SQL.
Выполните в Cloud Shell:
gcloud sql instances patch my-cloudsql-instance \
--database-flags=cloudsql_vector=on
Подключитесь к базе данных:
mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db
Создайте новый столбец embedding в таблице cymbal_products, используя функцию встраивания. В новом столбце будут храниться векторные встраивания на основе текста в столбце 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);
Примечание. Создание эмбеддингов для 2000 строк обычно занимает менее 5 минут.
Выйдите из сеанса mysql:
exit
8. Запустить поиск похожих изображений
Выполните поиск по сходству, сравнив векторные эмбеддинги, рассчитанные для описаний товаров, с эмбеддингом для поискового запроса.
Вы можете выполнять SQL-запросы из командной строки или из Cloud SQL Studio. Cloud SQL Studio позволяет удобнее редактировать и выполнять длинные инструкции SQL с несколькими строками в выходных данных.
Создайте пользователя MySQL для Cloud SQL Studio
Вам нужен новый пользователь базы данных, который может использовать Cloud SQL Studio. Создайте встроенного пользователя student с тем же паролем, который вы использовали для пользователя root.
В Cloud Shell выполните следующую команду:
gcloud sql users create student --instance=my-cloudsql-instance --password=$CLOUDSQL_PASSWORD --host=%
Запустить Cloud SQL Studio
- В консоли Google Cloud перейдите в раздел Экземпляры Cloud SQL и нажмите
my-cloudsql-instance.

- В меню навигации выберите Cloud SQL Studio.

- В диалоговом окне аутентификации введите название базы данных и учетные данные:
- База данных:
quickstart_db - Пользователь:
student - Пароль:
- База данных:
- Нажмите Authenticate (Выполнить аутентификацию).

- Нажмите на вкладку Untitled query (Запрос без названия), чтобы открыть редактор SQL.

Выполнить запрос
Выполните запрос, чтобы получить 5 товаров, наиболее соответствующих запросу клиента: "Какие фруктовые деревья хорошо растут в этой местности?"
Выполните запрос с cosine_distance для векторного поиска KNN (точного)
Вот запрос, который можно выполнить, чтобы выбрать первые пять объектов, наиболее подходящих для нашего запроса, с помощью функции 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;
В Cloud SQL Studio введите запрос и нажмите Выполнить (или выполните запрос в сеансе sql):

Запрос возвращает подходящие товары, упорядоченные по косинусному расстоянию:
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ | 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)
Время выполнения запроса с функцией cosine_distance составляет примерно 0,13 секунды.
Выполните запрос с approx_distance для векторного поиска KNN (точного)
Выполните тот же запрос, но с использованием поиска KNN с помощью функции approx_distance. Если у вас нет индекса ANN для эмбеддингов, автоматически выполняется точный поиск:
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;
А вот список товаров, возвращенных по запросу.
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ | 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)
Выполнение запроса заняло всего 0,12 секунды. Мы получили те же результаты, что и для функции KNN exact cosine_distance.
Подробнее об этой функции рассказывается в документации по Cloud SQL для MySQL.
9. Улучшение ответов LLM с помощью полученных данных
Улучшайте ответы генеративного искусственного интеллекта в клиентском приложении, передавая результаты запросов в качестве обоснованного источниками контекста в запросе к базовой языковой модели Gemini Enterprise Agent Platform.
Для этого Анна и Борис выполняют следующие действия:
- Сгенерируйте полезную нагрузку JSON из результата поиска в Cloud SQL.
- Протестируйте запрос в Agent Platform Studio.
- Выполните сквозной запрос непосредственно из SQL, используя интеграцию с
google_ml.
Создать выходные данные в формате JSON
Измените запрос, чтобы отформатировать результат в виде JSON и вернуть одну строку:
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;
Ожидаемый вывод в формате JSON:
[{"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"}]
Выполнить запрос в Agent Platform Studio
Укажите сгенерированный JSON в качестве контекста в запросе к генеративной модели в Agent Platform Studio.
- В консоли Google Cloud откройте Agent Platform Studio.

- Введите в Agent Platform Studio следующий запрос:

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:
<JSON_OUTPUT>
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.
Замените на ответ JSON из вашего запроса:
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.

- Выполните запрос.

В ответе указана цена, описание и дополнительная информация, которую модель получает из внешних источников на основе данных о дереве и местоположении.
Выполнить запрос в SQL
Вы также можете использовать интеграцию Cloud SQL AI с Gemini Enterprise Agent Platform, чтобы получать ответы от генеративной модели прямо в SQL.
Сначала зарегистрируйте модель.
- Зарегистрируйте модель
gemini-3.5-flashдля генерации ответов (заменитена идентификатор своего проекта):
CALL
mysql.ml_create_model_registration(
'gemini-3.5-flash',
'https://aiplatform.googleapis.com/v1/projects/<PROJECT_ID>/locations/global/publishers/google/models/gemini-3.5-flash:generateContent',
'google',
'GENERIC',
NULL,
'auth_type_cloudsql_service_agent_iam',
NULL, NULL, NULL, NULL);
Мы также можем использовать интеграцию Cloud SQL AI с Gemini Enterprise Agent Platform, чтобы получить аналогичный ответ от генеративной модели, используя SQL непосредственно в базе данных.
Теперь мы можем использовать сгенерированные данные во вложенном запросе с результатами JSON, чтобы передать их в качестве части запроса в текстовую модель генеративного искусственного интеллекта с помощью SQL.
В сеансе mysql или Cloud SQL Studio для базы данных выполните запрос
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('gemini-3.5-flash',
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;
А вот пример выходных данных. В зависимости от версии модели и параметров результат может отличаться.
"Hello there! I'd be happy to help you find the perfect fruit tree for your space. \n\nBased on your area, a wonderful option we currently have in stock is the **Malus Domestica** (the classic Apple Tree)!\n\nHere are the key details:\n\n* **Product Name:** Malus Domestica (Classic Apple Tree)\n* **Price:** $100.00\n\n### Why it's a great choice:\n* **Beautiful Seasonal Foliage:** It features vibrant green leaves during the summer that turn into gorgeous shades of red, orange, and yellow in the autumn. \n* **Shade & Size:** It grows to approximately 30 feet tall, making it a strong, durable tree that offers excellent shade for your yard alongside delicious fresh fruit.\n* **Growing Conditions:** It thrives best in cool, moist climates with well-draining, loamy soil and is ideal for USDA Hardiness Zones 4–8.\n\n### Supplemental Care Tips:\n* **Planting Location:** Choose a spot that gets full sunlight (at least 6 hours a day) to ensure maximum fruit production.\n* **Soil:** Make sure the soil is rich and loamy with good drainage so the roots stay healthy.\n* **Cross-Pollination:** Apple trees often produce a higher yield when planted near another compatible apple tree variety, so if you have extra space, adding a companion tree in the future can boost your harvest!\n\nLet me know if you have any questions about planting or care, or if you'd like help adding this to your cart!"
Результат предоставляется в формате Markdown.
10. Создание индекса ближайших соседей
Для больших наборов данных с миллионами векторов векторный поиск может потребовать значительных вычислительных ресурсов. Чтобы повысить эффективность запросов, создайте индекс для векторных эмбеддингов.
Создание индекса ScaNN
Для нашего теста мы будем использовать тип индекса ScaNN.
Чтобы создать индекс для столбца встраивания, необходимо определить измерение расстояния для столбца встраивания. Подробную информацию о параметрах можно найти в документации.
CREATE VECTOR INDEX cymbal_products_embedding_idx ON cymbal_products(embedding) USING SCANN DISTANCE_MEASURE=COSINE;
Сравнить ответы
Снова выполните поисковый запрос векторного поиска и посмотрите результаты:
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;
Ожидаемый результат:
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ | 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)
Улучшение производительности незначительно, но это ожидаемо для такого небольшого набора данных. Разница будет гораздо заметнее для больших наборов данных с миллионами векторов.
Проверьте план выполнения с помощью команды 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;
План выполнения (фрагмент):
...
-> 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)
...
Он показывает сканирование векторного индекса в таблице cp(псевдоним для таблицы cymbal_products).
Попробуйте использовать собственные данные или протестируйте разные поисковые запросы, чтобы увидеть, как работает семантический поиск в MySQL.
11. Очистить среду
Как удалить экземпляр Cloud SQL
Удалите экземпляр Cloud SQL после завершения практической работы.
Если вы были отключены и все предыдущие настройки утеряны, в Cloud Shell определите переменные проекта и среды:
export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)
Удалите экземпляр:
gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID
Ожидаемый результат в консоли:
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. Поздравляю!
Поздравляем! Вы выполнили практическую работу.
Учебный план Google Cloud
Эта лабораторная работа входит в учебный план "Готовый к работе ИИ с Google Cloud".
- Изучите полную программу курса, чтобы перейти от прототипа к производству.
- Делитесь своими успехами с хештегом
#ProductionReadyAI.
Что вы узнали
- Как развернуть экземпляр Cloud SQL для MySQL
- Как создать базу данных и включить интеграцию Cloud SQL AI
- Как загрузить данные в базу данных
- Как использовать Cloud SQL Studio
- Как использовать модель встраивания Vertex AI в Cloud SQL
- Как использовать Agent Platform Studio
- Как дополнить результат с помощью модели Gemini Enterprise Agent Platform
- Как повысить производительность с помощью векторного индекса
Попробуйте похожую практическую работу для AlloyDB или практическую работу для Cloud SQL для Postgres.
Опрос
Вывод: