۱. مقدمه
در این codelab، با نحوه مستقر کردن AlloyDB Omni در Google Kubernetes Engine (GKE) و استفاده از آن با مدلهای باز مثل EmbeddingGemma و Gemma 4 برای جاسازیها و پیشبینیها آشنا خواهید شد. اجرای پایگاه داده و مدلها در یک خوشه، تأخیر شبکه را کاهش میدهد و از وابستگی به سرویسهای شخص ثالث جلوگیری میکند. این کار همچنین به برآورده کردن الزامات انطباق و اقامت داده کمک میکند زیرا دادههای شما هرگز محیط شما را ترک نمیکند.

پیشنیازها
- درک اولیه از Google Cloud و کنسول Google Cloud
- دانش پایه درباره Kubernetes و GKE
- آشنایی با میانای خط فرمان و Google Cloud Shell
آنچه خواهید آموخت
- نحوه مستقر کردن AlloyDB Omni در خوشه GKE
- نحوه متصل شدن به AlloyDB Omni
- نحوه بار کردن دادهها در AlloyDB Omni
- نحوه مستقر کردن مدلهای هوش مصنوعی (جاسازی و مدل زبانی بزرگ) در GKE
- نحوه ثبت کردن مدلهای هوش مصنوعی در AlloyDB Omni
- نحوه تولید جاسازی برای جستجوی معنایی
- نحوه اجرای پُرسمانهای جستجوی معنایی در AlloyDB Omni
- نحوه ایجاد کردن و استفاده کردن از نمایههای برداری در AlloyDB Omni
آنچه نیاز خواهید داشت
- حساب Google Cloud و پروژه Google Cloud
- مرورگر وب مانند Chrome
۲. راهاندازی و الزامات
راهاندازی پروژه
- به سیستم کنسول Google Cloud وارد شوید. اگر ازقبل حساب Gmail یا Google Workspace ندارید، حسابی ایجاد کنید. بهجای حساب کاری یا تحصیلی، از حساب شخصی استفاده کنید.
- پروژه جدیدی ایجاد کنید یا پروژه موجودی را انتخاب کنید. در سرصفحه کنسول Google Cloud، روی انتخاب پروژه کلیک کنید، سپس روی پروژه جدید کلیک کنید.

در پنجره انتخاب پروژه، روی پروژه جدید کلیک کنید تا کادر گفتگوی ایجاد پروژه باز شود.

در کادر گفتگو، نام پروژه را وارد کنید و سازمان یا مکانتان را انتخاب کنید.

- نام پروژه نام نمایشی برای شرکتکنندگان این پروژه است. نام پروژه توسط Google APIs استفاده نمیشود و میتوانید آن را هرزمان خواستید تغییر دهید.
- شناسه پروژه در همه پروژههای Google Cloud منحصربهفرد است و تغییرناپذیر است (نمیتوانید آن را پساز تنظیم تغییر دهید). کنسول Google Cloud بهطور خودکار شناسه یکتایی تولید میکند، یا میتوانید شناسه خودتان را ارائه دهید. در این codelab، شناسه پروژهتان را با جایبان
ارجاع میدهید. - شماره پروژه شناسه سومی است که برخیاز میاناهای برنامهسازی کاربردی از آن استفاده میکنند. برای اطلاعات بیشتر، به اسناد Resource Manager مراجعه کنید.
فعال کردن صورتحساب
اگر صورتحساب را بااستفاده از اعتبارهای Google Cloud راهاندازی کردهاید، میتوانید از این مرحله رد شوید.
برای راهاندازی حساب صورتحساب شخصی، صورتحساب را در کنسول Google Cloud فعال کنید.
- تکمیل این آزمایشی کمتر از ۵ دلار امریکا در منابع Google Cloud هزینه دارد.
- مراحل پاکسازی را در پایان این آزمایشگاه دنبال کنید تا منابع را حذف کنید و از هزینههای بیشتر جلوگیری کنید.
- کاربران جدید واجدشرایط دوره آزمایشی رایگان ۳۰۰ دلاری هستند.
شروع Cloud Shell
در این codelab، از Google Cloud Shell استفاده میکنید که محیط خط فرمانی است که در فضای ابری اجرا میشود.
از کنسول Google Cloud، روی نماد فعالسازی Cloud Shell در نوارابزار بالا سمت چپ کلیک کنید:

یا کلید G و سپس S را فشار دهید، یا Google Cloud Shell را مستقیماً باز کنید.
وقتی متصل شد، Cloud Shell پیامواره پایانه را نمایش میدهد:

Cloud Shell شامل فضای ذخیرهسازی پایدار و ابزارهای توسعه است. میتوانید همه مراحل این codelab را از مرورگرتان اجرا کنید.
۳. فعال کردن میاناهای برنامهسازی کاربردی
برای استفاده از Google Kubernetes Engine (GKE) برای AlloyDB Omni و استقرار مدل، Compute Engine و GKE API را در پروژه Google Cloud خود فعال کنید.
در Cloud Shell، بررسی کنید که شناسه پروژهتان پیکربندی شده باشد:
PROJECT_ID=$(gcloud config get-value project)
echo $PROJECT_ID
اگر شناسه پروژه شما تعریف نشده است، آن را پیکربندی کنید:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID
میاناهای برنامهسازی کاربردی لازم را فعال کنید:
gcloud services enable compute.googleapis.com
gcloud services enable container.googleapis.com
خروجی موردانتظار:
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.
میتوانید درباره هر API فعالشده در اسناد مطالعه کنید.
۴. مستقر کردن AlloyDB Omni در GKE
برای مستقر کردن AlloyDB Omni در GKE، یک خوشه Kubernetes را طبق الزامات اپراتور AlloyDB Omni آماده کنید.
ایجاد خوشه GKE
خوشه GKE خلبان خودکار را برای اجرای AlloyDB Omni، اپراتور، و پایش محفظهها مستقر کنید. بااستفاده از خلبان خودکار، استقرار را ساده میکنیم - همه منابع برای اپراتور AlloyDB Omni، خوشه، و دیگر مؤلفهها بهطور خودکار اختصاص داده خواهند شد.
منطقهای را که منابعتان را در آن مستقر میکنید انتخاب کنید. منطقهای را انتخاب کنید که ازنظر جغرافیایی به مکان شما نزدیک باشد:
export LOCATION=<your region>
متغیرهای محیطی را برای استقرار خود تنظیم کنید:
export PROJECT_ID=$(gcloud config get-value project)
export CLUSTER_NAME=alloydb-ai-gke
خوشه GKE خلبان خودکار را ایجاد کنید:
gcloud container clusters create-auto ${CLUSTER_NAME} \
--project=${PROJECT_ID} \
--region=${LOCATION}
برونداد کنسول موردانتظار:
student@cloudshell:~ (test-project-001-402417)$ export PROJECT_ID=$(gcloud config get project)
export CLUSTER_NAME=alloydb-ai-gke
Your active configuration is: [test-project-001-402417]
student@cloudshell:~ (test-project-001-402417)$ gcloud container clusters create-auto ${CLUSTER_NAME} \
> --project=${PROJECT_ID} \
> --region=${LOCATION}
Creating cluster alloydb-ai-gke in us-east4... Cluster is being health-checked.
..⠹
Creating cluster alloydb-ai-gke in us-east4... Cluster is being health-checked
(Kubernetes Control Plane is healthy)...done.
Created [https://container.googleapis.com/v1/projects/gleb-genai-002/zones/us-east4/clusters/alloydb-ai-gke].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-east4/alloydb-ai-gke?project=gleb-genai-002
kubeconfig entry generated for alloydb-ai-gke.
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS STACK_TYPE
alloydb-ai-gke us-east4 1.36.4-gke.1391002 34.145.214.51 ek-standard-8 1.36.4-gke.1391002 3 RUNNING IPV4
آماده کردن خوشه
اجزای لازم را نصب کنید، مثلاً cert-manager، کنترلکننده گواهینامهها برای Kubernetes. برای جزئیات، به مستندات نصب cert-manager مراجعه کنید.
Cloud Shell شامل ابزار خط فرمان Kubernetes kubectl و helm است. بااستفاده از gcloud، اطلاعات کاربری خوشه را دریافت کنید:
gcloud container clusters get-credentials ${CLUSTER_NAME} --region=${LOCATION}
نصب cert-manager بااستفاده از helm:
helm install \
cert-manager oci://quay.io/jetstack/charts/cert-manager \
--version v1.21.2 \
--namespace cert-manager \
--create-namespace \
--set featureGates="ServerSideApply=true" \
--set global.leaderElection.namespace=cert-manager \
--set "extraArgs={--certificate-request-minimum-backoff-duration=15s,--certificate-request-maximum-backoff-duration=5m}" \
--set crds.enabled=true
برونداد کنسول موردانتظار (ویرایششده):
student@cloudshell:~$ elm install \
> cert-manager oci://quay.io/jetstack/charts/cert-manager \
> --version v1.21.2 \
> --namespace cert-manager \
> --create-namespace \
> --set featureGates="ServerSideApply=true" \
> --set global.leaderElection.namespace=cert-manager \
> --set "extraArgs={--certificate-request-minimum-backoff-duration=15s,--certificate-request-maximum-backoff-duration=5m}" \
> --set crds.enabled=true
Pulled: quay.io/jetstack/charts/cert-manager:v1.21.2
Digest: sha256:634dce9c13b56677a2c05e2ab76c312d0be2664022d5dd05815da67e1fd5f610
I1016 12:25:06.128464 30644 warnings.go:107] "Warning: autopilot-default-resources-mutator:Autopilot updated Deployment cert-manager/cert-manager-cainjector: defaulted unspecified 'cpu' resource for containers [cert-manager-cainjector] (see http://g.co/gke/autopilot-defaults)."
I1016 12:25:06.129972 30644 warnings.go:107] "Warning: autopilot-default-resources-mutator:Autopilot updated Deployment cert-manager/cert-manager: defaulted unspecified 'cpu' resource for containers [cert-manager-controller] (see http://g.co/gke/autopilot-defaults)."
I1016 12:25:06.134580 30644 warnings.go:107] "Warning: autopilot-default-resources-mutator:Autopilot updated Deployment cert-manager/cert-manager-webhook: defaulted unspecified 'cpu' resource for containers [cert-manager-webhook] (see http://g.co/gke/autopilot-defaults)."
I1016 12:25:06.250590 30644 warnings.go:107] "Warning: AdmissionWebhookController: mutated namespaceselector of the webhooks to enforce GKE Autopilot policies."
I1016 12:25:09.758249 30644 warnings.go:107] "Warning: autopilot-default-resources-mutator:Autopilot updated Job cert-manager/cert-manager-startupapicheck: defaulted unspecified 'cpu' resource for containers [cert-manager-startupapicheck] (see http://g.co/gke/autopilot-defaults)."
NAME: cert-manager
LAST DEPLOYED: Fri Oct 16 12:24:57 2026
NAMESPACE: cert-manager
STATUS: deployed
REVISION: 1
DESCRIPTION: Install complete
TEST SUITE: None
NOTES:
cert-manager v1.21.2 has been deployed successfully!
نصب کردن اپراتور AlloyDB Omni
اپراتور AlloyDB Omni را بااستفاده از Helm نصب کنید.
نمودار اپراتور AlloyDB Omni را بارگیری و نصب کنید:
helm install alloydbomni-operator oci://gcr.io/alloydb-omni/alloydbomni-operator \
--version 1.9.0 \
--create-namespace \
--namespace alloydb-omni-system \
$(helm install --help | grep -q -- '--rollback-on-failure' && echo '--rollback-on-failure' || echo '--atomic') \
--timeout 5m
برونداد کنسول موردانتظار (ویرایششده):
student@cloudshell:~$ helm install alloydbomni-operator oci://gcr.io/alloydb-omni/alloydbomni-operator \ > --version 1.9.0 \ > --create-namespace \ > --namespace alloydb-omni-system \ > $(helm install --help | grep -q -- '--rollback-on-failure' && echo '--rollback-on-failure' || echo '--atomic') \ > --timeout 5m Pulled: gcr.io/alloydb-omni/alloydbomni-operator:1.9.0 Digest: sha256:4f6cc3f0c1fbe003ab7d0119afee516e5c67ec950cd2909b418e5a3f6f09d1f6 I1016 12:28:50.088533 30982 warnings.go:107] "Warning: autopilot-default-resources-mutator:Autopilot updated Deployment alloydb-omni-system/fleet-controller-manager: adjusted 'cpu' resource to meet requirements for containers [fleet-manager] (see http://g.co/gke/autopilot-defaults)." I1016 12:28:50.092917 30982 warnings.go:107] "Warning: autopilot-default-resources-mutator:Autopilot updated Deployment alloydb-omni-system/local-controller-manager: adjusted 'cpu' resource to meet requirements for containers [local-manager] (see http://g.co/gke/autopilot-defaults)." I1016 12:28:50.229717 30982 warnings.go:107] "Warning: AdmissionWebhookController: mutated namespaceselector of the webhooks to enforce GKE Autopilot policies." I1016 12:28:50.238578 30982 warnings.go:107] "Warning: AdmissionWebhookController: mutated namespaceselector of the webhooks to enforce GKE Autopilot policies." NAME: alloydbomni-operator LAST DEPLOYED: Fri Oct 16 12:28:45 2026 NAMESPACE: alloydb-omni-system STATUS: deployed REVISION: 1 DESCRIPTION: Install complete TEST SUITE: None
خوشه پایگاه داده را مستقر کنید.
مانیفست زیر خوشه پایگاه داده را با googleMLExtension فعالشده و متعادلکننده بار داخلی پیکربندی میکند:
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.4.0"
primarySpec:
adminUser:
passwordRef:
name: db-pw-my-omni
features:
googleMLExtension:
enabled: true
resources:
cpu: 1
memory: 8Gi
disks:
- name: DataDisk
size: 20Gi
dbLoadBalancerOptions:
annotations:
networking.gke.io/load-balancer-type: "internal"
allowExternalIncomingTraffic: true
EOF
مقدار رمز گذرواژه نمایش Base64 از VeryStrongPassword است. در محیطهای تولید، از Google Secret Manager برای مدیریت گذرواژهها استفاده کنید. برای جزئیات، به اسناد Secret Manager مراجعه کنید.
مانیفست بهصورت my-omni.yaml ذخیره میشود. در Cloud Shell، روی باز کردن ویرایشگر در گوشه بالا سمت چپ پنجره پایانه کلیک کنید و فایل را بخوانید.

پساز خواندن مانیفست my-omni.yaml، روی باز کردن پایانه کلیک کنید تا به اعلان فرمان برگردید.

مانیفست my-omni.yaml را اعمال کنید:
kubectl apply -f my-omni.yaml
برونداد کنسول موردانتظار:
secret/db-pw-my-omni created dbcluster.alloydbomni.dbadmin.goog/my-omni created
وضعیت خوشه my-omni را بررسی کنید:
kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default
درطول استقرار، خوشه پایگاه داده مراحل راهاندازی را طی میکند تا به وضعیت DBClusterReady برسد.
برونداد کنسول موردانتظار:
$ kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default NAME PRIMARYENDPOINT PRIMARYPHASE DBCLUSTERPHASE HAREADYSTATUS HAREADYREASON my-omni 10.131.0.33 Ready DBClusterReady
درصورت تمایل میتوانید بااستفاده از فرمان kubectl log، بر استقرار خوشه نظارت کنید:
kubectl logs -l alloydbomni.internal.dbadmin.goog/dbcluster=my-omni --all-containers -f
اتصال به AlloyDB Omni
وقتی خوشه آماده شد، بااستفاده از کلاینت PostgreSQL (psql) به پاد پایگاه داده متصل شوید. گذرواژه VeryStrongPassword است، همانطور که در 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
نمونه برونداد کنسول:
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.4)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off, ALPN: postgresql)
Type "help" for help.
postgres=#
با تایپ کردن \q و فشار دادن کلید Enter، از جلسه psql خارج شوید:
postgres=# \q
۵. مستقر کردن مدل EmbeddingGemma در GKE
برای آزمایش کردن ادغام AlloyDB Omni AI با مدلهای محلی، یک مدل جاسازی را در خوشه GKE مستقر کنید. این آموزش از مدل EmbeddingGemma از Google استفاده میکند.
دریافت کردن کد Hugging Face
این آموزش مدل EmbeddingGemma را از Hugging Face مستقر میکند. برای دسترسی به وزنهای مدل، کد دسترسی Hugging Face تولید کنید:
- به سیستم حساب Hugging Face وارد شوید یا حسابی ایجاد کنید.
- به نمایه شما > کدهای دسترسی پیمایش کنید.
- روی ایجاد کردن کد جدید کلیک کنید.
- نامی برای کد وارد کنید و نقش خواندن را انتخاب کنید.
- روی ایجاد کردن کد کلیک کنید و مقدار کد تولیدشده را کپی کنید.
- اگر قبلاً شرایط مدل را در صفحه مدل EmbeddingGemma نپذیرفتهاید، اکنون بپذیرید.
یک کلید Kubernetes حاوی کد Hugging Face خود در Cloud Shell ایجاد کنید (جایبان کد را با کد خود جایگزین کنید):
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 -
آمادهسازی مانیفست استقرار
برای استقرار مدل، از بسته محفظه Text Embeddings Inference (TEI) در Hugging Face استفاده کنید. برای اطلاعات بیشتر، به اسناد Hugging Face GKE TEI مراجعه کنید.
همسانهسازی کردن مخزن استقرار از GitHub:
git clone https://github.com/huggingface/Google-Cloud-Containers
مانیفست پیکربندی CPU را بررسی و اصلاح کنید:
edit Google-Cloud-Containers/examples/gke/tei-deployment/cpu-config/deployment.yaml
مانیفست بهروزشده برای استقرار 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"
با فشار دادن ctrl+s، تغییرات را ذخیره کنید و به پایانه برگردید.
مستقر کردن مدل
مانیفست را برای پیادهسازی سرور TEI اعمال کنید:
kubectl apply -f Google-Cloud-Containers/examples/gke/tei-deployment/cpu-config
استقرار را تا زمانی که در وضعیت آماده قرار گیرد پایش کنید:
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'
سرویس Kubernetes tei-service را بررسی کنید:
kubectl get service tei-service
خروجی موردانتظار:
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 درخواستها را بهطور داخلی در http://34.118.233.48:8080/embed ارائه میدهد.
نقطه پایانی مدل را بهطور محلی بااستفاده از kubectl port-forward آزمایش کنید:
kubectl port-forward service/tei-service 8080:8080
با کلیک کردن روی + در بالای پایانه، برگه Cloud Shell دومی را باز کنید:

در برگه جدید، تولید جاسازی را با curl آزمایش کنید:
curl http://localhost:8080/embed \
-X POST \
-d '{"inputs":"Test"}' \
-H 'Content-Type: application/json'
خروجی موردانتظار (آرایه برداری):
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، بازارسال درگاه را در برگه اول متوقف کنید.
۶. ثبت کردن مدل جاسازی در AlloyDB Omni
برای استفاده از مدل مستقرشده از AlloyDB Omni، پایگاه دادهای ایجاد کنید، توابع تبدیل را تعریف کنید، و نقطه پایانی مدل را ثبت کنید.
ایجاد ماشین مجازی کارخواه و پایگاه داده
نمونه ماشین مجازی Compute Engine در همان VPC ایجاد کنید تا بهعنوان میزبان پرش کارخواه عمل کند:

در Cloud Shell، ماشین مجازی کارخواه را ایجاد کنید:
export ZONE=${LOCATION}-a
gcloud compute instances create instance-1 \
--zone=$ZONE
بازیابی IP نقطه پایانی AlloyDB Omni:
echo "INSTANCE_IP=$(kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default -o jsonpath='{.status.primary.endpoint}')"
خروجی موردانتظار:
INSTANCE_IP=10.128.0.33
مقدار INSTANCE_IP نشانی IP ترازکننده بار داخلی برای خوشه AlloyDB Omni است. در این مثال، 10.131.0.33 است.
بااستفاده از SSH به نمونه VM متصل شوید:
gcloud compute ssh instance-1 --zone=$ZONE
در جلسه SSH در instance-1، کارخواه PostgreSQL را نصب کنید:
sudo apt-get update && sudo apt-get install --yes postgresql-client
نشانی IP توازنگر بار AlloyDB Omni را صادر کنید (با نشانی IP PRIMARYENDPOINT خودتان جایگزین کنید):
export INSTANCE_IP=10.131.0.33
بااستفاده از psql به AlloyDB Omni متصل شوید (گذرواژه VeryStrongPassword است):
psql "host=$INSTANCE_IP user=postgres sslmode=require"
در جلسه psql، پایگاه داده demo را ایجاد کنید:
CREATE DATABASE demo;
به پایگاه داده demo بروید:
\c demo
ایجاد توابع تبدیل
نقاط پایانی جاسازی سفارشی به توابع تبدیل ورودی و خروجی نیاز دارند تا قالبهای داده را بین AlloyDB Omni و میانای برنامهسازی کاربردی مدل تطبیق دهند.
تابع تبدیل ورودی را ایجاد کنید:
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;
$$;
خروجی موردانتظار:
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=#
تابع تبدیل خروجی را برای تجزیه پاسخ آرایه برداری ایجاد کنید:
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;
$$;
خروجی موردانتظار:
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=#
ثبت مدل
مدل را بااستفاده از رویه google_ml.create_model در AlloyDB Omni ثبت کنید. http://tei-service:8080/embed را بهعنوان model_request_url برای مسیریابی درخواستها به سرویس خوشه 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');
خروجی موردانتظار:
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=#
مدل ثبتشده را با پُرسمان SQL نمونه آزمایش کنید:
SELECT google_ml.embedding('embeddinggemma', 'What is AlloyDB Omni?');
این تابع نمایش آرایه اعداد حقیقی را که توسط مدل EmbeddingGemma محلی درحال اجرا در GKE تولید شده است برمیگرداند.
برای برگشتن به پیامواره جلسه psql، q را فشار دهید.
از جلسه psql خارج شوید:
\q
۷. آزمایش کردن مدل با دادههای نمونه
بار کردن دادههای نمونهگیریشده
این آموزش گامبهگام از مجموعه داده خردهفروشی Cymbal برای نمایش جستجوی شباهت برداری استفاده میکند. برای وارد کردن دادهها به AlloyDB Omni، از Google Cloud SDK و کارخواه PostgreSQL استفاده خواهید کرد.
در جلسه «پوسته ایمن» در instance-1، به پایگاه داده نمایشی متصل شوید و افزونه vector را فعال کنید:
psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"
در جلسه psql:
CREATE EXTENSION IF NOT EXISTS vector;
از جلسه psql خارج شوید:
\q
طرحواره را بارگیری و اعمال کنید تا جدولها در پایگاه داده demo ایجاد شود:
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=demo"
خروجی موردانتظار:
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:~$
جدولهای ایجادشده را تأیید کنید:
psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\dt+"
خروجی موردانتظار:
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:
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"
خروجی موردانتظار:
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 آورده شده است.
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"
خروجی موردانتظار:
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:
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"
خروجی موردانتظار:
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 آورده شده است.
psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT * FROM cymbal_inventory LIMIT 3"
خروجی:
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:
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"
برونداد کنسول موردانتظار:
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 آورده شده است.
psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT store_id, name, zip_code FROM cymbal_stores limit 3"
خروجی:
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:~$
ساختن جاسازیها
بااستفاده از psql به پایگاه داده نمایشی متصل شوید و براساس شرح محصولات، برای محصولات شرحدادهشده در جدول cymbal_products جاسازی بسازید.
به پایگاه داده نمایشی متصل شوید:
psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"
از ستون embedding از نوع vector برای ذخیره کردن جاسازیهای نوشتار تولیدشده برای شرح محصولات استفاده کنید.
فعال کردن زمانبندی پرسمان:
\timing
جاسازیها را برای هر شرح محصول تولید کنید و آنها را در جدول cymbal_embedding ذخیره کنید:
INSERT INTO cymbal_embedding (uniq_id, embedding)
SELECT uniq_id, google_ml.embedding('embeddinggemma', product_description)::vector
FROM cymbal_products;
خروجی موردانتظار:
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=#
اجرای پرسمانهای جستجوی معنایی
در جلسه psql، پنج محصول برتر مطابق با سؤال "What kind of fruit trees grow well here?" را بااستفاده از فاصله کسینوسی (<=>) پیدا کنید:
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;
خروجی موردانتظار:
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=#
پُرسمان ۸۳ میلیثانیه اجرا شد و فهرستی از درختان را از جدول cymbal_products برگرداند که با درخواست مطابقت داشتند و در فروشگاه شماره ۱۵۸۳ موجود بودند.
ساختن نمایه ANN
با مجموعه دادههای کوچک، استفاده از جستجوی دقیق برای اسکن کردن همه جاسازیها آسان است، اما وقتی دادهها افزایش مییابد، زمان بارگیری و پاسخ نیز افزایش مییابد. برای بهبود عملکرد میتوانید نمایههایی روی دادههای جاسازیشدهتان بسازید. در اینجا نمونهای از نحوه انجام این کار بااستفاده از نمایه Google ScaNN برای دادههای برداری آورده شده است.
اگر اتصال قطع شده است، دوباره به پایگاه داده نمایشی متصل شوید:
psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"
فعال کردن افزونه alloydb_scann:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
نمایه ScaNN را در ستون embedding ایجاد کنید:
CREATE INDEX cymbal_products_embeddings_scann ON cymbal_embedding
USING scann (embedding cosine)
WITH (num_leaves=10, max_num_levels = 1);
پرسمان جستجوی معنایی را دوباره اجرا کنید تا عملکرد اجرا را مقایسه کنید:
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;
خروجی موردانتظار:
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
زمان اجرای پُرسمان کمی کاهش یافته است و این بهبود در مجموعهدادههای بزرگتر بیشتر قابلتوجه خواهد بود. دادههای برگرداندهشده باید همان یا بسیار شبیه به چیزی باشد که بدون نمایه دریافت کردیم.
پرسمانهای دیگر را امتحان کنید و در اسناد درباره بهینهسازی نمایه برداری بیشتر بخوانید.
خروج از جلسه psql:
\q
با قطع اتصال از جلسه instance-1 ssh با فشار دادن CTRL+D یا تایپ کردن exit، به Google Cloud Shell برگردید.
۸. پیادهسازی Gemma با vLLM
افزودن استخر گره برای Gemma
ابتدا بررسی کنید چه نوع گرههایی در منطقه شما دردسترس است:
gcloud compute accelerator-types list --filter="zone:${LOCATION}"
باید فهرستی از انواع شتابدهندههای دردسترس، ازجمله شتابدهنده nvidia-l4، را ببینید.
بااستفاده از vLLM، مانیفست استقرار برای مدل Google Gemini 4 12B ایجاد کنید:
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
اعمال کردن استقرار gemma-12b-gpu-vllm-deployment.yaml ذخیرهشده:
kubectl apply -f gemma-12b-gpu-vllm-deployment.yaml
خروجی موردانتظار:
$ kubectl apply -f gemma-12b-gpu-vllm-deployment.yaml deployment.apps/gemma-12b-gpu-vllm-deployment created service/gemma-12b-gpu-vllm-service created
منتظر بمانید تا استقرار تکمیل شود و مدل بار شود. ممکن است چند دقیقه طول بکشد.
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'
خروجی موردانتظار:
Waiting for model to load... ======================================== [SUCCESS] Model is loaded and ready! You can now proceed to the next step. ========================================
مدل را آزمایش کنید. برای دسترسی به مدل، بازارسال درگاه را فعال کنید:
kubectl port-forward svc/gemma-12b-gpu-vllm-service 8090:8000
در پنجره ترمینال دیگری، از curl برای ارسال پیامواره به مدل استفاده کنید:
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'
خروجی موردانتظار:
% 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، بازارسال درگاه را در پایانه اول متوقف کنید (اگر هنوز درحال اجرا است).
۹. ثبت کردن مدل Gemma 4 در AlloyDB Omni
مدل Gemma 12B را بااستفاده از رویه google_ml.create_model در AlloyDB Omni ثبت کنید. http://gemma-12b-gpu-vllm-service:8000/v1/chat/completions را بهعنوان model_request_url برای مسیریابی درخواستها به سرویس خوشه Kubernetes مشخص کنید:
بازیابی IP نقطه پایانی AlloyDB Omni:
echo "INSTANCE_IP=$(kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default -o jsonpath='{.status.primary.endpoint}')"
بااستفاده از SSH به نمونه VM متصل شوید:
gcloud compute ssh instance-1 --zone=$ZONE
پساز اتصال به VM، متغیر INSTANCE_IP را از مرحله قبلی صادر کنید (مقدار 10.128.0.33 بهعنوان نمونه ارائه شده است - آن را با IP خودتان جایگزین کنید):
export INSTANCE_IP=10.128.0.33
صادر کردن گذرواژه AlloyDB:
export PGPASSWORD=VeryStrongPassword
به پایگاه داده demo متصل شوید:
psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"
در جلسه psql، مدل را ثبت کنید:
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');
مدل را با پُرسمان 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';
برای خروج از پنجره نتیجه و برگشتن به پیامواره psql، کلید q را فشار دهید
ترکیب کردن جستجوی برداری با LLM RAG در AlloyDB Omni
از جستجوی برداری با درخواست LLM برای نمایش RAG (تولید با کمک بازیابی) با LLM استفاده کنید.
پُرسمان SQL را در 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;
خروجی موردانتظار:
----------------------------------------------------------------------------------------------------------------------------------------------
"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)
پُرسمان پیامواره را با نتایج جستجوی برداری به «مدل زبانی بزرگ» اضافه میکند.
پرسمانهای دیگر را امتحان کنید و با الگوهای RAG آزمایش کنید. مزیت معماری ارائهشده خودکفایی کامل آن است. دادهها به خارج از خوشه شما ارسال نمیشود و میتواند در محیطهای کاملاً مجزا اجرا شود.
خروج از جلسه psql:
\q
اتصال از جلسه SSH به ماشین مجازی را قطع کنید:
exit
فراموش نکنید که AlloyDB Omni ویژگیها و آزمایشگاههای بیشتری دارد.
۱۰. پاکسازی محیط
برای جلوگیری از کسر هزینههای جاری از حساب Google Cloud خود، منابع ایجادشده در این codelab را حذف کنید.
حذف خوشه GKE
در Cloud Shell، خوشه GKE را حذف کنید:
export PROJECT_ID=$(gcloud config get-value project)
export CLUSTER_NAME=alloydb-ai-gke
gcloud container clusters delete ${CLUSTER_NAME} \
--project=${PROJECT_ID} \
--region=${LOCATION}
خروجی موردانتظار:
student@cloudshell:~$ gcloud container clusters delete ${CLUSTER_NAME} \
> --project=${PROJECT_ID} \
> --region=${LOCATION}
The following clusters will be deleted.
- [alloydb-ai-gke] in [us-east4]
Do you want to continue (Y/n)? Y
Deleting cluster alloydb-ai-gke...done.
Deleted
حذف ماشین مجازی کارخواه
در Cloud Shell، نمونه Compute Engine را حذف کنید:
export PROJECT_ID=$(gcloud config get-value project)
gcloud compute instances delete instance-1 \
--project=${PROJECT_ID} \
--zone=${ZONE}
خروجی موردانتظار:
student@cloudshell:~$ export PROJECT_ID=$(gcloud config get project)
export ZONE=us-east4-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-east4-a]
Do you want to continue (Y/n)? Y
Deleted
اگر پروژه جدیدی برای این codelab ایجاد کردهاید، میتوانید کل پروژه را در مدیر منبع Google Cloud حذف کنید.
۱۱. تبریک میگوییم
بابت تکمیل codelab به شما تبریک میگوییم!
آنچه پوشش دادید
- نحوه مستقر کردن AlloyDB Omni در خوشه GKE
- نحوه متصل شدن به AlloyDB Omni
- نحوه بار کردن دادهها در AlloyDB Omni
- نحوه مستقر کردن مدلهای هوش مصنوعی (جاسازی و مدل زبانی بزرگ) در GKE
- نحوه ثبت کردن مدلهای هوش مصنوعی در AlloyDB Omni
- نحوه تولید جاسازی برای جستجوی معنایی
- نحوه اجرای پُرسمانهای جستجوی معنایی در AlloyDB Omni
- نحوه ایجاد کردن و استفاده کردن از نمایههای برداری در AlloyDB Omni
در اسناد میتوانید درباره کار با هوش مصنوعی در AlloyDB Omni بیشتر بخوانید.
نظرسنجی
خروجی: