1. Введение
В этой лаборатории вы узнаете, как использовать AI AlloyDB, сочетая векторный поиск с встраиваниями Vertex AI.
Предварительные условия
- Базовое понимание Google Cloud, консоли.
- Базовые навыки работы с интерфейсом командной строки и Google Shell.
Что вы узнаете
- Как развернуть кластер AlloyDB и основной экземпляр
- Как подключиться к AlloyDB из виртуальной машины Google Compute Engine
- Как создать базу данных и включить AlloyDB AI
- Как загрузить данные в базу данных
- Как использовать модель внедрения Vertex AI в AlloyDB
- Как обогатить результат с помощью генеративной модели Vertex AI
Что вам понадобится
- Учетная запись Google Cloud и проект Google Cloud
- Веб-браузер, например Chrome
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
Ожидаемый результат
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, используя знак «+» вверху.
На новой вкладке облачной оболочки выполните:
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, щелкнув основной экземпляр.
Затем нажмите AlloyDB Studio слева:
Выберите базу данных faststart_db, пользователя postgres и укажите пароль, указанный при создании кластера. Затем нажмите кнопку «Аутентифицировать».
Откроется интерфейс AlloyDB Studio. Для запуска команд в базе данных нажмите на вкладку «Редактор 1» справа.
Он открывает интерфейс, в котором вы можете запускать команды SQL.
Если вы предпочитаете использовать командную строку 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 в облачной консоли.
Он может попросить вас включить дополнительные API, но вы можете игнорировать этот запрос. Для завершения нашей лаборатории нам не нужны никакие дополнительные API.
Вот подсказка, которую мы собираемся использовать:
Вы дружелюбный консультант, помогающий найти продукт, соответствующий потребностям клиента.
По запросу клиента мы загрузили список товаров, тесно связанных с поиском.
Список в формате JSON со списком значений, таких как {"product_name":"name","description":"некоторое описание","sale_price":10, "zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Вот список продуктов:
[место для нашего JSON]
Заказчик спросил: «Какое дерево здесь лучше всего растет?»
Вы должны предоставить информацию о продукте, цене и некоторую дополнительную информацию в кратчайшие сроки.
И вот результат, когда мы запускаем приглашение с нашими значениями JSON и используем модель Gemini-1.5-flash:
Ответ, который мы получили от модели в этом примере, следующий. Обратите внимание, что ваш ответ может отличаться из-за изменений модели и параметров с течением времени:
«Я вижу, вы ищете дерево, которое растет в вашем районе. Судя по вашему почтовому индексу 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. Опрос
Выход: