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.
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
- 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ć.
- 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.
- 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:
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:
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:
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.
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”.
Następnie kliknij „Utwórz” i postępuj zgodnie z instrukcjami na następnym ekranie.
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”
Następnie kliknij przycisk „Zapisz i kontynuuj” u dołu strony, aby przejść do następnej strony.
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.
U góry kliknij „Utwórz dane logowania” i wybierz „Identyfikator klienta OAuth”. Otworzy się kolejny ekran.
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.
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.
Łą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.
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.
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”.
Otworzy się nowa karta w przeglądarce z interfejsem aplikacji. Powinna pojawić się strona „Cymbal Air Customer Service Assistant”.
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.
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.
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: