AlloyDB AI ve LangChain'i kullanarak LLM ve RAG tabanlı bir sohbet uygulaması oluşturma

1. Giriş

Bu codelab'de, GenAI Databases Retrieval Service'i nasıl dağıtacağınızı ve dağıtılan ortamı kullanarak örnek bir etkileşimli uygulama oluşturmayı öğreneceksiniz.

98c2676cc78880e.png

GenAI Retrieval Service ve örnek uygulama hakkında daha fazla bilgiyi burada bulabilirsiniz.

Ön koşullar

  • Google Cloud Console hakkında temel düzeyde bilgi
  • Komut satırı arayüzü ve Google Cloud Shell'de temel beceriler

Neler öğreneceksiniz?

  • AlloyDB kümesini dağıtma
  • AlloyDB'ye bağlanma
  • GenAI Veritabanı Alma Hizmeti'ni yapılandırma ve dağıtma
  • Dağıtılan hizmeti kullanarak örnek uygulama dağıtma

Gerekenler

  • Google Cloud hesabı ve Google Cloud projesi
  • Chrome gibi bir web tarayıcısı

2. Kurulum ve Gereksinimler

Kendine ait tempoda ortam kurulumu

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Proje adı, bu projenin katılımcılarının görünen adıdır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dize otomatik olarak oluşturur. Bu dizenin ne olduğu genellikle önemli değildir. Çoğu kod laboratuvarında proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) referans vermeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele başka bir kimlik oluşturabilirsiniz. Alternatif olarak, kendi anahtarınızı deneyerek kullanılabilir olup olmadığını görebilirsiniz. Bu adımdan sonra değiştirilemez ve proje boyunca geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer (Proje Numarası) olduğunu belirtmek isteriz. Bu üç değer hakkında daha fazla bilgiyi dokümanlar bölümünde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmak çok pahalı değildir. Bu eğitimden sonra faturalandırılmamak için kaynakları kapatmak istiyorsanız oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerindeki ücretsiz deneme programına uygundur.

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir olsa da bu kod laboratuvarında bulutta çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.

Google Cloud Console'da, sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:

55efc1aaa7a4d3ad.png

Ortam sağlanıp bağlantı kurulabilmesi için birkaç saniye beklemeniz gerekir. İşlem tamamlandığında aşağıdakine benzer bir ekran görürsünüz:

7ffe5cbb04455448.png

Bu sanal makinede ihtiyacınız olan tüm geliştirme araçları yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu codelab'deki tüm çalışmalarınızı tarayıcıda yapabilirsiniz. Hiçbir şey yüklemeniz gerekmez.

3. Başlamadan önce

API'yi etkinleştirme

Çıkış:

Cloud Shell'de proje kimliğinizin ayarlandığından emin olun:

Genellikle proje kimliği, Cloud Shell'deki komut isteminde parantez içinde gösterilir (resimde gösterildiği gibi):

fa6ee779963405d5.png

gcloud config set project [YOUR-PROJECT-ID]

Ardından PROJECT_ID ortam değişkenini Google Cloud proje kimliğinize ayarlayın:

PROJECT_ID=$(gcloud config get-value project)

Gerekli tüm hizmetleri etkinleştirin:

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

Beklenen çıkış

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. AlloyDB kümesini dağıtma

AlloyDB kümesi oluşturmadan önce, gelecekteki AlloyDB örneği tarafından kullanılacak VPC'mizde kullanılabilir bir özel IP aralığına ihtiyacımız vardır. Bu yoksa oluşturmamız, dahili Google hizmetleri tarafından kullanılması için atamamız gerekir. Ardından kümeyi ve örneği oluşturabiliriz.

Gizli IP aralığı oluşturma

AlloyDB için VPC'mizde Özel Hizmet Erişimi yapılandırmasını ayarlamamız gerekiyor. Buradaki varsayım, projede "varsayılan" VPC ağının bulunduğu ve tüm işlemler için bu ağın kullanılacağıdır.

Özel IP aralığını oluşturun:

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

Ayrılan IP aralığını kullanarak özel bağlantı oluşturun:

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

Beklenen konsol çıkışı:

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

AlloyDB kümesi oluşturma

us-central1 bölgesinde bir AlloyDB kümesi oluşturun.

postgres kullanıcısının şifresini tanımlayın. Kendi şifrenizi tanımlayabilir veya rastgele bir işlev kullanarak şifre oluşturabilirsiniz.

