AlloyDB Omni и EmbeddingGemma с Gemma 4 в Kubernetes

1. Введение

В этом практическом занятии вы узнаете, как развернуть AlloyDB Omni на Google Kubernetes Engine (GKE) и использовать его с открытыми моделями, такими как EmbeddingGemma и Gemma 4, для эмбеддингов и прогнозирования. Запуск базы данных и моделей в одном кластере снижает задержку в сети и позволяет избежать зависимости от сторонних сервисов. Это также помогает соблюдать требования соответствия нормативным требованиям и правила размещения данных, поскольку ваши данные никогда не покидают вашу среду.

Схема архитектуры AlloyDB Omni и EmbeddingGemma на GKE

Предварительные требования

  • Базовое понимание Google Cloud и консоли Google Cloud.
  • Базовые знания Kubernetes и GKE.
  • Знание интерфейса командной строки и Google Cloud Shell.

Что вы узнаете

  • Как развернуть AlloyDB Omni в кластере GKE
  • Как подключиться к AlloyDB Omni
  • Как загрузить данные в AlloyDB Omni
  • Как развернуть модели ИИ (встраивание и LLM) в GKE
  • Как зарегистрировать модели ИИ в AlloyDB Omni
  • Как сгенерировать векторные представления для семантического поиска
  • Как выполнять семантические поисковые запросы в AlloyDB Omni
  • Как создавать и использовать векторные индексы в AlloyDB Omni

Что вам понадобится

  • Аккаунт Google Cloud и проект Google Cloud
  • Веб-браузер, например Chrome.

2. Настройка и требования

Настройка проекта

  1. Войдите в консоль Google Cloud . Если у вас еще нет учетной записи Gmail или Google Workspace, создайте ее . Используйте личную учетную запись вместо рабочей или учебной.
  1. Создайте новый проект или выберите существующий. В заголовке консоли Google Cloud нажмите « Выбрать проект» , а затем нажмите «Новый проект» .

В консоли Google Cloud выберите диалоговое окно «Выбор проекта».

В окне «Выберите проект» нажмите кнопку «Новый проект» , чтобы открыть диалоговое окно создания проекта.

Диалог создания нового проекта

В диалоговом окне введите название проекта и выберите свою организацию или местоположение.

Поля ввода сведений о проекте

  • Название проекта — это отображаемое имя участников данного проекта. Название проекта не используется API Google, и вы можете изменить его в любое время.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Google Cloud автоматически генерирует уникальный идентификатор, или вы можете указать свой собственный. В этом практическом задании вы будете ссылаться на свой идентификатор проекта с помощью... Заполнитель.
  • Номер проекта — это третий идентификатор, используемый некоторыми API. Для получения дополнительной информации см. документацию по Resource Manager .

Включить выставление счетов

Если вы настроили оплату с использованием кредитов Google Cloud, этот шаг можно пропустить.

Чтобы настроить личный платежный аккаунт, включите выставление счетов в консоли Google Cloud .

  • Выполнение этой лабораторной работы обойдется менее чем в 5 долларов США в виде ресурсов Google Cloud.
  • Выполните действия по очистке в конце этой лабораторной работы, чтобы удалить ресурсы и избежать дальнейших списаний средств.
  • Новые пользователи могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .

Запустить Cloud Shell

В этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.

В консоли Google Cloud нажмите значок «Активировать Cloud Shell» на панели инструментов в правом верхнем углу:

Кнопка «Активировать облачную оболочку»

В качестве альтернативы нажмите G, а затем S, или откройте Google Cloud Shell напрямую .

После подключения Cloud Shell отображает приглашение командной строки терминала:

Скриншот терминала Google Cloud Shell

Cloud Shell включает в себя инструменты для постоянного хранения данных и разработки. Вы можете выполнить все шаги этого практического занятия прямо из своего браузера.

3. Включите API.

Для использования Google Kubernetes Engine (GKE) для развертывания AlloyDB Omni и моделей, включите API Compute Engine и GKE в своем проекте 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

Включите необходимые API:

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 можно прочитать в документации .

4. Разверните AlloyDB Omni в GKE.

Для развертывания AlloyDB Omni в GKE подготовьте кластер Kubernetes в соответствии с требованиями оператора AlloyDB Omni .

Создайте кластер GKE.

Разверните стандартный кластер GKE, способный запускать AlloyDB Omni, оператор и контейнеры мониторинга. Для работы AlloyDB Omni требуется как минимум два процессора и 8 ГБ оперативной памяти. В этом руководстве используется машинный тип n2-standard-4 .

Настройте переменные среды для развертывания:

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

Создайте стандартный кластер GKE:

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

Ожидаемый вывод в консоль:

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

Подготовьте кластер

Установите необходимые компоненты, такие как cert-manager , встроенный контроллер сертификатов для Kubernetes. Подробности см. в документации по установке cert-manager .

Cloud Shell включает в себя инструмент командной строки Kubernetes kubectl . Получите учетные данные кластера с помощью gcloud :

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

Установите cert-manager с помощью kubectl :

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

Ожидаемый вывод в консоль (засекречено):

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

Установите оператор AlloyDB Omni.

Установите оператор AlloyDB Omni с помощью Helm.

Загрузите и установите диаграмму операторов 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

Ожидаемый вывод в консоль (засекречено):

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

Разверните кластер баз данных.

Приведенный ниже манифест настраивает кластер баз данных с включенным расширением 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.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

Секретное значение пароля представляет собой представление VeryStrongPassword в формате Base64. В производственных средах для управления паролями используйте Google Secret Manager. Подробности см. в документации Secret Manager .

Манифест сохраняется как my-omni.yaml . В Cloud Shell нажмите «Открыть редактор» в правом верхнем углу окна терминала и прочитайте файл.

Откройте редактор в Cloud Shell

После ознакомления с манифестом my-omni.yaml нажмите «Открыть терминал» , чтобы вернуться к командной строке.

Откройте терминал в Cloud Shell

Примените манифест 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.3)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off, ALPN: postgresql)
Type "help" for help.

postgres=#

Для выхода из сессии psql введите \q и нажмите Enter:

postgres=# \q

5. Разверните модель EmbeddingGemma в GKE.

Для тестирования интеграции AlloyDB Omni AI с локальными моделями разверните модель встраивания в кластере GKE. В этом руководстве используется модель EmbeddingGemma от Google.

Создайте пул узлов для модели.

Для выполнения вывода модели подготовьте выделенный пул узлов. Вы можете использовать пул узлов только с процессором или пул узлов с ускорением на графическом процессоре (например, g2-standard-8 с графическим процессором NVIDIA L4). В этом руководстве используется пул узлов на базе процессора с типами машин c3-standard-8 .

Создайте пул одноузловых ЦП-узлов:

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

Ожидаемый результат:

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

Получите жетон "Обнимающее лицо"

В этом руководстве показана реализация модели EmbeddingGemma из Hugging Face . Для доступа к весам модели необходимо сгенерировать токен доступа Hugging Face:

  1. Войдите в систему или создайте учетную запись на Hugging Face .
  2. Перейдите в раздел «Ваш профиль» > «Токены доступа» .
  3. Нажмите «Создать новый токен» .
  4. Введите имя для токена и выберите роль «Чтение» .
  5. Нажмите «Создать токен» и скопируйте сгенерированное значение токена.
  6. Если вы еще этого не сделали, примите условия использования модели на странице модели EmbeddingGemma .

Создайте в Cloud Shell секрет Kubernetes, содержащий ваш токен Hugging Face (замените заполнитель token на свой токен):

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 -

Подготовьте манифест развертывания.

Для развертывания модели используйте контейнерный пакет Hugging Face Text Embeddings Inference (TEI). Дополнительную информацию см. в документации Hugging Face GKE TEI .

Клонируйте репозиторий развертывания из GitHub:

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

Проверьте и измените манифест конфигурации ЦП:

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

Обновленный манифест для развертывания на ЦП:

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, нажав кнопку «+» в верхней части терминала:

Добавить вкладку 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 .

6. Зарегистрируйте модель встраивания в AlloyDB Omni.

Для использования развернутой модели из AlloyDB Omni необходимо создать базу данных, определить функции преобразования и зарегистрировать конечную точку модели.

Создайте клиентскую виртуальную машину и базу данных.

Создайте экземпляр виртуальной машины Compute Engine в той же VPC, который будет выступать в качестве промежуточного хоста для клиентов:

Схема сетевой архитектуры, показывающая клиентскую виртуальную машину и AlloyDB Omni.

В Cloud Shell создайте клиентскую виртуальную машину:

export ZONE=us-central1-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:

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

Подключитесь к AlloyDB Omni с помощью psql (пароль: VeryStrongPassword ):

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

В сессии psql создайте demo базу данных:

CREATE DATABASE demo;

Переключиться на demo базу данных:

\c demo

Создайте функции преобразования

Для пользовательских конечных точек встраивания требуются функции преобразования входных и выходных данных для адаптации форматов данных между AlloyDB Omni и API модели.

Создайте функцию преобразования входных данных:

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

Зарегистрируйте модель

Зарегистрируйте модель в AlloyDB Omni, используя процедуру google_ml.create_model . Укажите 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.

Нажмите q , чтобы вернуться к командной строке psql .

Выход из сессии psql:

\q

7. Проверьте модель на примерах данных.

Загрузите пример данных

В этом руководстве для демонстрации поиска векторного сходства используется набор данных о розничной продаже продукции Cymbal. Для импорта данных в AlloyDB Omni вы будете использовать Google Cloud SDK и клиент PostgreSQL.

В сеансе SSH на 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=#

Запрос выполнился за 83 мс и вернул список деревьев из таблицы cymbal_products, соответствующих запросу и имеющих в наличии в магазине номер 1583.

Построить индекс ИНС

При работе с небольшим набором данных легко использовать точный поиск, сканируя все эмбеддинги, но по мере роста объема данных увеличиваются и время загрузки, и время отклика. Для повышения производительности можно создавать индексы на основе данных эмбеддингов. Вот пример того, как это сделать, используя индекс 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

Чтобы вернуться в Google Cloud Shell, отключитесь от SSH-сессии экземпляра instance-1 нажав CTRL+D или введя команду exit .

8. Разверните Gemma с помощью vLLM

Добавить пул узлов для Джеммы

Для начала проверьте, какие типы узлов доступны в вашем регионе:

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

Вы должны увидеть список доступных типов ускорителей, включая ускоритель nvidia-l4. Теперь создайте пул узлов с типом ускорителя 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

Создайте манифест развертывания для модели Google Gemini 4 12B с помощью 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

Примените сохраненный файл развертывания 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 .

9. Зарегистрируйте модель Gemma 4 в AlloyDB Omni.

Зарегистрируйте модель Gemma 12B в AlloyDB Omni, используя процедуру google_ml.create_model . Укажите 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:

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

После подключения к виртуальной машине экспортируйте переменную 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';

Нажмите q , чтобы выйти из окна результатов и вернуться в командную строку psql

Объедините векторный поиск с LLM RAG в AlloyDB Omni.

Используйте векторный поиск с запросом LLM для демонстрации RAG (генерация с расширенными возможностями поиска) с использованием LLM.

Выполните SQL-запрос в 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;

Ожидаемый результат:

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

Данный запрос дополняет подсказку для LLM результатами векторного поиска.

Попробуйте другие запросы и поэкспериментируйте с шаблонами RAG. Преимущество представленной архитектуры заключается в ее полной самодостаточности. Данные не передаются за пределы вашего кластера, и она может работать в полностью изолированных средах.

Выход из сессии psql :

\q

Отключитесь от SSH-сессии, подключенной к виртуальной машине:

exit

Не забывайте, что AlloyDB Omni обладает большим количеством функций и тестовых примеров.

10. Очистка окружающей среды

Чтобы избежать постоянных расходов на ваш аккаунт Google Cloud, удалите ресурсы, созданные в этом практическом задании.

Удалите кластер GKE.

В Cloud Shell удалите кластер 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}

Ожидаемый результат:

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

Удалите клиентскую виртуальную машину

В Cloud Shell удалите экземпляр 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}

Ожидаемый результат:

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

Если вы создали новый проект для этого практического занятия, вы можете при желании удалить весь проект в Google Cloud Resource Manager .

11. Поздравляем!

Поздравляем с завершением практического занятия!

Что вы осветили

  • Как развернуть AlloyDB Omni в кластере GKE
  • Как подключиться к AlloyDB Omni
  • Как загрузить данные в AlloyDB Omni
  • Как развернуть модели ИИ (встраивание и LLM) в GKE
  • Как зарегистрировать модели ИИ в AlloyDB Omni
  • Как сгенерировать векторные представления для семантического поиска
  • Как выполнять семантические поисковые запросы в AlloyDB Omni
  • Как создавать и использовать векторные индексы в AlloyDB Omni

Более подробную информацию о работе с ИИ в AlloyDB Omni можно найти в документации .

Опрос

Выход:

Как вы будете использовать этот учебный материал?

Прочитайте только до конца. Прочитайте текст и выполните упражнения.