Создание чат-приложения на основе LLM и RAG с использованием баз данных Cloud SQL и LangChain.

1. Введение

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

8727a44c8c402834.png

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

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

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

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

  • Как создать экземпляр Cloud SQL
  • Как подключиться к экземпляру
  • Как настроить и развернуть службу извлечения баз данных 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 ). Если вам не нравится сгенерированный идентификатор, вы можете создать другой случайный идентификатор. Кроме того, вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага и он сохраняется на протяжении всего проекта.
  • К вашему сведению, есть третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
  1. Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не будет стоить много, если вообще что-то стоить. Чтобы отключить ресурсы и избежать выставления счетов за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этой лаборатории вы будете использовать Google Cloud Shell , среду командной строки, работающую в облаке.

В Google Cloud Console щелкните значок Cloud Shell на верхней правой панели инструментов:

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

3. Прежде чем начать

Включить API

В Cloud Shell убедитесь, что идентификатор вашего проекта настроен:

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

fa6ee779963405d5.png

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

Используйте ранее указанный $CLOUDSQL_PASSWORD и имя экземпляра для подключения к Cloud SQL с виртуальной машины GCE:

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..."

Постгрес

В виртуальной машине 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. Служба отвечает за работу с базой данных и извлечение необходимой информации из базы данных на основе запроса приложения AI.

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

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

Откройте другую вкладку 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"
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» во вкладке:

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="(retrival-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 Console перейдите к API и службам, нажмите «Экран согласия OAuth» и выберите «Внутренний» пользователь.

2400e5dcdb93eab8.png

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

6c34d235156e571f.png

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

2b7cd51aff915072.png

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

d90c10c88fd347f9.png

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

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

7ad97432390f224c.png

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

325a926431c8f16d.png

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

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

e91adf03ec31cd15.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

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

4ca978f5142bb6ce.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». В адресной строке страницы мы видим URI страницы предварительного просмотра. Нам нужно удалить часть «/?authuser=0&redirectedPrevious=true» в конце.

389f0ae2945beed5.png

И используйте первую часть URI, например «https://8080-cs-35704030349-default.cs-us-east1-vpcf.cloudshell.dev/», которую следует оставить в окне браузера и указать как « Авторизованный JavaScript». origins » и «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 "

2c37eeda0a7e2f80.png

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

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

a1f571371b957129.png

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

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

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

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

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

Есть ли роскошные магазины возле выхода C28?

Где я могу купить кофе возле выхода A6?

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

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

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

6e7758f707c67c3e.png

Приложение использует новейшие модели 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
  • Как развернуть пример приложения с помощью развернутой службы

11. Опрос

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

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