export PGPASSWORD=`openssl rand -hex 12`

Beklenen konsol çıkışı:

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

Gelecekte kullanmak üzere PostgreSQL şifresini not edin:

echo $PGPASSWORD

Beklenen konsol çıkışı:

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

Bölgeyi ve AlloyDB küme adını tanımlayın. us-central1 bölgesini ve alloydb-aip-01 küme adını kullanacağız:

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

Kümeyi oluşturmak için komutu çalıştırın:

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

Beklenen konsol çıkışı:

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.                                                                                                                                                                                                                                                           

AlloyDB birincil örneğini oluşturma

Aynı Cloud Shell oturumunda kümemiz için bir AlloyDB birincil örneği oluşturun. Bağlantınız kesilirse bölge ve küme adı ortam değişkenlerini tekrar tanımlamanız gerekir.

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

Beklenen konsol çıkışı:

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. GCE sanal makinesini hazırlama

Hizmet Hesabı Oluşturma

GenAI Databases Retrieval hizmetimizi dağıtmak ve örnek bir uygulama barındırmak için sanal makinemizi kullanacağımızdan ilk adım bir Google Hizmet Hesabı (GSA) oluşturmaktır. GSA, GCE sanal makinesi tarafından kullanılacak ve diğer hizmetlerle çalışabilmesi için gerekli ayrıcalıkları vermemiz gerekecek.

Cloud Shell'de şunları yürütün:

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"

GCE sanal makinesi dağıtma

AlloyDB kümesiyle aynı bölgede ve VPC'de bir GCE sanal makinesi oluşturun.

Cloud Shell'de şunları çalıştırın:

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

Beklenen konsol çıkışı:

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

Postgres istemcisini yükleme

PostgreSQL istemci yazılımını dağıtılan sanal makineye yükleme

Sanal makineye bağlanın:

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

Beklenen konsol çıkışı:

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

Yazılımı çalıştırma komutunu sanal makinenin içine yükleyin:

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

Beklenen konsol çıkışı:

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

Örneğe bağlanma

psql kullanarak sanal makineden birincil örneğe bağlanın.

Sanal makinenize açık SSH oturumuyla devam edin. Bağlantınız kesildiyse yukarıdaki komutu kullanarak tekrar bağlanın.

GCE sanal makinesinden AlloyDB'ye bağlanmak için daha önce not ettiğiniz $PGASSWORD değerini ve küme adını kullanın:

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"

Beklenen konsol çıkışı:

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

SSH bağlantısını açık tutarak psql oturumundan çıkın:

exit

Beklenen konsol çıkışı:

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

6. Veritabanını başlatma

İstemci sanal makinemizi, veritabanımızı veri ile doldurmak ve uygulamamızı barındırmak için bir platform olarak kullanacağız. İlk adım, bir veritabanı oluşturmak ve bu veritabanını verilerle doldurmaktır.

Veritabanı Oluşturma

"assistantdemo" adlı bir veritabanı oluşturun.

GCE sanal makinesi oturumunda şunları yapın:

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

Beklenen konsol çıkışı:

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

pgVector uzantısını etkinleştirin.

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

Beklenen konsol çıkışı:

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

Python Ortamı Hazırlama

Devam etmek için GitHub deposundaki hazır Python komut dosyalarını kullanacağız. Ancak bunu yapmadan önce gerekli yazılımı yüklememiz gerekiyor.

GCE sanal makinesinde şunları yapın:

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

Beklenen konsol çıkışı:

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

Python sürümünü doğrulayın.

GCE sanal makinesinde şunları yapın:

python -V

Beklenen konsol çıkışı:

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

Veritabanını doldurma

Alma hizmeti ve örnek uygulamanın kodunu içeren GitHub deposunu klonlayın.

GCE sanal makinesinde şunları yapın:

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

Beklenen konsol çıkışı:

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.

Yapılandırma dosyasını hazırlama

GCE sanal makinesinde şunları yapın:

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

Beklenen konsol çıkışı:

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

Veritabanını örnek veri kümesiyle doldurun. İlk komut, gerekli tüm paketleri Python sanal ortamımıza ekler. İkinci komut ise veritabanımızı verilerle doldurur.

GCE sanal makinesinde şunları yapın:

pip install -r requirements.txt
python run_database_init.py

Beklenen konsol çıkışı(düzenlendi):

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. Alma Hizmeti'ni Cloud Run'a dağıtma

Artık alma hizmetini Cloud Run'a dağıtabiliriz. Hizmet, bir yapay zeka uygulamasından gelen istek doğrultusunda veritabanıyla çalışma ve veritabanından gerekli bilgileri ayıklama konusundan sorumludur.

Hizmet Hesabı Oluşturma

Alma hizmeti için bir hizmet hesabı oluşturun ve gerekli ayrıcalıkları verin.

Üstteki "+" işaretini kullanarak başka bir Cloud Shell sekmesi açın.

4ca978f5142bb6ce.png

Yeni Cloud Shell sekmesinde şunları yürütün:

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"

Beklenen konsol çıkışı:

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

Sekmede "exit" yürütme komutunu kullanarak sekmeyi kapatın:

exit

Alma Hizmeti'ni dağıtma

Hizmeti dağıtarak SSH üzerinden sanal makineye bağlı olduğunuz ilk sekmede devam edin.

Sanal makine SSH oturumunda şunları yürütün:

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

Beklenen konsol çıkışı:

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$

Hizmeti doğrulama

Artık hizmetin doğru çalışıp çalışmadığını ve sanal makinenin uç noktaya erişimi olup olmadığını kontrol edebiliriz. Alma hizmeti uç noktasını almak için gcloud yardımcı programını kullanırız. Alternatif olarak, Cloud Console'da kontrol edebilir ve curl komutunda "$(gcloud run services list –filter="(retrieval-service)" ifadesini buradaki değerle değiştirebilirsiniz.

Sanal makine SSH oturumunda şunları yürütün:

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

Beklenen konsol çıkışı:

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$

"Merhaba Dünya" mesajını görüyorsak hizmetimiz çalışıyor ve istekleri sunuyor demektir.

8. Örnek Uygulamayı Dağıtma

Artık alma hizmetini kullanıma sunduğumuza göre, hizmeti kullanacak örnek bir uygulama dağıtabiliriz. Uygulama, sanal makineye veya Cloud Run, Kubernetes gibi başka bir hizmete ya da yerel olarak bir dizüstü bilgisayara dağıtılabilir. Burada, bu paketin sanal makineye nasıl dağıtılacağını göstereceğiz.

Ortamı hazırlayın

Aynı SSH oturumunu kullanarak sanal makinemizde çalışmaya devam ediyoruz. Uygulamamızı çalıştırmak için bazı Python modülleri eklememiz gerekiyor. Komut, aynı Python sanal ortamındaki uygulama dizininden yürütülür.

Sanal makine SSH oturumunda şunları yürütün:

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

Beklenen çıkış (gizlendi):

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

İstemci kimliğini hazırlama

Uygulamanın rezervasyon işlevini kullanmak için Cloud Console'u kullanarak OAuth 2.0 istemci kimliğini hazırlamamız gerekir. Rezervasyon, rezervasyon verilerini veritabanına kaydetmek için istemci kimlik bilgilerini kullandığından, uygulamada oturum açtığımızda gerçekleşir.

Cloud Console'da API'ler ve Hizmetler'e gidin, "OAuth izin ekranı"nı tıklayın ve "Dahili" kullanıcıyı seçin.

2400e5dcdb93eab8.png

Ardından "Oluştur"u tıklayın ve bir sonraki ekrandaki talimatları uygulayın.

6c34d235156e571f.png

"Uygulama adı" ve "Kullanıcı desteği e-postası" gibi zorunlu alanları doldurmanız gerekir. Ayrıca, kullanıcı rızası ekranında göstermek istediğiniz bir alan adı ve son olarak "Geliştirici iletişim bilgileri"ni de ekleyebilirsiniz.

2b7cd51aff915072.png

Ardından sayfanın alt kısmındaki "Kaydet ve Devam Et" düğmesine basarak bir sonraki sayfaya gidin.

d90c10c88fd347f9.png

Kapsamları belirtmek istemiyorsanız burada hiçbir şeyi değiştirmeniz gerekmez. Son olarak, "Kaydet ve Devam Et" düğmesini tekrar basarak işlemi onaylayın. Bu işlemle uygulama izin ekranı ayarlanır.

Sonraki adım, istemci kimliğini oluşturmaktır. Sol panelde "Kimlik bilgileri"ni tıkladığınızda OAuth2 kimlik bilgilerine yönlendirilirsiniz.

7ad97432390f224c.png

Burada, en üstteki "Kimlik Bilgileri Oluştur"u tıklayıp "OAuth İstemci Kimliği"ni seçin. Ardından başka bir ekran açılır.

325a926431c8f16d.png

Uygulama türü için açılır listeden "Web uygulaması"nı seçin ve uygulama URI'nizi (ve isteğe bağlı olarak bağlantı noktasını) "Yetkilendirilmiş JavaScript kaynakları"na girin. Ayrıca, yetkilendirme pop-up ekranını kullanabilmek için "Yetkilendirilmiş yönlendirme URI'leri"ne, sonunda "/login/google" ile uygulama ana makinenizi eklemeniz gerekir. Yukarıdaki resimde, temel uygulama URI'm olarak http://localhost'ı kullandığımı görebilirsiniz.

"Oluştur" düğmesini tıkladıktan sonra, müşteri kimlik bilgilerinizi içeren bir pop-up pencere açılır.

e91adf03ec31cd15.png

Daha sonra uygulamamızla kullanmak için istemci kimliğine (ve isteğe bağlı olarak istemci gizli anahtarına) ihtiyacımız olacak.

Asistan uygulamasını çalıştırma

Uygulamayı başlatmadan önce bazı ortam değişkenlerini ayarlamamız gerekiyor. Uygulamanın temel işlevleri (ör. uçuş sorgulama ve havalimanı olanakları) için yalnızca uygulamayı alma hizmetine yönlendiren BASE_URL gerekir. gcloud komutunu kullanarak bu bilgileri alabiliriz .

Sanal makine SSH oturumunda şunları yürütün:

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

Beklenen çıkış (gizlendi):

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

Uygulamanın rezervasyon ve uçuş değişikliği gibi daha gelişmiş özelliklerini kullanmak için Google Hesabımızı kullanarak uygulamada oturum açmamız gerekir. Bu amaçla, İstemci Kimliği Hazırlama bölümündeki OAuth istemci kimliğini kullanarak CLIENT_ID ortam değişkenini sağlamamız gerekir:

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

Beklenen çıkış (gizlendi):

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

Artık uygulamamızı çalıştırabiliriz:

python run_app.py

Beklenen çıkış:

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)

Uygulamaya bağlanma

Sanal makinede çalışan uygulamaya birkaç şekilde bağlanabilirsiniz. Örneğin, VPC'deki güvenlik duvarı kurallarını kullanarak sanal makinede 8081 numaralı bağlantı noktasını açabilir veya genel IP'li bir yük dengeleyici oluşturabilirsiniz. Burada, yerel 8080 bağlantı noktasını sanal makinenin 8081 bağlantı noktasına çeviren bir SSH tüneli kullanacağız.

Yerel Makineden Bağlanma

Yerel bir makineden bağlanmak istediğimizde SSH tüneli çalıştırmamız gerekir. Bu işlem gcloud compute ssh kullanılarak yapılabilir:

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

Beklenen çıkış:

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

Artık tarayıcıyı açıp http://localhost:8081 adresini kullanarak uygulamamıza bağlanabiliriz. Başvuru ekranını görmemiz gerekiyor.

c667b9013afac3f9.png

Cloud Shell'dan bağlanma

Alternatif olarak, bağlantı kurmak için Cloud Shell'i de kullanabiliriz. Üstteki "+" işaretini kullanarak başka bir Cloud Shell sekmesi açın.

4ca978f5142bb6ce.png

Yeni Cloud Shell'de gcloud komutunu yürüterek web istemcinizi için kaynak ve yönlendirme URI'sini alın:

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

Beklenen çıkış şu şekildedir:

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

Ayrıca, "İstemci Kimliğini Hazırlama" bölümünde oluşturulan kimlik bilgileriniz için URI'ların kaynağını ve yönlendirmesini "Yetkilendirilmiş JavaScript kaynakları" ve "Yetkilendirilmiş yönlendirme URI'ları" olarak kullanın. Bu değerler, başlangıçta sağlanan http://localhost:8080 değerlerini değiştirir veya bunlara eklenir.

2c37eeda0a7e2f80.png

Yeni Cloud Shell sekmesinde, gcloud komutunu yürüterek sanal makinenize tünel başlatın:

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

"İstenen adres atanamıyor" hatası gösterilir. Lütfen bunu yoksayın.

Beklenen çıkış şu şekildedir:

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

Cloud Shell'inizde "Web önizlemesi" için kullanılabilecek 8080 bağlantı noktasını açar.

Cloud Shell'inizin sağ üst kısmındaki "Web önizlemesi" düğmesini tıklayın ve açılır menüden "8080 numaralı bağlantı noktasında önizle"yi seçin.

444fbf54dcd4d160.png

Web tarayıcınızda uygulama arayüzünün yer aldığı yeni bir sekme açılır. "Cymbal Air Müşteri Hizmetleri Asistanı" sayfasını görebilirsiniz.

389f0ae2945beed5.png

Uygulamada oturum açma

Her şey ayarlandıktan ve uygulamanız açıldığında, kimlik bilgilerinizi sağlamak için uygulama ekranımızın sağ üst kısmındaki "Oturum aç" düğmesini kullanabiliriz. Bu isteğe bağlıdır ve yalnızca uygulamanın rezervasyon işlevini denemek istiyorsanız gereklidir.

a1f571371b957129.png

Kimlik bilgilerini seçebileceğimiz bir pop-up pencere açılır.

Oturum açtıktan sonra uygulama hazır olur ve isteklerinizi pencerenin alt kısmındaki alana göndermeye başlayabilirsiniz.

Bu demoda Cymbal Air müşteri hizmetleri asistanı gösterilmektedir. Cymbal Air, kurgusal bir yolcu havayolu şirketidir. Asistan, seyahat edenlerin uçuşları yönetmesine ve Cymbal Air'ın San Francisco Uluslararası Havaalanı'ndaki (SFO) merkezi hakkında bilgi edinmesine yardımcı olan yapay zeka destekli bir sohbet robotudur.

Oturum açmadan (CLIENT_ID olmadan) kullanıcıların aşağıdaki gibi sorularına yanıt verebilirsiniz:

Denver'a bir sonraki uçuş ne zaman?

C28 kapısı civarında lüks mağaza var mı?

A6 kapısı yakınlarında kahve içebileceğim bir yer var mı?

Hediyeleri nereden satın alabilirim?

Lütfen 10:35'te kalkan Denver uçuşu için rezervasyon yapın

Uygulamada oturum açtığınızda uçuş rezervasyonu yapma veya size atanan koltuğun pencere kenarı mı yoksa koridor tarafı mı olduğunu kontrol etme gibi diğer özellikleri deneyebilirsiniz.

6e7758f707c67c3e.png

Uygulama, yanıt oluşturmak ve bu yanıtları operasyonel AlloyDB veritabanındaki uçuşlar ve olanaklar hakkındaki bilgilerle desteklemek için en son Google temel modellerini kullanır. Bu demo uygulama hakkında daha fazla bilgiyi projenin GitHub sayfasında bulabilirsiniz.

9. Ortamı temizleme

Tüm görevler tamamlandığında ortamımızı temizleyebiliriz.

Cloud Run Hizmeti'ni silme

Cloud Shell'de şunları çalıştırın:

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

Beklenen konsol çıkışı:

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

Cloud Run hizmeti için hizmet hesabını silme

Cloud Shell'de şunları çalıştırın:

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

Beklenen konsol çıkışı:

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

Laboratuvarı tamamladığınızda AlloyDB örneklerini ve kümesini yok etme

AlloyDB kümesini ve tüm örneklerini silme

Zorunlu seçenekle küme yok edilir. Bu seçenek, kümeye ait tüm örnekleri de siler.

Bağlantınız kesildiyse ve önceki tüm ayarlar kaybolduysa Cloud Shell'de proje ve ortam değişkenlerini tanımlayın:

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

Kümeyi silme:

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

Beklenen konsol çıkışı:

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.   

AlloyDB Yedeklemelerini Silme

Küme için tüm AlloyDB yedeklerini silin:

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

Beklenen konsol çıkışı:

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.                                                                                                                                                                                                                                                            

Artık sanal makinemizi silebiliriz.

GCE sanal makinesini silme

Cloud Shell'de şunları çalıştırın:

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

Beklenen konsol çıkışı:

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

GCE sanal makinesi ve Retrieval hizmeti için hizmet hesabını silme

Cloud Shell'de şunları çalıştırın:

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

Beklenen konsol çıkışı:

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

Codelab'i tamamladığınız için tebrikler.

Ele aldığımız konular

  • AlloyDB kümesini dağıtma
  • AlloyDB'ye bağlanma
  • GenAI Veritabanı Alma Hizmeti'ni yapılandırma ve dağıtma
  • Dağıtılan hizmeti kullanarak örnek uygulama dağıtma

11. Anket

Çıkış:

Bu eğitimi nasıl kullanacaksınız?

Yalnızca okuyun Okuyun ve alıştırmaları tamamlayın