1. Giriş
Bu codelab'de, vektör aramayı Vertex AI yerleştirmeleriyle birleştirerek AlloyDB AI'ı nasıl kullanacağınızı öğreneceksiniz.
Ön koşullar
- Google Cloud Console hakkında temel düzeyde bilgi
- Komut satırı arayüzü ve Google Shell'de 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
- Verileri veritabanına yükleme
- AlloyDB'de Vertex AI yerleştirme modelini kullanma
- Vertex AI üretken modelini kullanarak sonucu zenginleştirme
- Vektör dizini kullanarak performansı iyileştirme
Gerekenler
- Bir Google Cloud Hesabı ve Google Cloud Projesi
- Chrome gibi bir web tarayıcısı
2. Kurulum ve Gereksinimler
Kendine ait tempoda ortam kurulumu
- 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.
- 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, benzersiz bir dize otomatik olarak oluşturur. Bu dizenin ne olduğu genellikle önemli değildir. Çoğu kod laboratuvarında proje kimliğinize (genellikle
PROJECT_ID
olarak tanımlanır) referans vermeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele başka bir kimlik oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje boyunca geçerli kalır. - Bazı API'lerin kullandığı üçüncü bir değer (Proje Numarası) olduğunu belirtmek isteriz. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
- 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 Cloud Shell simgesini tıklayın:
Ortam sağlanıp bağlantı kurulabilmesi için birkaç saniye beklemeniz gerekir. İşlem tamamlandığında aşağıdakine benzer bir ekran görürsünüz:
İ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ışır. Bu sayede ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu codelab'deki tüm çalışmalarınızı tarayıcıda yapabilirsiniz. Hiç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.
Varsayılan bölgenizi Vertex AI embedding modellerini kullanacak şekilde yapılandırın. Vertex AI'ın kullanılabildiği yerler 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. Böyle bir kullanıcımız yoksa oluşturmamız, dahili Google hizmetleri tarafından kullanılması için 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ı ayarlamamı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
Ayrılan 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)$
AlloyDB 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. us-central1 bölgesini ve alloydb-aip-01 küme adını 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.
AlloyDB birincil örneğini 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 tekrar 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 bağlantı kullanılarak dağıtılır. Bu nedenle, veritabanıyla çalışmak için PostgreSQL istemcisinin yüklü olduğu bir sanal makineye ihtiyacımız vardır.
GCE sanal makinesi dağıtma
AlloyDB kümesiyle aynı bölgede ve VPC'de bir GCE sanal makinesi oluşturun.
Cloud Shell'de şunları çalıştırı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 Müşterisini 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 izinleri ekleyin.
"+" işaretini kullanarak başka bir Cloud Shell sekmesi açın dokunun.
Yeni Cloud Shell sekmesinde şunları 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
Sekmede "exit" yürütme komutunu kullanarak sekmeyi kapatın:
exit
Veritabanı Oluştur
Veritabanı hızlı başlangıç kılavuzu oluşturun.
GCE sanal makine oturumunda:
Veritabanı oluşturma:
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 şunları yapın:
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 indirip 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ştirilmiş öğeleri hesaplama
Verileri içe aktardıktan sonra ürün verilerimizi cymbal_products tablosuna aldık. Envanter, cymbal_inventory tablosundaki her mağazadaki kullanılabilir ürünlerin sayısını ve cymbal_stores tablosundaki mağazaların listesini de gösteriyor. Vektör verilerini, ürünlerimizin açıklamalarına göre hesaplamamız gerekir. Bunun için embedding 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 dokümanlar bölümünde 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 göre Vertex AI'dan vektör verileri döndürür.
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
Veritabanına bağlandıktan sonra psql oturumunda şunları yürütün:
ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) 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(768) GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED; ALTER TABLE quickstart_db=>
8. Benzerlik araması yapma
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.
AlloyDB Studio'ya bağlanma
Aşağıdaki bölümlerde, veritabanına 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.
Ardından sol taraftaki AlloyDB Studio'yu tıklayın:
quickstart_db veritabanını, postgres kullanıcısını seçin ve kümeyi oluştururken not ettiğimiz şifreyi girin. Ardından "Kimlik doğrulaması yap"ı tıklayın. düğmesini tıklayın.
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.
SQL komutlarını çalıştırabileceğiniz arayüzü açar
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'yu 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şiyor?" 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ış şu şekildedir:
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.43922018972266397 Meyer Lemon Tree | Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by | 34 | 93230 | 0.4685112926118228 Toyon | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e | 10.00 | 93230 | 0.4835677149651668 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.4947204525907498 California Peppertree | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e | 25.00 | 93230 | 0.5054166905547247 California Black Walnut | This is a beautiful walnut tree that can grow to be over 80 feet tall. It is a d | 100.00 | 93230 | 0.5084219510932597 California Sycamore | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is | 300.00 | 93230 | 0.5140519790508755 Coast Live Oak | This is a beautiful oak tree that can grow to be over 100 feet tall. It is an ev | 500.00 | 93230 | 0.5143126438081371 Fremont Cottonwood | This is a beautiful cottonwood tree that can grow to be over 100 feet tall. It i | 200.00 | 93230 | 0.5174774727252058 Madrone | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an | 50.00 | 93230 | 0.5227400803389093
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 aramasından elde ettiğimiz sonuçları içeren bir JSON oluşturmayı ve ardından anlamlı bir çıkış oluşturmak için Vertex AI'daki bir metin LLM modeli istemi için ek olarak bu oluşturulan JSON'u kullanmayı planlıyoruz. İlk adımda JSON'u oluştururuz, ardından Vertex AI Studio'da test ederiz ve son adımda bir uygulamada kullanılabilecek bir SQL ifadesine dahil ederiz.
Çıktıyı JSON biçiminde 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ğini aşağıda bulabilirsiniz:
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"}]
İstemi Vertex AI Studio'da çalıştırma
Oluşturulan JSON'u, Vertex AI Studio'daki üretken yapay zeka metin modeline istem olarak eklemek için kullanabiliriz.
Cloud Console'da Vertex AI Studio'yu açın.
Ek API'leri etkinleştirmenizi isteyebilir ancak bu isteği yoksayabilirsiniz. Laboratuvarımızı tamamlamak için başka API'ye ihtiyacımız yok.
Kullanacağımız istem şu şekildedir:
Müşterinin ihtiyaçlarına göre ürün bulmalarına yardımcı olan samimi bir danışmansınız.
Müşteri isteğine göre, aramayla yakından ilişkili ürünlerin listesini yükledik.
{"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"} gibi değer listesi içeren JSON biçimindeki liste
Ürün listesini aşağıda bulabilirsiniz:
[JSON'umuzun yeri]
Müşteri "Burada en iyi hangi ağaç yetişiyor?" diye sordu.
İstem olarak ürün, fiyat ve bazı ek bilgiler vermeniz gerekir
İstemimizi JSON değerlerimizle ve gemini-1.5-flash modelini kullanarak çalıştırdığımızda elde ettiğimiz sonuç:
Bu örnekteki modelden aldığımız yanıtı aşağıda bulabilirsiniz. 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 Cherry Tree 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 indirimli.
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şidi seçmenize yardımcı olabilir ve dikim ile bakım konusunda ipuçları verebilirler."
İstemi PSQL'de çalıştırma
Doğrudan veritabanında SQL kullanarak üretken bir modelden aynı yanıtı almak için AlloyDB yapay zeka entegrasyonunu Vertex AI ile kullanabiliriz. Ancak, gemini-1.5-Flash modelini kullanmak için önce onu kaydettirmemiz gerekir.
Uzantıyı 1.4.1 sürümüne yükseltin (mevcut sürüm daha düşükse). Daha önce gösterildiği gibi psql üzerinden quickstart_db veritabanına bağlanın (veya AlloyDB Studio'yu kullanın) ve şunu yürütün:
SELECT extversion from pg_extension where extname='google_ml_integration';
Döndürülen değer 1.4.1'den küçükse şu kodu yürütün:
ALTER EXTENSION google_ml_integration UPDATE TO '1.4.1';
Ardından, google_ml_integration.enable_model_support veritabanı işaretini "açık" olarak ayarlamamız gerekir. Bunu yapmak 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.
Aşağıdaki kodu çalıştırarak modeli psql veya AlloyDB Studio'ya kaydedin:
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');
Kayıtlamamız gereken bir sonraki model ise kullanıcı dostu çıkışı oluşturmak için kullanılacak gemini-1.5-flash-002.
CALL
google_ml.create_model(
model_id => 'gemini-1.5-flash-002',
model_request_url => 'https://$REGION-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/publishers/google/models/gemini-1.5-flash-002:streamGenerateContent',
model_provider => 'google',
model_auth_type => 'alloydb_service_agent_iam');
google_ml.model_info_view kaynağından bilgi seçerek kayıtlı modellerin listesini istediğiniz zaman 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-002',
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 çıktı şu şekildedir. Çıkışınız, model sürümüne ve parametrelere bağlı olarak farklı olabilir.:
"That" "'s a great question! Based on your location (assuming you're" " in zip code 93230), I have a suggestion for a" " fruit tree that should thrive.\n\nWe have the **Cherry Tree** available.\n\n**Product Name:** Cherry Tree\n\n**Description:** This is a beautiful cherry" " tree that will produce delicious cherries. It's a deciduous tree (meaning it loses its leaves in the fall) growing to about 15 feet tall." " The leaves are dark green in summer, turning a beautiful red in the fall. Cherry trees are known for their beauty, shade, and privacy.\n\n**Sale Price:** $75.00\n\n**Important Considerations for Growing" " Cherry Trees:**\n\n* **Climate:** Cherry trees prefer a cool, moist climate, and 93230 falls within a suitable range (USDA zones 4-9). However, it's always a good idea to" " check the specific microclimate of your property (sun exposure, drainage etc.).\n* **Soil:** They do best in sandy soil. If your soil is different, you may need to amend it to improve drainage.\n* **Pollination:** Many cherry varieties require a second, compatible cherry tree for proper pollination" ". Check the specific pollination needs of this variety before purchase if you want a significant cherry yield.\n\nThis cherry tree is a beautiful addition to any yard and will provide you with delicious cherries if you can meet its needs. Would you like to know more about its pollination requirements, or perhaps see if we have any other" " fruit trees suitable for your area?\n" ""
10. Vektör dizini oluştur
Veri kümemiz oldukça küçük ve yanıt süresi öncelikle yapay zeka modelleriyle etkileşime bağlıdır. Ancak, milyonlarca vektöründe vektör arama kısmı, yanıt süremizin önemli bir kısmını alarak sisteme yük bindirebilir. Bunu iyileştirmek için vektörlerimizin üzerine bir dizin oluşturabiliriz.
ScaNN dizini oluşturma
SCANN dizinini oluşturmak için bir uzantıyı daha etkinleştirmemiz gerekir. alloydb_scann uzantısı, Google ScaNN algoritmasını kullanarak ANN türü vektör dizini ile çalışmamızı sağlayan bir arayüz sağlar.
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Beklenen çıkış:
quickstart_db=> CREATE EXTENSION IF NOT EXISTS alloydb_scann; CREATE EXTENSION Time: 27.468 ms quickstart_db=>
Şimdi dizini oluşturabiliriz. Aşağıdaki örnekte çoğu parametreyi varsayılan olarak bırakıyorum ve dizin için yalnızca bir dizi bölümlendirme (num_leaves) veriyorum:
CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products
USING scann (embedding cosine)
WITH (num_leaves=31, max_num_levels = 2);
Dizin parametrelerini ayarlama hakkında daha fazla bilgiyi dokümanlar bölümünde bulabilirsiniz.
Beklenen çıkış:
quickstart_db=> CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products USING scann (embedding cosine) WITH (num_leaves=31, max_num_levels = 2); CREATE INDEX quickstart_db=>
Yanıtı karşılaştırma
Artık vektör arama sorgusunu EXPLAIN modunda çalıştırıp dizinin kullanılıp kullanılmadığını doğrulayabiliriz.
EXPLAIN (analyze)
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;
Beklenen çıkış:
Aggregate (cost=16.59..16.60 rows=1 width=32) (actual time=2.875..2.877 rows=1 loops=1) -> Subquery Scan on trees (cost=8.42..16.59 rows=1 width=142) (actual time=2.860..2.862 rows=1 loops=1) -> Limit (cost=8.42..16.58 rows=1 width=158) (actual time=2.855..2.856 rows=1 loops=1) -> Nested Loop (cost=8.42..6489.19 rows=794 width=158) (actual time=2.854..2.855 rows=1 loops=1) -> Nested Loop (cost=8.13..6466.99 rows=794 width=938) (actual time=2.742..2.743 rows=1 loops=1) -> Index Scan using cymbal_products_embeddings_scann on cymbal_products cp (cost=7.71..111.99 rows=876 width=934) (actual time=2.724..2.724 rows=1 loops=1) Order By: (embedding <=> '[0.008864171,0.03693164,-0.024245683,-0.00355923,0.0055611245,0.015985578,...<redacted>...5685,-0.03914233,-0.018452475,0.00826032,-0.07372604]'::vector) -> Index Scan using walmart_inventory_pkey on cymbal_inventory ci (cost=0.42..7.26 rows=1 width=37) (actual time=0.015..0.015 rows=1 loops=1) Index Cond: ((store_id = 1583) AND (uniq_id = (cp.uniq_id)::text))
Çıkıştan, sorgunun "cymbal_products'ta cymbal_products_embeddings_scann kullanarak Dizin Taraması" kullandığını açıkça görebiliriz.
Sorguyu açıklamadan çalıştırırsak:
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;
Beklenen çıkış:
[{"product_name":"Meyer Lemon Tree","description":"Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by ","sale_price":34,"zip_code":93230,"product_id":"02056727942aeb714dc9a2313654e1b0"}]
Sonuçların biraz farklı olduğunu ve dizine ekleme olmadan yaptığımız aramada en üstte yer alan kiraz ağacını değil, ikinci seçenek olan Meyer limon ağacını döndürdüğünü görüyoruz. Dolayısıyla dizin bize performans sağlıyor ancak iyi sonuçlar sunacak kadar doğru.
Belgeler sayfasında bulunan langchain entegrasyonuyla, vektörler için mevcut farklı dizinleri ve daha fazla laboratuvar ile örneği deneyebilirsiniz.
11. Ortamı temizleme
Laboratuvarı tamamladıktan sonra AlloyDB örneklerini ve kümesini kaldırın
AlloyDB kümesini ve tüm örneklerini 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 kesildiyse ve önceki tüm ayarlar 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 silme:
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.
AlloyDB Yedeklemelerini 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 silebiliriz.
GCE sanal makinesini silme
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
12. 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
- Verileri veritabanına yükleme
- AlloyDB'de Vertex AI yerleştirme modelini kullanma
- Vertex AI üretken modelini kullanarak sonucu zenginleştirme
- Vektör dizini kullanarak performansı iyileştirme
13. Anket
Çıkış: