AlloyDB Omni dan EmbeddingGemma dengan Gemma 4 di Kubernetes

1. Pengantar

Dalam codelab ini, Anda akan mempelajari cara men-deploy AlloyDB Omni di Google Kubernetes Engine (GKE) dan menggunakannya dengan model terbuka seperti EmbeddingGemma dan Gemma 4 untuk embedding dan prediksi. Menjalankan database dan model di cluster yang sama akan mengurangi latensi jaringan dan menghindari dependensi layanan pihak ketiga. Cara ini juga membantu memenuhi persyaratan kepatuhan dan residensi data karena data Anda tidak pernah keluar dari lingkungan Anda.

Diagram arsitektur AlloyDB Omni dan EmbeddingGemma di GKE

Prasyarat

  • Pemahaman dasar tentang Google Cloud dan konsol Google Cloud
  • Pengetahuan dasar tentang Kubernetes dan GKE
  • Pemahaman tentang antarmuka command line dan Google Cloud Shell

Yang akan Anda pelajari

  • Cara men-deploy AlloyDB Omni di cluster GKE
  • Cara terhubung ke AlloyDB Omni
  • Cara memuat data ke AlloyDB Omni
  • Cara men-deploy model AI (embedding dan LLM) ke GKE
  • Cara mendaftarkan model AI di AlloyDB Omni
  • Cara membuat embedding untuk penelusuran semantik
  • Cara menjalankan kueri penelusuran semantik di AlloyDB Omni
  • Cara membuat dan menggunakan indeks vektor di AlloyDB Omni

Yang Anda butuhkan

  • Akun Google Cloud dan project Google Cloud
  • Browser web seperti Chrome

2. Penyiapan dan persyaratan

Penyiapan project

  1. Login ke konsol Google Cloud. Jika belum memiliki akun Gmail atau Google Workspace, buat akun. Gunakan akun pribadi, bukan akun kantor atau sekolah.
  1. Buat project baru atau pilih project yang sudah ada. Di header Konsol Google Cloud, klik Select a project, lalu klik New Project.

Dialog pilih project di Konsol Google Cloud

Di jendela Select a project, klik New Project untuk membuka dialog pembuatan project.

Dialog pembuatan project baru

Pada dialog, masukkan Nama project dan pilih organisasi atau lokasi Anda.

Kolom input detail project

  • Project name adalah nama tampilan untuk peserta project ini. Nama project tidak digunakan oleh Google API, dan Anda dapat mengubahnya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (Anda tidak dapat mengubahnya setelah ditetapkan). Konsol Google Cloud otomatis membuat ID unik, atau Anda dapat memasukkan ID Anda sendiri. Dalam codelab ini, Anda mereferensikan project ID dengan placeholder .
  • Project Number adalah ID ketiga yang digunakan oleh beberapa API. Untuk mengetahui informasi selengkapnya, lihat dokumentasi Resource Manager.

Aktifkan penagihan

Jika menyiapkan penagihan menggunakan kredit Google Cloud, Anda dapat melewati langkah ini.

Untuk menyiapkan akun penagihan pribadi, aktifkan penagihan di konsol Google Cloud.

  • Menyelesaikan lab ini memerlukan biaya kurang dari $5 USD untuk resource Google Cloud.
  • Ikuti langkah-langkah pembersihan di akhir lab ini untuk menghapus resource dan menghindari biaya lebih lanjut.
  • Pengguna baru memenuhi syarat untuk mengikuti Uji Coba Gratis senilai$300 USD.

Mulai Cloud Shell

Dalam codelab ini, Anda menggunakan Google Cloud Shell, lingkungan command line yang berjalan di cloud.

Dari Konsol Google Cloud, klik ikon Activate Cloud Shell di toolbar kanan atas:

Tombol Activate Cloud Shell

Atau, tekan G, lalu S, atau buka Google Cloud Shell secara langsung.

Setelah terhubung, Cloud Shell akan menampilkan perintah terminal:

Screenshot terminal Google Cloud Shell

Cloud Shell mencakup penyimpanan persisten dan alat pengembangan. Anda dapat menjalankan semua langkah dalam codelab ini dari browser.

3. Mengaktifkan API

Untuk menggunakan Google Kubernetes Engine (GKE) untuk deployment model dan AlloyDB Omni, aktifkan Compute Engine dan GKE API di project Google Cloud Anda.

Di Cloud Shell, pastikan project ID Anda telah dikonfigurasi:

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

Jika project ID Anda belum ditentukan, konfigurasikan:

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

Aktifkan API yang diperlukan:

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

Output yang diharapkan:

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.

Anda dapat membaca tentang setiap API yang diaktifkan dalam dokumentasi.

4. Men-deploy AlloyDB Omni di GKE

Untuk men-deploy AlloyDB Omni di GKE, siapkan cluster Kubernetes dengan mengikuti persyaratan operator AlloyDB Omni.

Membuat cluster GKE

Deploy cluster GKE standar dengan kapasitas untuk menjalankan AlloyDB Omni, operator, dan container pemantauan. AlloyDB Omni memerlukan minimal dua CPU dan RAM 8 GB. Tutorial ini menggunakan jenis mesin n2-standard-4.

Tetapkan variabel lingkungan untuk deployment Anda:

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

Buat cluster GKE standar:

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

Output konsol yang diharapkan:

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

Menyiapkan cluster

Instal komponen yang diperlukan seperti cert-manager, pengontrol sertifikat native untuk Kubernetes. Untuk mengetahui detailnya, lihat dokumentasi penginstalan cert-manager.

Cloud Shell mencakup alat command line Kubernetes kubectl. Dapatkan kredensial cluster menggunakan gcloud:

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

Instal cert-manager menggunakan kubectl:

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

Output konsol yang diharapkan (disamarkan):

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

Menginstal operator AlloyDB Omni

Instal operator AlloyDB Omni menggunakan Helm.

Download dan instal diagram operator AlloyDB Omni:

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

Output konsol yang diharapkan (disamarkan):

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

Deploy cluster database.

Manifes berikut mengonfigurasi cluster database dengan googleMLExtension diaktifkan dan load balancer internal:

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

Nilai rahasia sandi adalah representasi Base64 dari VeryStrongPassword. Di lingkungan produksi, gunakan Google Secret Manager untuk mengelola sandi. Untuk mengetahui detailnya, lihat dokumentasi Secret Manager.

Manifes disimpan sebagai my-omni.yaml. Di Cloud Shell, klik Open Editor di pojok kanan atas jendela terminal dan baca file.

Buka Editor di Cloud Shell

Setelah membaca manifes my-omni.yaml, klik Open Terminal untuk kembali ke command prompt.

Buka Terminal di Cloud Shell

Terapkan manifes my-omni.yaml:

kubectl apply -f my-omni.yaml

Output konsol yang diharapkan:

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

Periksa status cluster my-omni:

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

Selama deployment, cluster database bertransisi melalui fase penyiapan hingga mencapai status DBClusterReady.

Output konsol yang diharapkan:

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

Secara opsional, Anda dapat memantau deployment cluster menggunakan perintah kubectl log:

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

Terhubung ke AlloyDB Omni

Setelah cluster siap, hubungkan ke pod database menggunakan klien PostgreSQL (psql). Sandinya adalah VeryStrongPassword seperti yang ditentukan dalam my-omni.yaml:

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

Contoh output konsol:

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

Keluar dari sesi psql dengan mengetik \q dan menekan Enter:

postgres=# \q

5. Men-deploy model EmbeddingGemma di GKE

Untuk menguji integrasi AI AlloyDB Omni dengan model lokal, deploy model embedding ke cluster GKE. Tutorial ini menggunakan model EmbeddingGemma dari Google.

Membuat node pool untuk model

Untuk menjalankan inferensi model, siapkan node pool khusus. Anda dapat menggunakan kumpulan node khusus CPU atau kumpulan node yang dipercepat GPU (seperti g2-standard-8 dengan GPU NVIDIA L4). Tutorial ini menggunakan node pool berbasis CPU dengan jenis mesin c3-standard-8.

