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

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

В окне «Выберите проект» нажмите кнопку «Новый проект», после чего откроется диалоговое окно для создания нового проекта.

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

- Название проекта — это отображаемое имя участников данного проекта. Название проекта не используется API Google и может быть изменено в любое время.
- Идентификатор проекта (Project ID) уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Google Cloud автоматически генерирует уникальный идентификатор, но вы можете настроить его. Если вам не нравится сгенерированный идентификатор, вы можете сгенерировать другой случайный или указать свой собственный, чтобы проверить его доступность. В большинстве практических заданий вам потребуется указать идентификатор вашего проекта, который обычно обозначается заполнителем PROJECT_ID.
- К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
Включить выставление счетов
Для включения оплаты у вас есть два варианта. Вы можете использовать свой личный платежный аккаунт или обменять средства, выполнив следующие шаги.
Обменяйте 5 долларов США на кредиты Google Cloud (по желанию)
Для проведения этого мастер-класса вам потребуется платежный аккаунт с достаточным балансом. Если вы планируете использовать собственную платежную систему, этот шаг можно пропустить.
- Перейдите по этой ссылке и войдите в систему, используя личный аккаунт Google.
- Вы увидите что-то подобное:

- Нажмите кнопку «НАЖМИТЕ ЗДЕСЬ ДЛЯ ДОСТУПА К ВАШИМ КРЕДИТАМ» . Это переведет вас на страницу настройки вашего платежного профиля. Если вам будет предложено зарегистрироваться для бесплатного пробного периода, нажмите «Отмена» и продолжите привязку платежной системы.

- Нажмите «Подтвердить». Теперь вы подключены к пробному платёжному аккаунту Google Cloud Platform.

Создайте личный платежный аккаунт.
Если вы настроили оплату с использованием кредитов Google Cloud, этот шаг можно пропустить.
Чтобы настроить личный платежный аккаунт, перейдите сюда, чтобы включить оплату в облачной консоли.
Несколько замечаний:
- Выполнение этой лабораторной работы должно обойтись менее чем в 3 доллара США в виде облачных ресурсов.
- В конце этой лабораторной работы вы можете выполнить действия по удалению ресурсов, чтобы избежать дальнейших списаний средств.
- Новые пользователи могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .
Запустить Cloud Shell
Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.
В консоли Google Cloud нажмите на значок Cloud Shell на панели инструментов в правом верхнем углу:

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

Эта виртуальная машина содержит все необходимые инструменты разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Вся работа в этом практическом задании может выполняться в браузере. Вам не нужно ничего устанавливать.
3. Прежде чем начать
Включить API
Для использования Cloud SQL , Compute Engine , сетевых сервисов и Vertex AI необходимо включить соответствующие API в вашем проекте Google Cloud.
В терминале Cloud Shell убедитесь, что идентификатор вашего проекта указан правильно:
gcloud config set project [YOUR-PROJECT-ID]
Установите переменную среды PROJECT_ID:
PROJECT_ID=$(gcloud config get-value project)
Включите все необходимые службы:
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.
- API администратора Cloud SQL (
sqladmin.googleapis.com) позволяет программно создавать, настраивать и управлять экземплярами Cloud SQL. Он предоставляет панель управления для полностью управляемой реляционной базы данных Google (поддерживающей MySQL, PostgreSQL и SQL Server), обрабатывая такие задачи, как выделение ресурсов, резервное копирование, обеспечение высокой доступности и масштабирование. - API Compute Engine (
compute.googleapis.com) позволяет создавать и управлять виртуальными машинами (ВМ), постоянными дисками и сетевыми настройками. Он предоставляет базовую инфраструктуру как услугу (IaaS), необходимую для запуска ваших рабочих нагрузок и размещения базовой инфраструктуры для множества управляемых сервисов. - API Cloud Resource Manager (
cloudresourcemanager.googleapis.com) позволяет программно управлять метаданными и конфигурацией вашего проекта Google Cloud. Он позволяет организовывать ресурсы, управлять политиками управления идентификацией и доступом (IAM) и проверять разрешения в иерархии проекта. - API для настройки сетевого взаимодействия сервисов (
servicenetworking.googleapis.com) позволяет автоматизировать настройку частного подключения между вашей виртуальной частной сетью (VPC) и управляемыми сервисами Google. Он необходим для установления частного IP-доступа для таких сервисов, как AlloyDB, чтобы они могли безопасно взаимодействовать с другими вашими ресурсами. - API Vertex AI (
aiplatform.googleapis.com) позволяет вашим приложениям создавать, развертывать и масштабировать модели машинного обучения. Он предоставляет единый интерфейс для всех сервисов искусственного интеллекта Google Cloud, включая доступ к моделям генеративного ИИ (например, Gemini) и обучению пользовательских моделей.
4. Создайте экземпляр Cloud SQL.
Создайте экземпляр Cloud SQL с интеграцией базы данных с Vertex AI.
Создать пароль для базы данных
Задайте пароль для пользователя базы данных по умолчанию. Вы можете задать собственный пароль или использовать функцию генерации случайного пароля:
export CLOUDSQL_PASSWORD=`openssl rand -hex 12`
Обратите внимание на сгенерированное значение пароля:
echo $CLOUDSQL_PASSWORD
Создание экземпляра Cloud SQL для MySQL
Флаг cloudsql_vector можно включить при создании экземпляра. Поддержка 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
Мы можем проверить наше соединение, выполнив команду в Cloud Shell.
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
Включите интеграцию Vertex AI
Предоставьте необходимые права доступа внутренней учетной записи облачной службы SQL, чтобы иметь возможность использовать интеграцию с Vertex AI.
Найдите адрес электронной почты внутренней службы Cloud SQL и экспортируйте его в качестве переменной.
SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL
Предоставьте учетной записи службы Cloud SQL доступ к Vertex AI:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
--role="roles/aiplatform.user"
Подробнее о создании и настройке экземпляров можно прочитать в документации Cloud SQL здесь .
5. Подготовка базы данных
Теперь нам нужно создать базу данных и включить поддержку векторов.
Создать базу данных
Создайте базу данных с именем quickstart_db . Для этого у нас есть различные варианты, такие как клиенты баз данных командной строки, например mysql для MySQL, SDK или Cloud SQL Studio. Для создания базы данных мы будем использовать SDK (gcloud).
В оболочке Cloud Shell выполните команду для создания базы данных.
gcloud sql databases create quickstart_db --instance=my-cloudsql-instance
6. Загрузка данных
Теперь нам нужно создать объекты в базе данных и загрузить данные. Мы будем использовать вымышленные данные Cymbal Store. Данные доступны в формате SQL (для схемы) и 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 mysql в сочетании с утилитой curl , которая получает данные из общедоступного источника.
В облачной оболочке выполните:
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-файлы, совместимые с инструментом импорта Cloud SQL, доступным в консоли Cloud, вы можете использовать его вместо представленного подхода.
7. Создайте векторные представления.
Следующий шаг — создание векторных представлений для описаний наших продуктов с использованием модели textembedding-005 от Google Vertex AI и сохранение их в новом столбце таблицы cymbal_products.
Для хранения векторных данных необходимо включить функциональность работы с векторами в нашем экземпляре 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`, используя функцию `embedding`. Этот новый столбец будет содержать векторные представления, основанные на тексте в столбце `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 минут, но иногда может занять немного больше времени, и часто завершается гораздо быстрее.
8. Выполните поиск сходства.
Теперь мы можем выполнить поиск, используя поиск сходства на основе векторных значений, рассчитанных для описаний, и векторного значения, которое мы генерируем для нашего запроса, используя ту же модель встраивания.
SQL-запрос можно выполнить из того же интерфейса командной строки или, в качестве альтернативы, из Cloud SQL Studio. Любые многострочные и сложные запросы лучше обрабатывать в 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
В консоли щелкните по созданному ранее экземпляру Cloud SQL.

Когда программа откроется, на правой панели вы увидите Cloud SQL Studio. Щёлкните по ней.

Откроется диалоговое окно, в котором вы укажете имя базы данных и свои учетные данные:
- База данных: quickstart_db
- Пользователь: студент
- Пароль: ваш записанный пароль для пользователя.
И нажмите кнопку «Аутентифицировать».

Откроется следующее окно, где вам нужно будет щелкнуть вкладку «Редактор» справа, чтобы открыть редактор SQL-запросов.

Теперь мы готовы запустить наши запросы.
Выполнить запрос
Выполните запрос, чтобы получить список доступных товаров, наиболее точно соответствующих запросу клиента. Запрос, который мы собираемся передать в Vertex AI для получения векторного значения, звучит примерно так: «Какие фруктовые деревья хорошо растут здесь?»
Выполните запрос с параметром cosine_distance для поиска вектора KNN (точного).
Вот запрос, который вы можете выполнить, чтобы выбрать первые 5 элементов, наиболее подходящих для нашего запроса, используя функцию 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 и нажмите кнопку «Выполнить» или вставьте его в командную строку, подключившись к базе данных quickstart_db.

А вот список товаров, выбранных в соответствии с запросом.
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| 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 секунды. Мы получили те же результаты, что и для функции cosine_distance.
9. Улучшение ответа LLM с использованием полученных данных.
Мы можем улучшить ответ Gen AI LLM клиентскому приложению, используя результат выполненного запроса, и подготовить осмысленный вывод, используя предоставленные результаты запроса в качестве части подсказки для генеративной базовой языковой модели Vertex AI.
Для этого нам необходимо сгенерировать JSON с результатами векторного поиска, а затем использовать этот сгенерированный JSON в качестве дополнения к запросу для модели LLM в Vertex AI, чтобы создать осмысленный результат. На первом этапе мы генерируем JSON, затем тестируем его в Vertex AI Studio, а на последнем этапе включаем его в SQL-запрос, который можно использовать в приложении.
Сгенерировать выходные данные в формате JSON.
Измените запрос так, чтобы он генерировал выходные данные в формате JSON и возвращал только одну строку для передачи в Vertex AI.
Вот пример запроса с использованием поиска по искусственной нейронной сети:
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"}]
Запустите командную строку в Vertex AI Studio.
Мы можем использовать сгенерированный JSON для предоставления его в качестве части текстовой модели подсказки для генеративного ИИ в Vertex AI Studio.
Откройте окно Vertex AI Studio Prompt в облачной консоли.

Возможно, система запросит включение дополнительных API, но вы можете проигнорировать этот запрос. Нам не нужны дополнительные API для завершения лабораторной работы.
Разместите подсказку в Студии.

Вот подсказка, которую мы будем использовать:
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.
А вот как это выглядит, когда мы заменяем 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.
А вот результат, полученный при запуске запроса с использованием наших JSON-значений и модели gemini-2.5-flash:

В данном примере модель дала ответ, используя результаты семантического поиска и наиболее подходящий продукт, доступный в указанном почтовом индексе.
Запустите командную строку в SQL.
Мы также можем использовать интеграцию Cloud SQL AI с Vertex AI, чтобы получить аналогичный ответ от генеративной модели, используя 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('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;
Вот пример выходных данных. Ваши выходные данные могут отличаться в зависимости от версии модели и параметров.
"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"
Результат предоставляется в формате 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.
В облачной оболочке укажите переменные проекта и среды на случай, если соединение было разорвано и все предыдущие настройки были потеряны:
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 для PostgreSQL
- Как создать базу данных и включить интеграцию Cloud SQL с искусственным интеллектом
- Как загрузить данные в базу данных
- Как использовать Cloud SQL Studio
- Как использовать модель встраивания Vertex AI в Cloud SQL
- Как использовать Vertex AI Studio
- Как улучшить результаты, используя генеративную модель Vertex AI
- Как повысить производительность с помощью векторного индекса
Попробуйте аналогичный практический курс по AlloyDB или по Cloud SQL для PostgreSQL.
13. Опрос
Выход: