Создание чат-приложения на основе LLM и RAG с использованием AlloyDB AI и LangChain.

1. Введение

e71e051395674233.gif

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

98c2676cc78880e.png

Более подробную информацию о службе поиска GenAI и примере приложения можно получить здесь .

Предпосылки

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

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

  • Как развернуть кластер AlloyDB
  • Как подключиться к AlloyDB
  • Как настроить и развернуть службу извлечения баз данных GenAI
  • Как развернуть пример приложения с помощью развернутой службы

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

  • Учетная запись 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 ). Если вам не нравится сгенерированный идентификатор, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага, и он остается на протяжении всего проекта.
  • Для вашего сведения, есть третье значение, Project Number , которое используют некоторые API. Узнайте больше обо всех трех этих значениях в документации .
  1. Далее вам нужно будет включить биллинг в Cloud Console для использования ресурсов/API Cloud. Прохождение этой кодовой лаборатории не будет стоить много, если вообще будет стоить. Чтобы отключить ресурсы и избежать выставления счетов за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить проект. Новые пользователи 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 убедитесь, что настроен идентификатор вашего проекта:

Обычно идентификатор проекта отображается в скобках в командной строке облачной оболочки, как показано на рисунке:

fa6ee779963405d5.png

gcloud config set project [YOUR-PROJECT-ID]

Затем установите переменную среды PROJECT_ID на идентификатор вашего проекта Google Cloud:

PROJECT_ID=$(gcloud config get-value project)

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

gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       vpcaccess.googleapis.com \
                       aiplatform.googleapis.com \
                       cloudbuild.googleapis.com \
                       artifactregistry.googleapis.com \
                       run.googleapis.com \
                       iam.googleapis.com

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

student@cloudshell:~ (gleb-test-short-004)$ gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       vpcaccess.googleapis.com \
                       aiplatform.googleapis.com \
                       cloudbuild.googleapis.com \
                       artifactregistry.googleapis.com \
                       run.googleapis.com \
                       iam.googleapis.com
Operation "operations/acf.p2-404051529011-664c71ad-cb2b-4ab4-86c1-1f3157d70ba1" finished successfully.

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

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

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

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

Нам нужно настроить конфигурацию Private Service Access в нашем 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 и имя кластера soliddb-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 для нашего кластера в том же сеансе облачной оболочки. Если вы отключены, вам нужно будет снова определить переменные окружения региона и имени кластера.

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 и имя кластера soliddb-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 для нашего кластера в том же сеансе облачной оболочки. Если вы отключены, вам нужно будет снова определить переменные окружения региона и имени кластера.

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. Подготовьте виртуальную машину GCE

Создать учетную запись службы

Поскольку мы будем использовать нашу виртуальную машину для развертывания службы поиска баз данных GenAI и размещения примера приложения, первым шагом будет создание учетной записи Google Service Account (GSA). GSA будет использоваться виртуальной машиной GCE, и нам нужно будет предоставить ей необходимые привилегии для работы с другими службами.

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

PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts create compute-aip --project $PROJECT_ID
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/cloudbuild.builds.editor"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/artifactregistry.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/storage.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/run.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/alloydb.viewer"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/serviceusage.serviceUsageConsumer"

Развертывание виртуальной машины 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 \
  --service-account=compute-aip@$PROJECT_ID.iam.gserviceaccount.com

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

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 5.10.0-26-cloud-amd64 #1 SMP Debian 5.10.197-1 (2023-09-29) 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 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B]
Get:4 file:/etc/apt/mirrors/debian-security.list Mirrorlist [39 B]
Hit:7 https://packages.cloud.google.com/apt google-compute-engine-bookworm-stable InRelease
Get:8 https://packages.cloud.google.com/apt cloud-sdk-bookworm InRelease [1652 B]
Get:2 https://deb.debian.org/debian bookworm InRelease [151 kB]
Get:3 https://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
...redacted...
update-alternatives: using /usr/share/postgresql/15/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode
Setting up postgresql-client (15+248) ...
Processing triggers for man-db (2.11.2-2) ...
Processing triggers for libc-bin (2.36-9+deb12u7) ...

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

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

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

Используйте ранее указанный $PGASSWORD и имя кластера для подключения к 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=P9...
student@instance-1:~$ export REGION=us-central1
student@instance-1:~$ export ADBCLUSTER=alloydb-aip-01
student@instance-1:~$ export INSTANCE_IP=export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres sslmode=require"
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.

postgres=> 

Выйдите из сеанса psql, сохранив SSH-соединение:

exit

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

postgres=> exit
student@instance-1:~$ 

6. Инициализируйте базу данных

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

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

Создайте базу данных с именем «assistantdemo».

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

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

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

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

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

psql "host=$INSTANCE_IP user=postgres dbname=assistantdemo" -c "CREATE EXTENSION vector"  

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

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=assistantdemo" -c "CREATE EXTENSION vector"
CREATE EXTENSION
student@instance-1:~$

Подготовка среды Python

Для продолжения мы воспользуемся подготовленными скриптами Python из репозитория GitHub, но перед этим нам необходимо установить необходимое программное обеспечение.

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

sudo apt install -y python3.11-venv git
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip

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

student@instance-1:~$ sudo apt install -y python3.11-venv git
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  git-man liberror-perl patch python3-distutils python3-lib2to3 python3-pip-whl python3-setuptools-whl
Suggested packages:
  git-daemon-run | git-daemon-sysvinit git-doc git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn ed diffutils-doc
The following NEW packages will be installed:
  git git-man liberror-perl patch python3-distutils python3-lib2to3 python3-pip-whl python3-setuptools-whl python3.11-venv
0 upgraded, 9 newly installed, 0 to remove and 2 not upgraded.
Need to get 12.4 MB of archives.
After this operation, 52.2 MB of additional disk space will be used.
Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B]
...redacted...
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 23.0.1
    Uninstalling pip-23.0.1:
      Successfully uninstalled pip-23.0.1
Successfully installed pip-24.0
(.venv) student@instance-1:~$

Проверьте версию Python.

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

python -V

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

(.venv) student@instance-1:~$ python -V
Python 3.11.2
(.venv) student@instance-1:~$ 

Заполнить базу данных

Клонируйте репозиторий GitHub с кодом для службы поиска и примером приложения.

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

git clone https://github.com/GoogleCloudPlatform/genai-databases-retrieval-app.git

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

student@instance-1:~$ git clone https://github.com/GoogleCloudPlatform/genai-databases-retrieval-app.git
Cloning into 'genai-databases-retrieval-app'...
remote: Enumerating objects: 525, done.
remote: Counting objects: 100% (336/336), done.
remote: Compressing objects: 100% (201/201), done.
remote: Total 525 (delta 224), reused 179 (delta 135), pack-reused 189
Receiving objects: 100% (525/525), 46.58 MiB | 16.16 MiB/s, done.
Resolving deltas: 100% (289/289), done.

Подготовить файл конфигурации

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

cd genai-databases-retrieval-app/retrieval_service
cp example-config.yml config.yml
sed -i s/127.0.0.1/$INSTANCE_IP/g config.yml
sed -i s/my-password/$PGPASSWORD/g config.yml
sed -i s/my_database/assistantdemo/g config.yml
sed -i s/my-user/postgres/g config.yml
cat config.yml

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

student@instance-1:~$ cd genai-databases-retrieval-app/retrieval_service
cp example-config.yml config.yml
sed -i s/127.0.0.1/$INSTANCE_IP/g config.yml
sed -i s/my-password/$PGPASSWORD/g config.yml
sed -i s/my_database/assistantdemo/g config.yml
sed -i s/my-user/postgres/g config.yml
cat config.yml
host: 0.0.0.0
# port: 8080
datastore:
  # Example for AlloyDB
  kind: "postgres"
  host: 10.65.0.2
  # port: 5432
  database: "assistantdemo"
  user: "postgres"
  password: "P9..."

Заполнить базу данных образцом набора данных. Первая команда добавляет все необходимые пакеты в нашу виртуальную среду Python, а вторая команда заполняет нашу базу данных данными.

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

pip install -r requirements.txt
python run_database_init.py

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

student@instance-1:~/genai-databases-retrieval-app/retrieval_service$ pip install -r requirements.txt
python run_database_init.py
Collecting asyncpg==0.28.0 (from -r requirements.txt (line 1))
  Obtaining dependency information for asyncpg==0.28.0 from https://files.pythonhosted.org/packages/77/a4/88069f7935b14c58534442a57be3299179eb46aace2d3c8716be199ff6a6/asyncpg-0.28.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata
  Downloading asyncpg-0.28.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.3 kB)
Collecting fastapi==0.101.1 (from -r requirements.txt (line 2))
...
database init done.
student@instance-1:~/genai-databases-retrieval-app/retrieval_service$

7. Развертывание службы извлечения в Cloud Run

Теперь мы можем развернуть службу поиска в Cloud Run. Служба отвечает за работу с базой данных и извлечение необходимой информации из базы данных на основе запроса от приложения ИИ.

Создать учетную запись службы

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

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

