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

1. Wprowadzenie

Z tego ćwiczenia w Codelab dowiesz się, jak wdrożyć usługę wyszukiwania baz danych generatywnej AI i utworzyć przykładową interaktywną aplikację w wdrożonym środowisku.

98c2676cc78880e.png

Więcej informacji o usłudze GenAI Retrieval Service i przykładowej aplikacji znajdziesz tutaj.

Wymagania wstępne

  • podstawowa znajomość konsoli Google Cloud;
  • podstawowe umiejętności w zakresie interfejsu wiersza poleceń i Google Cloud Shell;

Czego się nauczysz

  • Jak wdrożyć klaster AlloyDB
  • Łączenie z AlloyDB
  • Jak skonfigurować i wdrożyć usługę GenAI Databases Retrieval Service
  • 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 wykorzystaj już istniejący. 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. To ciąg znaków, który nie jest używany przez interfejsy API Google. W każdej chwili możesz ją zaktualizować.
  • Identyfikator projektu jest niepowtarzalny w ramach wszystkich projektów Google Cloud i nie można go zmienić (po ustawieniu). Cloud Console automatycznie generuje unikalny ciąg znaków. Zwykle nie jest to ważne. W większości ćwiczeń z programowania trzeba odwoływać się do identyfikatora projektu (zwykle identyfikowanego jako PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy identyfikator. Możesz też spróbować użyć własnego adresu e-mail, aby sprawdzić, czy jest on dostępny. Po wykonaniu tej czynności nie można jej już zmienić. Pozostanie ona przez cały czas trwania 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 bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokoś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 interfejs API

Dane wyjściowe:

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

Zwykle identyfikator projektu jest podany w nawiasach w wierszu poleceń w Cloud Shell, tak jak na ilustracji:

fa6ee779963405d5.png

gcloud config set project [YOUR-PROJECT-ID]

Następnie ustaw zmienną środowiskową PROJECT_ID na identyfikator 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, musisz mieć dostępny zakres prywatnych adresów IP w 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, że w projekcie mamy „domyślną” sieć VPC, która będzie 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`

Zanotuj hasło do PostgreSQL – do wykorzystania w przyszłości:

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 połączenie zostanie utracone, musisz ponownie zdefiniować zmienne środowiskowe nazwy regionu i 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ż do wdrożenia usługi GenAI Databases Retrieval i hostowania przykładowej aplikacji użyjemy naszej maszyny wirtualnej, pierwszym krokiem będzie utworzenie konta usługi Google (GSA). GSA będzie używany przez maszynę wirtualną GCE, dlatego musimy przyznać mu niezbędne uprawnienia do działania 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.

Aby połączyć się z AlloyDB z maszyny wirtualnej GCE, użyj wcześniej zapisanego hasła $PGASSWORD i nazwy klastra:

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:

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 Python z repozytorium GitHuba, ale zanim to zrobimy, 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 wyszukiwania i przykładowej aplikacji.

Wykonaj w maszynie wirtualnej GCE:

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

Wykonaj w maszynie wirtualnej GCE:

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

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ę danych za pomocą przykładowego zbioru danych. Pierwsze polecenie to dodanie wszystkich wymaganych pakietów do naszego wirtualnego środowiska Pythona, a drugie wypełnianie bazy 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(ocenzurowane):

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

Tworzenie konta usługi

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

Otwórz kolejną kartę Cloud Shell, klikają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 odzyskiwania

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. Do pobierania punktu końcowego 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$

Jeśli zobaczymy komunikat „Hello World”, oznacza to, że usługa 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 naszą maszyną wirtualną przy użyciu 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

Oczekiwane dane wyjściowe (usunięte):

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

Przygotuj identyfikator 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ż rezerwacja używa danych logowania klienta do zapisywania 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, np. „Nazwa aplikacji” i „Adres e-mail zespołu pomocy dla użytkowników”. 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ę.

Kolejnym 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 ekranu autoryzacji, musisz dodać hosta aplikacji z końcówką „/login/google” do wartości w polu „Autoryzowane identyfikatory URI przekierowania”. Na ilustracji powyżej widać, że moim podstawowym identyfikatorem URI aplikacji jest http://localhost.

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

e91adf03ec31cd15.png

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

Uruchomienie aplikacji Asystent

Zanim uruchomisz aplikację, musisz skonfigurować zmienne środowiskowe. Podstawowa funkcjonalność aplikacji, np. zapytania o loty i udogodnienia na lotnisku, wymaga tylko parametru BASE_URL, który wskazuje aplikację na usługę wyszukiwania. 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)")

Oczekiwany wynik (zawarty w wyświetleniu):

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 czy zmiana lotów, musimy zalogować się w aplikacji za pomocą naszego konta Google. W tym celu musimy podać zmienną środowiskową CLIENT_ID za pomocą identyfikatora klienta OAuth z rozdziału Prepare Client ID:

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

Oczekiwane dane wyjściowe (usunięte):

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 połączenia z maszyną wirtualną, które przetłumaczą 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

Łączenie z Cloud Shell

Możesz też połączyć się z Cloud Shell. Otwórz kolejną kartę Cloud Shell, klikając znak „+” u góry.

4ca978f5142bb6ce.png

W nowej wersji Cloud Shell pobierz identyfikator URI punktu początkowego i przekierowania dla klienta internetowego wykonującego 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ę błąd „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”.

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

444fbf54dcd4d160.png

Otworzy się nowa karta w przeglądarce 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ąć przesyłać prośby w polu u dołu okna.

Ta prezentacja pokazuje asystenta obsługi klienta Cymbal Air. Cymbal Air to fikcyjna linia lotnicza. Asystent to czatbot AI, który pomaga podróżnym zarządzać lotami i wyszukiwać informacje o centrum Cymbal Air na międzynarodowym lotnisku 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 w pobliżu bramy C28 są jakieś luksusowe sklepy?

Gdzie mogę kupić kawę w pobliżu bramy A6?

Gdzie mogę kupić prezent?

Zarezerwuj lot do Denver z wylotem 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 GitHub projektu.

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 [[email protected]]
student@cloudshell:~ (gleb-test-short-004)$

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

Usuwanie klastra AlloyDB i wszystkich instancji

Klaster jest niszczony z opcją siły, która usuwa również wszystkie należące do niego instancje.

W Cloud Shell zdefiniuj zmienne projektu i środowiskowego, jeśli konto jest odłączone i stracone są wszystkie poprzednie ustawienia:

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

Wykonaj w Cloud Shell:

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 [[email protected]]
student@cloudshell:~ (gleb-test-short-004)$ 

10. Gratulacje

Gratulujemy ukończenia ćwiczeń z programowania.

Omówione zagadnienia

  • Jak wdrożyć klaster AlloyDB
  • Łączenie z AlloyDB
  • Jak skonfigurować i wdrożyć usługę GenAI Databases Retrieval Service
  • 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?

Przeczytaj go tylko Przeczytaj go i wykonaj ćwiczenia