Генерация SQL с использованием естественного языка ИИ AlloyDB

1. Введение

1dc4e2c0ebd1aa4c.png

В этой лабораторной работе вы научитесь развертывать AlloyDB и использовать естественный язык ИИ для запросов к данным, а также настраивать конфигурацию для предсказуемых и эффективных запросов. Эта лабораторная работа входит в серию лабораторных работ, посвященных функциям ИИ в AlloyDB. Подробнее см. на странице документации, посвященной ИИ в AlloyDB .

Предпосылки

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

Чему вы научитесь

  • Как развернуть AlloyDB для Postgres
  • Как включить естественный язык в AlloyDB AI
  • Как создать и настроить конфигурацию для естественного языка ИИ
  • Как генерировать SQL-запросы и получать результаты, используя естественный язык

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

  • Учетная запись Google Cloud и проект Google Cloud
  • Веб-браузер, например Chrome , поддерживающий Google Cloud Console и Cloud Shell

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

Настройка среды для самостоятельного обучения

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Название проекта — отображаемое имя участников проекта. Это строка символов, не используемая API Google. Вы можете изменить её в любой момент.
  • Идентификатор проекта уникален для всех проектов Google Cloud и неизменяем (нельзя изменить после установки). Cloud Console автоматически генерирует уникальную строку; обычно вам не важно, какой именно. В большинстве практических работ вам потребуется указать идентификатор проекта (обычно обозначаемый как PROJECT_ID ). Если вам не нравится сгенерированный идентификатор, вы можете сгенерировать другой случайный идентификатор. Вы также можете попробовать использовать свой собственный идентификатор и посмотреть, доступен ли он. После этого шага его нельзя будет изменить, и он останется на протяжении всего проекта.
  • К вашему сведению, существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трёх значениях можно узнать в документации .
  1. Далее вам нужно включить биллинг в Cloud Console для использования облачных ресурсов/API. Выполнение этой лабораторной работы не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать списания средств за пределами этого руководства, вы можете удалить созданные вами ресурсы или проект. Новые пользователи Google Cloud могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .

Запустить Cloud Shell

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

3. Прежде чем начать

Включить API

Внутри Cloud Shell убедитесь, что настроен идентификатор вашего проекта:

gcloud config set project [YOUR-PROJECT-ID]

Установите переменную среды PROJECT_ID:

PROJECT_ID=$(gcloud config get-value project)

Включите все необходимые службы:

gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com \
                       discoveryengine.googleapis.com \
                       secretmanager.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 alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

4. Развертывание AlloyDB

Создайте кластер AlloyDB и основной экземпляр. Ниже описана процедура создания кластера и экземпляра AlloyDB с помощью Google Cloud SDK. Если вы предпочитаете консольный подход, следуйте документации здесь .

Перед созданием кластера AlloyDB нам понадобится доступный диапазон частных IP-адресов в нашей VPC, который будет использоваться будущим экземпляром AlloyDB. Если у нас его нет, нам нужно создать его и назначить для использования внутренними сервисами Google, после чего мы сможем создать кластер и экземпляр.

Создать частный диапазон IP-адресов

Нам необходимо настроить доступ к частному сервису в нашей VPC для AlloyDB. Предполагается, что в проекте есть сеть VPC «по умолчанию», которая будет использоваться для всех действий.

Создайте диапазон частных IP-адресов:

gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default

Создайте частное соединение, используя выделенный диапазон IP-адресов:

gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default

Ожидаемый вывод консоли:

student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range].

student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default
Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully.

student@cloudshell:~ (test-project-402417)$

Создать кластер AlloyDB

В этом разделе мы создаем кластер AlloyDB в регионе us-central1.

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

export PGPASSWORD=`openssl rand -hex 12`

Ожидаемый вывод консоли:

student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`

Сохраните пароль PostgreSQL для дальнейшего использования.

echo $PGPASSWORD

Этот пароль понадобится вам в будущем для подключения к экземпляру как пользователь postgres. Рекомендую записать его или скопировать куда-нибудь для дальнейшего использования.

Ожидаемый вывод консоли:

student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD
bbefbfde7601985b0dee5723

Создайте бесплатный пробный кластер

Если вы ранее не использовали AlloyDB, вы можете создать бесплатный пробный кластер:

Определите регион и имя кластера AlloyDB. Мы будем использовать регион us-central1 и имя кластера alloydb-aip-01:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01

Выполните команду для создания кластера:

gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION \
    --subscription-type=TRIAL

Ожидаемый вывод консоли:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION \
    --subscription-type=TRIAL
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.                                                                                                                                                                                                                                                           

Создайте основной экземпляр AlloyDB для нашего кластера в том же сеансе Cloud Shell. При отсутствии подключения вам потребуется заново определить переменные среды региона и имени кластера.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=8 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

Ожидаемый вывод консоли:

student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=8 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

Создать стандартный кластер AlloyDB

Если это не первый кластер AlloyDB в проекте, приступайте к созданию стандартного кластера.

Определите регион и имя кластера AlloyDB. Мы будем использовать регион us-central1 и имя кластера alloydb-aip-01:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01

Выполните команду для создания кластера:

gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION

Ожидаемый вывод консоли:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION 
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.                                                                                                                                                                                                                                                           

Создайте основной экземпляр AlloyDB для нашего кластера в том же сеансе Cloud Shell. При отсутствии подключения вам потребуется заново определить переменные среды региона и имени кластера.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

Ожидаемый вывод консоли:

student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

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

Нам необходимо создать базу данных, включить интеграцию Vertex AI, создать объекты базы данных и импортировать данные.

Предоставьте необходимые разрешения для AlloyDB

Добавьте разрешения Vertex AI к агенту службы AlloyDB.

Откройте еще одну вкладку Cloud Shell, нажав на знак «+» вверху.

4ca978f5142bb6ce.png

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

PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"

Ожидаемый вывод консоли:

student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-11039]
student@cloudshell:~ (test-project-001-402417)$ gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"
Updated IAM policy for project [test-project-001-402417].
bindings:
- members:
  - serviceAccount:service-4470404856@gcp-sa-alloydb.iam.gserviceaccount.com
  role: roles/aiplatform.user
- members:
...
etag: BwYIEbe_Z3U=
version: 1
 

Закройте вкладку, выполнив команду «выход» во вкладке:

exit

Подключиться к AlloyDB Studio

В следующих главах все команды SQL, требующие подключения к базе данных, можно также выполнить в AlloyDB Studio. Для выполнения команды необходимо открыть веб-интерфейс консоли кластера AlloyDB, щёлкнув по основному экземпляру.

ef4bfbcf0ed2ef3a.png

Затем нажмите на AlloyDB Studio слева:

5c155cbcd7d43a1.png

Выберите базу данных Postgres, пользователя Postgres и введите пароль, указанный при создании кластера. Затем нажмите кнопку «Аутентифицировать».

1c9dab73c6836798.png

Откроется интерфейс AlloyDB Studio. Для выполнения команд в базе данных нажмите на вкладку «Редактор 1» справа.

b36c28f8165119ca.png

Открывает интерфейс, в котором можно запускать команды SQL.

cf43aa20f292797e.png

Создать базу данных

Быстрый старт по созданию базы данных.

В редакторе AlloyDB Studio выполните следующую команду.

Создать базу данных:

CREATE DATABASE quickstart_db

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

Statement executed successfully

Подключиться к quickstart_db

Повторно подключитесь к студии, используя кнопку переключения пользователя/базы данных.

e826ad973eb23a74.png

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

1ca70c59b5aea8c1.png

Откроется новое соединение, в котором вы сможете работать с объектами из базы данных quickstart_db.

6. Образец данных

Теперь нам нужно создать объекты в базе данных и загрузить данные. Мы будем использовать вымышленный магазин «Cymbal ecomm» с набором таблиц для интернет-магазинов. Он содержит несколько таблиц, связанных ключами, что напоминает схему реляционной базы данных.

Набор данных подготовлен и размещен в виде SQL-файла, который можно загрузить в базу данных через интерфейс импорта. В облачной оболочке выполните следующие команды:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters import $ADBCLUSTER --region=$REGION --database=quickstart_db --gcs-uri='gs://sample-data-and-media/ecomm-retail/ecom_generic.sql' --user=postgres --sql

Команда использует AlloyDB SDK и создает схему eComm, а затем импортирует образцы данных непосредственно из контейнера GCS в базу данных, создавая все необходимые объекты и вставляя данные.

После импорта мы можем проверить таблицы в AlloyDB Studio.

9ee57986d4cdf20f.png

И проверьте количество строк в таблице.

541ae6486ea6abb0.png

7. Настройте NL SQL

В этой главе мы настроим NL для работы с вашим примером схемы.

Установить расширение alloydb_nl_ai

Нам необходимо установить расширение alloydb_ai_nl в нашу базу данных. Перед этим необходимо включить флаг базы данных alloydb_ai_nl.enabled.

В сеансе Cloud Shell выполните

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb instances update $ADBCLUSTER-pr \
  --cluster=$ADBCLUSTER \
  --region=$REGION \
  --database-flags=alloydb_ai_nl.enabled=on

Это инициирует обновление экземпляра. Вы можете увидеть статус обновления экземпляра в веб-консоли:

c296406c0aaf14c3.png

Когда экземпляр обновится (статус экземпляра станет зеленым), вы сможете включить расширение alloydb_ai_nl.

В студии AlloyDB выполните

CREATE EXTENSION IF NOT EXISTS google_ml_integration;
CREATE EXTENSION alloydb_ai_nl cascade;

Создайте конфигурацию естественного языка

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

В студии AlloyDB выполните

SELECT
  alloydb_ai_nl.g_create_configuration(
    'cymbal_ecomm_config' 
  );

Теперь мы можем зарегистрировать нашу схему eComm в конфигурации. Мы импортировали данные в схему eComm, поэтому добавим её в нашу конфигурацию NL.

SELECT
  alloydb_ai_nl.g_manage_configuration(
    operation => 'register_schema',
    configuration_id_in => 'cymbal_ecomm_config',
    schema_names_in => '{ecomm}'
  );

8. Добавить контекст в NL SQL

Добавить общий контекст

Мы можем добавить контекст для нашей зарегистрированной схемы. Предполагается, что контекст поможет генерировать более качественные результаты в ответ на запросы пользователей. Например, мы можем указать, что один бренд является предпочтительным для пользователя, даже если он не определён явно. Давайте сделаем Clades (вымышленный бренд) брендом по умолчанию.

В AlloyDB Studio выполните:

SELECT
  alloydb_ai_nl.g_manage_configuration(
    'add_general_context',
    'cymbal_ecomm_config',
    general_context_in => '{"If the user doesn''t clearly define preferred brand then use Clades."}'
  );

Давайте проверим, как работает для нас общий контекст.

В AlloyDB Studio выполните:

SELECT
  alloydb_ai_nl.get_sql(
    'cymbal_ecomm_config', -- nl_config
    'How many products do we have of our preferred brand?' -- nl question
  );

Сгенерированный запрос использует наш бренд по умолчанию, определенный ранее в общем контексте:

{"sql": "SELECT\n COUNT(*)\nFROM \"ecomm\".\"inventory_items\"\nWHERE\n \"product_brand\" = 'Clades';", "method": "default", "prompt": "", "retries": 0, "time(ms)": {"llm": 498.268000, "magic": 885.226000}, "error_msg": "", "nl_question": "How many products do we have of our preferred brand?", "toolbox_used": false}

Мы можем очистить его и выдать в качестве вывода только оператор SQL.

Например:

SELECT
  alloydb_ai_nl.get_sql(
    'cymbal_ecomm_config', -- nl_config
    'How many products do we have of our preferred brand?' -- nl question
  ) ->> 'sql';

Очищенный вывод:

SELECT COUNT(*) FROM "ecomm"."inventory_items" WHERE "product_brand" = 'Clades';

Вы заметили, что таблица inventory_items автоматически выбрана вместо таблицы products и использована для построения запроса. Это может сработать в некоторых случаях, но не для нашей схемы. В нашем случае таблица inventory_items служит для отслеживания продаж, что может ввести в заблуждение, если у вас нет инсайдерской информации. Позже мы рассмотрим, как сделать наши запросы более точными.

Контекст схемы

Контекст схемы описывает объекты схемы, такие как таблицы, представления и отдельные столбцы, хранящие информацию в виде комментариев в объектах схемы.

Мы можем создать его автоматически для всех объектов схемы в нашей определенной конфигурации, используя следующий запрос:

SELECT
  alloydb_ai_nl.generate_schema_context(
    'cymbal_ecomm_config', -- nl_config
    TRUE
  );

Параметр «TRUE» указывает на необходимость перегенерации контекста и его перезаписи. Выполнение займёт некоторое время в зависимости от модели данных. Чем больше у вас связей и соединений, тем больше времени потребуется.

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

SELECT
  object_context
FROM
  alloydb_ai_nl.generated_schema_context_view
WHERE
  schema_object = 'ecomm.inventory_items';

Очищенный вывод:

The `ecomm.inventory_items` table stores information about individual inventory items in an e-commerce system. Each item is uniquely identified by an `id` (primary key). The table tracks the `product_id` (foreign key referencing `ecomm.products`), the timestamp when the item was `created_at`, and the timestamp when it was `sold_at` (which can be null if the item hasn't been sold). The `cost` represents the cost of the item to the business, while `product_retail_price` is the price at which the item is sold. Additional product details include `product_category`, `product_name`, `product_brand`, `product_department`, and `product_sku` (stock keeping unit). The `product_distribution_center_id` (foreign key referencing `ecomm.distribution_centers`) indicates the distribution center where the item is located. The table includes information on both men's and women's apparel across various categories like jeans, tops & tees, activewear, sleep & lounge, intimates, swim, and accessories. The `sold_at` column indicates whether an item has been sold and when.

Похоже, в описании отсутствуют некоторые ключевые моменты, связанные с тем, что таблица inventory_items отражает движение товаров. Мы можем обновить её, добавив эту ключевую информацию в контекст отношения ecomm.inventory_items.

SELECT alloydb_ai_nl.update_generated_relation_context(
  'ecomm.inventory_items',
  'The `ecomm.inventory_items` table stores information about moving and sales of inventory items in an e-commerce system. Each movement is uniquely identified by an `id` (primary key) and used in order_items table as `inventory_item_id`. The table tracks sales and movements for the `product_id` (foreign key referencing `ecomm.products`), the timestamp when the movement for the item was `created_at`, and the timestamp when it was `sold_at` (which can be null if the item hasn''t been sold). The `cost` represents the cost of the item to the business, while `product_retail_price` is the price at which the item is sold. Additional product details include `product_category`, `product_name`, `product_brand`, `product_department`, and `product_sku` (stock keeping unit). The `product_distribution_center_id` (foreign key referencing `ecomm.distribution_centers`) indicates the distribution center where the item is located. The table includes information on both men''s and women''s apparel across various categories like jeans, tops & tees, activewear, sleep & lounge, intimates, swim, and accessories. The `sold_at` column indicates whether an item has been sold and when.'
);

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

SELECT
  object_context
FROM
  alloydb_ai_nl.generated_schema_context_view
WHERE
  schema_object = 'ecomm.products';

Я обнаружил, что автоматически сгенерированный контекст для таблицы товаров достаточно точен и не требует никаких изменений.

Я также проверил информацию о каждом столбце в обеих таблицах и тоже нашел ее верной.

Давайте применим сгенерированный контекст для ecomm.inventory_items и ecomm.products к нашей конфигурации.

SELECT alloydb_ai_nl.apply_generated_relation_context(
  'ecomm.inventory_items', 
  TRUE
);

SELECT alloydb_ai_nl.apply_generated_relation_context(
  'ecomm.products', 
  TRUE
);

Помните наш запрос на генерацию SQL-кода для вопроса «Сколько у нас товаров нашего любимого бренда?»? Теперь мы можем повторить его и посмотреть, изменился ли результат.

SELECT
  alloydb_ai_nl.get_sql(
    'cymbal_ecomm_config', -- nl_config
    'How many products do we have of our preferred brand?' -- nl question
  ) ->> 'sql';

Вот новый результат.

SELECT COUNT(*) FROM "ecomm"."products" WHERE "brand" = 'Clades';

И теперь он проверяет ecomm.products, что является более точным и возвращает около 300 товаров вместо 5000 операций с товарными позициями.

9. Работа с индексом ценности

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

Настройте индекс ценности

Мы можем составлять запросы, используя столбец «Бренд» в таблице «Продукты», и искать продукты с более стабильными брендами, определив тип концепции и связав его со столбцом «ecomm.products.brand».

Давайте создадим концепцию и свяжем ее со столбцом:

SELECT alloydb_ai_nl.add_concept_type(
    concept_type_in => 'brand_name',
    match_function_in => 'alloydb_ai_nl.get_concept_and_value_generic_entity_name',
    additional_info_in => '{
      "description": "Concept type for brand name.",
      "examples": "SELECT alloydb_ai_nl.get_concept_and_value_generic_entity_name(''Auto Forge'')" }'::jsonb
);
SELECT alloydb_ai_nl.associate_concept_type(
    'ecomm.products.brand',
    'brand_name',
    'cymbal_ecomm_config'
);

Вы можете проверить концепцию, выполнив запрос к alloydb_ai_nl.list_concept_types()

SELECT alloydb_ai_nl.list_concept_types();

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

SELECT alloydb_ai_nl.create_value_index('cymbal_ecomm_config');

Используйте индекс ценности

Если вы запускаете запрос на создание SQL-запроса, использующего названия брендов, но не определяющего, что это название бренда, это поможет правильно идентифицировать сущность и столбец. Вот запрос:

SELECT
  alloydb_ai_nl.get_sql(
    'cymbal_ecomm_config', -- nl_config
    'How many Clades do we have?' -- nl question
  ) ->> 'sql';

И вывод показывает правильную идентификацию слова «Clades» как названия бренда.

SELECT COUNT(*) FROM "ecomm"."products" WHERE "brand" = 'Clades';

10. Работа с шаблонами запросов

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

Создать шаблон запроса

Давайте создадим шаблон запроса, объединяющий несколько таблиц, чтобы получить информацию о клиентах, купивших продукцию «Republic Outpost» в прошлом году. Мы знаем, что запрос может использовать либо таблицу ecomm.products, либо таблицу ecomm.inventory_items, поскольку обе содержат информацию о брендах. Но таблица products содержит в 15 раз меньше строк и индекс по первичному ключу для соединения. Возможно, эффективнее использовать таблицу products. Поэтому мы создаём шаблон запроса.

SELECT alloydb_ai_nl.add_template(
    nl_config_id => 'cymbal_ecomm_config',
    intent => 'List the last names and the country of all customers who bought products of `Republic Outpost` in the last year.',
    sql => 'SELECT DISTINCT u."last_name", u."country" FROM "ecomm"."users" AS u INNER JOIN "ecomm"."order_items" AS oi ON u.id = oi."user_id" INNER JOIN "ecomm"."products" AS ep ON oi.product_id = ep.id WHERE ep.brand = ''Republic Outpost'' AND oi.created_at >= DATE_TRUNC(''year'', CURRENT_DATE - INTERVAL ''1 year'') AND oi.created_at < DATE_TRUNC(''year'', CURRENT_DATE)',
    sql_explanation => 'To answer this question, JOIN `ecomm.users` with `ecom.order_items` on having the same `users.id` and `order_items.user_id`, and JOIN the result with ecom.products on having the same `order_items.product_id` and `products.id`. Then filter rows with products.brand = ''Republic Outpost'' and by `order_items.created_at` for the last year. Return the `last_name` and the `country` of the users with matching records.',
    check_intent => TRUE
);

Теперь мы можем подать заявку на создание запроса.

SELECT
  alloydb_ai_nl.get_sql(
    'cymbal_ecomm_config', -- nl_config
    'Show me last name and country about customers who bought "Republic Outpost" products last year. 
' -- nl question
  ) ->> 'sql';

И это даёт желаемый результат.

SELECT DISTINCT u."last_name", u."country" FROM "ecomm"."users" AS u INNER JOIN "ecomm"."order_items" AS oi ON u.id = oi."user_id" INNER JOIN "ecomm"."products" AS ep ON oi.product_id = ep.id WHERE ep.brand = 'Republic Outpost' AND oi.created_at >= DATE_TRUNC('year', CURRENT_DATE - INTERVAL '1 year') AND oi.created_at < DATE_TRUNC('year', CURRENT_DATE)

Или вы можете выполнить запрос напрямую, используя следующий запрос:

SELECT
alloydb_ai_nl.execute_nl_query(
    'Show me last name and country about customers who bought "Republic Outpost" products last year.',
    'cymbal_ecomm_config'
);

Он вернет результаты в формате JSON, которые можно проанализировать.

                    execute_nl_query
--------------------------------------------------------
 {"last_name":"Adams","country":"China"}
 {"last_name":"Adams","country":"Germany"}
 {"last_name":"Aguilar","country":"China"}
 {"last_name":"Allen","country":"China"}

11. Очистите окружающую среду

Уничтожьте экземпляры AlloyDB и кластер, когда закончите работу с лабораторией.

Удалить кластер AlloyDB и все экземпляры

Кластер уничтожается с помощью опции force, которая также удаляет все экземпляры, принадлежащие кластеру.

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

gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)

Удалить кластер:

gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force

Ожидаемый вывод консоли:

student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
All of the cluster data will be lost when the cluster is deleted.

Do you want to continue (Y/n)?  Y

Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f
Deleting cluster...done.   

Удалить резервные копии AlloyDB

Удалите все резервные копии AlloyDB для кластера:

for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done

Ожидаемый вывод консоли:

student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f
Deleting backup...done.                                                                                                                                                                                                                                                            

12. Поздравления

Поздравляем с завершением лабораторной работы. Теперь вы можете попробовать реализовать собственные решения, используя функции NL2SQL в AlloyDB. Рекомендуем попробовать другие лабораторные работы, связанные с AlloyDB и искусственным интеллектом AlloyDB. Вы можете проверить, как работают мультимодальные вложения в AlloyDB, в этой лабораторной работе .

Что мы рассмотрели

  • Как развернуть AlloyDB для Postgres
  • Как включить естественный язык в AlloyDB AI
  • Как создать и настроить конфигурацию для естественного языка ИИ
  • Как генерировать SQL-запросы и получать результаты, используя естественный язык

13. Опрос

Выход:

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

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