Buat node pool CPU node tunggal:

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

Output yang diharapkan:

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

Mendapatkan token Hugging Face

Tutorial ini men-deploy model EmbeddingGemma dari Hugging Face. Untuk mengakses bobot model, buat token akses Hugging Face:

  1. Login atau buat akun di Hugging Face.
  2. Buka Profil Anda > Token Akses.
  3. Klik Buat token baru.
  4. Masukkan nama untuk token dan pilih peran Baca.
  5. Klik Create token, lalu salin nilai token yang dibuat.
  6. Setujui persyaratan model di halaman model EmbeddingGemma jika Anda belum melakukannya.

Buat secret Kubernetes yang berisi token Hugging Face Anda di Cloud Shell (ganti placeholder token dengan token Anda):

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 -

Menyiapkan manifes deployment

Untuk men-deploy model, gunakan paket container Text Embeddings Inference (TEI) dari Hugging Face. Untuk mengetahui informasi selengkapnya, lihat dokumentasi TEI GKE Hugging Face.

Clone repositori deployment dari GitHub:

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

Periksa dan ubah manifes konfigurasi CPU:

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

Manifes yang diperbarui untuk deployment CPU:

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"

Simpan perubahan dengan menekan ctrl+s dan beralih kembali ke terminal.

Men-deploy model

Terapkan manifes untuk men-deploy server TEI:

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

Pantau deployment hingga dalam status siap:

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'

Periksa layanan Kubernetes tei-service:

kubectl get service tei-service

Output yang diharapkan:

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

Layanan CLUSTER-IP melayani permintaan secara internal di http://34.118.233.48:8080/embed.

Uji endpoint model secara lokal menggunakan kubectl port-forward:

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

Buka tab Cloud Shell kedua dengan mengklik + di bagian atas terminal:

Menambahkan tab Cloud Shell

Di tab baru, uji pembuatan embedding dengan curl:

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

Output yang diharapkan (array vektor):

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

Hentikan penerusan port di tab pertama dengan menekan ctrl+c.

6. Mendaftarkan model embedding di AlloyDB Omni

Untuk menggunakan model yang di-deploy dari AlloyDB Omni, buat database, tentukan fungsi transformasi, dan daftarkan endpoint model.

Buat VM klien dan database

Buat instance VM Compute Engine di VPC yang sama untuk bertindak sebagai jump host klien:

Diagram arsitektur jaringan yang menampilkan VM klien dan AlloyDB Omni

Di Cloud Shell, buat VM klien:

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

Ambil IP endpoint AlloyDB Omni:

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

Output yang diharapkan:

INSTANCE_IP=10.128.0.33

Nilai INSTANCE_IP adalah IP load balancer internal untuk cluster AlloyDB Omni. Dalam contoh ini, nilainya adalah 10.131.0.33.

Hubungkan ke instance VM menggunakan SSH:

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

Di sesi SSH pada instance-1, instal klien PostgreSQL:

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

Ekspor IP load balancer AlloyDB Omni (ganti dengan IP PRIMARYENDPOINT Anda):

export INSTANCE_IP=10.131.0.33

Terhubung ke AlloyDB Omni menggunakan psql (sandi adalah VeryStrongPassword):

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

Di sesi psql, buat database demo:

CREATE DATABASE demo;

Beralih ke database demo:

\c demo

Membuat fungsi transformasi

Endpoint sematan kustom memerlukan fungsi transformasi input dan output untuk menyesuaikan format data antara AlloyDB Omni dan API model.

Buat fungsi transformasi input:

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

Output yang diharapkan:

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

Buat fungsi transformasi output untuk mengurai respons array vektor:

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

Output yang diharapkan:

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

Mendaftarkan model

Daftarkan model di AlloyDB Omni menggunakan prosedur google_ml.create_model. Tentukan http://tei-service:8080/embed sebagai model_request_url untuk merutekan permintaan ke layanan cluster Kubernetes:

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');

Output yang diharapkan:

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

Uji model terdaftar dengan contoh kueri SQL:

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

Fungsi ini menampilkan representasi array bilangan riil yang dihasilkan oleh model EmbeddingGemma lokal yang berjalan di GKE.

Tekan q untuk kembali ke perintah sesi psql.

Keluar dari sesi psql:

\q

7. Menguji model dengan data sampel

Memuat data sampel

Tutorial ini menggunakan set data retail Cymbal untuk mendemonstrasikan penelusuran kemiripan vektor. Anda akan menggunakan Google Cloud SDK dan klien PostgreSQL untuk mengimpor data ke AlloyDB Omni.

Pada sesi SSH di instance-1, hubungkan ke database demo dan aktifkan ekstensi vector:

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

Di sesi psql:

CREATE EXTENSION IF NOT EXISTS vector;

Keluar dari sesi psql:

\q

Download dan terapkan skema untuk membuat tabel di database demo:

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

Output yang diharapkan:

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

Verifikasi tabel yang dibuat:

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

Output yang diharapkan:

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)

Muat data ke tabel cymbal_products:

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"

Output yang diharapkan:

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

Berikut adalah contoh beberapa baris dari tabel cymbal_products.

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"

Output yang diharapkan:

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

Muat data ke tabel cymbal_inventory:

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"

Output yang diharapkan:

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

Berikut adalah contoh beberapa baris dari tabel cymbal_inventory.

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

Output:

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

Muat data ke tabel cymbal_stores:

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"

Output konsol yang diharapkan:

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

Berikut adalah contoh beberapa baris dari tabel cymbal_stores.

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

Output:

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

Membangun embedding

Hubungkan ke database demo menggunakan psql dan buat sematan untuk produk yang dijelaskan dalam tabel cymbal_products berdasarkan deskripsi produk.

Hubungkan ke database demo:

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

Gunakan kolom embedding berjenis vector untuk menyimpan embedding teks yang dihasilkan untuk deskripsi produk.

Aktifkan pengaturan waktu kueri:

\timing

Buat embedding untuk setiap deskripsi produk dan simpan di tabel cymbal_embedding:

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

Output yang diharapkan:

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

Menjalankan kueri penelusuran semantik

Dalam sesi psql, temukan lima produk teratas yang cocok dengan pertanyaan "What kind of fruit trees grow well here?" menggunakan jarak kosinus (<=>):

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;

Output yang diharapkan:

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

Kueri berjalan selama 83 md dan menampilkan daftar pohon dari tabel cymbal_products yang cocok dengan permintaan dan inventaris tersedia di toko dengan nomor 1583.

Buat indeks ANN

Dengan set data kecil, Anda dapat dengan mudah menggunakan penelusuran persis yang memindai semua sematan, tetapi saat data bertambah, waktu pemuatan dan respons juga akan meningkat. Untuk meningkatkan performa, Anda dapat membuat indeks pada data sematan. Berikut adalah contoh cara melakukannya menggunakan indeks ScaNN Google untuk data vektor.

Hubungkan kembali ke database demo jika koneksi Anda terputus:

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

Aktifkan ekstensi alloydb_scann:

CREATE EXTENSION IF NOT EXISTS alloydb_scann;

Buat indeks ScaNN pada kolom embedding:

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

Jalankan kembali kueri penelusuran semantik untuk membandingkan performa eksekusi:

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;

Output yang diharapkan:

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

Waktu eksekusi kueri telah sedikit berkurang dan peningkatan akan lebih terlihat dengan set data yang lebih besar. Data yang ditampilkan harus sama atau sangat mirip dengan data yang kita dapatkan tanpa indeks.

Coba kueri lain dan baca selengkapnya tentang cara mengoptimalkan indeks vektor dalam dokumentasi.

Keluar dari sesi psql:

\q

Kembali ke Google Cloud Shell dengan menutup koneksi dari sesi SSH instance-1 dengan menekan CTRL+D atau mengetik exit.

8. Men-deploy Gemma dengan vLLM

Menambahkan node pool untuk Gemma

Pertama, periksa jenis node yang tersedia di wilayah Anda:

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

Anda akan melihat daftar jenis akselerator yang tersedia, termasuk akselerator nvidia-l4. Sekarang buat node pool dengan jenis akselerator nvidia-l4:

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

Buat manifes deployment untuk model Google Gemini 4 12B menggunakan vLLM:

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

Terapkan deployment gemma-12b-gpu-vllm-deployment.yaml yang disimpan:

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

Output yang diharapkan:

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

Tunggu hingga deployment selesai dan model dimuat. Proses ini mungkin memerlukan waktu beberapa menit.

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'

Output yang diharapkan:

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

Menguji model. Aktifkan penerusan port untuk mengakses model:

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

Di jendela terminal lain, gunakan curl untuk mengirim perintah ke model:

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'

Output yang diharapkan:

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

Hentikan penerusan port di terminal pertama (jika masih berjalan) dengan menekan Ctrl+C.

9. Mendaftarkan model Gemma 4 di AlloyDB Omni

Daftarkan model Gemma 12B di AlloyDB Omni menggunakan prosedur google_ml.create_model. Tentukan http://gemma-12b-gpu-vllm-service:8000/v1/chat/completions sebagai model_request_url untuk merutekan permintaan ke layanan cluster Kubernetes:

Ambil IP endpoint AlloyDB Omni:

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

Hubungkan ke instance VM menggunakan SSH:

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

Setelah terhubung ke VM, ekspor variabel INSTANCE_IP dari langkah sebelumnya (nilai 10.128.0.33 diberikan sebagai contoh - ganti dengan IP Anda):

export INSTANCE_IP=10.128.0.33

Mengekspor sandi AlloyDB:

export PGPASSWORD=VeryStrongPassword

Hubungkan ke database demo:

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

Di sesi psql, daftarkan model:

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');

Uji model dengan contoh kueri SQL:

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';

Tekan q untuk keluar dari jendela hasil dan kembali ke perintah psql

Menggabungkan penelusuran vektor dengan RAG LLM di AlloyDB Omni

Gunakan penelusuran vektor dengan permintaan LLM untuk mendemonstrasikan RAG (Retrieval-Augmented Generation) dengan LLM.

Jalankan kueri SQL di plsql:

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;

Output yang diharapkan:

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

Kueri melengkapi perintah ke LLM dengan hasil penelusuran vektor.

Coba kueri lain dan bereksperimen dengan pola RAG. Manfaat arsitektur yang disajikan adalah kecukupan dirinya sepenuhnya. Data tidak dikirim ke luar cluster Anda dan dapat berjalan di lingkungan yang sepenuhnya terisolasi.

Keluar dari sesi psql:

\q

Putuskan koneksi dari sesi SSH ke VM:

exit

Jangan lupa bahwa AlloyDB Omni memiliki lebih banyak fitur dan lab.

10. Membersihkan lingkungan

Untuk menghindari biaya berkelanjutan pada akun Google Cloud Anda, hapus resource yang dibuat dalam codelab ini.

Menghapus cluster GKE

Di Cloud Shell, hapus cluster GKE:

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}

Output yang diharapkan:

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

Menghapus VM klien

Di Cloud Shell, hapus instance Compute Engine:

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

Output yang diharapkan:

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

Jika Anda membuat project baru untuk codelab ini, Anda dapat menghapus seluruh project di Google Cloud Resource Manager.

11. Selamat

Selamat, Anda telah menyelesaikan codelab ini!

Yang telah Anda pelajari

  • Cara men-deploy AlloyDB Omni di cluster GKE
  • Cara terhubung ke AlloyDB Omni
  • Cara memuat data ke AlloyDB Omni
  • Cara men-deploy model AI (embedding dan LLM) ke GKE
  • Cara mendaftarkan model AI di AlloyDB Omni
  • Cara membuat embedding untuk penelusuran semantik
  • Cara menjalankan kueri penelusuran semantik di AlloyDB Omni
  • Cara membuat dan menggunakan indeks vektor di AlloyDB Omni

Anda dapat membaca selengkapnya tentang cara menggunakan AI di AlloyDB Omni dalam dokumentasi.

Survei

Output:

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membaca dan menyelesaikan latihannya