AlloyDB AI ile vektör yerleştirmeleri kullanmaya başlama

1. Giriş

Bu codelab'de, vektör aramayı Vertex AI yerleştirmeleriyle birleştirerek AlloyDB AI'ı nasıl kullanacağınızı öğreneceksiniz.

17e86406ab251142.png

Ön koşullar

  • Google Cloud, Console hakkında temel bilgiler
  • Komut satırı arayüzü ve Google kabuğuyla ilgili temel beceriler

Neler öğreneceksiniz?

  • AlloyDB kümesini ve birincil örneği dağıtma
  • Google Compute Engine sanal makinesinden AlloyDB'ye bağlanma
  • Veritabanı oluşturma ve AlloyDB AI'ı etkinleştirme
  • Veritabanına veri yükleme
  • AlloyDB'de Vertex AI yerleştirme modelini kullanma
  • Vertex AI üretken modelini kullanarak sonucu zenginleştirme

Gerekenler

  • Bir Google Cloud Hesabı ve Google Cloud Projesi
  • Chrome gibi bir web tarayıcısı

2. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğinizi (genellikle PROJECT_ID olarak tanımlanır) belirtmeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz olması açısından, bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmanın tekrarlanmasını önlemek amacıyla kaynakları kapatmak için oluşturduğunuz kaynakları silebilir veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloud Shell'i başlatma

Google Cloud dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.

Google Cloud Console'da, sağ üstteki araç çubuğunda bulunan Cloud Shell simgesini tıklayın:

55efc1aaa7a4d3ad.png

Ortamı sağlamak ve bağlamak yalnızca birkaç dakika sürer. Tamamlandığında şuna benzer bir sonuç görmeniz gerekir:

7ffe5cbb04455448

İhtiyacınız olan tüm geliştirme araçlarını bu sanal makinede bulabilirsiniz. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki tüm çalışmalarınız tarayıcıda yapılabilir. Herhangi bir şey yüklemeniz gerekmez.

3. Başlamadan önce

API'yi etkinleştirme

Çıkış:

Cloud Shell'de proje kimliğinizin ayarlandığından emin olun:

gcloud config set project [YOUR-PROJECT-ID]

PROJECT_ID ortam değişkenini ayarlayın:

PROJECT_ID=$(gcloud config get-value project)

Gerekli tüm hizmetleri etkinleştirin:

gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com

Beklenen çıkış

student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$ 
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

Vertex AI yerleştirme modellerini kullanmak için varsayılan bölgenizi yapılandırın. Vertex AI'ın kullanılabildiği konumlar hakkında daha fazla bilgi edinin. Örnekte us-central1 bölgesini kullanıyoruz.

gcloud config set compute/region us-central1

4. AlloyDB'yi dağıtma

Bir AlloyDB kümesi oluşturmadan önce VPC'mizde gelecekteki AlloyDB örneği tarafından kullanılacak uygun bir özel IP aralığına ihtiyacımız vardır. Elimizde yoksa oluşturmamız ve dahili Google hizmetleri tarafından kullanılacak şekilde atamamız gerekir. Ardından kümeyi ve örneği oluşturabiliriz.

Özel IP aralığı oluşturma

AlloyDB için VPC'mizde Özel Hizmet Erişimi yapılandırmasını yapılandırmamız gerekiyor. Burada, "varsayılan" değerine sahip olduğumuzu VPC ağına bağlanacaktır ve tüm işlemler için kullanılacaktır.

Özel IP aralığını oluşturun:

gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default

Tahsis edilen IP aralığını kullanarak özel bağlantı oluşturun:

gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default

Beklenen konsol çıkışı:

student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range].

student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default
Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully.

student@cloudshell:~ (test-project-402417)$

AllyDB Kümesi oluşturma

us-central1 bölgesinde bir AlloyDB kümesi oluşturun.

Postgres kullanıcısı için şifre tanımlayın. Kendi şifrenizi tanımlayabilir veya rastgele bir işlev kullanarak şifre oluşturabilirsiniz

export PGPASSWORD=`openssl rand -hex 12`

Beklenen konsol çıkışı:

student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`

İleride kullanmanız için PostgreSQL şifresini not edin:

echo $PGPASSWORD

Beklenen konsol çıkışı:

student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD
bbefbfde7601985b0dee5723

Bölgeyi ve AlloyDB küme adını tanımlayın. Küme adı olarak us-central1 bölgesini ve alloydb-aip-01 bilgisini kullanacağız:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01

Kümeyi oluşturmak için şu komutu çalıştırın:

gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION

Beklenen konsol çıkışı:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.                                                                                                                                                                                                                                                           

AllyDB Birincil Örnek Oluşturma

Aynı Cloud Shell oturumunda kümemiz için bir AlloyDB birincil örneği oluşturun. Bağlantınız kesilirse bölge ve küme adı ortam değişkenlerini yeniden tanımlamanız gerekir.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

Beklenen konsol çıkışı:

student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

5. AlloyDB'ye bağlan

AlloyDB yalnızca özel bir bağlantı kullanılarak dağıtıldığından, veritabanıyla çalışmak için PostgreSQL istemcisi yüklü bir sanal makineye ihtiyacımız vardır.

GCE sanal makinesini dağıtma

AlloyDB kümesiyle aynı bölgede ve VPC'de bir GCE sanal makinesi oluşturun.

Cloud Shell'de şunu yürütün:

export ZONE=us-central1-a
gcloud compute instances create instance-1 \
    --zone=$ZONE \
    --create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
    --scopes=https://www.googleapis.com/auth/cloud-platform

Beklenen konsol çıkışı:

student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
gcloud compute instances create instance-1 \
    --zone=$ZONE \
    --create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
    --scopes=https://www.googleapis.com/auth/cloud-platform

Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/zones/us-central1-a/instances/instance-1].
NAME: instance-1
ZONE: us-central1-a
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE: 
INTERNAL_IP: 10.128.0.2
EXTERNAL_IP: 34.71.192.233
STATUS: RUNNING

Postgres İstemcisi'ni yükleme

Dağıtılan sanal makineye PostgreSQL istemci yazılımını yükleme

Sanal makineye bağlanın:

gcloud compute ssh instance-1 --zone=us-central1-a

Beklenen konsol çıkışı:

student@cloudshell:~ (test-project-402417)$ gcloud compute ssh instance-1 --zone=us-central1-a
Updating project ssh metadata...working..Updated [https://www.googleapis.com/compute/v1/projects/test-project-402417].                                                                                                                                                         
Updating project ssh metadata...done.                                                                                                                                                                                                                                              
Waiting for SSH key to propagate.
Warning: Permanently added 'compute.5110295539541121102' (ECDSA) to the list of known hosts.
Linux instance-1.us-central1-a.c.gleb-test-short-001-418811.internal 6.1.0-18-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
student@instance-1:~$ 

Sanal makine içinde çalışan yazılımı yükleyin:

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

Beklenen konsol çıkışı:

student@instance-1:~$ sudo apt-get update
sudo apt-get install --yes postgresql-client
Get:1 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable InRelease [5146 B]
Get:2 https://packages.cloud.google.com/apt cloud-sdk-bullseye InRelease [6406 B]   
Hit:3 https://deb.debian.org/debian bullseye InRelease  
Get:4 https://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB]
Get:5 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable/main amd64 Packages [1930 B]
Get:6 https://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
Get:7 https://deb.debian.org/debian bullseye-backports InRelease [49.0 kB]
...redacted...
update-alternatives: using /usr/share/postgresql/13/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode
Setting up postgresql-client (13+225) ...
Processing triggers for man-db (2.9.4-2) ...
Processing triggers for libc-bin (2.31-13+deb11u7) ...

Örneğe bağlanma

psql kullanarak sanal makineden birincil örneğe bağlanın.

Aynı Cloud Shell sekmesinde, ornek-1 sanal makinenize SSH oturumu açıldı.

GCE sanal makinesinden AlloyDB'ye bağlanmak için belirtilen AlloyDB şifre (PG gizli) değerini ve AlloyDB küme kimliğini kullanın:

export PGPASSWORD=<Noted password>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
psql "host=$INSTANCE_IP user=postgres sslmode=require"

Beklenen konsol çıkışı:

student@instance-1:~$ export PGPASSWORD=CQhOi5OygD4ps6ty
student@instance-1:~$ ADBCLUSTER=alloydb-aip-01
student@instance-1:~$ REGION=us-central1
student@instance-1:~$ INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
gleb@instance-1:~$ psql "host=$INSTANCE_IP user=postgres sslmode=require"
psql (15.6 (Debian 15.6-0+deb12u1), server 15.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=>

psql oturumunu kapatın:

exit

6. Veritabanını Hazırlama

Veritabanı oluşturmamız, Vertex AI entegrasyonunu etkinleştirmemiz, veritabanı nesneleri oluşturma ve verileri içe aktarmamız gerekiyor.

AllyDB'ye Gerekli İzinleri Verme

AlloyDB hizmet aracısına Vertex AI izinlerini ekleme

"+" işaretini kullanarak başka bir Cloud Shell sekmesi açın dokunun.

4ca978f5142bb6ce.png

Yeni Cloud Shell sekmesinde şu komutu yürütün:

PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"

Beklenen konsol çıkışı:

student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-11039]
student@cloudshell:~ (test-project-001-402417)$ gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"
Updated IAM policy for project [test-project-001-402417].
bindings:
- members:
  - serviceAccount:service-4470404856@gcp-sa-alloydb.iam.gserviceaccount.com
  role: roles/aiplatform.user
- members:
...
etag: BwYIEbe_Z3U=
version: 1
 

"exit" yürütme komutunun biriyle sekmeyi kapatın tıklayın:

exit

Veritabanı Oluştur

Veritabanı hızlı başlangıç kılavuzu oluşturun.

GCE sanal makine oturumunda:

Veritabanı oluşturun:

psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db"

Beklenen konsol çıkışı:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db"
CREATE DATABASE
student@instance-1:~$  

Vertex AI entegrasyonunu etkinleştirme

Veritabanında Vertex AI entegrasyonunu ve pgvector uzantılarını etkinleştirin.

GCE sanal makinesinde yürütme:

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"

Beklenen konsol çıkışı:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"
CREATE EXTENSION
CREATE EXTENSION
student@instance-1:~$ 

Verileri İçe Aktarma

Hazırlanan verileri indirin ve yeni veritabanına aktarın.

GCE sanal makinesinde yürütme:

gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"

Beklenen konsol çıkışı:

student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
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@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
COPY 941
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
COPY 263861
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"
COPY 4654
student@instance-1:~$

7. Yerleştirmeleri hesaplama

Verileri içe aktardıktan sonra ürün verilerimizi cymbal_products tablosuna ekledik. Envanterde her mağazada bulunan ürünlerin sayısı cymbal_inventory tablosunda ve cymbal_stores tablosundaki mağazaların listesinde gösteriliyor. Vektör verilerini ürünlerimizin açıklamalarına dayanarak hesaplamamız gerekiyor ve bunun için yerleştirme işlevini kullanacağız. Bu işlevden yararlanarak Vertex AI entegrasyonunu kullanarak ürün açıklamalarına göre vektör verilerini hesaplayıp tabloya ekleyeceğiz. Kullanılan teknoloji hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.

Yerleştirme sütunu oluşturma

psql kullanarak veritabanına bağlanın ve cymbal_products tablosundaki yerleştirme işlevini kullanarak vektör verilerini içeren sanal bir sütun oluşturun. Yerleştirme işlevi, product_description sütunundan sağlanan verilere dayanarak Vertex AI'dan vektör verilerini döndürür.

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"

Veritabanına bağlandıktan sonra psql oturumunda:

ALTER TABLE cymbal_products ADD COLUMN embedding vector GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;

Komut, sanal sütunu oluşturur ve vektör verileriyle doldurur.

Beklenen konsol çıkışı:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
psql (13.11 (Debian 13.11-0+deb11u1), server 14.7)
WARNING: psql major version 13, server major version 14.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

quickstart_db=> ALTER TABLE cymbal_products ADD COLUMN embedding vector GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;
ALTER TABLE
quickstart_db=> 

8. Benzerlik Araması Yap

Artık aramamızı, açıklamalar için hesaplanan vektör değerlerine ve isteğimiz için aldığımız vektör değerine dayalı benzerlik araması yaparak gerçekleştirebiliriz.

SQL sorgusu, aynı psql komut satırı arayüzünden veya alternatif olarak AlloyDB Studio'dan yürütülebilir. Çok satırlı ve karmaşık çıkışlar, AlloyDB Studio'da daha iyi görünebilir.

AllyDB Studio'ya bağlanma

Aşağıdaki bölümlerde, veritabanıyla bağlantı gerektiren tüm SQL komutları alternatif olarak AlloyDB Studio'da yürütülebilir. Komutu çalıştırmak için birincil örneği tıklayarak AlloyDB kümenizin web konsolu arayüzünü açmanız gerekir.

ef4bfbcf0ed2ef3a.png

Ardından sol taraftaki AlloyDB Studio'yu tıklayın:

5c155cbcd7d43a1.png

quickstart_db veritabanını, user postgres'i seçin ve kümeyi oluştururken belirtilen şifreyi girin. Ardından "Kimlik doğrulaması yap"ı tıklayın. düğmesini tıklayın.

432613065cac864f.png

AlloyDB Studio arayüzünü açar. Veritabanında komutları çalıştırmak için "Düzenleyici 1"i tıklayın. sekmesini tıklayın.

b36c28f8165119ca.png

SQL komutlarını çalıştırabileceğiniz arayüzü açar

cf43aa20f292797e.png

Komut satırı psql kullanmayı tercih ederseniz alternatif yolu izleyin ve önceki bölümlerde açıklandığı gibi sanal makine SSH oturumunuzdan veritabanına bağlanın.

psql'den Benzerlik Araması çalıştırma

Veritabanı oturumunuzun bağlantısı kesildiyse psql veya AlloyDB Studio kullanarak veritabanına tekrar bağlanın.

Veritabanına bağlanın:

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"

Müşterinin isteğiyle en alakalı ürünlerin listesini almak için bir sorgu çalıştırın. "Burada ne tür meyve ağaçları iyi yetişir?" gibi bir vektör değeri elde etmek için Vertex AI'a ileteceğimiz istek.

İsteğimiz açısından en uygun olan ilk 10 öğeyi seçmek için çalıştırabileceğiniz sorguyu aşağıda görebilirsiniz:

SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 10;

Beklenen çıkış şudur:

quickstart_db=> SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 10;
    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.287184013172779
 Toyon               | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 | 0.30574073611569963
 Secateurs           | These secateurs are perfect for pruning small branches and vines.                |      15.00 |    93230 |  0.3264385326189635
 Trimming Shears     | These trimming shears are perfect for trimming hedges and bushes.                |      20.00 |    93230 | 0.33293036535756393
 Cypress Tree        | This is a beautiful cypress tree that will provide shade and privacy. It is an e |      75.00 |    93230 | 0.33485770716129326
 Madrone             | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an |      50.00 |    93230 |  0.3354408801293012
 California Redwood  | This is a beautiful redwood tree that can grow to be over 300 feet tall. It is a |    1000.00 |    93230 |  0.3427243109636263
 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.3427628377929176
 California Sycamore | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is  |     300.00 |    93230 |  0.3430208475356905
 Maple Tree          | This is a beautiful maple tree that will produce colorful leaves in the fall. It |     100.00 |    93230 |  0.3432609589330091
(10 rows)

quickstart_db=> 

9. Yanıtı Geliştir

Sorgunun sonucunu kullanarak bir istemci uygulamasına verilen yanıtı iyileştirebilir ve Vertex AI üretken temel dil modeline yönelik istem kapsamında, sağlanan sorgu sonuçlarını kullanarak anlamlı bir çıkış hazırlayabilirsiniz.

Bunu başarmak için vektör aramadan elde ettiğimiz sonuçları kullanarak bir JSON oluşturmayı planlıyoruz. Ardından, oluşturulan JSON'ı, Vertex AI'daki metin LLM modeli istemiyle birlikte kullanarak anlamlı bir sonuç oluşturacağız. İlk adımda JSON'u oluştururuz, sonra Vertex AI Studio'da test ederiz ve son adımda JSON'u, uygulamada kullanılabilecek bir SQL ifadesine ekleriz.

JSON biçiminde çıkış oluşturma

Sorguyu değiştirerek çıkışı JSON biçiminde oluşturun ve Vertex AI'a iletmek için yalnızca bir satır döndürün

Sorgu örneği:

WITH trees as (
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id as product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

Çıkışta beklenen JSON şu şekildedir:

[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]

Vertex AI Studio'da istemi çalıştırma

Oluşturulan JSON'ı, Vertex AI Studio'daki üretken yapay zeka metin modeline istemin bir parçası olarak sağlamak için kullanabiliriz

Cloud konsolunda Vertex AI Studio'yu açın.

e514b176aef7945e.png

54712e5ade7121f.png

Ek API'leri etkinleştirmenizi isteyebilir ancak bu isteği yoksayabilirsiniz. Laboratuvarımızı tamamlamak için başka API'lere ihtiyacımız yoktur.

Kullanacağımız istem:

Müşterinin ihtiyaçlarına göre bir ürünü bulmaya yardımcı olan samimi bir danışmansınız.

Müşteri talebi doğrultusunda, aramayla yakından alakalı ürünlerin bir listesini yükledik.

{"product_name":"name","description":"Bazı açıklamalar","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"} gibi değerlerin yer aldığı JSON biçiminde liste

Ürün listesini aşağıda bulabilirsiniz:

[JSON'umuzun yeri]

Müşteri, "Burada en iyi büyüyen ağaç hangisi?" diye sordu.

Ürün, fiyat ve bazı ek bilgiler sağlamalısınız." istem olarak

İstemi JSON değerlerimizle ve gemini-1.5-flash modelini kullanarak çalıştırdığımızda elde ettiğimiz sonuç şöyle olur:

30e5072cd2975685.png

Bu örnekteki modelden aldığımız yanıt aşağıdaki gibidir. Model ve parametreler zaman içinde değiştiği için yanıtınızın farklı olabileceğini unutmayın:

"Bulunduğunuz bölgede yetişen bir ağaç aradığınızı görüyorum. Posta kodunuza (93230) göre kiraz ağacı mükemmel bir seçenek gibi görünüyor.

Lezzetli kirazlar üreten güzel bir ağaç olarak tarif edilir. Şu anda 75,00 TL indirimde.

Bölgenizdeki büyüme oranıyla ilgili net bir bilgim olmasa da, kiraz ağaçlarının genellikle iyi dizilmiş toprağı ve tam güneşli toprağı tercih ettiğini söyleyebilirim.

En iyi sonuçları elde etmek için bulunduğunuz yerdeki ve toprak koşullarıyla ilgili daha özel tavsiyeler verebilecek yerel bir fidanlık veya bahçecilik uzmanına danışmanızı öneririz. Ayrıca, ihtiyaçlarınıza en uygun çeşitleri seçmenize yardımcı olabilir, ekim ve bakım hakkında ipuçları verebilirler."

İstemi PSQL'de çalıştırma

Vertex AI ile AlloyDB AI entegrasyonunu kullanarak aynı yanıtı, SQL'i doğrudan veritabanında kullanan üretken bir modelden de alabiliriz. Ancak, gemini-1.5-flash modelini kullanmak için önce onu kaydetmemiz gerekir.

Uzantıyı 1.3 sürümüne yükseltin. Daha önce gösterildiği gibi pSQL'den quickstart_db veritabanına daha önce gösterildiği gibi bağlanın (veya AlloyDB Studio'yu kullanın) ve şunu yürütün:

ALTER EXTENSION google_ml_integration UPDATE TO '1.3'

Ardından, google_ml_integration.enable_model_support veritabanı işaretini "açık" olarak ayarlamamız gerekir. Bunun için AlloyDB web konsolu arayüzünü kullanabilir veya aşağıdaki gcloud komutunu çalıştırabilirsiniz.

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
ADBCLUSTER=alloydb-aip-01
gcloud beta alloydb instances update $ADBCLUSTER-pr \
  --database-flags google_ml_integration.enable_model_support=on \
  --region=$REGION \
  --cluster=$ADBCLUSTER \
  --project=$PROJECT_ID \
  --update-mode=FORCE_APPLY

Komutun arka planda yürütülmesi yaklaşık 3-5 dakika sürer. Ardından, yeni işareti psql oturumunda veya AlloyDB Studio'nun quickstart_db veritabanına bağlanarak doğrulayabilirsiniz.

show google_ml_integration.enable_model_support;

psql oturumundan beklenen çıkış "on" ise:

postgres=> show google_ml_integration.enable_model_support;
 google_ml_integration.enable_model_support 
--------------------------------------------
 on
(1 row)

Ardından, iki model kaydetmemiz gerekir. İlki, halihazırda kullanılan text-embedding-004 modelidir. Model kaydı özelliklerini etkinleştirdiğimiz için modelin kaydedilmesi gerekir.

psql veya AlloyDB Studio'da çalıştırılan modeli kaydetmek için şu kodu kullanın:

CALL
  google_ml.create_model(
    model_id => 'text-embedding-004',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-004',
    model_type => 'text_embedding',
    model_auth_type => 'alloydb_service_agent_iam',
    model_in_transform_fn => 'google_ml.vertexai_text_embedding_input_transform',
    model_out_transform_fn => 'google_ml.vertexai_text_embedding_output_transform');

Kaydetmemiz gereken bir sonraki model ise kullanıcı dostu çıktılar oluşturmak için kullanılacak olan gemini-1.5-flash-001'dir.

CALL
  google_ml.create_model(
    model_id => 'gemini-1.5-flash-001',
    model_request_url => 'https://$REGION-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/publishers/google/models/gemini-1.5-flash-001:streamGenerateContent',
    model_provider => 'google',
    model_auth_type => 'alloydb_service_agent_iam');

İstediğiniz zaman google_ml.model_info_view kaynağından bilgi seçerek kayıtlı modellerin listesini doğrulayabilirsiniz.

select model_id,model_type from google_ml.model_info_view;

Aşağıda örnek çıktı

quickstart_db=> select model_id,model_type from google_ml.model_info_view;
        model_id         |   model_type   
-------------------------+----------------
 textembedding-gecko     | text_embedding
 textembedding-gecko@001 | text_embedding
 text-embedding-004      | text_embedding
 gemini-1.5-flash-001    | generic
(4 rows)

Artık SQL kullanan üretken yapay zeka metin modeline istemin bir parçası olarak alt sorgu JSON dosyasında oluşturulan kodu kullanabiliriz.

Veritabanına yapılan psql veya AlloyDB Studio oturumunda sorguyu çalıştırın.

WITH trees AS (
SELECT
        cp.product_name,
        cp.product_description AS description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id AS product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci ON
        ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON
        cs.store_id = ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-004',
        '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
        json_array_elements(google_ml.predict_row( model_id =>'gemini-1.5-flash-001',
        request_body => json_build_object('contents',
        json_build_object('role',
        'user',
        'parts',
        json_build_object('text',
        prompt_text)))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
FROM
        prompt)
SELECT
        string_agg(resp::text,
        ' ')
FROM
        response;

Beklenen çıkış şu şekildedir: Elde ettiğiniz çıkış, model sürümüne ve parametrelere bağlı olarak farklılık gösterebilir:

--------------------------------------------------------------------------------------------------------
 "I" " see you're interested in fruit trees! Based on your location, I found" " one great option:\n\n**Cherry Tree:** \n\nThis beautiful cherry tree will" " produce delicious cherries. It's a deciduous tree, meaning it loses its leaves in the fall, and can grow up to 15 feet tall. The" " leaves are a vibrant dark green in the summer, turning a beautiful red in the fall. \n\nCherry trees are known for their beauty and ability to provide shade" " and privacy. They prefer a cool, moist climate and sandy soil, making them a good fit for your area. \n\nThe Cherry Tree is currently on sale for $75.00.\n\nWould you like to know more about" " the Cherry Tree, or are you interested in exploring other fruit tree options? \n" ""
(1 row)

10. Ortamı temizle

Laboratuvarı tamamladıktan sonra AlloyDB örneklerini ve kümesini kaldırın

AllyDB kümesini ve tüm örnekleri silme

Küme, seçenek gücüyle yok edilir. Bu işlem, kümeye ait tüm örnekleri de siler.

Bağlantınız kesildiğinde ve önceki tüm ayarlarınız kaybolduysa Cloud Shell'de proje ve ortam değişkenlerini tanımlayın:

gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)

Kümeyi silin:

gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force

Beklenen konsol çıkışı:

student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
All of the cluster data will be lost when the cluster is deleted.

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

Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f
Deleting cluster...done.   

AllyDB Yedeklerini Silme

Kümenin tüm AlloyDB yedeklerini silin:

for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done

Beklenen konsol çıkışı:

student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f
Deleting backup...done.                                                                                                                                                                                                                                                            

Artık sanal makinemizi kaldırabiliriz

GCE sanal makinesini silin

Cloud Shell'de şunu yürütün:

export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
    --zone=$ZONE \
    --quiet

Beklenen konsol çıkışı:

student@cloudshell:~ (test-project-001-402417)$ export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
    --zone=$ZONE \
    --quiet
Deleted 

11. Tebrikler

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

İşlediklerimiz

  • AlloyDB kümesini ve birincil örneği dağıtma
  • Google Compute Engine sanal makinesinden AlloyDB'ye bağlanma
  • Veritabanı oluşturma ve AlloyDB AI'ı etkinleştirme
  • Veritabanına veri yükleme
  • AlloyDB'de Vertex AI yerleştirme modelini kullanma
  • Vertex AI üretken modelini kullanarak sonucu zenginleştirme

12. Anket

Çıkış:

Bu eğiticiden nasıl yararlanacaksınız?

Yalnızca baştan sona oku Okuyun ve alıştırmaları tamamlayın