Tworzenie aplikacji czatu opartej na LLM i RAG przy użyciu AlloyDB AI i LangChain

1. Wprowadzenie

Z tego ćwiczenia w Codelabs dowiesz się, jak wdrożyć usługę GenAI Databases Retrieval Service i utworzyć przykładową interaktywną aplikację przy użyciu wdrożonego środowiska.

98c2676cc78880e.png

Więcej informacji o usłudze odzyskiwania danych za pomocą ogólnej sztucznej inteligencji i przykładowej aplikacji znajdziesz tutaj.

Wymagania wstępne

  • podstawowa znajomość konsoli Google Cloud;
  • podstawowe umiejętności w interfejsie wiersza poleceń i powłoce Google Cloud.

Czego się nauczysz

  • Jak wdrożyć klaster AlloyDB
  • Łączenie z AlloyDB
  • Konfigurowanie i wdrażanie usługi pobierania baz danych generatywnej AI
  • Jak wdrożyć przykładową aplikację korzystającą z wdrożonej usługi

Czego potrzebujesz

  • Konto Google Cloud i projekt Google Cloud
  • przeglądarka internetowa, np. Chrome;

2. Konfiguracja i wymagania

Konfiguracja środowiska w samodzielnym tempie

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Nazwa projektu to wyświetlana nazwa uczestników projektu. Jest to ciąg znaków, którego nie używają interfejsy API Google. Zawsze możesz ją zaktualizować.
  • Identyfikator projektu jest niepowtarzalny w ramach wszystkich projektów Google Cloud i nie można go zmienić (po ustawieniu). Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie ma znaczenia, jaki to ciąg. W większości laboratoriów z kodem trzeba podać identyfikator projektu (zwykle oznaczony jako PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować inny losowy. Możesz też spróbować użyć własnego adresu e-mail, aby sprawdzić, czy jest on dostępny. Nie można go zmienić po wykonaniu tego kroku. Pozostanie on do końca projektu.
  • Informacyjnie: istnieje jeszcze 3 wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć rozliczenia w konsoli Cloud, aby korzystać z zasobów i interfejsów API Cloud. Przejście przez ten samouczek nie będzie wiązać się z wielkimi kosztami, jeśli w ogóle będą jakieś. Aby wyłączyć zasoby i uniknąć obciążenia opłatami po zakończeniu samouczka, możesz usunąć utworzone zasoby lub usunąć projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Uruchom Cloud Shell

Google Cloud można obsługiwać zdalnie z laptopa, ale w tym ćwiczeniu będziesz używać Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

W konsoli Google Cloud kliknij ikonę Cloud Shell na pasku narzędzi w prawym górnym rogu:

55efc1aaa7a4d3ad.png

Uzyskanie dostępu do środowiska i połączenie się z nim powinno zająć tylko kilka chwil. Po jego zakończeniu powinno wyświetlić się coś takiego:

7ffe5cbb04455448.png

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie poprawia wydajność sieci i uwierzytelnianie. Wszystkie zadania w tym CodeLab możesz wykonać w przeglądarce. Nie musisz niczego instalować.

3. Zanim zaczniesz

Włącz API

Dane wyjściowe:

W Cloud Shell sprawdź, czy identyfikator projektu jest skonfigurowany:

Zwykle identyfikator projektu jest wyświetlany w nawiasach w wierszu poleceń w Cloud Shell, jak pokazano na obrazku:

fa6ee779963405d5.png

gcloud config set project [YOUR-PROJECT-ID]

Następnie ustaw zmienną środowiskową PROJECT_ID na identyfikator Twojego projektu Google Cloud:

PROJECT_ID=$(gcloud config get-value project)

Włącz wszystkie niezbędne usługi:

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

Oczekiwany wynik

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. Wdrażanie klastra AlloyDB

Zanim utworzysz klaster AlloyDB, potrzebujemy dostępnego prywatnego zakresu adresów IP w naszej sieci VPC, który będzie używany przez przyszłą instancję AlloyDB. Jeśli go nie mamy, musimy go utworzyć i przypisać do wewnętrznych usług Google. Następnie będziemy mogli utworzyć klaster i instancję.

Tworzenie prywatnego zakresu adresów IP

Musimy skonfigurować dostęp do usług prywatnych w VPC dla AlloyDB. Zakładamy tutaj, że w projekcie mamy „domyślną” sieć VPC i będzie ona używana do wszystkich działań.

Utwórz zakres prywatnych adresów IP:

gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default

Utwórz połączenie prywatne, używając przydzielonego zakresu adresów IP:

gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default

Oczekiwane dane wyjściowe konsoli:

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)$

Utwórz klaster AlloyDB

Utwórz klaster AlloyDB w regionie us-central1.

Zdefiniuj hasło dla użytkownika postgres. Możesz zdefiniować własne hasło lub użyć funkcji losowania, aby je wygenerować.

export PGPASSWORD=`openssl rand -hex 12`

Oczekiwane dane wyjściowe konsoli:

student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`

Zapamiętaj hasło do PostgreSQL na przyszłość:

echo $PGPASSWORD

Oczekiwane dane wyjściowe konsoli:

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

Zdefiniuj region i nazwę klastra AlloyDB. Jako nazwy klastra użyjemy regionu us-central1 i alloydb-aip-01:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01

Uruchom polecenie, aby utworzyć klaster:

gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION

Oczekiwane dane wyjściowe konsoli:

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.                                                                                                                                                                                                                                                           

Tworzenie instancji głównej AlloyDB

Utwórz instancję główną AlloyDB dla naszego klastra w tej samej sesji Cloud Shell. Jeśli rozłączysz konta, konieczne będzie ponowne zdefiniowanie zmiennych środowiskowych regionu i nazwy klastra.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

Oczekiwane dane wyjściowe konsoli:

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. Przygotowanie maszyny wirtualnej GCE

Tworzenie konta usługi

Ponieważ będziemy używać maszyny wirtualnej do wdrażania usługi wyszukiwania baz danych GenAI i hostowania przykładowej aplikacji, pierwszym krokiem będzie utworzenie konta usługi Google (GSA). Moduł Wyszukiwania Google będzie używany przez maszynę wirtualną GCE i będziemy musieli przyznać jej uprawnienia niezbędne do pracy z innymi usługami.

W Cloud Shell wykonaj te czynności:

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"

Wdrażanie maszyny wirtualnej GCE

Utwórz maszynę wirtualną GCE w tym samym regionie i sieci VPC co klaster AlloyDB.

W Cloud Shell wykonaj te czynności:

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

Oczekiwane dane wyjściowe konsoli:

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

Instalowanie klienta Postgres

Zainstaluj oprogramowanie klienckie PostgreSQL na wdrożonej maszynie wirtualnej

Połącz się z maszyną wirtualną:

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

Oczekiwane dane wyjściowe konsoli:

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:~$ 

Zainstaluj oprogramowanie uruchamiające polecenie w maszynie wirtualnej:

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

Oczekiwane dane wyjściowe konsoli:

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

Łączenie z instancją

połączyć się z instancją główną z maszyny wirtualnej za pomocą psql;

Kontynuuj otwartą sesję SSH do maszyny wirtualnej. Jeśli połączenie zostało utracone, nawiązaj je ponownie, używając tego samego polecenia.

Użyj wcześniej zanotowanego tekstu $PGASSWORD i nazwy klastra, aby połączyć się z AlloyDB z maszyny wirtualnej 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"

Oczekiwane dane wyjściowe konsoli:

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=> 

Zakończ sesję psql, zachowując połączenie SSH:

exit

Oczekiwane dane wyjściowe konsoli:

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

6. Inicjowanie bazy danych

Użyjemy maszyny wirtualnej klienta jako platformy do wypełniania bazy danych danymi i hostowania aplikacji. Pierwszym krokiem jest utworzenie bazy danych i wypełnienie jej danymi.

Utwórz bazę danych

Utwórz bazę danych o nazwie „assistantdemo”.

W sesji maszyny wirtualnej GCE wykonaj te czynności:

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

Oczekiwane dane wyjściowe konsoli:

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

Włącz rozszerzenie pgVector.

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

Oczekiwane dane wyjściowe konsoli:

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

Przygotowanie środowiska Pythona

Aby kontynuować, użyjemy przygotowanych skryptów Pythona z repozytorium GitHub, ale najpierw musimy zainstalować wymagane oprogramowanie.

W maszynie wirtualnej GCE wykonaj te czynności:

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

Oczekiwane dane wyjściowe konsoli:

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:~$

Sprawdź wersję Pythona.

W maszynie wirtualnej GCE wykonaj te czynności:

python -V

Oczekiwane dane wyjściowe konsoli:

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

Wypełnianie bazy danych

Sklonuj repozytorium GitHub z kodem usługi pobierania i przykładowej aplikacji.

W maszynie wirtualnej GCE wykonaj te czynności:

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

Oczekiwane dane wyjściowe konsoli:

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.

Przygotuj plik konfiguracji

W maszynie wirtualnej GCE wykonaj te czynności:

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

Oczekiwane dane wyjściowe konsoli:

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

Wypełnij bazę przykładowym zbiorem danych. Pierwsze polecenie dodaje wszystkie wymagane pakiety do naszego środowiska wirtualnego Pythona, a drugie polecenie wypełnia bazę danych danymi.

W maszynie wirtualnej GCE wykonaj te czynności:

pip install -r requirements.txt
python run_database_init.py

Oczekiwane dane wyjściowe konsoli(usunięto):

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. Wdrażanie usługi wyszukiwania w Cloud Run

Możemy teraz wdrożyć usługę pobierania w Cloud Run. Usługa odpowiada za obsługę bazy danych i wyodrębnianie z niej potrzebnych informacji na podstawie żądania aplikacji AI.

Utwórz konto usługi

Utwórz konto usługi dla usługi pobierania i przyznaj niezbędne uprawnienia.

Otwórz inną kartę Cloud Shell, naciskając znak „+” u góry.

4ca978f5142bb6ce.png

Na nowej karcie Cloud Shell wykonaj te czynności:

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"

Oczekiwane dane wyjściowe konsoli:

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

Zamknij kartę, używając polecenia „exit”:

exit

Wdrażanie usługi wyszukiwania

Kontynuuj na pierwszej karcie, na której jesteś połączony z maszyną wirtualną przez SSH, wdrażając usługę.

W sesji SSH maszyny wirtualnej wykonaj te czynności:

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

Oczekiwane dane wyjściowe konsoli:

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$

Weryfikowanie usługi

Teraz możemy sprawdzić, czy usługa działa prawidłowo i czy maszyna wirtualna ma dostęp do punktu końcowego. Aby uzyskać punkt końcowy usługi pobierania, używamy narzędzia gcloud. Możesz też sprawdzić go w konsoli Cloud i zastąpić w poleceniu curl wartość "$(gcloud run services list –filter="(retrieval-service)" wartością z konsoli.

W sesji SSH maszyny wirtualnej wykonaj te czynności:

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

Oczekiwane dane wyjściowe konsoli:

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$

Komunikat „Hello World” oznacza, że nasza usługa już działa i obsługuje żądania.

8. Wdrażanie przykładowej aplikacji

Teraz, gdy usługa pobierania działa, możemy wdrożyć przykładową aplikację, która będzie z niej korzystać. Aplikację można wdrożyć na maszynie wirtualnej lub w innej usłudze, takiej jak Cloud Run, Kubernetes czy nawet lokalnie na laptopie. Pokażemy, jak wdrożyć go na maszynie wirtualnej.

Przygotowywanie środowiska

Nadal pracujemy nad maszyną wirtualną, korzystając z tej samej sesji SSH. Aby uruchomić aplikację, musimy dodać kilka modułów Pythona. Polecenie zostanie wykonane z katalogu aplikacji w tym samym środowisku wirtualnym Pythona.

W sesji SSH maszyny wirtualnej wykonaj te czynności:

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

Oczekiwany wynik (zawarty w wyświetleniu):

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

Przygotowanie identyfikatora klienta

Aby korzystać z funkcji rezerwacji w aplikacji, musisz przygotować identyfikator klienta OAuth 2.0 w Konsoli Cloud. Będzie to miało miejsce, gdy zalogujemy się w aplikacji, ponieważ funkcja rezerwacji używa danych logowania klienta do rejestrowania danych rezerwacji w bazie danych.

W konsoli Cloud otwórz sekcję Interfejsy API i usługi, kliknij „Ekran zgody OAuth” i wybierz użytkownika „Wewnętrzny”.

2400e5dcdb93eab8.png

Następnie kliknij „Utwórz” i postępuj zgodnie z instrukcjami na następnym ekranie.

6c34d235156e571f.png

Musisz wypełnić wymagane pola, takie jak „Nazwa aplikacji” i „Adres e-mail obsługi użytkownika”. Możesz też dodać domenę, która ma być widoczna na ekranie zgody, oraz w sekcji „Dane kontaktowe dewelopera”

2b7cd51aff915072.png

Następnie kliknij przycisk „Zapisz i kontynuuj” u dołu strony, aby przejść do następnej strony.

d90c10c88fd347f9.png

Nie musisz nic zmieniać, chyba że chcesz określić zakresy. Na koniec potwierdź, ponownie naciskając przycisk „Zapisz i kontynuuj”. Spowoduje to skonfigurowanie ekranu zgody na aplikację.

Następnym krokiem jest utworzenie identyfikatora klienta. W panelu po lewej stronie kliknij „Dane logowania”, aby przejść do danych logowania OAuth2.

7ad97432390f224c.png

U góry kliknij „Utwórz dane logowania” i wybierz „Identyfikator klienta OAuth”. Otworzy się kolejny ekran.

325a926431c8f16d.png

Na liście typów aplikacji wybierz „Aplikacja internetowa” i jako „Autoryzowane źródła JavaScript” podaj identyfikator URI aplikacji (i opcjonalnie port). Aby móc korzystać z wyskakującego okienka autoryzacji, musisz dodać do „Autoryzowane URI przekierowania” hosta aplikacji z dodatkiem „/login/google” na końcu. Na powyższym obrazku widać, że jako identyfikator URI podstawowej aplikacji użyto http://localhost.

Po kliknięciu przycisku „Utwórz” pojawi się wyskakujące okienko z danymi logowania klienta.

e91adf03ec31cd15.png

Identyfikator klienta (i opcjonalnie tajny klucz klienta) będzie później potrzebny do użycia w naszej aplikacji.

Uruchomienie aplikacji Asystent

Zanim uruchomisz aplikację, musisz skonfigurować zmienne środowiskowe. Podstawowe funkcje aplikacji, takie jak zapytanie o loty czy informacje o udogodnieniach na lotnisku, wymagają jedynie parametru BASE_URL, który kieruje aplikację do usługi pobierania. Możemy go uzyskać za pomocą polecenia gcloud .

W sesji SSH maszyny wirtualnej wykonaj te czynności:

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

Oczekiwane dane wyjściowe (usunięte):

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

Aby korzystać z bardziej zaawansowanych funkcji aplikacji, takich jak rezerwowanie i zmiana lotów, musimy zalogować się w aplikacji za pomocą naszego konta Google. W tym celu musimy podać zmienną środowiskową CLIENT_ID, używając identyfikatora klienta OAuth z rozdziału Przygotowanie identyfikatora klienta:

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

Oczekiwany wynik (zawarty w wyświetleniu):

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

Teraz możemy uruchomić aplikację:

python run_app.py

Oczekiwany wynik:

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)

Połącz się z aplikacją

Do aplikacji działającej na maszynie wirtualnej możesz się łączyć na kilka sposobów. Możesz na przykład otworzyć port 8081 na maszynie wirtualnej za pomocą reguł zapory sieciowej w VPC lub utworzyć równoważycie obciążenia z publicznym adresem IP. Użyjemy tunelu SSH do maszyny wirtualnej, aby przetłumaczyć lokalny port 8080 na port 8081 maszyny wirtualnej.

Łączenie z komputera lokalnego

Jeśli chcemy połączyć się z komputera lokalnego, musimy uruchomić tunel SSH. Można to zrobić za pomocą polecenia gcloud compute ssh:

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

Oczekiwany wynik:

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:~$

Teraz możesz otworzyć przeglądarkę i użyć adresu http://localhost:8081, aby połączyć się z naszą aplikacją. Powinien pojawić się ekran aplikacji.

c667b9013afac3f9.png

Łączę z Cloud Shell

Do połączenia możemy też użyć Cloud Shell. Otwórz kolejną kartę Cloud Shell, klikając znak „+” u góry.

4ca978f5142bb6ce.png

W nowym oknie Cloud Shell uzyskaj URI pochodzenia i przekierowania dla klienta internetowego, wykonując polecenie gcloud:

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

Oto oczekiwany wynik:

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

Identyfikator URI źródła i przekierowania należy użyć jako „autoryzowane źródła JavaScript” i „autoryzowane identyfikatory URI przekierowania” w danych logowania utworzonych w rozdziale „Przygotowanie identyfikatora klienta” z zamianą lub dodatkiem do podanych pierwotnie wartości http://localhost:8080.

2c37eeda0a7e2f80.png

Na nowej karcie Cloud Shell uruchom tunel do maszyny wirtualnej, wykonując polecenie gcloud:

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

Wyświetli się komunikat o błędzie „Nie można przypisać żądanego adresu”. Zignoruj go.

Oto oczekiwany wynik:

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:~$

Otworzy port 8080 w Cloud Shell, który można wykorzystać do „podglądu w przeglądarce”.

Kliknij przycisk „Podgląd w przeglądarce” w prawym górnym rogu Cloud Shell i z menu wybierz „Podejrzyj na porcie 8080”

444fbf54dcd4d160.png

W przeglądarce otworzy się nowa karta z interfejsem aplikacji. Powinna pojawić się strona „Cymbal Air Customer Service Assistant”.

389f0ae2945beed5.png

Logowanie w aplikacji

Gdy wszystko jest skonfigurowane i Twoja aplikacja jest otwarta, możemy użyć przycisku „Zaloguj się” w prawym górnym rogu ekranu aplikacji, aby podać dane logowania. Jest to opcjonalne i wymagane tylko wtedy, gdy chcesz wypróbować funkcję rezerwacji w aplikacji.

a1f571371b957129.png

Otworzy się wyskakujące okienko, w którym możemy wybrać nasze dane logowania.

Po zalogowaniu się aplikacja jest gotowa i możesz zacząć wysyłać żądania w polu u dołu okna.

Ta prezentacja przedstawia asystenta obsługi klienta Cymbal Air. Cymbal Air to fikcyjna linia lotnicza. Asystent to chatbot oparty na AI, który pomaga podróżnym zarządzać lotami i wyszukiwać informacje o hubie Cymbal Air w międzynarodowym porcie lotniczym w San Francisco (SFO).

Bez logowania się (bez CLIENT_ID) może ona pomóc w uzyskaniu odpowiedzi na pytania użytkowników, takie jak:

Kiedy jest następny lot do Denver?

Czy przy bramie C28 są jakieś luksusowe sklepy?

Gdzie kupię kawę w pobliżu bramki A6?

Gdzie mogę kupić prezent?

Zarezerwuj lot do Denver – odlot o 10:35

Po zalogowaniu się w aplikacji możesz korzystać z innych funkcji, takich jak rezerwowanie lotów czy sprawdzanie, czy przypisane Ci miejsce jest przy oknie czy przy przejściu.

6e7758f707c67c3e.png

Aplikacja korzysta z najnowszych modeli Google do generowania odpowiedzi i uzupełnia je informacjami o lotach i udogodnieniach z operacyjnej bazy danych AlloyDB. Więcej informacji o tej aplikacji demonstracyjnej znajdziesz na stronie projektu w GitHubie.

9. Czyszczenie środowiska

Teraz, gdy wszystkie zadania zostały ukończone, możemy wyczyścić środowisko.

Usuwanie usługi Cloud Run

W Cloud Shell wykonaj te czynności:

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

Oczekiwane dane wyjściowe konsoli:

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

Usuń konto usługi dla usługi Cloud Run

W Cloud Shell wykonaj te czynności:

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

Oczekiwane dane wyjściowe konsoli:

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)$

Po zakończeniu modułu zniszcz instancje i klaster AlloyDB

Usuwanie klastra AlloyDB i wszystkich instancji

Klaster zostanie zniszczony za pomocą wymuszania opcji, co spowoduje również usunięcie wszystkich należących do niego instancji.

Jeśli połączenie zostało utracone i wszystkie poprzednie ustawienia zostały utracone, w Cloud Shell określ zmienne projektu i środowiska:

gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)

Aby usunąć klaster:

gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force

Oczekiwane dane wyjściowe konsoli:

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.   

Usuwanie kopii zapasowych AlloyDB

Usuń wszystkie kopie zapasowe AlloyDB z klastra:

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

Oczekiwane dane wyjściowe konsoli:

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.                                                                                                                                                                                                                                                            

Teraz możemy usunąć maszynę wirtualną.

Usuwanie maszyny wirtualnej GCE

W Cloud Shell wykonaj te czynności:

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

Oczekiwane dane wyjściowe konsoli:

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

Usuń konto usługi dla maszyny wirtualnej GCE i usługi odzyskiwania

W Cloud Shell wykonaj te czynności:

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

Oczekiwane dane wyjściowe konsoli:

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

Gratulujemy ukończenia ćwiczenia.

Omówione zagadnienia

  • Jak wdrożyć klaster AlloyDB
  • Łączenie z AlloyDB
  • Konfigurowanie i wdrażanie usługi pobierania baz danych generatywnej AI
  • Jak wdrożyć przykładową aplikację korzystając z wdrożonej usługi

11. Ankieta

Dane wyjściowe:

Jak będziesz korzystać z tego samouczka?

Tylko przeczytaj Przeczytaj i wykonaj ćwiczenia