Kubernetes'te Gemma 4 ile AlloyDB Omni ve EmbeddingGemma

1. Giriş

Bu codelab'de, AlloyDB Omni'yi Google Kubernetes Engine'e (GKE) dağıtmayı ve yerleştirmeler ile tahminler için EmbeddingGemma ve Gemma 4 gibi açık modellerle kullanmayı öğreneceksiniz. Hem veritabanını hem de modelleri aynı kümede çalıştırmak ağ gecikmesini azaltır ve üçüncü taraf hizmet bağımlılıklarını önler. Ayrıca, verileriniz hiçbir zaman ortamınızdan ayrılmadığı için uygunluk ve veri yerleşimi şartlarını karşılamanıza da yardımcı olur.

GKE'de AlloyDB Omni ve EmbeddingGemma'nın mimari şeması

Ön koşullar

  • Google Cloud ve Google Cloud Console hakkında temel bilgiler
  • Kubernetes ve GKE hakkında temel bilgiler
  • Komut satırı arayüzü ve Google Cloud Shell hakkında bilgi sahibi olma

Neler öğreneceksiniz?

  • AlloyDB Omni'yi GKE kümesine dağıtma
  • AlloyDB Omni'ye bağlanma
  • AlloyDB Omni'ye veri yükleme
  • Yapay zeka modellerini (yerleştirme ve LLM) GKE'ye dağıtma
  • AlloyDB Omni'ye yapay zeka modellerini kaydetme
  • Semantik arama için yerleştirmeler oluşturma
  • AlloyDB Omni'de semantik arama sorguları çalıştırma
  • AlloyDB Omni'de vektör dizinleri oluşturma ve kullanma

İhtiyacınız olanlar

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

2. Kurulum ve şartlar

Proje ayarlama

  1. Google Cloud Console'da oturum açın. Henüz bir Gmail veya Google Workspace hesabınız yoksa oluşturun. İş veya okul hesabı yerine kişisel hesap kullanıyorsanız.
  1. Yeni bir proje oluşturun veya mevcut bir projeyi seçin. Google Cloud Console üstbilgisinde Proje seçin'i, ardından Yeni Proje'yi tıklayın.

Google Cloud Console'da proje seçme iletişim kutusu

Proje oluşturma iletişim kutusunu açmak için Proje seçin penceresinde Yeni Proje'yi tıklayın.

Yeni proje oluşturma iletişim kutusu

İletişim kutusuna bir Proje adı girin ve kuruluşunuzu veya konumunuzu seçin.

Proje ayrıntıları giriş alanları

  • Proje adı, bu projenin katılımcıları için görünen addır. Proje adı, Google API'leri tarafından kullanılmaz ve istediğiniz zaman değiştirebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarladıktan sonra değiştiremezsiniz). Google Cloud Console otomatik olarak benzersiz bir kimlik oluşturur veya kendi kimliğinizi sağlayabilirsiniz. Bu codelab'de, proje kimliğinizi yer tutucusuyla referans olarak gösteriyorsunuz.
  • Proje Numarası, bazı API'ler tarafından kullanılan üçüncü bir tanımlayıcıdır. Daha fazla bilgi için Resource Manager belgelerini inceleyin.

Faturalandırmayı etkinleştir

Faturalandırmayı Google Cloud kredilerini kullanarak ayarladıysanız bu adımı atlayabilirsiniz.

Kişisel faturalandırma hesabı oluşturmak için Google Cloud Console'da faturalandırmayı etkinleştirin.

  • Bu laboratuvarı tamamlamak için Google Cloud kaynaklarında 5 ABD dolarından daha az harcama yapmanız gerekir.
  • Kaynakları silmek ve daha fazla ücret ödememek için bu laboratuvarın sonundaki temizleme adımlarını uygulayın.
  • Yeni kullanıcılar 300 ABD doları değerinde ücretsiz deneme sürümünden yararlanabilir.

Cloud Shell'i Başlatma

Bu codelab'de, 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'i Etkinleştir simgesini tıklayın:

Cloud Shell'i etkinleştir düğmesi

Alternatif olarak, önce G'ye, ardından S'ye basın veya Google Cloud Shell'i doğrudan açın.

Bağlantı kurulduğunda Cloud Shell, terminal istemini gösterir:

Google Cloud Shell terminalinin ekran görüntüsü

Cloud Shell, kalıcı depolama alanı ve geliştirme araçları içerir. Bu codelab'deki tüm adımları tarayıcınızdan çalıştırabilirsiniz.

3. API'leri etkinleştir

AlloyDB Omni ve model dağıtımları için Google Kubernetes Engine'i (GKE) kullanmak üzere Google Cloud projenizde Compute Engine ve GKE API'lerini etkinleştirin.

Cloud Shell'de proje kimliğinizin yapılandırıldığını doğrulayın:

PROJECT_ID=$(gcloud config get-value project)
echo $PROJECT_ID

Proje kimliğiniz tanımlanmamışsa yapılandırın:

export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID

Gerekli API'leri etkinleştirin:

gcloud services enable compute.googleapis.com
gcloud services enable container.googleapis.com

Beklenen çıktı:

student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=test-project-001-402417
student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable compute.googleapis.com
gcloud services enable container.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

Etkinleştirilen her API hakkında bilgiyi dokümanlarda bulabilirsiniz.

4. GKE'de AlloyDB Omni'yi dağıtma

AlloyDB Omni'yi GKE'ye dağıtmak için AlloyDB Omni operatör gereksinimlerine uygun bir Kubernetes kümesi hazırlayın.

GKE kümesi oluşturma

AlloyDB Omni'yi, operatörü ve izleme kapsayıcılarını çalıştırabilecek kapasiteye sahip standart bir GKE kümesi dağıtın. AlloyDB Omni için en az iki CPU ve 8 GB RAM gerekir. Bu eğitimde n2-standard-4 makine türü kullanılmaktadır.

Dağıtımınız için ortam değişkenlerini ayarlayın:

export PROJECT_ID=$(gcloud config get-value project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
export MACHINE_TYPE=n2-standard-4

Standart GKE kümesini oluşturun:

gcloud container clusters create ${CLUSTER_NAME} \
  --project=${PROJECT_ID} \
  --region=${LOCATION} \
  --workload-pool=${PROJECT_ID}.svc.id.goog \
  --release-channel=rapid \
  --machine-type=${MACHINE_TYPE} \
  --num-nodes=1

Beklenen konsol çıkışı:

student@cloudshell:~ (test-project-001-402417)$ export PROJECT_ID=$(gcloud config get project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
export MACHINE_TYPE=n2-standard-4
Your active configuration is: [test-project-001-402417]
student@cloudshell:~ (test-project-001-402417)$ gcloud container clusters create ${CLUSTER_NAME} \
  --project=${PROJECT_ID} \
  --region=${LOCATION} \
  --workload-pool=${PROJECT_ID}.svc.id.goog \
  --release-channel=rapid \
  --machine-type=${MACHINE_TYPE} \
  --num-nodes=1
Note: Your Pod address range (`--cluster-ipv4-cidr`) can accommodate at most 1008 node(s).
Creating cluster alloydb-ai-gke in us-central1... Cluster is being health-checked (Kubernetes Control Plane is healthy)...done.                                                                                            
Created [https://container.googleapis.com/v1/projects/test-project-001-402417/zones/us-central1/clusters/alloydb-ai-gke].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1/alloydb-ai-gke?project=test-project-001-402417
kubeconfig entry generated for alloydb-ai-gke.
NAME: alloydb-ai-gke
LOCATION: us-central1
MASTER_VERSION: 1.36.3-gke.1640000
MASTER_IP: 34.121.243.65
MACHINE_TYPE: n2-standard-4
NODE_VERSION: 1.36.3-gke.1640000
NUM_NODES: 3
STATUS: RUNNING
STACK_TYPE: IPV4

Kümeyi hazırlama

Kubernetes için yerel sertifika denetleyicisi olan cert-manager gibi gerekli bileşenleri yükleyin. Ayrıntılar için cert-manager yükleme belgelerine bakın.

Cloud Shell, Kubernetes komut satırı aracını kubectl içerir. gcloud kullanarak küme kimlik bilgilerini alın:

gcloud container clusters get-credentials ${CLUSTER_NAME} --region=${LOCATION}

kubectl kullanarak cert-manager'ı yükleyin:

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.21.1/cert-manager.yaml

Beklenen konsol çıkışı (sansürlenmiş):

student@cloudshell:~$ kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.21.1/cert-manager.yaml
namespace/cert-manager created
customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created
...
validatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created

AlloyDB Omni operatörünü yükleme

Helm'i kullanarak AlloyDB Omni operatörünü yükleyin.

AlloyDB Omni operatör grafiğini indirip yükleyin:

helm install alloydbomni-operator oci://gcr.io/alloydb-omni/alloydbomni-operator \
--version 1.8.1 \
--create-namespace \
--namespace alloydb-omni-system \
--atomic \
--timeout 5m

Beklenen konsol çıkışı (sansürlenmiş):

student@cloudshell:~$ helm install alloydbomni-operator oci://gcr.io/alloydb-omni/alloydbomni-operator \
> --version 1.8.0 \
> --create-namespace \
> --namespace alloydb-omni-system \
> --atomic \
> --timeout 5m
Flag --atomic has been deprecated, use --rollback-on-failure instead
Pulled: gcr.io/alloydb-omni/alloydbomni-operator:1.8.0
Digest: sha256:f2d98fa7a3b08dfc1e83b811582718b94e5c017b81aade700c83e917c59f0395
NAME: alloydbomni-operator
LAST DEPLOYED: Thu Aug 27 17:57:30 2026
NAMESPACE: alloydb-omni-system
STATUS: deployed
REVISION: 1
DESCRIPTION: Install complete
TEST SUITE: None

Veritabanı kümesini dağıtın.

Aşağıdaki manifest, googleMLExtension etkin ve dahili yük dengeleyici içeren bir veritabanı kümesi yapılandırır:

cat << 'EOF' > my-omni.yaml
apiVersion: v1
kind: Secret
metadata:
  name: db-pw-my-omni
type: Opaque
data:
  my-omni: "VmVyeVN0cm9uZ1Bhc3N3b3Jk"
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
  name: my-omni
spec:
  databaseVersion: "18.3.0"
  primarySpec:
    adminUser:
      passwordRef:
        name: db-pw-my-omni
    features:
      googleMLExtension:
        enabled: true
    resources:
      cpu: 1
      memory: 8Gi
      disks:
      - name: DataDisk
        size: 20Gi
        storageClass: standard
    dbLoadBalancerOptions:
      annotations:
        networking.gke.io/load-balancer-type: "internal"
  allowExternalIncomingTraffic: true
EOF

Şifre gizli değeri, VeryStrongPassword öğesinin Base64 gösterimidir. Üretim ortamlarında şifreleri yönetmek için Google Secret Manager'ı kullanın. Ayrıntılar için Secret Manager belgelerine bakın.

Manifest, my-omni.yaml olarak kaydedilir. Cloud Shell'de, terminal penceresinin sağ üst köşesindeki Open Editor'ı (Düzenleyiciyi Aç) tıklayın ve dosyayı okuyun.

Cloud Shell'de Düzenleyici'yi açma

my-omni.yaml manifest dosyasını okuduktan sonra komut istemine dönmek için Open Terminal'i (Terminali Aç) tıklayın.

Cloud Shell'de Terminal'i açma

my-omni.yaml manifest dosyasını uygulayın:

kubectl apply -f my-omni.yaml

Beklenen konsol çıkışı:

secret/db-pw-my-omni created
dbcluster.alloydbomni.dbadmin.goog/my-omni created

my-omni kümesinin durumunu kontrol edin:

kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default

Dağıtım sırasında veritabanı kümesi, DBClusterReady durumuna ulaşana kadar kurulum aşamalarından geçer.

Beklenen konsol çıkışı:

$ kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default
NAME      PRIMARYENDPOINT   PRIMARYPHASE   DBCLUSTERPHASE   HAREADYSTATUS   HAREADYREASON
my-omni   10.131.0.33        Ready          DBClusterReady

İsteğe bağlı olarak, kubectl log komutunu kullanarak küme dağıtımını izleyebilirsiniz:

kubectl logs -l alloydbomni.internal.dbadmin.goog/dbcluster=my-omni --all-containers -f

AlloyDB Omni'ye bağlanma

Küme hazır olduğunda PostgreSQL istemcisini (psql) kullanarak veritabanı pod'una bağlanın. Şifre, my-omni.yaml içinde tanımlandığı gibi VeryStrongPassword'dir:

DB_CLUSTER_NAME=my-omni
DB_CLUSTER_NAMESPACE=default
DBPOD=`kubectl get pod --selector=alloydbomni.internal.dbadmin.goog/dbcluster=$DB_CLUSTER_NAME,alloydbomni.internal.dbadmin.goog/task-type=database -n $DB_CLUSTER_NAMESPACE -o jsonpath='{.items[0].metadata.name}'`
kubectl exec -ti $DBPOD -n $DB_CLUSTER_NAMESPACE -c database -- psql -h localhost -U postgres

Örnek konsol çıkışı:

DB_CLUSTER_NAME=my-omni
DB_CLUSTER_NAMESPACE=default
DBPOD=`kubectl get pod --selector=alloydbomni.internal.dbadmin.goog/dbcluster=$DB_CLUSTER_NAME,alloydbomni.internal.dbadmin.goog/task-type=database -n $DB_CLUSTER_NAMESPACE -o jsonpath='{.items[0].metadata.name}'`
kubectl exec -ti $DBPOD -n $DB_CLUSTER_NAMESPACE -c database -- psql -h localhost -U postgres
Password for user postgres:
psql (18.3)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off, ALPN: postgresql)
Type "help" for help.

postgres=#

\q yazıp Enter tuşuna basarak psql oturumundan çıkın:

postgres=# \q

5. GKE'de EmbeddingGemma modelini dağıtma

AlloyDB Omni'nin yerel modellerle yapay zeka entegrasyonunu test etmek için GKE kümesine bir yerleştirme modeli dağıtın. Bu eğitimde Google'ın EmbeddingGemma modeli kullanılmaktadır.

Model için düğüm havuzu oluşturma

Model çıkarımı çalıştırmak için özel bir düğüm havuzu hazırlayın. Yalnızca CPU'lu bir düğüm havuzu veya GPU hızlandırmalı bir düğüm havuzu (ör. NVIDIA L4 GPU'lu g2-standard-8) kullanabilirsiniz. Bu eğiticide, c3-standard-8 makine türlerinin bulunduğu CPU tabanlı bir düğüm havuzu kullanılmaktadır.

Tek düğümlü bir CPU düğüm havuzu oluşturun:

export PROJECT_ID=$(gcloud config get-value project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
gcloud container node-pools create cpupool \
  --project=${PROJECT_ID} \
  --location=${LOCATION} \
  --node-locations=${LOCATION}-a \
  --cluster=${CLUSTER_NAME} \
  --machine-type=c3-standard-8 \
  --num-nodes=1

Beklenen çıktı:

student@cloudshell$ export PROJECT_ID=$(gcloud config get project)
Your active configuration is: [pant]
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
student@cloudshell$ gcloud container node-pools create cpupool \
>   --project=${PROJECT_ID} \
>   --location=${LOCATION} \
>   --node-locations=${LOCATION}-a \
>   --cluster=${CLUSTER_NAME} \
>   --machine-type=c3-standard-8 \
>   --num-nodes=1
Creating node pool cpupool...done.
Created [https://container.googleapis.com/v1/projects/gleb-test-short-003-483115/zones/us-central1/clusters/alloydb-ai-gke/nodePools/cpupool].
NAME     MACHINE_TYPE    DISK_SIZE_GB  NODE_VERSION
cpupool  c3-standard-8  100           1.34.1-gke.3355002

Hugging Face jetonu edinme

Bu eğitimde, Hugging Face'teki EmbeddingGemma modeli dağıtılır. Model ağırlıklarına erişmek için Hugging Face erişim jetonu oluşturun:

  1. Hugging Face'te oturum açın veya hesap oluşturun.
  2. Profiliniz > Erişim Jetonları'na gidin.
  3. Yeni jeton oluştur'u tıklayın.
  4. Jetona bir ad girin ve Okuma rolünü seçin.
  5. Jeton oluştur'u tıklayın ve oluşturulan jeton değerini kopyalayın.
  6. Daha önce yapmadıysanız EmbeddingGemma model sayfasında model şartlarını kabul edin.

Cloud Shell'de Hugging Face jetonunuzu içeren bir Kubernetes gizli anahtarı oluşturun (jeton yer tutucusunu jetonunuzla değiştirin):

export HF_TOKEN=<YOUR_HUGGING_FACE_TOKEN>
kubectl create secret generic hf-secret \
  --from-literal=hf_api_token=$HF_TOKEN \
  --dry-run=client -o yaml | kubectl apply -f -

Dağıtım manifestini hazırlama

Modeli dağıtmak için Hugging Face'in Text Embeddings Inference (TEI) container paketini kullanın. Daha fazla bilgi için Hugging Face GKE TEI belgelerine bakın.

Dağıtım deposunu GitHub'dan klonlayın:

git clone https://github.com/huggingface/Google-Cloud-Containers

CPU yapılandırma manifestini inceleyin ve değiştirin:

edit Google-Cloud-Containers/examples/gke/tei-deployment/cpu-config/deployment.yaml

CPU dağıtımı için güncellenen manifest:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tei-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tei-server
  template:
    metadata:
      labels:
        app: tei-server
        hf.co/model: Google--embeddinggemma-300m
        hf.co/task: text-embeddings
    spec:
      containers:
        - name: tei-container
          image: ghcr.io/huggingface/text-embeddings-inference:cpu-latest
          resources:
            requests:
              cpu: "6"
              memory: "24Gi"
            limits:
              cpu: "6"
              memory: "24Gi"
          env:
            - name: MODEL_ID
              value: google/embeddinggemma-300m
            - name: NUM_SHARD
              value: "1"
            - name: PORT
              value: "8080"
            - name: HF_TOKEN
              valueFrom:
                secretKeyRef:
                  name: hf-secret
                  key: hf_api_token
          volumeMounts:
            - mountPath: /tmp
              name: tmp
      volumes:
        - name: tmp
          emptyDir: {}
      nodeSelector:
        cloud.google.com/machine-family: "c3"

ctrl+s tuşuna basarak değişiklikleri kaydedin ve terminale geri dönün.

Modeli dağıtma

TEI sunucusunu dağıtmak için manifesti uygulayın:

kubectl apply -f Google-Cloud-Containers/examples/gke/tei-deployment/cpu-config

Dağıtımı hazır duruma gelene kadar izleyin:

printf "Waiting for model to load..."; until kubectl logs -l app=tei-server --tail=50 2>/dev/null | grep -q "Ready"; do printf "."; sleep 3; done; printf '\n\033[1;32m========================================\n[SUCCESS] Model is loaded and ready!\nYou can now proceed to the next step.\n========================================\033[0m\n'

tei-service Kubernetes hizmetini kontrol edin:

kubectl get service tei-service

Beklenen çıktı:

student@cloudshell$ kubectl get service tei-service
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
tei-service   ClusterIP   34.118.233.48   <none>        8080/TCP   10m

CLUSTER-IP hizmeti, istekleri dahili olarak http://34.118.233.48:8080/embed adresinde sunar.

kubectl port-forward kullanarak model uç noktasını yerel olarak test edin:

kubectl port-forward service/tei-service 8080:8080

Terminalin üst kısmındaki + işaretini tıklayarak ikinci bir Cloud Shell sekmesi açın:

Cloud Shell sekmesi ekleme

Yeni sekmede, curl ile yerleştirme oluşturmayı test edin:

curl http://localhost:8080/embed \
  -X POST \
  -d '{"inputs":"Test"}' \
  -H 'Content-Type: application/json'

Beklenen çıktı (vektör dizisi):

curl http://localhost:8080/embed \
>     -X POST \
>     -d '{"inputs":"Test"}' \
>     -H 'Content-Type: application/json'
[[-0.018975832,0.0071419072,0.06347208,0.022992613,0.014205903
...
-0.03677433,0.01636146,0.06731572]]

ctrl+c tuşuna basarak ilk sekmede bağlantı noktası yönlendirmeyi durdurun.

6. Yerleştirme modelini AlloyDB Omni'ye kaydetme

AlloyDB Omni'den dağıtılan modeli kullanmak için bir veritabanı oluşturun, dönüştürme işlevlerini tanımlayın ve model uç noktasını kaydedin.

İstemci VM'si ve veritabanı oluşturma

İstemci atlama ana makinesi olarak işlev görecek aynı VPC'de bir Compute Engine sanal makine örneği oluşturun:

İstemci VM'sini ve AlloyDB Omni'yi gösteren ağ mimarisi şeması

Cloud Shell'de istemci sanal makinesini oluşturun:

export ZONE=us-central1-a
gcloud compute instances create instance-1 \
  --zone=$ZONE

AlloyDB Omni uç nokta IP'sini alın:

echo "INSTANCE_IP=$(kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default -o jsonpath='{.status.primary.endpoint}')"

Beklenen çıktı:

INSTANCE_IP=10.128.0.33

INSTANCE_IP değeri, AlloyDB Omni kümesinin dahili yük dengeleyici IP'sidir. Bu örnekte 10.131.0.33'dır.

SSH kullanarak sanal makine örneğine bağlanın:

gcloud compute ssh instance-1 --zone=$ZONE

instance-1 üzerindeki SSH oturumunda PostgreSQL istemcisini yükleyin:

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

AlloyDB Omni yük dengeleyici IP'sini dışa aktarın (PRIMARYENDPOINT IP'nizle değiştirin):

export INSTANCE_IP=10.131.0.33

psql kullanarak AlloyDB Omni'ye bağlanın (şifre VeryStrongPassword):

psql "host=$INSTANCE_IP user=postgres sslmode=require"

psql oturumunda demo veritabanını oluşturun:

CREATE DATABASE demo;

demo veritabanına geçin:

\c demo

Dönüşüm işlevleri oluşturma

Özel yerleştirme uç noktaları, AlloyDB Omni ile model API'si arasındaki veri biçimlerini uyarlamak için giriş ve çıkış dönüştürme işlevleri gerektirir.

Giriş dönüşümü işlevini oluşturun:

CREATE OR REPLACE FUNCTION tei_text_input_transform(model_id VARCHAR(100), input_text TEXT)
RETURNS JSON
LANGUAGE plpgsql
AS $$
DECLARE
  transformed_input JSON;
BEGIN
  SELECT json_build_object('inputs', input_text, 'truncate', true)::JSON INTO transformed_input;
  RETURN transformed_input;
END;
$$;

Beklenen çıktı:

demo=# CREATE OR REPLACE FUNCTION tei_text_input_transform(model_id VARCHAR(100), input_text TEXT)
RETURNS JSON
LANGUAGE plpgsql
AS $$
DECLARE
  transformed_input JSON;
BEGIN
  SELECT json_build_object('inputs', input_text, 'truncate', true)::JSON INTO transformed_input;
  RETURN transformed_input;
END;
$$;
CREATE FUNCTION
demo=#

Vektör dizisi yanıtını ayrıştırmak için çıkış dönüştürme işlevini oluşturun:

CREATE OR REPLACE FUNCTION tei_text_output_transform(model_id VARCHAR(100), response_json JSON)
RETURNS REAL[]
LANGUAGE plpgsql
AS $$
DECLARE
  transformed_output REAL[];
BEGIN
  SELECT ARRAY(SELECT json_array_elements_text(response_json->0)) INTO transformed_output;
  RETURN transformed_output;
END;
$$;

Beklenen çıktı:

demo=# CREATE OR REPLACE FUNCTION tei_text_output_transform(model_id VARCHAR(100), response_json JSON)
RETURNS REAL[]
LANGUAGE plpgsql
AS $$
DECLARE
  transformed_output REAL[];
BEGIN
  SELECT ARRAY(SELECT json_array_elements_text(response_json->0)) INTO transformed_output;
  RETURN transformed_output;
END;
$$;
CREATE FUNCTION
demo=#

Modeli kaydetme

google_ml.create_model prosedürünü kullanarak modeli AlloyDB Omni'ye kaydedin. İstekleri Kubernetes kümesi hizmetine yönlendirmek için http://tei-service:8080/embed değerini model_request_url olarak belirtin:

CALL
  google_ml.create_model(
    model_id => 'embeddinggemma',
    model_request_url => 'http://tei-service:8080/embed',
    model_provider => 'custom',
    model_type => 'text_embedding',
    model_in_transform_fn => 'tei_text_input_transform',
    model_out_transform_fn => 'tei_text_output_transform');

Beklenen çıktı:

demo=# CALL
  google_ml.create_model(
    model_id => 'embeddinggemma',
    model_request_url => 'http://tei-service:8080/embed',
    model_provider => 'custom',
    model_type => 'text_embedding',
    model_in_transform_fn => 'tei_text_input_transform',
    model_out_transform_fn => 'tei_text_output_transform');
CALL
demo=#

Kayıtlı modeli örnek bir SQL sorgusuyla test edin:

SELECT google_ml.embedding('embeddinggemma', 'What is AlloyDB Omni?');

Bu işlev, GKE'de çalışan yerel EmbeddingGemma modeli tarafından oluşturulan gerçek sayılar dizisi gösterimini döndürür.

q oturum istemine geri dönmek için psql tuşuna basın.

psql oturumundan çıkın:

\q

7. Modeli örnek verilerle test etme

Örnek verileri yükleme

Bu eğitimde, vektör benzerliği aramasını göstermek için Cymbal perakende veri kümesi kullanılmaktadır. Verileri AlloyDB Omni'ye aktarmak için Google Cloud SDK ve PostgreSQL istemcisini kullanacaksınız.

instance-1 üzerindeki SSH oturumunda demo veritabanına bağlanın ve vector uzantısını etkinleştirin:

psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"

psql oturumunda:

CREATE EXTENSION IF NOT EXISTS vector;

psql oturumundan çıkın:

\q

demo veritabanında tablolar oluşturmak için şemayı indirip uygulayın:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=demo"

Beklenen çıktı:

student@cloudshell:~$ gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=demo"
Password for user postgres:
SET
SET
SET
SET
SET
 set_config
------------

(1 row)

SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER TABLE
ALTER SEQUENCE
ALTER TABLE
ALTER TABLE
ALTER TABLE
student@cloudshell:~$

Oluşturulan tabloları doğrulayın:

psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\dt+"

Beklenen çıktı:

student@cloudshell:~$ psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\dt+"
Password for user postgres: 
                                           List of relations
 Schema |       Name       | Type  |  Owner   | Persistence | Access method |    Size    | Description 
--------+------------------+-------+----------+-------------+---------------+------------+-------------
 public | cymbal_embedding | table | postgres | permanent   | heap          | 8192 bytes | 
 public | cymbal_inventory | table | postgres | permanent   | heap          | 8192 bytes | 
 public | cymbal_products  | table | postgres | permanent   | heap          | 8192 bytes | 
 public | cymbal_stores    | table | postgres | permanent   | heap          | 8192 bytes | 
(4 rows)

cymbal_products tablosuna veri yükleme:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_products from stdin csv header"

Beklenen çıktı:

student@cloudshell:~$ gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_products from stdin csv header"
COPY 941
student@cloudshell:~$ 

cymbal_products tablosundaki birkaç satırın örneğini aşağıda bulabilirsiniz.

psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT uniq_id,left(product_name,30),left(product_description,50),sale_price FROM cymbal_products limit 3"

Beklenen çıktı:

student@cloudshell:~$ psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT uniq_id,left(product_name,30),left(product_description,50),sale_price FROM cymbal_products limit 3"
Password for user postgres: 
             uniq_id              |              left              |                        left                        | sale_price 
----------------------------------+--------------------------------+----------------------------------------------------+------------
 a73d5f754f225ecb9fdc64232a57bc37 | Laundry Tub Strainer Cup       |   Laundry tub strainer cup Chrome For 1-.50, drain |      11.74
 41b8993891aa7d39352f092ace8f3a86 | LED Starry Star Night Light La |  LED Starry Star Night Light Laser Projector 3D Oc |      46.97
 ed4a5c1b02990a1bebec908d416fe801 | Surya Horizon HRZ-1060 Area Ru |  The 100% polypropylene construction of the Surya  |       77.4
(3 rows)
student@cloudshell:~$ 

cymbal_inventory tablosuna veri yükleme:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_inventory from stdin csv header"

Beklenen çıktı:

student@cloudshell:~$ gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_inventory from stdin csv header"
Password for user postgres: 
COPY 263861
student@cloudshell:~$ 

cymbal_inventory tablosundaki birkaç satırın örneğini aşağıda bulabilirsiniz.

psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT * FROM cymbal_inventory LIMIT 3"

Çıkış:

student@cloudshell:~$ psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT * FROM cymbal_inventory LIMIT 3"
Password for user postgres: 
 store_id |             uniq_id              | inventory 
----------+----------------------------------+-----------
     1583 | adc4964a6138d1148b1d98c557546695 |         5
     1490 | adc4964a6138d1148b1d98c557546695 |         4
     1492 | adc4964a6138d1148b1d98c557546695 |         3
(3 rows)
student@cloudshell:~$ 

cymbal_stores tablosuna veri yükleme:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_stores from stdin csv header"

Beklenen konsol çıkışı:

student@cloudshell:~$ gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_stores from stdin csv header"
Password for user postgres: 
COPY 4654
student@cloudshell:~$

cymbal_stores tablosundaki birkaç satırın örneğini aşağıda bulabilirsiniz.

psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT store_id, name, zip_code FROM cymbal_stores limit 3"

Çıkış:

student@cloudshell:~$ psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT store_id, name, zip_code FROM cymbal_stores limit 3"
Password for user postgres: 
 store_id |       name        | zip_code 
----------+-------------------+----------
     1990 | Mayaguez Store    |      680
     2267 | Ware Supercenter  |     1082
     4359 | Ponce Supercenter |      780
(3 rows)
student@cloudshell:~$ 

Yerleştirmeler oluşturma

psql kullanarak demo veritabanına bağlanın ve cymbal_products tablosunda açıklanan ürünler için ürün açıklamalarına dayalı yerleştirmeler oluşturun.

Demo veritabanına bağlanın:

psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"

Ürün açıklamaları için oluşturulan metin yerleştirmelerini depolamak üzere embedding türündeki vector sütununu kullanın.

Sorgu zamanlamasını etkinleştirin:

\timing

Her ürün açıklaması için yerleştirmeler oluşturun ve bunları cymbal_embedding tablosunda saklayın:

INSERT INTO cymbal_embedding (uniq_id, embedding)
SELECT uniq_id, google_ml.embedding('embeddinggemma', product_description)::vector
FROM cymbal_products;

Beklenen çıktı:

demo=# INSERT INTO cymbal_embedding(uniq_id,embedding)  SELECT uniq_id, google_ml.embedding('embeddinggemma',product_description)::vector FROM cymbal_products;
INSERT 0 941
Time: 497878.136 ms (08:17.878)
demo=#

Semantik arama sorguları çalıştırma

psql oturumunda, kosinüs uzaklığını (<=>) kullanarak "What kind of fruit trees grow well here?" sorusuna en çok uyan ilk beş ürünü bulun:

SELECT
    cp.product_name,
    left(cp.product_description, 80) AS description,
    cp.sale_price,
    cs.zip_code,
    (ce.embedding <=> google_ml.embedding('embeddinggemma', 'What kind of fruit trees grow well here?')::vector) AS distance
FROM
    cymbal_products cp
JOIN cymbal_embedding ce ON ce.uniq_id = cp.uniq_id
JOIN cymbal_inventory ci ON ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON cs.store_id = ci.store_id
WHERE
    ci.inventory > 0
    AND cs.store_id = 1583
ORDER BY
    distance ASC
LIMIT 5;

Beklenen çıktı:

demo=# SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (ce.embedding <=> google_ml.embedding('embeddinggemma','What kind of fruit trees grow well here?')::vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_embedding ce on ce.uniq_id=cp.uniq_id
JOIN cymbal_inventory ci on ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on cs.store_id=ci.store_id
WHERE
    ci.inventory > 0
    AND cs.store_id = 1583
ORDER BY
    distance ASC
LIMIT 5;
     product_name      |                                   description                                    | sale_price | zip_code |      distance
-----------------------+----------------------------------------------------------------------------------+------------+----------+--------------------
 Cherry Tree           | This is a beautiful cherry tree that will produce delicious cherries. It is an d |      75.00 |    93230 | 0.5210549378080666
 California Lilac      | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d |       5.00 |    93230 | 0.5639421771781971
 Toyon                 | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 | 0.5670010914504852
 Rose Bush             | This is a beautiful rose bush that will produce fragrant roses. It is a perennia |      50.00 |    93230 | 0.5731542622882957
 California Peppertree | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e |      25.00 |    93230 | 0.5750934653011995
(5 rows)

Time: 83.610 ms
demo=#

Sorgu 83 ms sürdü ve cymbal_products tablosundaki, istekle eşleşen ve 1583 numaralı mağazada envanteri bulunan ağaçların listesini döndürdü.

ANN dizini oluşturma

Küçük bir veri kümesiyle tüm yerleştirmeleri tarayan tam arama kolayca kullanılabilir ancak veri büyüdüğünde yükleme ve yanıt süresi de artar. Performansı artırmak için yerleştirme verilerinizde dizinler oluşturabilirsiniz. Vektör verileri için Google ScaNN dizinini kullanarak bunu nasıl yapacağınızla ilgili bir örneği aşağıda bulabilirsiniz.

Bağlantıyı kaybettiyseniz demo veritabanına yeniden bağlanın:

psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"

alloydb_scann uzantısını etkinleştirin:

CREATE EXTENSION IF NOT EXISTS alloydb_scann;

embedding sütununda ScaNN dizinini oluşturun:

CREATE INDEX cymbal_products_embeddings_scann ON cymbal_embedding
  USING scann (embedding cosine)
  WITH (num_leaves=10, max_num_levels = 1);

Yürütme performansını karşılaştırmak için anlamsal arama sorgusunu yeniden çalıştırın:

SELECT
    cp.product_name,
    left(cp.product_description, 80) AS description,
    cp.sale_price,
    cs.zip_code,
    (ce.embedding <=> google_ml.embedding('embeddinggemma', 'What kind of fruit trees grow well here?')::vector) AS distance
FROM
    cymbal_products cp
JOIN cymbal_embedding ce ON ce.uniq_id = cp.uniq_id
JOIN cymbal_inventory ci ON ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON cs.store_id = ci.store_id
WHERE
    ci.inventory > 0
    AND cs.store_id = 1583
ORDER BY
    distance ASC
LIMIT 5;

Beklenen çıktı:

demo=# SELECT
    cp.product_name,
    left(cp.product_description,80) as description,
    cp.sale_price,
    cs.zip_code,
    (ce.embedding <=> google_ml.embedding('embeddinggemma', 'What kind of fruit trees grow well here?')::vector) AS distance
FROM
    cymbal_products cp
JOIN cymbal_embedding ce ON ce.uniq_id = cp.uniq_id
JOIN cymbal_inventory ci ON ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON cs.store_id = ci.store_id
WHERE
    ci.inventory > 0
    AND cs.store_id = 1583
ORDER BY
    distance ASC
LIMIT 5;
     product_name      |                                   description                                    | sale_price | zip_code |      distance
-----------------------+----------------------------------------------------------------------------------+------------+----------+--------------------
 Cherry Tree           | This is a beautiful cherry tree that will produce delicious cherries. It is an d |      75.00 |    93230 | 0.5210549378080666
 California Lilac      | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d |       5.00 |    93230 | 0.5639421771781971
 Toyon                 | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 | 0.5670010914504852
 Rose Bush             | This is a beautiful rose bush that will produce fragrant roses. It is a perennia |      50.00 |    93230 | 0.5731542622882957
 California Peppertree | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e |      25.00 |    93230 | 0.5750934653011995
(5 rows)

Time: 64.783 ms

Sorgu yürütme süresi biraz kısaldı ve kazanç, daha büyük veri kümelerinde daha belirgin olacak. Döndürülen veriler, dizin olmadan aldığımız verilerle aynı veya çok benzer olmalıdır.

Diğer sorguları deneyin ve belgelerden vektör dizinini optimize etme hakkında daha fazla bilgi edinin.

psql oturumundan çıkma:

\q

CTRL+D tuşlarına basarak veya exit yazarak instance-1 ssh oturumunun bağlantısını kesip Google Cloud Shell'e geri dönün.

8. Gemma'yı vLLM ile dağıtma

Gemma için düğüm havuzu ekleme

Öncelikle bölgenizde hangi düğüm türlerinin kullanılabildiğini kontrol edin:

export LOCATION=us-central1-a
gcloud compute accelerator-types list --filter="zone:${LOCATION}"

nvidia-l4 hızlandırıcı da dahil olmak üzere kullanılabilir hızlandırıcı türlerinin listesini görürsünüz. Şimdi nvidia-l4 hızlandırıcı türüyle bir düğüm havuzu oluşturun:

export PROJECT_ID=$(gcloud config get project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
gcloud container node-pools create gpupool \
    --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \
    --project=${PROJECT_ID} \
    --location=${LOCATION} \
    --node-locations=${LOCATION}-a \
    --cluster=${CLUSTER_NAME} \
    --machine-type=g2-standard-8 \
    --num-nodes=1

vLLM'yi kullanarak Google Gemini 4 12B modeli için dağıtım manifestosu oluşturun:

cat << 'EOF' > gemma-12b-gpu-vllm-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gemma-12b-gpu-vllm-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gemma-12b-gpu-vllm
  template:
    metadata:
      labels:
        app: gemma-12b-gpu-vllm
        ai.gke.io/model: gemma-4-12b-it
        ai.gke.io/inference-server: vllm
        examples.ai.gke.io/source: user-guide
    spec:
      containers:
      - name: inference-server
        image: us-docker.pkg.dev/vertex-ai/vertex-vision-model-garden-dockers/pytorch-vllm-serve:latest
        resources:
          requests:
            cpu: "4"
            memory: "16Gi"
            ephemeral-storage: "30Gi"
            nvidia.com/gpu: "1"
          limits:
            cpu: "8"
            memory: "24Gi"
            ephemeral-storage: "30Gi"
            nvidia.com/gpu: "1"
        command: ["python3", "-m", "vllm.entrypoints.api_server"]
        args:
          - --model=$(MODEL_ID)
          - --host=0.0.0.0
          - --port=8000
          - --tensor-parallel-size=1
          - --enable-log-requests
          - --enable-chunked-prefill
          - --enable-prefix-caching
          - --enable-auto-tool-choice
          - --generation-config=auto
          - --tool-call-parser=gemma4
          - --dtype=bfloat16
          - --max-num-seqs=16
          - --max-model-len=32768
          - --gpu-memory-utilization=0.95
          - --reasoning-parser=gemma4
          - --trust-remote-code
          - --quantization=fp8
        env:
        - name: LD_LIBRARY_PATH
          value: ${LD_LIBRARY_PATH}:/usr/local/nvidia/lib64
        - name: MODEL_ID
          value: google/gemma-4-12b-it
        - name: HF_TOKEN
          valueFrom:
            secretKeyRef:
              name: hf-secret
              key: hf_api_token
        volumeMounts:
        - mountPath: /dev/shm
          name: dshm
      volumes:
      - name: dshm
        emptyDir:
            medium: Memory
      nodeSelector:
        cloud.google.com/gke-accelerator: nvidia-l4
        cloud.google.com/gke-gpu-driver-version: latest
---
apiVersion: v1
kind: Service
metadata:
  name: gemma-12b-gpu-vllm-service
spec:
  selector:
    app: gemma-12b-gpu-vllm
  type: ClusterIP
  ports:
    - protocol: TCP
      port: 8000
      targetPort: 8000
EOF

Kayıtlı gemma-12b-gpu-vllm-deployment.yaml dağıtımı uygulayın:

kubectl apply -f gemma-12b-gpu-vllm-deployment.yaml

Beklenen çıktı:

$ kubectl apply -f gemma-12b-gpu-vllm-deployment.yaml
deployment.apps/gemma-12b-gpu-vllm-deployment created
service/gemma-12b-gpu-vllm-service created

Dağıtım tamamlanana ve model yüklenene kadar bekleyin. Bu işlem birkaç dakika sürebilir.

printf "Waiting for model to load..."; until kubectl logs -l app=gemma-12b-gpu-vllm --tail=50 2>/dev/null | grep -q "Application startup complete"; do printf "."; sleep 3; done; printf '\n\033[1;32m========================================\n[SUCCESS] Model is loaded and ready!\nYou can now proceed to the next step.\n========================================\033[0m\n'

Beklenen çıktı:

Waiting for model to load...
========================================
[SUCCESS] Model is loaded and ready!
You can now proceed to the next step.
========================================

Modeli test edin. Modele erişmek için bağlantı noktası yönlendirmeyi etkinleştirin:

kubectl port-forward svc/gemma-12b-gpu-vllm-service 8090:8000

Başka bir terminal penceresinde, modele istem göndermek için curl'ü kullanın:

curl http://localhost:8090/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [
      {"role": "system", "content": "You are a helpful assistant running on GKE."},
      {"role": "user", "content": "What is AlloyDB Omni."}
    ],
    "temperature": 0.7
  }' | jq -r '.choices[0].message.content'

Beklenen çıktı:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3957  100  3761  100   196     85      4  0:00:49  0:00:43  0:00:06   830
**AlloyDB Omni** is a fully managed, PostgreSQL-compatible database engine from Google Cloud that can be run **on-premises, in other clouds, or in your own data centers.**

To understand it simply: It allows you to run the high-performance, enterprise-grade capabilities of Google's **AlloyDB** (a cloud-native database) on your own infrastructure.

Here is a breakdown of what makes it significant:

### 1. The "Best of Both Worlds" Architecture
Normally, you have to choose between:
*   **Managed Cloud Databases:** Easy to scale and manage, but you are locked into the cloud provider's infrastructure.
*   **Self-Managed Databases:** You have full control over the hardware/location, but you are responsible for scaling, patching, and high availability.

**AlloyDB Omni** bridges this gap. It provides the advanced features of a cloud-native database (like intelligent indexing, high availability, and massive scalability) while allowing you to run it anywhere.

Ctrl+C tuşuna basarak ilk terminalde bağlantı noktası yönlendirmeyi durdurun (hâlâ çalışıyorsa).

9. Gemma 4 modelini AlloyDB Omni'ye kaydetme

google_ml.create_model prosedürünü kullanarak Gemma 12B modelini AlloyDB Omni'ye kaydedin. İstekleri Kubernetes kümesi hizmetine yönlendirmek için http://gemma-12b-gpu-vllm-service:8000/v1/chat/completions değerini model_request_url olarak belirtin:

AlloyDB Omni uç nokta IP'sini alın:

echo "INSTANCE_IP=$(kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default -o jsonpath='{.status.primary.endpoint}')"

SSH kullanarak sanal makine örneğine bağlanın:

export ZONE=us-central1-a
gcloud compute ssh instance-1 --zone=$ZONE

Sanal makineye bağlandıktan sonra INSTANCE_IP değişkenini önceki adımdan (10.128.0.33 değeri örnek olarak verilmiştir, IP'nizle değiştirin) dışa aktarın:

export INSTANCE_IP=10.128.0.33

AlloyDB şifresini dışa aktarma:

export PGPASSWORD=VeryStrongPassword

demo veritabanına bağlanın:

psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"

psql oturumunda modeli kaydedin:

CALL
  google_ml.create_model(
    model_id => 'gemma-12b-gpu',
    model_request_url => 'http://gemma-12b-gpu-vllm-service:8000/v1/chat/completions',
    model_provider => 'custom',
    model_type => 'llm');

Modeli örnek bir SQL sorgusuyla test edin:

SELECT google_ml.predict_row(
  model_id => 'gemma-12b-gpu',
  request_body => json_build_object(
    'messages', json_build_array(
      json_build_object('role', 'user', 'content', 'What is AlloyDB Omni?'))))->'choices'->0->'message'->'content';

Sonuç penceresinden çıkıp psql istemine dönmek için q tuşuna basın.

AlloyDB Omni'de vektör aramayı LLM RAG ile birleştirme

LLM ile RAG'i (almayla artırılmış üretim) göstermek için vektör aramasını LLM isteğiyle birlikte kullanın.

SQL sorgusunu plsql'de çalıştırın:

WITH trees AS (
SELECT
        cp.product_name,
        cp.product_description AS description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id AS product_id
FROM
    cymbal_products cp
JOIN cymbal_embedding ce ON ce.uniq_id = cp.uniq_id
JOIN cymbal_inventory ci ON ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON cs.store_id = ci.store_id
WHERE
        ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (ce.embedding <=> embedding('embeddinggemma',
        'What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1),
prompt AS (
SELECT
        'You are a friendly advisor helping to find a product based on the customer''s needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","product_description":"some description","sale_price":10}
Here is the list of products:' || json_agg(trees) || 'The customer asked "What kind of fruit trees grow well here?"
You should give information about the product, price and some supplemental information' AS prompt_text
FROM
        trees),
response AS (
SELECT
        google_ml.predict_row(
          model_id =>'gemma-12b-gpu',
          request_body => json_build_object(
            'messages', json_build_array(
              json_build_object('role', 'user', 'content',prompt_text)
            )))->'choices'->0->'message'->'content' AS resp
FROM
        prompt)
SELECT
REPLACE(resp::text, '\n', CHR(10))
FROM
        response;

Beklenen çıktı:

----------------------------------------------------------------------------------------------------------------------------------------------
 "Hello there! I'd be happy to help you find the perfect tree for your garden.                                                               +
                                                                                                                                             +
 Based on your location, we have a wonderful option that would grow beautifully in your area:                                                +
                                                                                                                                             +
 **Cherry Tree**                                                                                                                             +
 *   **Price:** $75.00                                                                                                                       +
 *   **Description:** This is a stunning deciduous tree that not only provides a beautiful landscape but also produces delicious cherries.   +
 *   **Supplemental Information:**                                                                                                           +
     *   **Growth:** It grows to about 15 feet tall.                                                                                         +
     *   **Appearance:** You can look forward to dark green leaves in the summer that transform into a vibrant red in the fall.              +
     *   **Benefits:** It's a great choice if you're looking for both fruit and extra shade or privacy in your yard.                         +
     *   **Care Tips:** It performs best in a cool, moist climate with sandy soil. Since you are in a suitable zone, it should thrive nicely!+
                                                                                                                                             +
 Would you like more details on how to plant this, or would you like to proceed with an order?"
(1 row)

Sorgu, vektör arama sonuçlarıyla LLM'ye gönderilen istemi tamamlar.

Diğer sorguları deneyin ve RAG kalıplarıyla denemeler yapın. Sunulan mimarinin avantajı, tamamen kendi kendine yeterli olmasıdır. Veriler kümenizin dışına gönderilmez ve tamamen yalıtılmış ortamlarda çalışabilir.

psql oturumundan çıkma:

\q

Sanal makineyle SSH oturumunun bağlantısını kesin:

exit

AlloyDB Omni'nin daha fazla özellik ve laboratuvar içerdiğini unutmayın.

10. Ortamı temizleme

Google Cloud hesabınızın sürekli olarak ücretlendirilmesini önlemek için bu codelab'de oluşturulan kaynakları silin.

GKE kümesini silme

Cloud Shell'de GKE kümesini silin:

export PROJECT_ID=$(gcloud config get-value project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
gcloud container clusters delete ${CLUSTER_NAME} \
  --project=${PROJECT_ID} \
  --region=${LOCATION}

Beklenen çıktı:

student@cloudshell:~$ gcloud container clusters delete ${CLUSTER_NAME} \
>   --project=${PROJECT_ID} \
>   --region=${LOCATION}
The following clusters will be deleted.
 - [alloydb-ai-gke] in [us-central1]

Do you want to continue (Y/n)?  Y

Deleting cluster alloydb-ai-gke...done.
Deleted

İstemci VM'sini silme

Cloud Shell'de Compute Engine örneğini silin:

export PROJECT_ID=$(gcloud config get-value project)
export ZONE=us-central1-a
gcloud compute instances delete instance-1 \
  --project=${PROJECT_ID} \
  --zone=${ZONE}

Beklenen çıktı:

student@cloudshell:~$ export PROJECT_ID=$(gcloud config get project)
export ZONE=us-central1-a
gcloud compute instances delete instance-1 \
  --project=${PROJECT_ID} \
  --zone=${ZONE}
Your active configuration is: [cloudshell-5399]
The following instances will be deleted. Any attached disks configured to be auto-deleted will be deleted unless they are attached to any other instances or the `--keep-disks` flag is given and specifies them for keeping. Deleting a disk 
is irreversible and any data on the disk will be lost.
 - [instance-1] in [us-central1-a]

Do you want to continue (Y/n)?  Y

Deleted

Bu codelab için yeni bir proje oluşturduysanız Google Cloud Resource Manager'da projenin tamamını isteğe bağlı olarak silebilirsiniz.

11. Tebrikler

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

Kapsam dahilinde olanlar

  • AlloyDB Omni'yi GKE kümesine dağıtma
  • AlloyDB Omni'ye bağlanma
  • AlloyDB Omni'ye veri yükleme
  • Yapay zeka modellerini (yerleştirme ve LLM) GKE'ye dağıtma
  • AlloyDB Omni'ye yapay zeka modellerini kaydetme
  • Semantik arama için yerleştirmeler oluşturma
  • AlloyDB Omni'de semantik arama sorguları çalıştırma
  • AlloyDB Omni'de vektör dizinleri oluşturma ve kullanma

AlloyDB Omni'de yapay zeka ile çalışma hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.

Anket

Çıkış:

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

Sadece okuyun Okuyun ve alıştırmaları tamamlayın