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 GenAI Retrieval Service i przykładowej aplikacji znajdziesz tutaj.

Wymagania wstępne

  • Podstawowa znajomość usługi Google Cloud Console
  • 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ę przy użyciu wdrożonej usługi

Czego potrzebujesz

  • konto Google Cloud i projekt Google Cloud;
  • przeglądarki, np. Chrome;

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  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 jest wyświetlaną nazwą uczestników tego 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 unikalny we wszystkich projektach Google Cloud i nie można go zmienić (po jego ustawieniu nie można go zmienić). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń w Codelabs musisz podać swój identyfikator projektu (zwykle identyfikowany jako PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy. Możesz też spróbować własnych sił i sprawdzić, czy jest dostępna. Po wykonaniu tej czynności nie można jej już zmienić. Pozostanie ona przez cały czas trwania projektu.
  • Jest jeszcze trzecia wartość, numer projektu, z którego korzystają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Ukończenie tego ćwiczenia z programowania nic nie kosztuje. Aby wyłączyć zasoby w celu uniknięcia naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Uruchamianie Cloud Shell

Google Cloud można obsługiwać zdalnie z laptopa, ale w ramach tego ćwiczenia z programowania wykorzystasz Google Cloud Shell – środowisko wiersza poleceń działające w chmurze.

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, znacząco zwiększając wydajność sieci i uwierzytelnianie. Wszystkie zadania w ramach tego ćwiczenia z programowania można wykonywać 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 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 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

Oczekiwane dane wyjściowe

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 naszym środowisku VPC, który będzie używany przez przyszłą instancję AlloyDB. Jeśli go nie mamy, musimy go utworzyć, przypisać do użytku przez wewnętrzne usługi Google, a następnie utworzyć klaster i instancję.

Tworzenie zakresu prywatnych adresów IP

Musimy skonfigurować konfigurację prywatnego dostępu do usługi w naszej sieci VPC dla AlloyDB. W tym ujęciu zakładamy, że „domyślna” Sieć VPC w projekcie, 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)$

Tworzenie klastra AlloyDB

Utwórz klaster AlloyDB w regionie us-central1.

Określ hasło użytkownika postgres. Możesz zdefiniować własne hasło lub wygenerować je przy użyciu funkcji losowej.

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. Wykorzystamy region us-central1 i Alloydb-aip-01 jako nazwę klastra:

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. Przygotuj maszynę wirtualną GCE

Utwórz konto 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). 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 wykonaniu Cloud Shell:

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

Wdrażanie maszyny wirtualnej GCE

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

Wykonaj w 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

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 z otwartą sesją SSH do maszyny wirtualnej. Jeśli połączenie zostało rozłączone, połącz się ponownie, używając tego samego polecenia co powyżej.

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

Wyjdź z sesji psql utrzymujące połączenie SSH:

exit

Oczekiwane dane wyjściowe konsoli:

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

6. Inicjowanie bazy danych

Wykorzystamy naszą kliencką maszynę wirtualną jako platformę do zapełnienia naszej bazy danych danymi i hostowania aplikacji. Pierwszym krokiem jest utworzenie bazy danych i wypełnienie jej danymi.

Utwórz bazę danych

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

Przygotowywanie środowiska Pythona

Aby kontynuować, użyjemy przygotowanych skryptów Pythona z repozytorium GitHuba, ale zanim to zrobimy, musimy zainstalować wymagane oprogramowanie.

Wykonaj w maszynie wirtualnej GCE:

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

Zweryfikuj wersję Pythona.

Wykonaj w maszynie wirtualnej GCE:

python -V

Oczekiwane dane wyjściowe konsoli:

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

Wypełnij bazę danych

Sklonuj repozytorium GitHub z kodem usługi pobierania 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.

Przygotowywanie pliku 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ę przykładowym zbiorem danych. Pierwsze polecenie to dodanie wszystkich wymaganych pakietów do naszego wirtualnego środowiska Pythona, a drugie wypełnianie bazy danych danymi.

Wykonaj w maszynie wirtualnej GCE:

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 pracę z bazą danych i wyodrębnianie z niej niezbędnych informacji na podstawie żądania z aplikacji AI.

Utwórz konto usługi

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

Otwórz inną kartę Cloud Shell ze znakiem „+” na górze ekranu.

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ę przez wykonanie polecenia „exit” na karcie:

exit

Wdrażanie usługi wyszukiwania

Przejdź dalej w pierwszej karcie, w której łączysz usługę z maszyną wirtualną przez SSH, wdrażając usługę.

W sesji SSH maszyny wirtualnej wykonaj:

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 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ć to ustawienie w konsoli Cloud i zastąpić w poleceniu curl ciąg "$(gcloud run services list –filter="(retrieval-service)") wartością, która się tam znajduje.

W sesji SSH maszyny wirtualnej wykonaj:

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 widzisz komunikat „Hello World” oznacza to, że usługa działa i obsługuje żądania.

8. Wdrażanie przykładowej aplikacji

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

Przygotowywanie środowiska

Nadal pracujemy nad naszą maszyną wirtualną przy użyciu tej samej sesji SSH. Aby uruchomić aplikację, musimy dodać moduły Pythona. Polecenie zostanie wykonane z katalogu aplikacji w tym samym środowisku wirtualnym Pythona.

W sesji SSH maszyny wirtualnej wykonaj:

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, musimy przygotować identyfikator klienta OAuth 2.0 za pomocą 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 Google Cloud otwórz Interfejsy API i usługi, a następnie kliknij „Ekran zgody OAuth”. i wybierz „Wewnętrzna”, użytkownika.

2400e5dcdb93eab8.png

Następnie naciśnij „Utwórz” i wykonaj instrukcje na następnym ekranie.

6c34d235156e571f.png

Musisz wypełnić wymagane pola, np. „Nazwa aplikacji”. i „Adres e-mail pomocy technicznej dla użytkowników”. Możesz też dodać domenę, która ma być widoczna na ekranie zgody, oraz w sekcji „Informacje kontaktowe dewelopera”

2b7cd51aff915072.png

Następnie naciskasz przycisk „Zapisz i kontynuuj” na dole strony.

d90c10c88fd347f9.png

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

Następnym krokiem jest utworzenie identyfikatora klienta. W panelu po lewej stronie kliknij „Dane logowania”. które prowadzą do danych logowania OAuth2.

7ad97432390f224c.png

W tym miejscu kliknij „Create Credentials” (Utwórz dane logowania). u góry i wybierz „Identyfikator klienta OAuth”. Następnie otworzy się kolejny ekran.

325a926431c8f16d.png

Wybierz „Aplikacja internetowa” i wpisz identyfikator URI aplikacji (oraz port – opcjonalnie) w polu „Autoryzowane źródła JavaScript”. Do pola „Autoryzowane identyfikatory URI przekierowania” musisz też dodać hosta aplikacji z „/login/google” aby móc użyć wyskakującego okienka autoryzacji. Na ilustracji powyżej widać, że moim podstawowym identyfikatorem URI aplikacji jest http://localhost.

Po naciśnięciu przycisku „Create” 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.

Uruchamianie aplikacji Asystenta

Przed uruchomieniem aplikacji musimy skonfigurować pewne 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żna go pobrać za pomocą polecenia gcloud .

W sesji SSH maszyny wirtualnej wykonaj:

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 czy zmiana lotów, musimy zalogować się w aplikacji za pomocą naszego konta Google. W tym celu musimy udostępnić 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

Oczekiwane dane wyjściowe:

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)

Łączenie z aplikacją

Z aplikacją działającą w maszynie wirtualnej możesz połączyć się na kilka sposobów. Możesz na przykład otworzyć port 8081 w maszynie wirtualnej, korzystając z reguł zapory sieciowej w VPC, lub utworzyć system równoważenia 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.

Łączę z komputera lokalnego

Aby połączyć się z komputera lokalnego, musimy uruchomić tunel SSH. Możesz to zrobić za pomocą gcloud compute ssh:

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

Oczekiwane dane wyjściowe:

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żemy otworzyć przeglądarkę i użyć adresu http://localhost:8081, aby połączyć się z naszą aplikacją. Powinien wyświetlić się ekran aplikacji.

c667b9013afac3f9.png

Łączę z Cloud Shell

Do połączenia możemy też użyć Cloud Shell. Otwórz inną kartę Cloud Shell ze znakiem „+” na górze ekranu.

4ca978f5142bb6ce.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 oczekiwane dane wyjściowe:

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

Otwiera on port 8080 w Cloud Shell, którego można użyć do „podglądu w przeglądarce”.

Kliknij „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. Powinien wyświetlić się „Asystent obsługi klienta Cymbal Air”. stronę. Na pasku adresu strony widać identyfikator URI strony podglądu. Musimy usunąć część "/?authuser=0&redirectedPreviously=true" na końcu

389f0ae2945beed5.png

Użyj pierwszej części identyfikatora URI, np. „https://8080-cs-35704030349-default.cs-us-east1-vpcf.cloudshell.dev/”. należy zostawić w oknie przeglądarki i wpisać w polu „Autoryzowane źródła JavaScript”. i „Autoryzowane identyfikatory URI przekierowania” dla danych logowania utworzonych w polu „Prepare Client ID” (przygotowywanie identyfikatora klienta) zastępowanie lub dodanie rozdziałów do pierwotnie podanych wartości http://localhost:8080. Górna wartość wygląda tak: „https://8080-cs-35704030349-default.cs-us-east1-vpcf.cloudshell.dev”. a niższy to „https://8080-cs-35704030349-default.cs-us-east1-vpcf.cloudshell.dev/login/google”.

2c37eeda0a7e2f80.png

Zaloguj się w aplikacji

Gdy wszystko jest skonfigurowane i aplikacja jest otwarta, możemy użyć przycisku „Zaloguj się”. w prawym górnym rogu ekranu aplikacji w celu podania danych 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żna wybrać 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 dla pasażerów. 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żesz odpowiadać 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 wypróbować inne funkcje, takie jak rezerwowanie lotów lub sprawdzanie, czy przypisane Ci miejsce to miejsce przy oknie lub przy przejściu.

6e7758f707c67c3e.png

Aplikacja wykorzystuje najnowsze modele podstawowe Google do generowania odpowiedzi i rozszerzania ich o informacje o lotach i udogodnieniach z operacyjnej bazy danych AlloyDB. Więcej informacji o tej aplikacji demonstracyjnej znajdziesz na stronie projektu w GitHubie.

9. Wyczyść środowisko

Teraz po wykonaniu wszystkich zadań możemy oczyścić środowisko

Usuń usługę Cloud Run

Wykonaj w Cloud Shell:

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

Usuwanie konta usługi Cloud Run

Wykonaj w Cloud Shell:

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.

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)

Usuń 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 zniszczyć naszą maszynę wirtualną

Usuwanie maszyny wirtualnej GCE

Wykonaj w Cloud Shell:

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 

Usuwanie konta usługi maszyny wirtualnej GCE i usługi pobierania

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 [compute-aip@gleb-test-short-004.iam.gserviceaccount.com]
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ę przy użyciu wdrożonej usługi

11. Ankieta

Dane wyjściowe:

Jak wykorzystasz ten samouczek?

tylko do przeczytania. Przeczytaj go i wykonaj ćwiczenia
.