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.
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
- 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 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.
- 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:
Uzyskanie dostępu do środowiska i połączenie się z nim powinno zająć tylko kilka chwil. Po zakończeniu powinno pojawić się coś takiego:
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:
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.
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.
Następnie naciśnij „Utwórz” i wykonaj instrukcje na następnym ekranie.
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”
Następnie naciskasz przycisk „Zapisz i kontynuuj” na dole strony.
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.
W tym miejscu kliknij „Create Credentials” (Utwórz dane logowania). u góry i wybierz „Identyfikator klienta OAuth”. Następnie otworzy się kolejny ekran.
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.
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.
Łą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.
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”
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
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”.
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.
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.
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: