AlloyDB'de Çok Formatlı Yerleştirmeler

1. Giriş

a7e7c1d2afe05e68.png

Bu codelab'de, AlloyDB'yi dağıtma ve çok formatlı gömmeler kullanarak semantik arama için yapay zeka entegrasyonundan yararlanma hakkında bilgi verilmektedir. Bu laboratuvar, AlloyDB AI özelliklerine ayrılmış bir laboratuvar koleksiyonunun parçasıdır. Belgelerdeki AlloyDB AI sayfasında daha fazla bilgi edinebilirsiniz.

Ön koşullar

  • Google Cloud ve konsol hakkında temel düzeyde bilgi sahibi olmak
  • Komut satırı arayüzü ve Cloud Shell'de temel beceriler

Neler öğreneceksiniz?

  • AlloyDB for Postgres'i dağıtma
  • Çok formatlı vektör araması nasıl kullanılır?
  • AlloyDB AI operatörlerini etkinleştirme
  • Çok formatlı arama için farklı AlloyDB AI operatörlerini kullanma
  • Metin ve resim arama sonuçlarını birleştirmek için AlloyDB AI'yı kullanma

Gerekenler

  • Google Cloud hesabı ve Google Cloud projesi
  • Google Cloud Console ve Cloud Shell'i destekleyen 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çın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Henüz bir Gmail veya Google Workspace hesabınız yoksa 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. Bu bilgiyi istediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırılmayı önlemek için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir. Ancak 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:

55efc1aaa7a4d3ad.png

Ortamın sağlanması ve bağlantının kurulması yalnızca birkaç saniye sürer. İşlem tamamlandığında aşağıdakine benzer bir sonuç görürsünüz:

7ffe5cbb04455448.png

Bu sanal makineye, ihtiyaç duyacağınız tüm geliştirme araçları yüklenmiştir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde iyileştirilir. Bu codelab'deki tüm çalışmalarınızı tarayıcıda yapabilirsiniz. Herhangi bir şey yüklemeniz gerekmez.

3. Başlamadan önce

API'yi etkinleştirme

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 \
                       discoveryengine.googleapis.com \
                       secretmanager.googleapis.com

Beklenen çıktı

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.

4. AlloyDB'yi dağıtma

AlloyDB kümesi ve birincil örnek oluşturun. Aşağıdaki prosedürde, Google Cloud SDK'yı kullanarak AlloyDB kümesi ve örneği oluşturma adımları açıklanmaktadır. Konsol yaklaşımını tercih ederseniz buradaki belgeleri inceleyebilirsiniz.

AlloyDB kümesi oluşturmadan önce, gelecekteki AlloyDB örneği tarafından kullanılacak VPC'mizde kullanılabilir bir özel IP aralığına ihtiyacımız vardır. Bu kimlik yoksa oluşturmamız, dahili Google hizmetleri tarafından kullanılmak üzere atamamız ve ardından küme ile örneği oluşturabilmemiz gerekir.

Özel IP aralığı oluşturma

AlloyDB için VPC'mizde özel hizmet erişimi yapılandırmasını ayarlamamız gerekiyor. Buradaki varsayım, projede "varsayılan" VPC ağının olduğu ve tüm işlemler için bu ağın kullanılacağıdı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şturma:

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

