Начало работы с векторными встраиваниями с помощью AlloyDB AI

1. Введение

В этой лаборатории вы узнаете, как использовать AI AlloyDB, сочетая векторный поиск с встраиваниями Vertex AI.

17e86406ab251142.png

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

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

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

  • Как развернуть кластер AlloyDB и основной экземпляр
  • Как подключиться к AlloyDB из виртуальной машины Google Compute Engine
  • Как создать базу данных и включить AlloyDB AI
  • Как загрузить данные в базу данных
  • Как использовать модель внедрения Vertex AI в AlloyDB
  • Как обогатить результат с помощью генеративной модели Vertex AI

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

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

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

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

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.

Настройте регион по умолчанию для использования моделей внедрения Vertex AI. Узнайте больше о доступных локациях для Vertex AI . В примере мы используем регион us-central1.

gcloud config set compute/region us-central1

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

Прежде чем создавать кластер 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

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

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

Определите регион и имя кластера AlloyDB. Мы собираемся использовать регион us-central1 и alydb-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

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

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. Подключитесь к AlloyDB.

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

Развертывание виртуальной машины GCE

Создайте виртуальную машину GCE в том же регионе и VPC, что и кластер AlloyDB.

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

export ZONE=us-central1-a
gcloud compute instances create instance-1 \
    --zone=$ZONE \
    --create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
    --scopes=https://www.googleapis.com/auth/cloud-platform

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

student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
gcloud compute instances create instance-1 \
    --zone=$ZONE \
    --create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
    --scopes=https://www.googleapis.com/auth/cloud-platform

Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/zones/us-central1-a/instances/instance-1].
NAME: instance-1
ZONE: us-central1-a
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE: 
INTERNAL_IP: 10.128.0.2
EXTERNAL_IP: 34.71.192.233
STATUS: RUNNING

Установите клиент Postgres

Установите клиентское программное обеспечение PostgreSQL на развернутую виртуальную машину.

Подключитесь к виртуальной машине:

gcloud compute ssh instance-1 --zone=us-central1-a

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

