Начало работы с векторными внедрениями в Cloud SQL для MySQL

1. Введение

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

8aa6ba3bc12a1593.png

Предварительные требования

  • Базовое понимание Google Cloud и консоли Google Cloud.
  • Базовые навыки работы с командной строкой и Cloud Shell.

Что вы узнаете

  • Как развернуть экземпляр Cloud SQL для MySQL
  • Как создать базу данных и включить интеграцию Cloud SQL с искусственным интеллектом
  • Как загрузить данные в базу данных
  • Как использовать Cloud SQL Studio
  • Как использовать модель встраивания Vertex AI в Cloud SQL
  • Как использовать Agent Platform Studio
  • Как улучшить результаты, используя модель платформы корпоративных агентов Gemini.
  • Как повысить производительность с помощью векторного индекса

Что вам понадобится

  • Учетная запись Google Cloud и проект Google Cloud.
  • Веб-браузер, например Chrome.

2. Настройка и требования

Настройка проекта

  1. Войдите в консоль Google Cloud . Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо создать учетную запись Google .

Используйте личный аккаунт вместо рабочего или учебного.

  1. Создайте новый проект или используйте существующий. Чтобы создать новый проект в консоли Google Cloud, нажмите «Выбрать проект» на панели инструментов.

295004821bab6a87.png

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

37d264871000675d.png

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

96d86d3d5655cdbe.png

  • Название проекта — это отображаемое имя участников данного проекта. Название проекта не используется API Google и может быть изменено в любое время.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Google Cloud автоматически генерирует уникальный идентификатор, но вы можете его настроить. Если вам не нравится сгенерированный идентификатор, вы можете сгенерировать другой случайный идентификатор или указать свой собственный, чтобы проверить его доступность. В большинстве практических заданий вы указываете идентификатор своего проекта, который обычно обозначается как... Заполнитель.
  • К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации по созданию и управлению проектами .

Включить выставление счетов

Для включения оплаты у вас есть два варианта. Вы можете использовать свой личный платежный аккаунт или обменять средства, выполнив следующие шаги.

Использовать кредиты Google Cloud (необязательно)

Для проведения этого мастер-класса вам потребуется платежный аккаунт с достаточным балансом. Используйте средства, предоставленные организаторами мастер-класса или указанные в баннере вверху этого руководства, чтобы начать. Если у вас уже есть платежный аккаунт, вы можете пропустить этот шаг.

Создайте личный платежный аккаунт.

Если вы настроили оплату с использованием кредитов Google Cloud, этот шаг можно пропустить.

Чтобы настроить личный платежный аккаунт, включите выставление счетов в консоли Google Cloud Billing .

Примечания:

Запустить Cloud Shell

Хотя вы можете управлять Google Cloud удаленно со своего компьютера, в этом практическом задании вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.

В консоли Google Cloud нажмите на значок Cloud Shell на панели инструментов в правом верхнем углу:

Активировать Cloud Shell

В качестве альтернативы, нажмите g, а затем s в консоли Google Cloud или откройте Cloud Shell .

Подготовка и подключение к среде займут всего несколько минут. После завершения вы должны увидеть подключенный терминал:

Скриншот терминала Google Cloud Shell, показывающий, что среда подключена.

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что повышает производительность сети и аутентификацию. В этой практической работе вы можете выполнять все действия в браузере.

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.

Предоставьте учетной записи службы Cloud SQL необходимую роль IAM для включения интеграции с Gemini Enterprise Agent Platform.

Получите адрес электронной почты учетной записи службы Cloud SQL и экспортируйте его в качестве переменной среды:

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

Предоставьте учетной записи службы Cloud SQL роль roles/aiplatform.user :

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.

В облачной оболочке выполните:

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 для загрузки и применения схемы из общедоступного источника.

В облачной оболочке выполните:

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`, используя функцию `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 минут.

Выход из сессии 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

  1. В консоли Google Cloud перейдите к разделу «Экземпляры Cloud SQL» и щелкните my-cloudsql-instance .

Список экземпляров Cloud SQL в консоли Google Cloud

  1. В навигационном меню щелкните Cloud SQL Studio .

Пункт меню Cloud SQL Studio

  1. В диалоговом окне аутентификации введите имя базы данных и учетные данные:
    • База данных : quickstart_db
    • Пользователь : student
    • Пароль :
  2. Нажмите «Аутентифицировать» .

Диалог аутентификации Cloud SQL Studio

  1. Чтобы открыть редактор SQL- запросов, щелкните вкладку «Без названия» .

Вкладка редактора SQL в Cloud SQL Studio

Выполнить запрос

Выполните запрос, чтобы получить 5 товаров, наиболее соответствующих запросу клиента: "Какие фруктовые деревья хорошо растут здесь?"

Вот запрос, который вы можете выполнить, чтобы выбрать первые 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 введите запрос и нажмите «Выполнить» (или выполните запрос в своей sql сессии):

Выполнение SQL-запроса в Cloud SQL Studio

Запрос возвращает соответствующие товары, отсортированные по косинусному расстоянию:

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| 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 секунды.

Выполните тот же запрос, но используя поиск 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 for MySQL.

9. Улучшение ответа LLM с использованием полученных данных.

Улучшите ответ генеративного ИИ на клиентское приложение, передавая результаты запроса в качестве контекстного указания в подсказке базовой языковой модели платформы Gemini Enterprise Agent Platform.

Для достижения этой цели:

  1. Сгенерируйте полезную нагрузку в формате JSON из результатов векторного поиска в Cloud SQL.
  2. Проверьте работу приглашения в Agent Platform Studio.
  3. Выполните сквозную проверку запроса непосредственно из 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.

  1. В консоли Google Cloud откройте Agent Platform Studio .

Навигация по Agent Platform Studio

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

Подсказка в Agent Platform Studio

  1. Запустите командную строку.

Быстрый результат в Agent Platform Studio

В ответе указываются цена, описание и дополнительная информация, которую модель получает из внешних источников на основе данных о дереве и его местоположении.

Запустите командную строку в SQL.

Также вы можете использовать интеграцию Cloud SQL AI с Gemini Enterprise Agent Platform, чтобы получать ответы от генеративной модели непосредственно в SQL.

Сначала зарегистрируйте модель.

  1. Зарегистрируйте модель gemini-3.5-flash для генерации ответов (замените (с указанием идентификатора вашего проекта):
CALL
  mysql.ml_create_model_registration(
  'gemini-3.5-flash',
  'https://aiplatform.googleapis.com/v1/projects/gleb-test-short-004-506517/locations/global/publishers/google/models/gemini-3.6-flash:generateContent',
  'google',
  'GENERIC',
  NULL,
  'auth_type_cloudsql_service_agent_iam',
  NULL, NULL, NULL, NULL);

Мы также можем использовать интеграцию 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('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.

В облачной оболочке укажите переменные проекта и среды на случай, если соединение было разорвано и все предыдущие настройки были потеряны:

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 с искусственным интеллектом
  • Как загрузить данные в базу данных
  • Как использовать Cloud SQL Studio
  • Как использовать модель встраивания Vertex AI в Cloud SQL
  • Как использовать Agent Platform Studio
  • Как улучшить результаты, используя модель платформы корпоративных агентов Gemini.
  • Как повысить производительность с помощью векторного индекса

Попробуйте аналогичный практический курс по AlloyDB или по Cloud SQL для PostgreSQL.

Опрос

Выход:

Как вы будете использовать этот учебный материал?

Прочитайте только до конца. Прочитайте текст и выполните упражнения.