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

1. Введение

В этом практическом занятии вы узнаете, как использовать Cloud SQL для интеграции ИИ с PostgreSQL, комбинируя векторный поиск с эмбеддингами платформы Gemini Enterprise Agent Platform.

Архитектурная схема, демонстрирующая интеграцию Cloud SQL с платформой Gemini Enterprise Agent Platform.

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

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

Что вы будете делать

  • Разверните экземпляр Cloud SQL для PostgreSQL.
  • Создайте базу данных и включите интеграцию Cloud SQL AI.
  • Загрузите данные в базу данных.
  • Используйте Cloud SQL Studio
  • Создание эмбеддингов с помощью платформы Gemini Enterprise Agent Platform в Cloud SQL.
  • Используйте Agent Platform Studio
  • Обогащение результатов запроса с помощью генеративной модели платформы Gemini Enterprise Agent Platform.
  • Повысьте производительность запросов, используя векторный индекс HNSW.

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

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

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

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

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

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

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

В консоли Google Cloud выберите диалоговое окно «Выбор проекта».

В диалоговом окне «Выберите проект» нажмите «Новый проект» .

37d264871000675d.png

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

96d86d3d5655cdbe.png

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

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

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

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

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

Примечания:

  • Выполнение этой лабораторной работы обойдется менее чем в 5 долларов США в виде ресурсов Google Cloud.
  • Выполните действия в конце этой лабораторной работы, чтобы удалить ресурсы и избежать дальнейших списаний средств.
  • Новые пользователи могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .

Запустить 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 set project <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 можно прочитать в документации .

4. Создайте экземпляр Cloud SQL.

Создайте экземпляр Cloud SQL с интеграцией базы данных Gemini Enterprise Agent Platform.

Создать пароль для базы данных

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

export CLOUDSQL_PASSWORD=$(openssl rand -hex 16)

Отобразить сгенерированное значение пароля:

echo $CLOUDSQL_PASSWORD

Запомните сгенерированный пароль, он пригодится вам позже.

Создайте экземпляр Cloud SQL для PostgreSQL.

Экземпляры Cloud SQL можно создавать несколькими способами, включая консоль Google Cloud, Terraform или Google Cloud CLI ( gcloud ). В этом практическом занятии вы будете использовать gcloud . Чтобы узнать, как создать экземпляр с помощью других инструментов, см. документацию по созданию экземпляров .

В Cloud Shell выполните следующую команду для создания экземпляра:

gcloud sql instances create my-cloudsql-instance \
--database-version=POSTGRES_18 \
--tier=db-custom-1-3840 \
--region=us-central1 \
--edition=ENTERPRISE \
--enable-google-ml-integration \
--database-flags cloudsql.enable_google_ml_integration=on

После создания экземпляра установите пароль для пользователя по умолчанию ( postgres ) и убедитесь, что вы можете подключиться:

gcloud sql users set-password postgres \
    --instance=my-cloudsql-instance \
    --password=$CLOUDSQL_PASSWORD

Подключитесь к экземпляру с помощью команды gcloud sql connect . При появлении запроса введите пароль:

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

Для выхода из сессии psql нажмите 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 :

PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
  --role="roles/aiplatform.user"

Для получения дополнительной информации о создании и настройке экземпляров см. раздел «Интеграция Cloud SQL с Gemini Enterprise Agent Platform» .

5. Подготовьте базу данных.

Создайте базу данных и включите поддержку векторов.

Создайте базу данных

Создайте базу данных с именем quickstart_db . Вы можете создавать базы данных с помощью клиентов баз данных (например, psql ), Google Cloud CLI или Cloud SQL Studio. На этом шаге используйте gcloud .

В Cloud Shell выполните следующую команду для создания базы данных:

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

Включить расширения

Для работы с Gemini Enterprise Agent Platform и векторами необходимо включить два расширения в базе данных quickstart_db : google_ml_integration и vector .

В Cloud Shell подключитесь к базе данных:

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

При появлении запроса введите пароль от базы данных.

В сеансе SQL выполните следующие команды:

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector CASCADE;

Завершить сеанс SQL:

exit;

6. Загрузка данных

Создайте таблицы в базе данных и загрузите данные, используя вымышленные файлы набора данных Cymbal Store, хранящиеся в общедоступном хранилище Cloud Storage в формате CSV.

Сначала создайте необходимые объекты схемы. Запустите команды gcloud sql connect и gcloud storage , чтобы загрузить и импортировать схему:

В Cloud Shell выполните следующую команду (при появлении запроса введите пароль, созданный для экземпляра):

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql | gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Эта команда подключается к базе данных и выполняет загруженный SQL-код для создания таблиц, индексов и последовательностей.

Далее загрузите CSV-файлы данных из облачного хранилища:

gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv .

Подключитесь к базе данных:

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Импорт данных из CSV-файлов:

\copy cymbal_products from 'cymbal_products.csv' csv header
\copy cymbal_inventory from 'cymbal_inventory.csv' csv header
\copy cymbal_stores from 'cymbal_stores.csv' csv header

Если вы используете собственные данные, и CSV-файлы совместимы с инструментом импорта Cloud SQL в консоли Google Cloud, вы можете использовать консоль вместо командной строки.

7. Создайте эмбеддинги

Создайте векторные представления для описаний продуктов, используя модель text-embedding-005 из Gemini Enterprise Agent Platform, и сохраните их в виде векторных данных.

Если соединение прервалось, подключитесь к базе данных:

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Создайте сгенерированный столбец с именем embedding в таблице cymbal_products , используя функцию embedding . Эта команда создает сохраненный сгенерированный столбец, содержащий векторные представления, сгенерированные из столбца product_description для всех строк таблицы. Модель указывается в качестве первого параметра, а столбец с исходным текстом — в качестве второго параметра:

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (google_ml.embedding('text-embedding-005', product_description)) STORED;

Для 900-1000 строк этот процесс обычно занимает от 1 до 5 минут.

При добавлении новой строки в таблицу или обновлении product_description в существующей строке столбец embedding автоматически обновляется.

8. Выполните поиск сходства.

Выполните поиск сходства, сравнив векторные представления, рассчитанные для описаний товаров, с векторным представлением поискового запроса.

Вы можете выполнять SQL-запросы из командной строки с помощью gcloud sql connect или из Cloud SQL Studio. Cloud SQL Studio предоставляет более удобный способ редактирования и выполнения длинных SQL-запросов с несколькими строками в выходных данных.

Запустите 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
    • Пользователь : postgres
    • Пароль :
  2. Нажмите «Аутентифицировать» .

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

  1. Чтобы открыть редактор SQL, нажмите вкладку «Редактор» .

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

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

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

SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::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 10;

В Cloud SQL Studio введите запрос и нажмите «Выполнить» (или выполните запрос в сеансе psql ):

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

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

product_name       |                                   description                                    | sale_price | zip_code |      distance       
-------------------------+----------------------------------------------------------------------------------+------------+----------+---------------------
 Cherry Tree             | This is a beautiful cherry tree that will produce delicious cherries. It is an d |      75.00 |    93230 | 0.43922018972266397
 Meyer Lemon Tree        | Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by  |         34 |    93230 |  0.4685112926118228
 Toyon                   | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 |  0.4835677149651668
 California Lilac        | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d |       5.00 |    93230 |  0.4947204525907498
 California Peppertree   | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e |      25.00 |    93230 |  0.5054166905547247
 California Black Walnut | This is a beautiful walnut tree that can grow to be over 80 feet tall. It is a d |     100.00 |    93230 |  0.5084219510932597
 California Sycamore     | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is  |     300.00 |    93230 |  0.5140519790508755
 Coast Live Oak          | This is a beautiful oak tree that can grow to be over 100 feet tall. It is an ev |     500.00 |    93230 |  0.5143126438081371
 Fremont Cottonwood      | This is a beautiful cottonwood tree that can grow to be over 100 feet tall. It i |     200.00 |    93230 |  0.5174774727252058
 Madrone                 | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an |      50.00 |    93230 |  0.5227400803389093
(10 rows)

9. Улучшите отклик LLM, используя полученные данные.

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

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

  1. Сгенерируйте полезную нагрузку в формате JSON из результатов векторного поиска в Cloud SQL.
  2. Проверьте работу приглашения в Agent Platform Studio.
  3. Выполните сквозную проверку запроса непосредственно из SQL, используя интеграцию google_ml .

Сгенерировать выходные данные в формате JSON.

Измените запрос, чтобы результат был отформатирован как JSON и возвращала одну строку:

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
        (cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

Ожидаемый результат в формате JSON:

[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]

Запустите командную строку в 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, "product_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, "product_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]
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

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

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

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

  1. При необходимости обновите расширение до версии 1.4.3 или выше. Подключитесь к quickstart_db и выполните:
SELECT extversion from pg_extension where extname='google_ml_integration';

Если полученная версия ниже 1.4.3 , выполните:

ALTER EXTENSION google_ml_integration UPDATE TO '1.4.3';
  1. Проверьте флаг базы данных google_ml_integration.enable_model_support :
SHOW google_ml_integration.enable_model_support;

Если флаг off , обновите флаг базы данных в Cloud Shell:

gcloud sql instances patch my-cloudsql-instance \
--database-flags google_ml_integration.enable_model_support=on,cloudsql.enable_google_ml_integration=on

Эта операция занимает от 1 до 3 минут. Проверьте настройки еще раз:

SHOW google_ml_integration.enable_model_support;
  1. Зарегистрируйте модель gemini-3.5-flash для генерации ответов (замените (с указанием идентификатора вашего проекта):
CALL
  google_ml.create_model(
    model_id => 'gemini-3.5-flash',
    model_request_url => 'https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.6-flash:generateContent',
    model_provider => 'google',
    model_auth_type => 'cloudsql_service_agent_iam');

Проверьте зарегистрированные модели:

SELECT model_id, model_type FROM google_ml.model_info_view WHERE model_id='gemini-3.5-flash';
  1. Выполните полный SQL-запрос, чтобы получить результаты векторного поиска и передать их напрямую в gemini-3.5-flash :
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
        (cp.embedding <=> embedding('text-embedding-005',
        'What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1),
prompt AS (
SELECT
        '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_agg(trees) || '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
        google_ml.predict_row( model_id =>'gemini-3.5-flash',
        request_body => json_build_object('contents',
        json_build_object('role',
        'user',
        'parts',
        json_build_object('text',
        prompt_text))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
FROM
        prompt)
SELECT
REPLACE(resp::text, '\n', CHR(10))
FROM
        response;

Ожидаемый результат:

"Hello there! If you're looking for a wonderful fruit tree to plant, I have a fantastic option for you: ### **Cherry Tree** * **Price:** $75.00 * **Product ID:** `d536e9e823296a2eba198e52dd23e712` --- ### **Why it's a great choice:** * **Fruit & Shade:** Not only will it produce delicious, sweet cherries, but it also grows into a beautiful 15-foot deciduous tree that provides excellent shade and privacy for your yard. * **Seasonal Beauty:** Its leaves are a lovely dark green throughout the summer and transition into a striking red during the fall. * **Ideal Growing Conditions:** Cherry trees thrive best in cool, moist climates with sandy soil and are suitable for **USDA hardiness zones 4–9**. If your local climate matches these conditions, this Cherry Tree would make a beautiful and tasty addition to your garden! Let me know if you'd like more details or help placing an order."

10. Создайте индекс ближайшего соседа.

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

Создайте индекс HNSW

Hierarchical Navigable Small World (HNSW) — это векторный индекс, основанный на графах.

Для построения индекса HNSW по столбцу embedding укажите функцию расстояния ( vector_cosine_ops ) и необязательные параметры, такие как m и ef_construction . Дополнительную информацию см. в разделе «Работа с векторными представлениями» .

CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);

Ожидаемый результат:

quickstart_db=> CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);
CREATE INDEX
quickstart_db=>

Сравните производительность запросов.

Выполните запрос векторного поиска с помощью EXPLAIN (ANALYZE) чтобы убедиться, что планировщик запросов использует индекс:

EXPLAIN (ANALYZE) 
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
        (cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

Ожидаемый результат:

 Aggregate  (cost=779.12..779.13 rows=1 width=32) (actual time=1.066..1.069 rows=1 loops=1)
   ->  Subquery Scan on trees  (cost=769.05..779.12 rows=1 width=142) (actual time=1.038..1.041 rows=1 loops=1)
         ->  Limit  (cost=769.05..779.11 rows=1 width=158) (actual time=1.022..1.024 rows=1 loops=1)
               ->  Nested Loop  (cost=769.05..9339.69 rows=852 width=158) (actual time=1.020..1.021 rows=1 loops=1)
                     ->  Nested Loop  (cost=768.77..9316.48 rows=852 width=945) (actual time=0.858..0.859 rows=1 loops=1)
                           ->  Index Scan using cymbal_products_embeddings_hnsw on cymbal_products cp  (cost=768.34..2572.47 rows=941 width=941) (actual time=0.532..0.539 rows=3 loops=1)
...
 Planning Time: 112.398 ms
 Execution Time: 1.221 ms

План выполнения показывает Index Scan using cymbal_products_embeddings_hnsw .

Выполните запрос без использования EXPLAIN :

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
        (cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

Ожидаемый результат:

[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]

Для получения дополнительной информации и примеров использования LangChain и векторных индексов см. обзорную документацию Cloud SQL AI .

11. Очистка ресурсов

Удалите экземпляр 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".

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

Краткое содержание

Вы научились:

  • Разверните экземпляр Cloud SQL для PostgreSQL.
  • Создайте базу данных и включите интеграцию Cloud SQL AI.
  • Загрузите данные в базу данных.
  • Используйте Cloud SQL Studio
  • Используйте модель встраивания Gemini Enterprise Agent Platform в Cloud SQL.
  • Используйте Agent Platform Studio
  • Обогащение результатов запроса с помощью генеративной модели платформы Gemini Enterprise Agent Platform.
  • Повысьте производительность запросов, используя векторный индекс.

Попробуйте выполнить задание из практического курса AlloyDB AI по векторному представлению данных, используя индекс ScaNN вместо HNSW.