Bu bölümde, us-central1 bölgesinde bir AlloyDB kümesi oluşturuyoruz.

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`

PostgreSQL şifresini ileride kullanmak üzere not edin.

echo $PGPASSWORD

Gelecekte postgres kullanıcısı olarak örneğe bağlanmak için bu şifreye ihtiyacınız olacaktır. Daha sonra kullanabilmek için bu kodu bir yere yazmanızı veya kopyalamanızı öneririz.

Beklenen konsol çıkışı:

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

Ücretsiz deneme kümesi oluşturma

AlloyDB'yi daha önce kullanmadıysanız ücretsiz bir deneme kümesi oluşturabilirsiniz:

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

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

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

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

Beklenen konsol çıkışı:

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

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=8 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

Beklenen konsol çıkışı:

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

AlloyDB Standard kümesi oluşturma

Projedeki ilk AlloyDB kümeniz değilse standart küme oluşturma işlemine devam edin.

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

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

Kümeyi oluşturmak için 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.                                                                                                                                                                                                                                                           

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. Veritabanını Hazırlama

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

AlloyDB'ye Gerekli İzinleri Verme

AlloyDB hizmet aracısına Vertex AI izinleri ekleyin.

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

4ca978f5142bb6ce.png

Yeni Cloud Shell sekmesinde şunu çalıştırı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

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.

ef4bfbcf0ed2ef3a.png

Ardından solda AlloyDB Studio'yu tıklayın:

5c155cbcd7d43a1.png

Postgres veritabanını ve postgres kullanıcısını seçin, ardından küme oluşturulurken not edilen şifreyi girin. Ardından "Kimlik doğrulama" düğmesini tıklayın.

1c9dab73c6836798.png

AlloyDB Studio arayüzü açılır. Veritabanındaki komutları çalıştırmak için sağdaki "Editor 1" sekmesini tıklayın.

b36c28f8165119ca.png

SQL komutlarını çalıştırabileceğiniz arayüz açılır.

cf43aa20f292797e.png

Veritabanı Oluşturma

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

AlloyDB Studio Düzenleyici'de aşağıdaki komutu çalıştırın.

Veritabanı oluşturma:

CREATE DATABASE quickstart_db

Beklenen çıktı:

Statement executed successfully

quickstart_db'ye bağlanma

Kullanıcı/veritabanı değiştirme düğmesini kullanarak stüdyoya yeniden bağlanın.

e826ad973eb23a74.png

Açılır listeden yeni quickstart_db veritabanını seçin ve daha önce kullandığınız kullanıcı ile şifreyi kullanın.

1ca70c59b5aea8c1.png

quickstart_db veritabanındaki nesnelerle çalışabileceğiniz yeni bir bağlantı açılır.

6. Örnek Veriler

Şimdi veritabanında nesneler oluşturmamız ve verileri yüklememiz gerekiyor. Kurgusal veriler içeren kurgusal bir "Zil" mağazası kullanacağız.

Verileri içe aktarmadan önce veri türlerini ve dizinleri destekleyen uzantıları etkinleştirmemiz gerekir. Biri vektör veri türünü, diğeri ise AlloyDB ScaNN dizinini destekleyen iki uzantıya ihtiyacımız var.

AlloyDB Studio'da quickstart_db'ye bağlanın.

CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS alloydb_scann;

Veri kümesi hazırlanır ve içe aktarma arayüzü kullanılarak veritabanına yüklenebilen bir SQL dosyası olarak yerleştirilir. Cloud Shell'de aşağıdaki komutları çalıştırın:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters import $ADBCLUSTER --region=$REGION --database=quickstart_db --gcs-uri='gs://sample-data-and-media/ecomm-retail/ecom_generic_vectors.sql' --user=postgres --sql

Komut, AlloyDB SDK'sını kullanır ve agentspace_user adlı bir kullanıcı oluşturur. Ardından, gerekli tüm nesneleri oluşturup verileri ekleyerek örnek verileri doğrudan GCS paketinden veritabanına aktarır.

İçe aktarma işleminden sonra AlloyDB Studio'daki tabloları kontrol edebiliriz. Tablolar e-ticaret şemasındadır:

9ee57986d4cdf20f.png

Ayrıca tablolardan birindeki satır sayısını doğrulayın.

51c3c55881157da3.png

Örnek verilerimizi başarıyla içe aktardık ve sonraki adımlara geçebiliriz.

7. Metin yerleştirmelerini kullanarak semantik arama

Bu bölümde, metin gömmelerini kullanarak semantik aramayı kullanmaya çalışacak ve bunu geleneksel Postgres metin ve tam metin aramasıyla karşılaştıracağız.

Öncelikle LIKE operatörünü kullanarak standart PostgreSQL SQL ile klasik aramayı deneyelim.

Aşağıdaki sorguyu kullanarak yağmurluk aramaya çalıştığımızda:

SET session.my_search_var='%wet%conditions%jacket%';
SELECT
  name,
  product_description,
  retail_price,   replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM
  ecomm.products
WHERE
  name ILIKE current_setting('session.my_search_var')
  OR product_description ILIKE current_setting('session.my_search_var')
LIMIT
  10;

Sorgu, ürün adında veya açıklamasında ıslak hava koşulları ve ceket gibi kelimelerin tam olarak geçmesi gerektiğinden herhangi bir satır döndürmüyor. "Islak hava koşullarına uygun ceket" ile "yağmurlu hava koşullarına uygun ceket" aynı şey değildir.

Aramaya olası tüm varyasyonları dahil etmeye çalışabiliriz. Sadece iki kelime eklemeyi deneyelim. Örneğin:

SELECT
  name,
  product_description,
  retail_price,
   replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM
  ecomm.products
WHERE
  name ILIKE '%wet%jacket%'
  OR name ILIKE '%jacket%wet%'
  OR name ILIKE '%jacket%'
  OR name ILIKE '%%wet%'
  OR product_description ILIKE '%wet%jacket%'
  OR product_description ILIKE '%jacket%wet%'
  OR product_description ILIKE '%jacket%'
  OR product_description ILIKE '%wet%'
LIMIT
  10;

Bu sorgu birden fazla satır döndürür ancak bunların tümü ceket isteğimizle tam olarak eşleşmez ve alaka düzeyine göre sıralamak zordur. Ayrıca, örneğin "erkekler için" gibi başka koşullar eklersek sorgunun karmaşıklığı önemli ölçüde artar. Alternatif olarak tam metin aramayı deneyebiliriz ancak bu durumda bile az çok tam kelimeler ve yanıtın alaka düzeyiyle ilgili sınırlamalarla karşılaşıyoruz.

Artık yerleştirmeleri kullanarak benzer bir arama yapabiliriz. Ürünlerimiz için farklı modeller kullanarak yerleştirmeleri önceden hesapladık. En yeni Google gemini-embedding-001 modelini kullanacağız. Bu veriler, ecomm.products tablosunun "product_embedding" sütununda saklanır. "Erkekler için yağmurluk" arama koşulumuzla ilgili aşağıdaki sorguyu çalıştırırsak:

SELECT
  name,
  product_description,
  retail_price,
   replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
  product_embedding <=> embedding ('gemini-embedding-001','wet conditions jacket for men')::vector AS distance
FROM
  ecomm.products
ORDER BY distance
LIMIT
  10;

Bu sorgu yalnızca yağmurlu havalara uygun ceketleri değil, aynı zamanda en alakalı sonuçları en üste yerleştirerek sıralanmış tüm sonuçları döndürür.

Yerleştirme içeren sorgu, 90-150 ms içinde sonuç döndürür. Bu sürenin bir kısmı, verileri bulut yerleştirme modelinden almak için harcanır. Yürütme planına baktığımızda, modele yapılan istek planlama süresine dahil edilir. Sorgunun aramayı yapan kısmı oldukça kısadır. AlloyDB ScaNN dizini kullanılarak 29 bin kayıtta arama yapmak 7 ms'den kısa sürer.

Limit  (cost=2709.20..2718.82 rows=10 width=490) (actual time=6.966..7.049 rows=10 loops=1)
   ->  Index Scan using embedding_scann on products  (cost=2709.20..30736.40 rows=29120 width=490) (actual time=6.964..7.046 rows=10 loops=1)
         Order By: (product_embedding <=> '[-0.0020264734,-0.016582033,0.027258193
...
-0.0051468653,-0.012440448]'::vector)
         Limit: 10
 Planning Time: 136.579 ms
 Execution Time: 6.791 ms
(6 rows)

Bu, yalnızca metin yerleştirme modeli kullanılarak yapılan metin yerleştirme aramasıydı. Ancak ürünlerimiz için de resimlerimiz var ve bunları aramayla birlikte kullanabiliriz. Bir sonraki bölümde, çok formatlı modelin arama için görüntüleri nasıl kullandığını göstereceğiz.

8. Çok formatlı aramayı kullanma

Metne dayalı semantik arama faydalı olsa da karmaşık ayrıntıları açıklamak zor olabilir. AlloyDB'nin çok formatlı arama özelliği, görüntü girişiyle ürün keşfini mümkün kılarak avantaj sağlar. Bu özellik, özellikle görsel temsil arama amacını yalnızca metin açıklamalarına kıyasla daha etkili bir şekilde netleştirdiğinde yararlıdır. Örneğin, "Resimdeki gibi bir mont bul".

Ceket örneğimize dönelim. Bulmak istediğim cekete benzer bir ceketimin resmi varsa bunu Google çok formatlı yerleştirme modeline iletebilir ve ürünlerimin resimlerinin yerleştirmeleriyle karşılaştırabilirim. Tablomuzda, product_image_embedding sütununda ürünlerimizin resimleri için yerleştirmeler zaten hesaplanmış durumda. product_image_embedding_model sütununda kullanılan modeli görebilirsiniz.

Aramamız için image_embedding işlevini kullanarak resmimiz için yerleştirme alabilir ve bunu önceden hesaplanmış yerleştirmelerle karşılaştırabiliriz. Bu işlevi etkinleştirmek için google_ml_integration uzantısının doğru sürümünü kullandığımızdan emin olmamız gerekir.

Mevcut uzantı sürümünü doğrulayalım. AlloyDB Studio'da yürütün.

SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
  

Sürüm 1.4.4'ten düşükse aşağıdaki prosedürü uygulayın.

CALL google_ml.upgrade_to_preview_version();

Uzantının sürümünü tekrar kontrol edin. 1.4.4 olmalıdır.

Arama için örnek resmimi ekliyorum ancak istediğiniz özel resmi kullanabilirsiniz. Bunu Google depolama alanına veya herkese açık olarak sunulan başka bir kaynağa yüklemeniz ve URI'yi sorguya yerleştirmeniz yeterlidir.

9f33ca0c73ea2b19.png

Bu resim, gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png adresine yüklenir.

Görsellerle Görsel Arama

Öncelikle yalnızca resimle arama yapmayı deneriz:

SELECT
  name,
  product_description,
  retail_price,
  replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
  product_image_embedding <=> google_ml.image_embedding (model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector AS distance
FROM
  ecomm.products
ORDER BY distance
LIMIT
  4;

Envanterde sıcak tutan bazı ceketler bulduk.

Resim arama, karşılaştırma için sağladığımız resme benzeyen öğeleri döndürür. Daha önce de belirttiğim gibi, kendi resimlerinizi herkese açık bir pakete yükleyip farklı türde kıyafetler bulup bulamayacağını deneyebilirsiniz.

Görsel arama özelliğimizde Google'ın "multimodalembedding@001" modelini kullandık. image_embedding işlevimiz, resmi Vertex AI'a gönderir, vektöre dönüştürür ve veritabanımızdaki resimler için depolanan vektörlerle karşılaştırmak üzere geri döndürür.

Ayrıca, "EXPLAIN ANALYZE" kullanarak AlloyDB ScaNN dizinimizle ne kadar hızlı çalıştığını da kontrol edebiliriz.

Limit  (cost=971.70..975.55 rows=4 width=490) (actual time=2.453..2.477 rows=4 loops=1)
   ->  Index Scan using product_image_embedding_scann on products  (cost=971.70..28998.90 rows=29120 width=490) (actual time=2.451..2.475 rows=4 loops=1)
         Order By: (product_image_embedding <=> '[0.02119865,0.034206174,0.030682731,
...
,-0.010307034,-0.010053742]'::vector)
         Limit: 4
 Planning Time: 913.322 ms
 Execution Time: 2.517 ms
(6 rows)

Önceki örnekte olduğu gibi, zamanın büyük bir kısmının resmimizi bulut uç noktasını kullanarak yerleştirmelere dönüştürmek için harcandığını ve vektör aramanın kendisinin yalnızca 2,5 ms sürdüğünü görüyoruz.

Metinle Görsel Arama

Çok formatlı arama ile, aynı model için google_ml.text_embedding kullanarak aradığımız ceketin metin açıklamasını modele iletebilir ve hangi resimleri döndürdüğünü görmek için resim yerleştirmeleriyle karşılaştırabiliriz.

SELECT
  name,
  product_description,
  retail_price,
  replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
  product_image_embedding <=> google_ml.text_embedding (model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour')::vector AS distance
FROM
  ecomm.products
ORDER BY distance
LIMIT
  4;

Ayrıca gri veya koyu renklerde bir dizi şişme montumuz var.

Biraz farklı ceketler aldık ancak açıklamamıza göre ve resim yerleştirmelerini arayarak ceketleri doğru şekilde seçti.

Arama resmi için yerleştirmemizi kullanarak açıklamalar arasında arama yapmanın başka bir yolunu deneyelim.

Resimlerle Metin Arama

Resmimiz için yerleştirme işlemini geçiren resimleri aramaya ve ürünlerimiz için önceden hesaplanmış resim yerleştirmeleriyle karşılaştırmaya çalıştık. Ayrıca, metin isteğimiz için yerleştirme iletme ve ürün resimleri için aynı yerleştirmede arama yapmayı da denedik. Şimdi resmimiz için yerleştirme kullanmayı deneyelim ve ürün açıklamaları için metin yerleştirmeleriyle karşılaştıralım. Yerleştirme, product_description_embedding sütununda saklanır ve aynı multimodalembedding@001 modelini kullanır.

Sorgumuz:

SELECT
  name,
  product_description,
  retail_price,
  replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
  product_description_embedding <=> google_ml.image_embedding (model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector AS distance

FROM
  ecomm.products
ORDER BY distance
LIMIT
  4;

Burada ise gri veya koyu renkli, biraz farklı bir ceket grubu görüyoruz. Bunlardan bazıları, farklı arama yöntemleriyle seçilenlerle aynı veya çok benzer.

Ayrıca, yukarıdakiyle aynı ceketleri biraz farklı bir sırayla döndürüyor. Resimler için yerleştirme işlemimize göre, metin açıklaması için hesaplanan yerleştirmelerle karşılaştırma yapabilir ve doğru ürün grubunu döndürebilir.

Ayrıca, karşılıklı sıralama birleştirme gibi yöntemler kullanarak hem metin hem de resim yerleştirmelerini birleştirmeyi deneyebilirsiniz. Her sıralamaya puan atayıp sonuçları birleştirilmiş puana göre sıralayarak iki aramayı birleştirdiğimiz sorguya örnek aşağıda verilmiştir.

WITH image_search AS (
            SELECT id,
                RANK () OVER (ORDER BY  product_image_embedding <=>google_ml.image_embedding(model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector) AS rank
                FROM ecomm.products
                ORDER BY product_image_embedding <=>google_ml.image_embedding(model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector LIMIT 5
        ),
      text_search AS (
            SELECT id,
                RANK () OVER (ORDER BY product_description_embedding <=>google_ml.text_embedding(model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour'
    )::vector) AS rank
            FROM ecomm.products
            ORDER BY product_description_embedding <=>google_ml.text_embedding(model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour'
    )::vector LIMIT 5
        ),
      rrf_score AS (
        SELECT
            COALESCE(image_search.id, text_search.id) AS id,
            COALESCE(1.0 / (60 + image_search.rank), 0.0) + COALESCE(1.0 / (60 + text_search.rank), 0.0) AS rrf_score
        FROM image_search FULL OUTER JOIN text_search ON image_search.id = text_search.id
        ORDER BY rrf_score DESC
      )
      SELECT 
        ep.name,
        ep.product_description,
        ep.retail_price,
        replace(ep.product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
      FROM ecomm.products ep, rrf_score 
      WHERE 
        ep.id=rrf_score.id 
      ORDER by rrf_score DESC
      LIMIT 4;

Sorgudaki farklı parametrelerle oynayarak arama sonuçlarınızı iyileştirip iyileştiremeyeceğinizi deneyebilirsiniz.

Bu işlem laboratuvarı sonlandırır. Beklenmedik ücretlerle karşılaşmamak için kullanılmayan kaynakları silmeniz önerilir.

Buna ek olarak, dokümanda açıklandığı şekilde sonuçları sıralamak için diğer yapay zeka operatörlerini de kullanabilirsiniz.

9. Ortamı temizleme

Laboratuvarı tamamladığınızda AlloyDB örneklerini ve kümeyi yok edin.

AlloyDB kümesini ve tüm örnekleri silme

Küme, zorlama seçeneğiyle yok edilir. Bu seçenek, 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.                                                                                                                                                                                                                                                            

10. Tebrikler

Codelab'i tamamladığınız için tebrik ederiz. Metin ve görseller için yerleştirme işlevlerini kullanarak AlloyDB'de çok formatlı aramayı nasıl kullanacağınızı öğrendiniz. Çok formatlı aramayı test edebilir ve AlloyDB AI operatörleri için codelab'i kullanarak google_ml.rank işleviyle geliştirebilirsiniz.

İşlediğimiz konular

  • AlloyDB for Postgres'i dağıtma
  • Çok formatlı vektör araması nasıl kullanılır?
  • AlloyDB AI operatörlerini etkinleştirme
  • Çok formatlı arama için farklı AlloyDB AI operatörlerini kullanma
  • Metin ve resim arama sonuçlarını birleştirmek için AlloyDB AI'ı kullanma

11. Anket

Çıkış:

Bu eğitimi nasıl kullanacaksınız?

Sadece okuyun Okuyun ve alıştırmaları tamamlayın