4ca978f5142bb6ce.png

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

export PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts create retrieval-identity
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"

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

student@cloudshell:~ (gleb-test-short-003)$ gcloud iam service-accounts create retrieval-identity
Created service account [retrieval-identity].

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

exit

Развертывание службы поиска

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

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

cd ~/genai-databases-retrieval-app
gcloud alpha run deploy retrieval-service \
    --source=./retrieval_service/\
    --no-allow-unauthenticated \
    --service-account retrieval-identity \
    --region us-central1 \
    --network=default \
    --quiet

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

student@instance-1:~/genai-databases-retrieval-app$ gcloud alpha run deploy retrieval-service \
    --source=./retrieval_service/\
    --no-allow-unauthenticated \
    --service-account retrieval-identity \
    --region us-central1 \
    --network=default
This command is equivalent to running `gcloud builds submit --tag [IMAGE] ./retrieval_service/` and `gcloud run deploy retrieval-service --image [IMAGE]`

Building using Dockerfile and deploying container to Cloud Run service [retrieval-service] in project [gleb-test-short-003] region [us-central1]
X Building and deploying... Done.
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/6ebe74bf-3039-4221-b2e9-7ca8fa8dad8e?project=1012713954588].
  ✓ Creating Revision...
  ✓ Routing traffic...
    Setting IAM Policy...
Completed with warnings:
  Setting IAM policy failed, try "gcloud beta run services remove-iam-policy-binding --region=us-central1 --member=allUsers --role=roles/run.invoker retrieval-service"
Service [retrieval-service] revision [retrieval-service-00002-4pl] has been deployed and is serving 100 percent of traffic.
Service URL: https://retrieval-service-onme64eorq-uc.a.run.app
student@instance-1:~/genai-databases-retrieval-app$

Проверить услугу

Теперь мы можем проверить, работает ли служба правильно и имеет ли виртуальная машина доступ к конечной точке. Мы используем утилиту gcloud для получения конечной точки службы извлечения. В качестве альтернативы вы можете проверить это в облачной консоли и заменить в команде curl "$(gcloud run services list –filter="(retrieval-service)" на значение оттуда.

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

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $(gcloud  run services list --filter="(retrieval-service)" --format="value(URL)")

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

student@instance-1:~/genai-databases-retrieval-app$ curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $(gcloud  run services list --filter="(retrieval-service)" --format="value(URL)")
{"message":"Hello World"}student@instance-1:~/genai-databases-retrieval-app$

Если мы видим сообщение «Hello World», это означает, что наш сервис запущен и обслуживает запросы.

8. Развертывание примера приложения

Теперь, когда у нас есть служба поиска и она работает, мы можем развернуть пример приложения, которое будет использовать эту службу. Приложение может быть развернуто на виртуальной машине или любой другой службе, например, Cloud Run, Kubernetes или даже локально на ноутбуке. Здесь мы покажем, как развернуть его на виртуальной машине.

Подготовьте окружающую среду

Продолжаем работать над нашей виртуальной машиной, используя тот же сеанс SSH. Для запуска нашего приложения нам нужно добавить несколько модулей Python. Команда будет выполнена из каталога приложения в той же виртуальной среде Python.

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

cd ~/genai-databases-retrieval-app/llm_demo
pip install -r requirements.txt

Ожидаемый результат (отредактировано):

student@instance-1:~$ cd ~/genai-databases-retrieval-app/llm_demo
pip install -r requirements.txt
Collecting fastapi==0.104.0 (from -r requirements.txt (line 1))
  Obtaining dependency information for fastapi==0.104.0 from https://files.pythonhosted.org/packages/db/30/b8d323119c37e15b7fa639e65e0eb7d81eb675ba166ac83e695aad3bd321/fastapi-0.104.0-py3-none-any.whl.metadata
  Downloading fastapi-0.104.0-py3-none-any.whl.metadata (24 kB)
...

Подготовить идентификатор клиента

Для использования функциональности бронирования в приложении нам необходимо подготовить OAuth 2.0 Client ID с помощью Cloud Console. Без этого мы не сможем войти в приложение с нашими учетными данными Google для бронирования. Это необходимо для записи данных бронирования в базу данных.

В Cloud Console перейдите в API и службы и нажмите «Экран согласия OAuth». Откроется страница обзора Oauth, на которой мы нажимаем «Начать».

2f13a26289362f20.png

На следующей странице указываем название приложения, адрес электронной почты службы поддержки пользователей и нажимаем «Далее».

dd3721c042db26ae.png

На следующем экране выбираем Internal для нашего приложения и снова нажимаем Next.

71b6d11179ed872b.png

Затем снова указываем контактный адрес электронной почты и нажимаем Далее

8ff29dfd959b41f0.png

Затем соглашаемся с политикой сервисов Google API и нажимаем кнопку Создать.

f615dc15193717a6.png

Это приведет нас на страницу, где мы сможем создать OAuth-клиент.

56e5040805632a53.png

На экране выбираем «Веб-приложение» из выпадающего меню, устанавливаем «Cymbal Air» в качестве приложения и нажимаем кнопку «Добавить URI».

4e28c6700426735a.png

URI представляют собой доверенные источники для приложения и зависят от того, откуда вы пытаетесь получить доступ к приложению. Мы указываем "https://localhost:8081" как авторизованный URI и "https://localhost:8081/login/google" как перенаправленный URI. Эти значения будут работать, если вы укажете в своем браузере "https://localhost:8081" как URI для подключения. Например, когда вы подключаетесь через туннель SSH со своего компьютера. Я покажу вам, как это сделать позже.

9dc25f2d318097e2.png

После нажатия кнопки «Создать» вы получите всплывающее окно с учетными данными вашего клиента. И учетные данные будут записаны в систему. Вы всегда можете скопировать идентификатор клиента, который будет использоваться при запуске вашего приложения.

f5a7b6ad0858d95c.png

Позже вы увидите, где указать этот идентификатор клиента.

Запустить приложение-помощник

Перед запуском приложения нам нужно настроить некоторые переменные среды. Базовая функциональность приложения, такая как запрос рейсов и удобств аэропорта, требует только BASE_URL , который указывает приложению на службу поиска. Мы можем получить его с помощью команды gcloud.

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

export BASE_URL=$(gcloud  run services list --filter="(retrieval-service)" --format="value(URL)")

Ожидаемый результат (отредактировано):

student@instance-1:~/genai-databases-retrieval-app/llm_demo$ export BASE_URL=$(gcloud  run services list --filter="(retrieval-service)" --format="value(URL)")

Чтобы использовать более продвинутые возможности приложения, такие как бронирование и изменение рейсов, нам необходимо войти в приложение, используя нашу учетную запись Google, и для этого нам необходимо предоставить переменную среды CLIENT_ID, используя идентификатор клиента OAuth из главы «Подготовка идентификатора клиента»:

export CLIENT_ID=215....apps.googleusercontent.com

Ожидаемый результат (отредактировано):

student@instance-1:~/genai-databases-retrieval-app/llm_demo$ export CLIENT_ID=215....apps.googleusercontent.com

И теперь мы можем запустить наше приложение:

python run_app.py

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

student@instance-1:~/genai-databases-retrieval-app/llm_demo$ python main.py
INFO:     Started server process [28565]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8081 (Press CTRL+C to quit)

Подключиться к приложению

У вас есть несколько способов подключиться к приложению, запущенному на виртуальной машине. Например, вы можете открыть порт 8081 на виртуальной машине, используя правила брандмауэра в VPC или создать балансировщик нагрузки с публичным IP. Здесь мы собираемся использовать туннель SSH к виртуальной машине, транслируя локальный порт 8080 в порт виртуальной машины 8081.

Подключение с локальной машины

Когда мы хотим подключиться с локальной машины, нам нужно запустить SSH-туннель. Это можно сделать с помощью gcloud compute ssh :

gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8081:localhost:8081

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

student-macbookpro:~ student$ gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081
Warning: Permanently added 'compute.7064281075337367021' (ED25519) to the list of known hosts.
Linux instance-1.us-central1-c.c.gleb-test-001.internal 6.1.0-21-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) 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:~$

Теперь мы можем открыть браузер и использовать http://localhost:8081 для подключения к нашему приложению. Мы должны увидеть экран приложения.

c667b9013afac3f9.png

Подключение из Cloud Shell

В качестве альтернативы мы можем использовать Google Cloud Shell для подключения. Откройте другую вкладку Cloud Shell, используя знак "+" вверху.

4ca978f5142bb6ce.png

На новой вкладке получите исходный и перенаправляющий URI для вашего веб-клиента, выполнив команду gcloud:

echo "origin:"; echo "https://8080-$WEB_HOST"; echo "redirect:"; echo "https://8080-$WEB_HOST/login/google"

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

student@cloudshell:~ echo "origin:"; echo "https://8080-$WEB_HOST"; echo "redirect:"; echo "https://8080-$WEB_HOST/login/google"
origin:
https://8080-cs-35704030349-default.cs-us-east1-rtep.cloudshell.dev
redirect:
https://8080-cs-35704030349-default.cs-us-east1-rtep.cloudshell.dev/login/google

И используйте источник и перенаправление URI в качестве « Авторизированных источников JavaScript » и «Авторизированных URI перенаправления » для наших учетных данных, созданных в главе «Подготовка идентификатора клиента», заменив или добавив к изначально предоставленным значениям http://localhost:8080 .

Нажмите «Cymbal Air» на странице идентификаторов клиентов OAuth 2.0.

b4c1430329886d9c.png

Введите исходный и перенаправленный URI для Cloud Shell и нажмите кнопку «Сохранить».

5651bdd6d0d1c88.png

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

gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081

Если появится ошибка «Невозможно назначить запрошенный адрес» — проигнорируйте ее.

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

student@cloudshell:~ gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081
bind [::1]:8081: Cannot assign requested address
inux instance-1.us-central1-a.c.gleb-codelive-01.internal 6.1.0-21-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) 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.
Last login: Sat May 25 19:15:46 2024 from 35.243.235.73
student@instance-1:~$

Он открывает порт 8080 в вашей облачной оболочке, который можно использовать для «веб-просмотра».

Нажмите кнопку «Веб-просмотр» в правом верхнем углу Cloud Shell и в раскрывающемся меню выберите «Предварительный просмотр на порту 8080».

444fbf54dcd4d160.png

Он открывает новую вкладку в вашем веб-браузере с интерфейсом приложения. Вы должны увидеть страницу "Cymbal Air Customer Service Assistant".

389f0ae2945beed5.png

Войти в приложение

Когда все настроено и ваше приложение открыто, мы можем использовать кнопку «Войти» в правом верхнем углу экрана нашего приложения, чтобы предоставить наши учетные данные. Это необязательно и требуется только в том случае, если вы хотите попробовать функционал бронирования приложения.

a1f571371b957129.png

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

После регистрации приложение готово, и вы можете начать размещать свои заявки в поле в нижней части окна.

В этой демонстрации демонстрируется помощник по обслуживанию клиентов Cymbal Air. Cymbal Air — вымышленная пассажирская авиакомпания. Помощник — это чат-бот на основе искусственного интеллекта, который помогает путешественникам управлять рейсами и искать информацию о хабе Cymbal Air в международном аэропорту Сан-Франциско (SFO).

Без входа в систему (без CLIENT_ID) он может помочь ответить на такие вопросы пользователей, как:

Когда следующий рейс в Денвер?

Есть ли какие-нибудь магазины класса люкс около выхода C28?

Где можно выпить кофе возле выхода А6?

Где я могу купить подарок?

Пожалуйста, забронируйте рейс в Денвер с вылетом в 10:35 утра.

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

6e7758f707c67c3e.png

Приложение использует новейшие модели Google Foundation для генерации ответов и дополняет их информацией о рейсах и удобствах из операционной базы данных AlloyDB. Подробнее об этом демонстрационном приложении можно прочитать на странице проекта на Github .

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

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

Удалить службу Cloud Run

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

gcloud run services delete retrieval-service --region us-central1

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

student@cloudshell:~ (gleb-test-short-004)$ gcloud run services delete retrieval-service --region us-central1
Service [retrieval-service] will be deleted.

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

Deleting [retrieval-service]...done.                                                                                                                                                                                                                 
Deleted service [retrieval-service].

Удалить учетную запись службы для запуска облачной службы

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

PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts delete retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com --quiet

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

student@cloudshell:~ (gleb-test-short-004)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-222]
student@cloudshell:~ (gleb-test-short-004)$ gcloud iam service-accounts delete retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com --quiet
deleted service account [retrieval-identity@gleb-test-short-004.iam.gserviceaccount.com]
student@cloudshell:~ (gleb-test-short-004)$

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

В 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 

Удалить учетную запись службы для GCE VM и службы Retrieval

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

PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts delete compute-aip@$PROJECT_ID.iam.gserviceaccount.com --quiet

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

student@cloudshell:~ (gleb-test-short-004)$ PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts delete compute-aip@$PROJECT_ID.iam.gserviceaccount.com --quiet
Your active configuration is: [cloudshell-222]
deleted service account [compute-aip@gleb-test-short-004.iam.gserviceaccount.com]
student@cloudshell:~ (gleb-test-short-004)$ 

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

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

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

  • Как развернуть кластер AlloyDB
  • Как подключиться к AlloyDB
  • Как настроить и развернуть службу извлечения баз данных GenAI
  • Как развернуть пример приложения с помощью развернутой службы

11. Опрос

Выход:

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

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