student@cloudshell:~ (test-project-402417)$ gcloud compute ssh instance-1 --zone=us-central1-a
Updating project ssh metadata...working..Updated [https://www.googleapis.com/compute/v1/projects/test-project-402417].                                                                                                                                                         
Updating project ssh metadata...done.                                                                                                                                                                                                                                              
Waiting for SSH key to propagate.
Warning: Permanently added 'compute.5110295539541121102' (ECDSA) to the list of known hosts.
Linux instance-1.us-central1-a.c.gleb-test-short-001-418811.internal 6.1.0-18-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
student@instance-1:~$ 

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

sudo apt-get update
sudo apt-get install --yes postgresql-client

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

student@instance-1:~$ sudo apt-get update
sudo apt-get install --yes postgresql-client
Get:1 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable InRelease [5146 B]
Get:2 https://packages.cloud.google.com/apt cloud-sdk-bullseye InRelease [6406 B]   
Hit:3 https://deb.debian.org/debian bullseye InRelease  
Get:4 https://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB]
Get:5 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable/main amd64 Packages [1930 B]
Get:6 https://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
Get:7 https://deb.debian.org/debian bullseye-backports InRelease [49.0 kB]
...redacted...
update-alternatives: using /usr/share/postgresql/13/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode
Setting up postgresql-client (13+225) ...
Processing triggers for man-db (2.9.4-2) ...
Processing triggers for libc-bin (2.31-13+deb11u7) ...

Подключиться к экземпляру

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

На той же вкладке Cloud Shell с открытым сеансом SSH к вашей виртуальной машине экземпляра 1.

Используйте указанное значение пароля AlloyDB (PGPASSWORD) и идентификатор кластера AlloyDB для подключения к AlloyDB с виртуальной машины GCE:

export PGPASSWORD=<Noted password>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
psql "host=$INSTANCE_IP user=postgres sslmode=require"

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

student@instance-1:~$ export PGPASSWORD=CQhOi5OygD4ps6ty
student@instance-1:~$ ADBCLUSTER=alloydb-aip-01
student@instance-1:~$ REGION=us-central1
student@instance-1:~$ INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
gleb@instance-1:~$ psql "host=$INSTANCE_IP user=postgres sslmode=require"
psql (15.6 (Debian 15.6-0+deb12u1), server 15.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=>

Закройте сеанс psql:

exit

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

Нам нужно создать базу данных, включить интеграцию 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» во вкладке:

exit

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

Краткое руководство по созданию базы данных.

В сеансе виртуальной машины GCE выполните:

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

psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db"

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

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db"
CREATE DATABASE
student@instance-1:~$  

Включить интеграцию Vertex AI

Включите интеграцию Vertex AI и расширения pgvector в базе данных.

В виртуальной машине GCE выполните:

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"

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

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"
CREATE EXTENSION
CREATE EXTENSION
student@instance-1:~$ 

Импортировать данные

Загрузите подготовленные данные и импортируйте их в новую базу данных.

В виртуальной машине GCE выполните:

gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"

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

student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
SET
SET
SET
SET
SET
 set_config 
------------
 
(1 row)
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER TABLE
ALTER SEQUENCE
ALTER TABLE
ALTER TABLE
ALTER TABLE
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
COPY 941
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
COPY 263861
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"
COPY 4654
student@instance-1:~$

7. Вычисление вложений

После импорта данных мы получили данные о наших продуктах в таблице cymbal_products, инвентарь, показывающий количество доступных продуктов в каждом магазине, в таблице cymbal_inventory и список магазинов в таблице cymbal_stores. Нам нужно вычислить векторные данные на основе описаний наших продуктов, и для этого мы собираемся использовать встраивание функций. Используя функцию, мы собираемся использовать интеграцию Vertex AI для расчета векторных данных на основе описаний наших продуктов и добавления их в таблицу. Подробнее об используемой технологии можно прочитать в документации .

Создать столбец внедрения

Подключитесь к базе данных с помощью psql и создайте виртуальный столбец с векторными данными, используя функцию внедрения в таблицу cymbal_products. Функция внедрения возвращает векторные данные из Vertex AI на основе данных, предоставленных из столбца product_description.

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"

В сеансе psql после подключения к базе данных выполните:

ALTER TABLE cymbal_products ADD COLUMN embedding vector GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;

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

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

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
psql (13.11 (Debian 13.11-0+deb11u1), server 14.7)
WARNING: psql major version 13, server major version 14.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

quickstart_db=> ALTER TABLE cymbal_products ADD COLUMN embedding vector GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;
ALTER TABLE
quickstart_db=> 

8. Запустите поиск по сходству

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

SQL-запрос можно выполнить из того же интерфейса командной строки psql или, альтернативно, из AlloyDB Studio. Любой многострочный и сложный вывод может выглядеть лучше в AlloyDB Studio.

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

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

ef4bfbcf0ed2ef3a.png

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

5c155cbcd7d43a1.png

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

432613065cac864f.png

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

b36c28f8165119ca.png

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

cf43aa20f292797e.png

Если вы предпочитаете использовать командную строку psql, следуйте альтернативному маршруту и ​​подключитесь к базе данных из сеанса SSH вашей виртуальной машины, как это было описано в предыдущих главах.

Запустите поиск по сходству из psql

Если сеанс вашей базы данных был отключен, подключитесь к базе данных снова с помощью psql или AlloyDB Studio.

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

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"

Запустите запрос, чтобы получить список доступных продуктов, наиболее соответствующих запросу клиента. Запрос, который мы собираемся передать Vertex AI для получения значения вектора, звучит так: «Какие фруктовые деревья здесь хорошо растут?»

Вот запрос, который вы можете выполнить, чтобы выбрать первые 10 элементов, наиболее подходящих для нашего запроса:

SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-004','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;

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

quickstart_db=> SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-004','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;
    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.287184013172779
 Toyon               | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 | 0.30574073611569963
 Secateurs           | These secateurs are perfect for pruning small branches and vines.                |      15.00 |    93230 |  0.3264385326189635
 Trimming Shears     | These trimming shears are perfect for trimming hedges and bushes.                |      20.00 |    93230 | 0.33293036535756393
 Cypress Tree        | This is a beautiful cypress tree that will provide shade and privacy. It is an e |      75.00 |    93230 | 0.33485770716129326
 Madrone             | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an |      50.00 |    93230 |  0.3354408801293012
 California Redwood  | This is a beautiful redwood tree that can grow to be over 300 feet tall. It is a |    1000.00 |    93230 |  0.3427243109636263
 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.3427628377929176
 California Sycamore | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is  |     300.00 |    93230 |  0.3430208475356905
 Maple Tree          | This is a beautiful maple tree that will produce colorful leaves in the fall. It |     100.00 |    93230 |  0.3432609589330091
(10 rows)

quickstart_db=> 

9. Улучшите реакцию

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

Для этого мы планируем сгенерировать JSON с нашими результатами векторного поиска, а затем использовать этот сгенерированный JSON в качестве дополнения к подсказке для текстовой модели LLM в Vertex AI, чтобы создать значимый результат. На первом этапе мы генерируем JSON, затем тестируем его в Vertex AI Studio, а на последнем этапе включаем его в оператор SQL, который можно использовать в приложении.

Создать вывод в формате JSON

Измените запрос, чтобы он генерировал выходные данные в формате JSON и возвращал только одну строку для передачи в Vertex AI.

Вот пример запроса:

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-004','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"}]

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

Мы можем использовать сгенерированный JSON, чтобы предоставить его как часть запроса на генеративную текстовую модель ИИ в Vertex AI Studio.

Откройте Vertex AI Studio в облачной консоли.

e514b176aef7945e.png

54712e5ade7121f.png

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

Вот подсказка, которую мы собираемся использовать:

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

По запросу клиента мы загрузили список товаров, тесно связанных с поиском.

Список в формате JSON со списком значений, таких как {"product_name":"имя","description":"некоторое описание","sale_price":10, "zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}

Вот список продуктов:

[место для нашего JSON]

Заказчик спросил: «Какое дерево здесь лучше всего растет?»

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

И вот результат, когда мы запускаем приглашение с нашими значениями JSON и используем модель Gemini-1.5-flash:

30e5072cd2975685.png

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

«Я вижу, вы ищете дерево, которое растет в вашем районе. Судя по вашему почтовому индексу 93230, вишневое дерево кажется отличным вариантом!

Его описывают как красивое дерево, на котором растут вкусные вишни. В настоящее время он продается за 75 долларов.

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

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

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

Мы можем использовать интеграцию AlloyDB AI с Vertex AI, чтобы получить тот же ответ от генеративной модели с использованием SQL непосредственно в базе данных. Но чтобы использовать модель Gemini-1.5-flash, нам необходимо сначала ее зарегистрировать.

Обновите расширение до версии 1.3. Подключитесь к базе данных faststart_db из pSQL, как было показано ранее (или используйте AlloyDB Studio) и выполните:

ALTER EXTENSION google_ml_integration UPDATE TO '1.3'

Затем нам нужно установить флаг базы данных google_ml_integration.enable_model_support в положение «on». Для этого вы можете использовать интерфейс веб-консоли AlloyDB или запустить следующую команду gcloud.

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
ADBCLUSTER=alloydb-aip-01
gcloud beta alloydb instances update $ADBCLUSTER-pr \
  --database-flags google_ml_integration.enable_model_support=on \
  --region=$REGION \
  --cluster=$ADBCLUSTER \
  --project=$PROJECT_ID \
  --update-mode=FORCE_APPLY

Выполнение команды в фоновом режиме занимает около 3-5 минут. Затем вы можете проверить новый флаг в сеансе psql или с помощью AlloyDB Studio, подключаясь к базе данных faststart_db.

show google_ml_integration.enable_model_support;

Ожидаемый результат сеанса psql — «включен»:

postgres=> show google_ml_integration.enable_model_support;
 google_ml_integration.enable_model_support 
--------------------------------------------
 on
(1 row)

Затем нам нужно зарегистрировать две модели. Первая — это уже используемая модель text-embedding-004 . Его необходимо зарегистрировать, поскольку мы включили возможности регистрации модели.

Чтобы зарегистрировать модель, запустите в psql или AlloyDB Studio следующий код:

CALL
  google_ml.create_model(
    model_id => 'text-embedding-004',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-004',
    model_type => 'text_embedding',
    model_auth_type => 'alloydb_service_agent_iam',
    model_in_transform_fn => 'google_ml.vertexai_text_embedding_input_transform',
    model_out_transform_fn => 'google_ml.vertexai_text_embedding_output_transform');

И следующая модель, которую нам нужно зарегистрировать, — это Gemini-1.5-flash-001, которая будет использоваться для создания удобного для пользователя вывода.

CALL
  google_ml.create_model(
    model_id => 'gemini-1.5-flash-001',
    model_request_url => 'https://$REGION-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/publishers/google/models/gemini-1.5-flash-001:streamGenerateContent',
    model_provider => 'google',
    model_auth_type => 'alloydb_service_agent_iam');

Вы всегда можете проверить список зарегистрированных моделей, выбрав информацию из google_ml.model_info_view.

select model_id,model_type from google_ml.model_info_view;

Вот пример вывода

quickstart_db=> select model_id,model_type from google_ml.model_info_view;
        model_id         |   model_type   
-------------------------+----------------
 textembedding-gecko     | text_embedding
 textembedding-gecko@001 | text_embedding
 text-embedding-004      | text_embedding
 gemini-1.5-flash-001    | generic
(4 rows)

Теперь мы можем использовать сгенерированный в подзапросе JSON, чтобы предоставить его как часть приглашения к генеративной текстовой модели ИИ с использованием SQL.

В сеансе psql или AlloyDB Studio к базе данных выполните запрос

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-004',
        '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
        json_array_elements(google_ml.predict_row( model_id =>'gemini-1.5-flash-001',
        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
        string_agg(resp::text,
        ' ')
FROM
        response;

И вот ожидаемый результат. Результат может отличаться в зависимости от версии и параметров модели:

--------------------------------------------------------------------------------------------------------
 "I" " see you're interested in fruit trees! Based on your location, I found" " one great option:\n\n**Cherry Tree:** \n\nThis beautiful cherry tree will" " produce delicious cherries. It's a deciduous tree, meaning it loses its leaves in the fall, and can grow up to 15 feet tall. The" " leaves are a vibrant dark green in the summer, turning a beautiful red in the fall. \n\nCherry trees are known for their beauty and ability to provide shade" " and privacy. They prefer a cool, moist climate and sandy soil, making them a good fit for your area. \n\nThe Cherry Tree is currently on sale for $75.00.\n\nWould you like to know more about" " the Cherry Tree, or are you interested in exploring other fruit tree options? \n" ""
(1 row)

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

Уничтожьте экземпляры и кластер 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.                                                                                                                                                                                                                                                            

Теперь мы можем уничтожить нашу виртуальную машину

Удалить виртуальную машину GCE

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

export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
    --zone=$ZONE \
    --quiet

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

student@cloudshell:~ (test-project-001-402417)$ export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
    --zone=$ZONE \
    --quiet
Deleted 

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

Поздравляем с завершением работы над кодом.

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

  • Как развернуть кластер AlloyDB и основной экземпляр
  • Как подключиться к AlloyDB из виртуальной машины Google Compute Engine
  • Как создать базу данных и включить AlloyDB AI
  • Как загрузить данные в базу данных
  • Как использовать модель внедрения Vertex AI в AlloyDB
  • Как обогатить результат с помощью генеративной модели Vertex AI

12. Опрос

Выход:

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

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