1. Введение
В этой лабораторной работе вы научитесь развертывать AlloyDB и использовать естественный язык ИИ для запросов к данным, а также настраивать конфигурацию для предсказуемых и эффективных запросов. Эта лабораторная работа входит в серию лабораторных работ, посвященных функциям ИИ в AlloyDB. Подробнее см. на странице документации, посвященной ИИ в AlloyDB .
Предпосылки
- Базовое понимание Google Cloud, консоли
- Базовые навыки работы с интерфейсом командной строки и Cloud Shell
Чему вы научитесь
- Как развернуть AlloyDB для Postgres
- Как включить естественный язык в AlloyDB AI
- Как создать и настроить конфигурацию для естественного языка ИИ
- Как генерировать SQL-запросы и получать результаты, используя естественный язык
Что вам понадобится
- Учетная запись Google Cloud и проект Google Cloud
- Веб-браузер, например Chrome , поддерживающий Google Cloud Console и Cloud Shell
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в Google Cloud Console и создайте новый проект или используйте существующий. Если у вас ещё нет учётной записи Gmail или Google Workspace, вам необходимо её создать .
- Название проекта — отображаемое имя участников проекта. Это строка символов, не используемая API Google. Вы можете изменить её в любой момент.
- Идентификатор проекта уникален для всех проектов Google Cloud и неизменяем (нельзя изменить после установки). Cloud Console автоматически генерирует уникальную строку; обычно вам не важно, какой именно. В большинстве практических работ вам потребуется указать идентификатор проекта (обычно обозначаемый как
PROJECT_ID
). Если вам не нравится сгенерированный идентификатор, вы можете сгенерировать другой случайный идентификатор. Вы также можете попробовать использовать свой собственный идентификатор и посмотреть, доступен ли он. После этого шага его нельзя будет изменить, и он останется на протяжении всего проекта. - К вашему сведению, существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трёх значениях можно узнать в документации .
- Далее вам нужно включить биллинг в Cloud Console для использования облачных ресурсов/API. Выполнение этой лабораторной работы не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать списания средств за пределами этого руководства, вы можете удалить созданные вами ресурсы или проект. Новые пользователи Google Cloud могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .
Запустить Cloud Shell
Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этой лабораторной работе вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.
В консоли Google Cloud Console нажмите значок Cloud Shell на верхней правой панели инструментов:
Подготовка и подключение к среде займёт всего несколько минут. После завершения вы увидите примерно следующее:
Эта виртуальная машина содержит все необходимые инструменты разработки. Она предоставляет постоянный домашний каталог объёмом 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, нажав на знак «+» вверху.
На новой вкладке облачной оболочки выполните:
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, щёлкнув по основному экземпляру.
Затем нажмите на AlloyDB Studio слева:
Выберите базу данных Postgres, пользователя Postgres и введите пароль, указанный при создании кластера. Затем нажмите кнопку «Аутентифицировать».
Откроется интерфейс AlloyDB Studio. Для выполнения команд в базе данных нажмите на вкладку «Редактор 1» справа.
Открывает интерфейс, в котором можно запускать команды SQL.
Создать базу данных
Быстрый старт по созданию базы данных.
В редакторе AlloyDB Studio выполните следующую команду.
Создать базу данных:
CREATE DATABASE quickstart_db
Ожидаемый результат:
Statement executed successfully
Подключиться к quickstart_db
Повторно подключитесь к студии, используя кнопку переключения пользователя/базы данных.
Выберите из раскрывающегося списка новую базу данных quickstart_db и используйте того же пользователя и пароль, что и раньше.
Откроется новое соединение, в котором вы сможете работать с объектами из базы данных 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.
И проверьте количество строк в таблице.
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
Это инициирует обновление экземпляра. Вы можете увидеть статус обновления экземпляра в веб-консоли:
Когда экземпляр обновится (статус экземпляра станет зеленым), вы сможете включить расширение 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. Опрос
Выход: