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

Более подробную информацию о службе поиска GenAI и примере приложения можно найти здесь .
Предварительные требования
- Базовое понимание консоли Google Cloud
- Базовые навыки работы с командной строкой и оболочкой Google Cloud.
Что вы узнаете
- Как создать экземпляр Cloud SQL
- Как подключиться к экземпляру
- Как настроить и развернуть службу извлечения данных из баз данных GenAI
- Как развернуть пример приложения, используя развернутую службу
Что вам понадобится
- Аккаунт Google Cloud и проект Google Cloud
- Веб-браузер, например Chrome.
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .



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

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

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

gcloud config set project [YOUR-PROJECT-ID]
Затем установите переменную среды PROJECT_ID равным идентификатору вашего проекта Google Cloud:
PROJECT_ID=$(gcloud config get-value project)
Включите все необходимые службы:
gcloud services enable sqladmin.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 sqladmin.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. Создайте экземпляр Cloud SQL.
Создайте экземпляр Cloud SQL с включенной поддержкой векторной графики.
Создать пароль
Задайте пароль для пользователя базы данных по умолчанию. Вы можете задать собственный пароль или использовать функцию генерации случайного пароля.
export CLOUDSQL_PASSWORD=`openssl rand -hex 12`
Обратите внимание на сгенерированное значение пароля.
echo $CLOUDSQL_PASSWORD
MySQL
Флаг cloudsql_vector можно включить при создании экземпляра. В настоящее время поддержка векторных запросов доступна в MySQL 8.0.36 и 8.0.37.
export region=us-central1
gcloud sql instances create my-cloudsql-instance --region=$region --database-version=MYSQL_8_0_36 --database-flags=cloudsql_vector=ON --root-password=$CLOUDSQL_PASSWORD
Ожидаемый вывод в консоль (IP-адрес скрыт):
student@cloudshell:~ export region=us-central1 gcloud sql instances create my-cloudsql-instance --region=$region --database-version=MYSQL_8_0_36 --database-flags=cloudsql_vector=ON --root-password=$CLOUDSQL_PASSWORD Creating Cloud SQL instance for MYSQL_8_0_36...done. Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/test-project-402417/instances/my-cloudsql-instance]. NAME DATABASE_VERSION LOCATION TIER PRIMARY_ADDRESS PRIVATE_ADDRESS STATUS my-cloudsql-instance MYSQL_8_0_36 us-central1-a db-n1-standard-1 00.000.00.00 - RUNNABLE
PostgreSQL
Расширение pgvector доступно в версиях >= 11.
export region=us-central1
gcloud sql instances create my-cloudsql-instance --region=$region --database-version=POSTGRES_15 --tier=db-g1-small
Ожидаемый вывод в консоль (IP-адрес скрыт):
student@cloudshell:~ export region=us-central1 gcloud sql instances create my-cloudsql-instance --region=$region --database-version=POSTGRES_15 --tier=db-g1-small Creating Cloud SQL instance for POSTGRES_15...done. Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/test-project-402417/instances/my-cloudsql-instance]. NAME DATABASE_VERSION LOCATION TIER PRIMARY_ADDRESS PRIVATE_ADDRESS STATUS my-cloudsql-instance POSTGRES_15 us-central1-a db-g1-small 00.000.00.00 - RUNNABLE
После создания экземпляра необходимо задать пароль для пользователя по умолчанию в этом экземпляре и проверить, можно ли подключиться с этим паролем. Введите свой пароль в поле запроса, когда будет готова система к подключению.
gcloud sql users set-password postgres \
--instance=my-cloudsql-instance \
--password=$CLOUDSQL_PASSWORD
gcloud sql connect my-cloudsql-instance --user=postgres
Ожидаемый вывод в консоль:
student@cloudshell:~ (test-project-402417)$ gcloud sql users set-password postgres \
--instance=my-cloudsql-instance \
--password=$CLOUDSQL_PASSWORD
gcloud sql connect my-cloudsql-instance --user=postgres
Updating Cloud SQL user...done.
Allowlisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [postgres].Password:
psql (16.3 (Ubuntu 16.3-1.pgdg22.04+1), server 15.7)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
postgres=>
Завершить сессию psql:
exit
5. Подготовка виртуальной машины GCE.
Создать учетную запись службы
Поскольку мы будем использовать нашу виртуальную машину для развертывания службы извлечения данных из баз данных GenAI и размещения тестового приложения, первым шагом является создание учетной записи службы Google (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/cloudsql.viewer"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/cloudsql.client"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
Развертывание виртуальной машины GCE
Создайте виртуальную машину GCE в том же регионе и VPC, что и экземпляр Cloud SQL.
В оболочке 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
Разрешите виртуальной машине подключаться к Cloud SQL.
Нам необходимо добавить публичный IP-адрес нашей виртуальной машины в список авторизованных сетей для нашего экземпляра Cloud SQL. В облачной оболочке выполните следующую команду:
VM_EXTERNAL_IP=$(gcloud compute instances describe instance-1 --zone=us-central1-a --format='get(networkInterfaces[0].accessConfigs[0].natIP)')
gcloud sql instances patch my-cloudsql-instance --authorized-networks=$VM_EXTERNAL_IP
Ожидаемый вывод в консоль:
student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
student@cloudshell:~ (test-project-402417)$ VM_EXTERNAL_IP=$(gcloud compute instances describe instance-1 --zone=us-central1-a --format='get(networkInterfaces[0].accessConfigs[0].natIP)')
gcloud sql instances patch my-cloudsql-instance --authorized-networks=$VM_EXTERNAL_IP
When adding a new IP address to authorized networks, make sure to also include any IP addresses that have already been authorized. Otherwise, they will be overwritten and de-authorized.
Do you want to continue (Y/n)? Y
The following message will be used for the patch API method.
{"name": "my-cloudsql-instance", "project": "test-project-402417", "settings": {"ipConfiguration": {"authorizedNetworks": [{"value": "34.71.252.173"}]}}}
Patching Cloud SQL instance...done.
Updated [https://sqladmin.googleapis.com/sql/v1beta4/projects/test-project-402417/instances/my-cloudsql-instance].
Установите клиент базы данных.
MySQL
Установите клиентское программное обеспечение MySQL на развернутую виртуальную машину.
Подключитесь к виртуальной машине:
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 default-mysql-client
Ожидаемый вывод в консоль:
student@instance-1:~$ sudo apt-get update sudo apt-get install --yes mysql-client Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: libconfig-inifiles-perl libdbd-mariadb-perl libdbi-perl libgdbm-compat4 libperl5.32 libterm-readkey-perl mariadb-client-10.5 mariadb-client-core-10.5 perl perl-modules-5.32 Suggested packages: libclone-perl libmldbm-perl libnet-daemon-perl libsql-statement-perl perl-doc libterm-readline-gnu-perl | libterm-readline-perl-perl make libtap-harness-archive-perl The following NEW packages will be installed: default-mysql-client libconfig-inifiles-perl libdbd-mariadb-perl libdbi-perl libgdbm-compat4 libperl5.32 libterm-readkey-perl mariadb-client-10.5 mariadb-client-core-10.5 perl Perl-modules-5.32 ...redacted... Processing triggers for libc-bin (2.31-13+deb11u10) ...
PostgreSQL
Установите клиентское программное обеспечение 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) ...
Подключитесь к экземпляру
MySQL
Подключитесь к основному экземпляру с виртуальной машины, используя MySQL.
Продолжите работу с открытым SSH-соединением с вашей виртуальной машиной. Если соединение прервалось, подключитесь снова, используя ту же команду, что и выше.
Для подключения к Cloud SQL с виртуальной машины GCE используйте указанный ранее параметр $CLOUDSQL_PASSWORD и имя экземпляра:
export CLOUDSQL_PASSWORD=<Noted password>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export INSTANCE_NAME=my-cloudsql-instance
export INSTANCE_IP=$(gcloud sql instances list --filter=name:$INSTANCE_NAME --format="value(PRIMARY_ADDRESS)")
mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD
Ожидаемый вывод в консоль:
student@instance-1:~$ export CLOUDSQL_PASSWORD=P9... student@instance-1:~$ export REGION=us-central1 student@instance-1:~$ export INSTANCE_NAME=my-cloud-sql-instance student@instance-1:~$ export INSTANCE_IP=$(gcloud sql instances list --filter=name:$INSTANCE_NAME --format="value(PRIMARY_ADDRESS)") student@instance-1:~$ mysql –host=$INSTANCE_IP –user=root –password=$CLOUDSQL_PASSWORD –sslmode=require Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 2824706 Server version: 8.0.36-google (Google) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]>
Завершить сеанс MySQL, сохранив при этом SSH-соединение:
exit
Ожидаемый вывод в консоль:
MySQL [(none)]> exit Bye student@instance-1:~$
PostgreSQL
Подключитесь к основному экземпляру с виртуальной машины, используя psql.
Продолжите работу с открытым SSH-соединением с вашей виртуальной машиной. Если соединение прервалось, подключитесь снова, используя ту же команду, что и выше.
Используйте указанный ранее параметр $CLOUDSQL_PASSWORD и имя экземпляра для подключения к PostgreSQL с виртуальной машины GCE:
export PGPASSWORD=<Noted password (CLOUDSQL_PASSWORD)>
export CLOUDSQL_PASSWORD=$PGPASSWORD
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export INSTANCE_NAME=my-cloudsql-instance
export INSTANCE_IP=$(gcloud sql instances list --filter=name:$INSTANCE_NAME --format="value(PRIMARY_ADDRESS)")
psql "host=$INSTANCE_IP user=postgres sslmode=require"
Ожидаемый вывод в консоль:
student@instance-1:~$ export CLOUDSQL_PASSWORD=P9...
student@instance-1:~$ export REGION=us-central1
student@instance-1:~$ export INSTANCE_IP=$(gcloud sql instances list --filter=name:$INSTANCE_NAME --format="value(PRIMARY_ADDRESS)")
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. Инициализация базы данных.
Мы будем использовать клиентскую виртуальную машину в качестве платформы для заполнения базы данных данными и размещения нашего приложения. Первым шагом является создание базы данных и ее заполнение данными.
Создать базу данных
MySQL
Создайте базу данных с именем "assistantdemo".
В сессии виртуальной машины GCE выполните:
mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD -e "CREATE DATABASE assistantdemo"
Ожидаемый вывод в консоль (отсутствие вывода):
student@instance-1:~$ mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD -e "CREATE DATABASE assistantdemo" student@instance-1:~$
PostgreSQL
Создайте базу данных с именем "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.
MySQL
В виртуальной машине GCE выполните:
cd ~/genai-databases-retrieval-app/retrieval_service
cp example-config-cloudsql.yml config.yml
cp example-config-cloudsql.yml config.yml
sed -i s/engine/mysql/g config.yml
sed -i s/my-project/$PROJECT_ID/g config.yml
sed -i s/my-region/$REGION/g config.yml
sed -i s/my-instance/$INSTANCE_NAME/g config.yml
sed -i s/my-password//g config.yml
sed -i s/my_database/assistantdemo/g config.yml
sed -i s/my-user/root/g config.yml
cat config.yml
Ожидаемый вывод в консоль:
student@instance-1:~$ cd genai-databases-retrieval-app/retrieval_service cp example-config-cloudsql.yml config.yml sed -i s/127.0.0.1/$INSTANCE_IP/g config.yml sed -i s/my-password/$CLOUDSQL_PASSWORD/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 MySQL kind: "cloudsql-mysql" host: 10.65.0.2 # port: 5432 database: "assistantdemo" user: "root" password: "P9..."
PostgreSQL
В виртуальной машине GCE выполните:
cd ~/genai-databases-retrieval-app/retrieval_service
cp example-config-cloudsql.yml config.yml
sed -i s/engine/postgres/g config.yml
sed -i s/my-project/$PROJECT_ID/g config.yml
sed -i s/my-region/$REGION/g config.yml
sed -i s/my-instance/$INSTANCE_NAME/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-cloudsql.yml config.yml sed -i s/engine/postgres/g config.yml sed -i s/my-project/$PROJECT_ID/g config.yml sed -i s/my-region/$REGION/g config.yml sed -i s/my-instance/$INSTANCE_NAME/g config.yml sed -i s/my-password/$CLOUDSQL_PASSWORD/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 Postgres kind: "cloudsql-postgres" host: 10.65.0.2 # port: 5432 database: "assistantdemo" user: "postgres" password: "P9..."
Заполнить базу данных
Заполните базу данных тестовым набором данных. Первая команда добавляет все необходимые пакеты в нашу виртуальную среду Python, а вторая команда заполняет базу данных данными.
В виртуальной машине GCE выполните:
cd ~/genai-databases-retrieval-app/retrieval_service
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, используя знак "+" вверху.

В новой вкладке облачной оболочки выполните:
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"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/cloudsql.client"
Ожидаемый вывод в консоль:
student@cloudshell:~ (gleb-test-short-003)$ gcloud iam service-accounts create retrieval-identity Created service account [retrieval-identity].
Закройте вкладку, выполнив одну из команд, указанных на вкладке, например, «Выход»:
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 с помощью Cloud Console. Он понадобится нам при входе в приложение, поскольку функция бронирования использует учетные данные клиента для записи данных о бронировании в базу данных.
В консоли Cloud перейдите в раздел API и сервисы, нажмите «Экран согласия OAuth» и выберите пользователя «Внутренний».

Затем нажмите «Создать» и следуйте инструкциям на следующем экране.

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

Затем нажмите кнопку «Сохранить и продолжить» внизу страницы, и вы перейдете на следующую страницу.

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

Здесь вам нужно нажать кнопку «Создать учетные данные» вверху и выбрать «OAuth ClientID». После этого откроется другой экран.

Выберите «Веб-приложение» из выпадающего списка в качестве типа приложения и укажите URI вашего приложения (и порт — по желанию) в поле «Авторизованные источники JavaScript». В поле «Авторизованные URI перенаправления» необходимо добавить хост вашего приложения с добавлением «/login/google» в конце, чтобы иметь возможность использовать всплывающее окно авторизации. На изображении выше видно, что я использовал http://localhost в качестве базового URI моего приложения.
После нажатия кнопки «Создать» появится всплывающее окно с учетными данными ваших клиентов.

Идентификатор клиента (и, при необходимости, секретный ключ клиента) нам понадобится позже для использования в нашем приложении.
Приложение «Помощник запуска»
Перед запуском приложения необходимо настроить несколько переменных окружения. Для базовой функциональности приложения, такой как запрос информации о рейсах и услугах аэропорта, требуется только переменная 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 для подключения к нашему приложению. Мы должны увидеть экран приложения.

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

В новой вкладке облачной оболочки запустите туннель к вашей виртуальной машине, выполнив команду 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».

В вашем веб-браузере откроется новая вкладка с интерфейсом приложения. Вы должны увидеть страницу «Помощник службы поддержки клиентов Cymbal Air». В адресной строке страницы мы видим URI страницы предварительного просмотра. Нам нужно удалить часть «/?authuser=0&redirectedPreviously=true» в конце.

Первая часть URI, например "https://8080-cs-35704030349-default.cs-us-east1-vpcf.cloudshell.dev/", должна оставаться в окне браузера, а в качестве " Авторизованных источников JavaScript " и "Авторизованных URI перенаправления " для учетных данных, созданных в главе "Подготовка идентификатора клиента", следует заменить или добавить к исходным значениям http://localhost:8080 . Верхнее значение будет выглядеть как " https://8080-cs-35704030349-default.cs-us-east1-vpcf.cloudshell.dev ", а нижнее - как " https://8080-cs-35704030349-default.cs-us-east1-vpcf.cloudshell.dev/login/google ".

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

Откроется всплывающее окно, где мы сможем выбрать свои учетные данные.
После авторизации приложение готово, и вы можете начать отправлять свои запросы в поле внизу окна.
В этой демонстрации показан помощник службы поддержки клиентов Cymbal Air. Cymbal Air — вымышленная пассажирская авиакомпания. Помощник представляет собой чат-бот с искусственным интеллектом, который помогает путешественникам управлять рейсами и находить информацию о хабе Cymbal Air в международном аэропорту Сан-Франциско (SFO).
Без авторизации (без CLIENT_ID) это может помочь ответить на вопросы пользователей, например:
Когда следующий рейс в Денвер?
Есть ли поблизости от ворот C28 какие-нибудь магазины класса люкс?
Где можно купить кофе рядом с выходом A6?
Где можно купить подарок?
Пожалуйста, забронируйте рейс в Денвер с вылетом в 10:35 утра.
Войдя в приложение, вы можете попробовать другие функции, например, бронирование авиабилетов или проверку того, является ли назначенное вам место у окна или у прохода.

Приложение использует новейшие модели Google Foundation для генерации ответов и дополнения их информацией о рейсах и услугах из операционной базы данных Cloud SQL. Подробнее об этом демонстрационном приложении можно узнать на странице проекта на 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)$
Удалите экземпляр Cloud SQL.
После завершения лабораторной работы удалите экземпляр Cloud SQL.
В облачной оболочке укажите переменные проекта и среды на случай, если соединение было разорвано и все предыдущие настройки были потеряны:
export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)
Удалите экземпляр:
gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID
Ожидаемый вывод в консоль:
student@cloudshell:~$ gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID All of the instance data will be lost when the instance is deleted. Do you want to continue (Y/n)? y Deleting Cloud SQL instance...done. Deleted [https://sandbox.googleapis.com/v1beta4/projects/test-project-001-402417/instances/my-cloudsql-instance].
Теперь мы можем уничтожить нашу виртуальную машину.
Удалить виртуальную машину 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
Удалите учетную запись службы для виртуальной машины GCE и службы восстановления.
В оболочке 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. Поздравляем!
Поздравляем с завершением практического занятия!
Что мы рассмотрели
- Как создать экземпляр Cloud SQL
- Как подключиться к экземпляру Cloud SQL
- Как настроить и развернуть службу извлечения данных из баз данных GenAI
- Как развернуть пример приложения, используя развернутую службу