1. Giới thiệu
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách triển khai AlloyDB Omni trên Google Kubernetes Engine (GKE) và sử dụng AlloyDB Omni với các mô hình mở như EmbeddingGemma và Gemma 4 để tạo các bản nhúng và dự đoán. Việc chạy cả cơ sở dữ liệu và các mô hình trong cùng một cụm giúp giảm độ trễ mạng và tránh các phần phụ thuộc vào dịch vụ bên thứ ba. Tính năng này cũng giúp đáp ứng các yêu cầu về việc tuân thủ và nơi lưu trữ dữ liệu vì dữ liệu của bạn không bao giờ rời khỏi môi trường của bạn.

Điều kiện tiên quyết
- Hiểu biết cơ bản về Google Cloud và Google Cloud Console
- Kiến thức cơ bản về Kubernetes và GKE
- Làm quen với giao diện dòng lệnh và Google Cloud Shell
Kiến thức bạn sẽ học được
- Cách triển khai AlloyDB Omni trên một cụm GKE
- Cách kết nối với AlloyDB Omni
- Cách tải dữ liệu vào AlloyDB Omni
- Cách triển khai các mô hình AI (mô hình nhúng và mô hình ngôn ngữ lớn) vào GKE
- Cách đăng ký mô hình AI trong AlloyDB Omni
- Cách tạo các vectơ nhúng cho tính năng tìm kiếm ngữ nghĩa
- Cách chạy các truy vấn tìm kiếm ngữ nghĩa trong AlloyDB Omni
- Cách tạo và sử dụng chỉ mục vectơ trong AlloyDB Omni
Bạn cần có
- Tài khoản Google Cloud và dự án trên đám mây của Google Cloud
- Một trình duyệt web như Chrome
2. Thiết lập và yêu cầu
Thiết lập dự án
- Đăng nhập vào Google Cloud Console. Nếu bạn chưa có tài khoản Gmail hoặc Google Workspace, hãy tạo một tài khoản. Sử dụng tài khoản cá nhân thay vì tài khoản do nơi làm việc hoặc trường học cấp.
- Tạo dự án mới hoặc chọn dự án hiện có. Trong tiêu đề Google Cloud Console, hãy nhấp vào Chọn dự án, rồi nhấp vào Dự án mới.

Trong cửa sổ Chọn một dự án, hãy nhấp vào Dự án mới để mở hộp thoại tạo dự án.

Trong hộp thoại, hãy nhập Tên dự án rồi chọn tổ chức hoặc vị trí của bạn.

- Tên dự án là tên hiển thị của những người tham gia dự án này. Tên dự án không được các API của Google sử dụng và bạn có thể thay đổi tên này bất cứ lúc nào.
- Mã dự án là duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi thiết lập). Google Cloud Console sẽ tự động tạo một mã nhận dạng duy nhất hoặc bạn có thể cung cấp mã nhận dạng của riêng mình. Trong lớp học lập trình này, bạn sẽ tham chiếu mã dự án bằng phần giữ chỗ
. - Số dự án là giá trị nhận dạng thứ ba mà một số API sử dụng. Để biết thêm thông tin, hãy xem tài liệu về Resource Manager.
Bật tính năng thanh toán
Nếu thiết lập thông tin thanh toán bằng tín dụng Google Cloud, bạn có thể bỏ qua bước này.
Để thiết lập tài khoản thanh toán cá nhân, hãy bật tính năng thanh toán trong Cloud Console.
- Việc hoàn thành bài tập này sẽ tốn ít hơn 5 USD cho các tài nguyên trên Google Cloud.
- Hãy làm theo các bước dọn dẹp ở cuối bài thực hành này để xoá tài nguyên và tránh bị tính thêm phí.
- Người dùng mới đủ điều kiện dùng thử miễn phí 300 USD.
Khởi động Cloud Shell
Trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên đám mây.
Trên bảng điều khiển Google Cloud, hãy nhấp vào biểu tượng Kích hoạt Cloud Shell trên thanh công cụ ở trên cùng bên phải:

Ngoài ra, hãy nhấn G rồi nhấn S hoặc mở Google Cloud Shell trực tiếp.
Khi được kết nối, Cloud Shell sẽ hiển thị lời nhắc của thiết bị đầu cuối:

Cloud Shell có bộ nhớ liên tục và các công cụ phát triển. Bạn có thể chạy tất cả các bước trong lớp học lập trình này trên trình duyệt.
3. Bật API
Để sử dụng Google Kubernetes Engine (GKE) cho AlloyDB Omni và việc triển khai mô hình, hãy bật API Compute Engine và GKE trong dự án trên đám mây của bạn.
Trong Cloud Shell, hãy xác minh rằng bạn đã định cấu hình mã dự án:
PROJECT_ID=$(gcloud config get-value project)
echo $PROJECT_ID
Nếu bạn chưa xác định mã dự án, hãy định cấu hình mã dự án:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID
Bật các API bắt buộc:
gcloud services enable compute.googleapis.com
gcloud services enable container.googleapis.com
Kết quả đầu ra dự kiến:
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.
Bạn có thể đọc về từng API đã bật trong tài liệu.
4. Triển khai AlloyDB Omni trên GKE
Để triển khai AlloyDB Omni trên GKE, hãy chuẩn bị một cụm Kubernetes theo các yêu cầu đối với toán tử AlloyDB Omni.
Tạo một cụm GKE
Triển khai một cụm GKE tiêu chuẩn có đủ dung lượng để chạy AlloyDB Omni, toán tử và các vùng chứa giám sát. AlloyDB Omni yêu cầu tối thiểu 2 CPU và 8 GB RAM. Hướng dẫn này sử dụng loại máy n2-standard-4.
Đặt các biến môi trường cho quá trình triển khai:
export PROJECT_ID=$(gcloud config get-value project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
export MACHINE_TYPE=n2-standard-4
Tạo cụm GKE tiêu chuẩn:
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
Kết quả đầu ra dự kiến trên bảng điều khiển:
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
Chuẩn bị cụm
Cài đặt các thành phần bắt buộc như cert-manager, bộ điều khiển chứng chỉ gốc cho Kubernetes. Để biết thông tin chi tiết, hãy xem tài liệu cài đặt cert-manager.
Cloud Shell có công cụ dòng lệnh Kubernetes kubectl. Lấy thông tin đăng nhập cụm bằng cách sử dụng gcloud:
gcloud container clusters get-credentials ${CLUSTER_NAME} --region=${LOCATION}
Cài đặt cert-manager bằng kubectl:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.21.1/cert-manager.yaml
Kết quả đầu ra dự kiến trên bảng điều khiển (đã chỉnh sửa):
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
Cài đặt toán tử AlloyDB Omni
Cài đặt toán tử AlloyDB Omni bằng Helm.
Tải xuống và cài đặt biểu đồ toán tử 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
Kết quả đầu ra dự kiến trên bảng điều khiển (đã chỉnh sửa):
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
Triển khai cụm cơ sở dữ liệu.
Tệp kê khai sau đây định cấu hình một cụm cơ sở dữ liệu có googleMLExtension được bật và một bộ cân bằng tải nội bộ:
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
Giá trị bí mật của mật khẩu là biểu thị Base64 của VeryStrongPassword. Trong môi trường phát hành chính thức, hãy sử dụng Google Secret Manager để quản lý mật khẩu. Để biết thông tin chi tiết, hãy xem tài liệu về Secret Manager.
Tệp kê khai được lưu dưới dạng my-omni.yaml. Trong Cloud Shell, hãy nhấp vào Mở trình chỉnh sửa ở góc trên cùng bên phải của cửa sổ thiết bị đầu cuối rồi đọc tệp.

Sau khi đọc tệp kê khai my-omni.yaml, hãy nhấp vào Open Terminal (Mở cửa sổ dòng lệnh) để quay lại dấu nhắc lệnh.

Áp dụng tệp kê khai my-omni.yaml:
kubectl apply -f my-omni.yaml
Kết quả đầu ra dự kiến trên bảng điều khiển:
secret/db-pw-my-omni created dbcluster.alloydbomni.dbadmin.goog/my-omni created
Kiểm tra trạng thái của cụm my-omni:
kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default
Trong quá trình triển khai, cụm cơ sở dữ liệu sẽ chuyển đổi qua các giai đoạn thiết lập cho đến khi đạt được trạng thái DBClusterReady.
Kết quả đầu ra dự kiến trên bảng điều khiển:
$ kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default NAME PRIMARYENDPOINT PRIMARYPHASE DBCLUSTERPHASE HAREADYSTATUS HAREADYREASON my-omni 10.131.0.33 Ready DBClusterReady
Bạn có thể giám sát việc triển khai cụm bằng lệnh kubectl log (không bắt buộc):
kubectl logs -l alloydbomni.internal.dbadmin.goog/dbcluster=my-omni --all-containers -f
Kết nối với AlloyDB Omni
Khi cụm đã sẵn sàng, hãy kết nối với nhóm cơ sở dữ liệu bằng ứng dụng PostgreSQL (psql). Mật khẩu là VeryStrongPassword như được xác định trong 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
Ví dụ về thông tin xuất trên bảng điều khiển:
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=#
Thoát khỏi phiên psql bằng cách nhập \q rồi nhấn Enter:
postgres=# \q
5. Triển khai mô hình EmbeddingGemma trên GKE
Để kiểm thử việc tích hợp AI AlloyDB Omni với các mô hình cục bộ, hãy triển khai một mô hình nhúng vào cụm GKE. Hướng dẫn này sử dụng mô hình EmbeddingGemma của Google.
Tạo một bộ nút cho mô hình
Để chạy suy luận mô hình, hãy chuẩn bị một bộ nút chuyên dụng. Bạn có thể sử dụng một bộ nút chỉ có CPU hoặc một bộ nút được tăng tốc bằng GPU (chẳng hạn như g2-standard-8 có GPU NVIDIA L4). Hướng dẫn này sử dụng một bộ nút dựa trên CPU với các loại máy c3-standard-8.
Tạo một bộ nút CPU một nút:
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
Kết quả đầu ra dự kiến:
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
Lấy mã thông báo Hugging Face
Hướng dẫn này triển khai mô hình EmbeddingGemma từ Hugging Face. Để truy cập vào trọng số mô hình, hãy tạo một mã truy cập Hugging Face:
- Đăng nhập hoặc tạo tài khoản trên Hugging Face.
- Chuyển đến Hồ sơ của bạn > Mã truy cập.
- Nhấp vào Tạo mã thông báo mới.
- Nhập tên cho mã thông báo và chọn vai trò Đọc.
- Nhấp vào Tạo mã thông báo rồi sao chép giá trị mã thông báo đã tạo.
- Chấp nhận các điều khoản về mô hình trên trang mô hình EmbeddingGemma nếu bạn chưa làm việc này trước đây.
Tạo một khoá bí mật Kubernetes chứa mã thông báo Hugging Face của bạn trong Cloud Shell (thay thế phần giữ chỗ mã thông báo bằng mã thông báo của bạn):
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 -
Chuẩn bị tệp kê khai triển khai
Để triển khai mô hình, hãy sử dụng gói vùng chứa Suy luận nhúng văn bản (TEI) của Hugging Face. Để biết thêm thông tin, hãy xem tài liệu về Hugging Face GKE TEI.
Sao chép kho lưu trữ triển khai trên GitHub:
git clone https://github.com/huggingface/Google-Cloud-Containers
Kiểm tra và sửa đổi tệp kê khai cấu hình CPU:
edit Google-Cloud-Containers/examples/gke/tei-deployment/cpu-config/deployment.yaml
Tệp kê khai đã cập nhật cho việc triển khai 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"
Lưu các thay đổi bằng cách nhấn ctrl+s rồi chuyển về thiết bị đầu cuối.
Triển khai mô hình
Áp dụng tệp kê khai để triển khai máy chủ TEI:
kubectl apply -f Google-Cloud-Containers/examples/gke/tei-deployment/cpu-config
Theo dõi quá trình triển khai cho đến khi quá trình này ở trạng thái sẵn sàng:
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'
Kiểm tra dịch vụ tei-service Kubernetes:
kubectl get service tei-service
Kết quả đầu ra dự kiến:
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
Dịch vụ CLUSTER-IP xử lý các yêu cầu nội bộ tại http://34.118.233.48:8080/embed.
Kiểm thử điểm cuối mô hình cục bộ bằng cách sử dụng kubectl port-forward:
kubectl port-forward service/tei-service 8080:8080
Mở thẻ Cloud Shell thứ hai bằng cách nhấp vào + ở đầu cửa sổ dòng lệnh:

Trong thẻ mới, hãy kiểm thử việc tạo mục nhúng bằng curl:
curl http://localhost:8080/embed \
-X POST \
-d '{"inputs":"Test"}' \
-H 'Content-Type: application/json'
Kết quả đầu ra dự kiến (mảng vectơ):
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]]
Dừng chuyển tiếp cổng trong thẻ đầu tiên bằng cách nhấn ctrl+c.
6. Đăng ký mô hình nhúng trong AlloyDB Omni
Để sử dụng mô hình đã triển khai từ AlloyDB Omni, hãy tạo một cơ sở dữ liệu, xác định các hàm biến đổi và đăng ký điểm cuối của mô hình.
Tạo một máy ảo và cơ sở dữ liệu của ứng dụng
Tạo một phiên bản máy ảo Compute Engine trong cùng một VPC để đóng vai trò là máy chủ chuyển tiếp của ứng dụng:

Trong Cloud Shell, hãy tạo máy ảo khách hàng:
export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE
Truy xuất IP điểm cuối AlloyDB Omni:
echo "INSTANCE_IP=$(kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default -o jsonpath='{.status.primary.endpoint}')"
Kết quả đầu ra dự kiến:
INSTANCE_IP=10.128.0.33
Giá trị INSTANCE_IP là IP của trình cân bằng tải nội bộ cho cụm AlloyDB Omni. Trong ví dụ này, đó là 10.131.0.33.
Kết nối với phiên bản máy ảo bằng SSH:
gcloud compute ssh instance-1 --zone=$ZONE
Trong phiên SSH trên instance-1, hãy cài đặt ứng dụng PostgreSQL:
sudo apt-get update && sudo apt-get install --yes postgresql-client
Xuất IP của trình cân bằng tải AlloyDB Omni (thay thế bằng IP PRIMARYENDPOINT của bạn):
export INSTANCE_IP=10.131.0.33
Kết nối với AlloyDB Omni bằng psql (mật khẩu là VeryStrongPassword):
psql "host=$INSTANCE_IP user=postgres sslmode=require"
Trong phiên psql, hãy tạo cơ sở dữ liệu demo:
CREATE DATABASE demo;
Chuyển sang cơ sở dữ liệu demo:
\c demo
Tạo hàm biến đổi
Các điểm cuối nhúng tuỳ chỉnh yêu cầu các hàm biến đổi đầu vào và đầu ra để điều chỉnh định dạng dữ liệu giữa AlloyDB Omni và API mô hình.
Tạo hàm biến đổi dữ liệu đầu vào:
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;
$$;
Kết quả đầu ra dự kiến:
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=#
Tạo hàm biến đổi đầu ra để phân tích cú pháp phản hồi mảng vectơ:
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;
$$;
Kết quả đầu ra dự kiến:
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=#
Đăng ký mô hình
Đăng ký mô hình trong AlloyDB Omni bằng quy trình google_ml.create_model. Chỉ định http://tei-service:8080/embed làm model_request_url để định tuyến các yêu cầu đến dịch vụ cụm 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');
Kết quả đầu ra dự kiến:
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=#
Kiểm thử mô hình đã đăng ký bằng một truy vấn SQL mẫu:
SELECT google_ml.embedding('embeddinggemma', 'What is AlloyDB Omni?');
Hàm này trả về biểu diễn mảng số thực do mô hình EmbeddingGemma cục bộ chạy trên GKE tạo.
Nhấn q để quay lại lời nhắc về phiên psql.
Thoát khỏi phiên psql:
\q
7. Kiểm thử mô hình bằng dữ liệu mẫu
Tải dữ liệu mẫu
Hướng dẫn này sử dụng tập dữ liệu bán lẻ Cymbal để minh hoạ tính năng tìm kiếm tương tự theo vectơ. Bạn sẽ sử dụng Google Cloud SDK và ứng dụng PostgreSQL để nhập dữ liệu vào AlloyDB Omni.
Trong phiên SSH trên instance-1, hãy kết nối với cơ sở dữ liệu minh hoạ và bật tiện ích vector:
psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"
Trong phiên psql:
CREATE EXTENSION IF NOT EXISTS vector;
Thoát khỏi phiên psql:
\q
Tải giản đồ xuống và áp dụng giản đồ đó để tạo bảng trong cơ sở dữ liệu demo:
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=demo"
Kết quả đầu ra dự kiến:
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:~$
Xác minh các bảng đã tạo:
psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\dt+"
Kết quả đầu ra dự kiến:
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)
Tải dữ liệu vào bảng 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"
Kết quả đầu ra dự kiến:
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:~$
Dưới đây là mẫu của một vài hàng trong bảng 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"
Kết quả đầu ra dự kiến:
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:~$
Tải dữ liệu vào bảng 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"
Kết quả đầu ra dự kiến:
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:~$
Dưới đây là mẫu của một vài hàng trong bảng cymbal_inventory.
psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT * FROM cymbal_inventory LIMIT 3"
Kết quả:
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:~$
Tải dữ liệu vào bảng 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"
Kết quả đầu ra dự kiến trên bảng điều khiển:
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:~$
Sau đây là mẫu của một vài hàng trong bảng cymbal_stores.
psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT store_id, name, zip_code FROM cymbal_stores limit 3"
Kết quả:
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:~$
Tạo các vectơ nhúng
Kết nối với cơ sở dữ liệu minh hoạ bằng psql và tạo các mục nhúng cho những sản phẩm được mô tả trong bảng cymbal_products dựa trên nội dung mô tả sản phẩm.
Kết nối với cơ sở dữ liệu minh hoạ:
psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"
Sử dụng cột embedding thuộc loại vector để lưu trữ các vectơ nhúng văn bản được tạo cho nội dung mô tả sản phẩm.
Bật tính năng đo thời gian truy vấn:
\timing
Tạo các mục nhúng cho từng nội dung mô tả sản phẩm và lưu trữ các mục đó trong bảng cymbal_embedding:
INSERT INTO cymbal_embedding (uniq_id, embedding)
SELECT uniq_id, google_ml.embedding('embeddinggemma', product_description)::vector
FROM cymbal_products;
Kết quả đầu ra dự kiến:
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=#
Chạy truy vấn tìm kiếm ngữ nghĩa
Trong phiên psql, hãy tìm 5 sản phẩm hàng đầu phù hợp với câu hỏi "What kind of fruit trees grow well here?" bằng cách sử dụng khoảng cách cosine (<=>):
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;
Kết quả đầu ra dự kiến:
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=#
Truy vấn chạy 83 mili giây và trả về danh sách các cây từ bảng cymbal_products khớp với yêu cầu và có hàng tồn kho tại cửa hàng có số 1583.
Tạo chỉ mục ANN
Với một tập dữ liệu nhỏ, bạn có thể dễ dàng sử dụng tính năng tìm kiếm chính xác để quét tất cả các mục nhúng. Tuy nhiên, khi dữ liệu tăng lên, thời gian tải và phản hồi cũng tăng theo. Để cải thiện hiệu suất, bạn có thể tạo chỉ mục trên dữ liệu nhúng. Dưới đây là ví dụ về cách thực hiện bằng cách sử dụng chỉ mục ScaNN của Google cho dữ liệu vectơ.
Kết nối lại với cơ sở dữ liệu minh hoạ nếu bạn bị mất kết nối:
psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"
Bật tiện ích alloydb_scann:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Tạo chỉ mục ScaNN trên cột embedding:
CREATE INDEX cymbal_products_embeddings_scann ON cymbal_embedding
USING scann (embedding cosine)
WITH (num_leaves=10, max_num_levels = 1);
Chạy lại cụm từ tìm kiếm ngữ nghĩa để so sánh hiệu suất thực thi:
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;
Kết quả đầu ra dự kiến:
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
Thời gian thực thi truy vấn đã giảm nhẹ và mức tăng sẽ rõ rệt hơn với các tập dữ liệu lớn hơn. Dữ liệu trả về phải giống hoặc rất giống với dữ liệu chúng ta nhận được mà không có chỉ mục.
Hãy thử các truy vấn khác và đọc thêm về cách tối ưu hoá chỉ mục vectơ trong tài liệu.
Thoát khỏi phiên psql:
\q
Quay lại Google Cloud Shell bằng cách ngắt kết nối khỏi phiên instance-1 ssh bằng cách nhấn tổ hợp phím CTRL+D hoặc nhập exit.
8. Triển khai Gemma bằng vLLM
Thêm bộ nút cho Gemma
Trước tiên, hãy kiểm tra xem những loại nút nào có ở khu vực của bạn:
export LOCATION=us-central1-a
gcloud compute accelerator-types list --filter="zone:${LOCATION}"
Bạn sẽ thấy danh sách các loại bộ tăng tốc có sẵn, bao gồm cả bộ tăng tốc nvidia-l4. Bây giờ, hãy tạo một bộ nút có loại trình tăng tốc 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
Tạo tệp kê khai triển khai cho mô hình Google Gemini 4 12B bằng 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
Áp dụng chế độ triển khai gemma-12b-gpu-vllm-deployment.yaml đã lưu:
kubectl apply -f gemma-12b-gpu-vllm-deployment.yaml
Kết quả đầu ra dự kiến:
$ kubectl apply -f gemma-12b-gpu-vllm-deployment.yaml deployment.apps/gemma-12b-gpu-vllm-deployment created service/gemma-12b-gpu-vllm-service created
Chờ cho đến khi quá trình triển khai hoàn tất và mô hình được tải. Quá trình này có thể mất vài phút.
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'
Kết quả đầu ra dự kiến:
Waiting for model to load... ======================================== [SUCCESS] Model is loaded and ready! You can now proceed to the next step. ========================================
Kiểm thử mô hình. Bật tính năng chuyển tiếp cổng để truy cập vào mô hình:
kubectl port-forward svc/gemma-12b-gpu-vllm-service 8090:8000
Trong một cửa sổ dòng lệnh khác, hãy dùng curl để gửi câu lệnh đến mô hình:
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'
Kết quả đầu ra dự kiến:
% 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.
Dừng chuyển tiếp cổng trong thiết bị đầu cuối đầu tiên (nếu thiết bị này vẫn đang chạy) bằng cách nhấn Ctrl+C.
9. Đăng ký mô hình Gemma 4 trong AlloyDB Omni
Đăng ký mô hình Gemma 12B trong AlloyDB Omni bằng quy trình google_ml.create_model. Chỉ định http://gemma-12b-gpu-vllm-service:8000/v1/chat/completions làm model_request_url để định tuyến các yêu cầu đến dịch vụ cụm Kubernetes:
Truy xuất IP điểm cuối AlloyDB Omni:
echo "INSTANCE_IP=$(kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default -o jsonpath='{.status.primary.endpoint}')"
Kết nối với phiên bản máy ảo bằng SSH:
export ZONE=us-central1-a
gcloud compute ssh instance-1 --zone=$ZONE
Sau khi kết nối với VM, hãy xuất biến INSTANCE_IP từ bước trước (giá trị 10.128.0.33 được đưa ra làm ví dụ – hãy thay thế bằng IP của bạn):
export INSTANCE_IP=10.128.0.33
Xuất mật khẩu AlloyDB:
export PGPASSWORD=VeryStrongPassword
Kết nối với cơ sở dữ liệu demo:
psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"
Trong phiên psql, hãy đăng ký mô hình:
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');
Kiểm tra mô hình với một truy vấn SQL mẫu:
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';
Nhấn q để thoát khỏi cửa sổ kết quả và quay lại lời nhắc psql
Kết hợp tính năng tìm kiếm vectơ với RAG LLM trong AlloyDB Omni
Sử dụng tính năng tìm kiếm vectơ với yêu cầu LLM để minh hoạ RAG (Tạo sinh tăng cường truy xuất) bằng LLM.
Chạy truy vấn SQL trong PL/SQL:
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;
Kết quả đầu ra dự kiến:
----------------------------------------------------------------------------------------------------------------------------------------------
"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)
Cụm từ tìm kiếm bổ sung cho câu lệnh đối với LLM bằng kết quả tìm kiếm vectơ.
Hãy thử các truy vấn khác và thử nghiệm với các mẫu RAG. Ưu điểm của kiến trúc được trình bày là tính tự cung tự cấp hoàn toàn. Dữ liệu không được gửi ra bên ngoài cụm của bạn và có thể chạy trong các môi trường hoàn toàn biệt lập.
Thoát khỏi phiên psql:
\q
Ngắt kết nối khỏi phiên SSH đến máy ảo:
exit
Đừng quên rằng AlloyDB Omni có nhiều tính năng và phòng thí nghiệm hơn.
10. Làm sạch môi trường
Để tránh phát sinh phí định kỳ cho tài khoản Google Cloud của bạn, hãy xóa các tài nguyên đã tạo trong bài hướng dẫn này.
Xóa cụm GKE
Trong Cloud Shell, hãy xóa cụm 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}
Kết quả đầu ra dự kiến:
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
Xoá VM ứng dụng
Trong Cloud Shell, hãy xoá phiên bản 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}
Kết quả đầu ra dự kiến:
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
Nếu bạn đã tạo một dự án mới cho bài thực hành này, bạn có thể tùy chọn xóa toàn bộ dự án trong Google Cloud Resource Manager.
11. Xin chúc mừng
Chúc mừng bạn đã hoàn thành lớp học lập trình này!
Nội dung bạn đã đề cập
- Cách triển khai AlloyDB Omni trên một cụm GKE
- Cách kết nối với AlloyDB Omni
- Cách tải dữ liệu vào AlloyDB Omni
- Cách triển khai các mô hình AI (mô hình nhúng và mô hình ngôn ngữ lớn) vào GKE
- Cách đăng ký mô hình AI trong AlloyDB Omni
- Cách tạo các vectơ nhúng cho tính năng tìm kiếm ngữ nghĩa
- Cách chạy các truy vấn tìm kiếm ngữ nghĩa trong AlloyDB Omni
- Cách tạo và sử dụng chỉ mục vectơ trong AlloyDB Omni
Bạn có thể đọc thêm về cách làm việc với AI trong AlloyDB Omni trong tài liệu.
Khảo sát
Kết quả: