AlloyDB'de Çok Formatlı Yerleştirmeler

1. Giriş

bb67830f66d83d3f.png

Bu codelab'de, AlloyDB'yi dağıtma ve çok formatlı yerleştirmeleri kullanarak semantik arama için yapay zeka entegrasyonundan yararlanma hakkında bir kılavuz sunulmaktadır. 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?

  • Postgres için AlloyDB'yi dağıtma
  • AlloyDB Studio'yu kullanma
  • Ç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

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

Proje Kurulumu

  1. Google Cloud Console'da oturum açın. Gmail veya Google Workspace hesabınız yoksa oluşturmanız gerekir.

İş veya okul hesabı yerine kişisel hesap kullanın.

  1. Yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Google Cloud Console'da yeni bir proje oluşturmak için üstbilgide "Bir proje seçin" düğmesini tıklayın. Bu işlem, bir pop-up pencere açar.

295004821bab6a87.png

Proje seçin penceresinde Yeni Proje düğmesini tıklayın. Bu işlem, yeni proje için bir iletişim kutusu açar.

37d264871000675d.png

İletişim kutusunda tercih ettiğiniz proje adını girin ve konumu seçin.

96d86d3d5655cdbe.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Proje adı, Google API'leri tarafından kullanılmaz ve istediğiniz zaman değiştirilebilir.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Google Cloud Console, benzersiz bir kimliği otomatik olarak oluşturur ancak bu kimliği özelleştirebilirsiniz. Oluşturulan kimliği beğenmediyseniz başka bir rastgele kimlik oluşturabilir veya kendi kimliğinizi girerek kullanılabilirliğini kontrol edebilirsiniz. Çoğu codelab'de, genellikle PROJECT_ID yer tutucusuyla tanımlanan proje kimliğinize başvurmanız gerekir.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.

Faturalandırmayı etkinleştirme

Faturalandırmayı etkinleştirmek için iki seçeneğiniz vardır. Kişisel faturalandırma hesabınızı kullanabilir veya aşağıdaki adımları uygulayarak kredileri kullanabilirsiniz.

5 ABD doları değerindeki Google Cloud kredilerini kullanma (isteğe bağlı)

Bu atölyeyi düzenlemek için bir miktar kredisi olan bir faturalandırma hesabına ihtiyacınız vardır. Kendi faturalandırmanızı kullanmayı planlıyorsanız bu adımı atlayabilirsiniz.

  1. Bu bağlantıyı tıklayın ve kişisel bir Google Hesabı ile oturum açın.
  2. Aşağıdakine benzer bir ifade görürsünüz:

f54628965f465486.png

  1. KREDİLERİNİZE ERİŞMEK İÇİN BURAYI TIKLAYIN düğmesini tıklayın. Bu işlem sizi faturalandırma profilinizi oluşturacağınız sayfaya yönlendirir. Ücretsiz deneme kaydı ekranı gösterilirse iptal'i tıklayın ve faturalandırmayı bağlamaya devam edin.

20e88842cf2a732e.png

  1. "Artık bir Google Cloud Platform deneme sürümü faturalandırma hesabına bağlısınız" seçeneğini tıklayın.

cdc87f1c57777951.png

Kişisel faturalandırma hesabı oluşturma

Faturalandırmayı Google Cloud kredilerini kullanarak ayarladıysanız bu adımı atlayabilirsiniz.

Kişisel faturalandırma hesabı oluşturmak için Cloud Console'da faturalandırmayı etkinleştirmek üzere buraya gidin.

Bazı notlar:

  • Bu laboratuvarın tamamlanması için 3 ABD dolarından daha az bir tutarda bulut kaynağı kullanılması gerekir.
  • Daha fazla ödeme alınmaması için bu laboratuvarın sonundaki adımları uygulayarak kaynakları silebilirsiniz.
  • Yeni 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ı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:

Cloud Shell'i etkinleştirme

Alternatif olarak G, ardından S tuşuna basabilirsiniz. Bu sıra, Google Cloud Console'da veya bu bağlantıyı kullanıyorsanız Cloud Shell'i etkinleştirir.

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:

Ortamın bağlandığını gösteren Google Cloud Shell terminalinin ekran görüntüsü

Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 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 yazılım yüklemeniz gerekmez.

3. Başlamadan önce

API'yi etkinleştirme

AlloyDB, Compute Engine, Networking Services ve Vertex AI'ı kullanmak için Google Cloud projenizde ilgili API'leri etkinleştirmeniz gerekir.

Terminaldeki 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.

API'lerle tanışın

  • AlloyDB API (alloydb.googleapis.com), PostgreSQL için AlloyDB kümeleri oluşturmanıza, yönetmenize ve ölçeklendirmenize olanak tanır. Talepkar kurumsal işlemsel ve analitik iş yükleri için tasarlanmış, tümüyle yönetilen ve PostgreSQL ile uyumlu bir veritabanı hizmeti sunar.
  • Compute Engine API (compute.googleapis.com), sanal makineler (VM'ler), kalıcı diskler ve ağ ayarları oluşturup yönetmenize olanak tanır. İş yüklerinizi çalıştırmak ve birçok yönetilen hizmetin temel altyapısını barındırmak için gereken temel hizmet olarak altyapı (IaaS) temelini sağlar.
  • Cloud Resource Manager API (cloudresourcemanager.googleapis.com), Google Cloud projenizin meta verilerini ve yapılandırmasını programatik olarak yönetmenize olanak tanır. Kaynakları düzenlemenize, Identity and Access Management (IAM) politikalarını yönetmenize ve proje hiyerarşisi genelinde izinleri doğrulamanıza olanak tanır.
  • Service Networking API (servicenetworking.googleapis.com), sanal özel bulut (VPC) ağınız ile Google'ın yönetilen hizmetleri arasındaki özel bağlantının kurulumunu otomatikleştirmenize olanak tanır. AlloyDB gibi hizmetler için özel IP erişimi oluşturmak ve bu hizmetlerin diğer kaynaklarınızla güvenli bir şekilde iletişim kurmasını sağlamak için özellikle gereklidir.
  • Vertex AI API (aiplatform.googleapis.com), uygulamalarınızın makine öğrenimi modelleri oluşturmasına, dağıtmasına ve ölçeklendirmesine olanak tanır. Üretken yapay zeka modellerine (ör. Gemini) erişim ve özel model eğitimi de dahil olmak üzere Google Cloud'un tüm yapay zeka hizmetleri için birleşik bir arayüz sağlar.

4. AlloyDB'yi dağıtma

AlloyDB kümesi ve birincil örnek oluşturun. Aşağıdaki prosedürde, Google Cloud SDK kullanılarak nasıl AlloyDB kümesi ve örneği oluşturulacağı 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 var. Bu kimlik yoksa oluşturmamız, dahili Google hizmetleri tarafından kullanılacak şekilde 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ı yapmamı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 (Note: Yours will be different!)

Ü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. Önceki adımda ücretsiz deneme kümesi oluşturduysanız bu adımı atlayın.

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.

abc505ac4d41f24e.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ı AlloyDB Studio'da yürütülebilir.

Yeni bir sekmede Postgres için AlloyDB'deki Kümeler sayfasına gidin.

Birincil örneği tıklayarak AlloyDB kümeniz için web konsolu arayüzünü açın.

1d7298e7096e7313.png

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

a33131c72ad29478.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. Şifreyi not almayı unuttuysanız veya şifre sizin için çalışmıyorsa şifreyi değiştirebilirsiniz. Bunun nasıl yapılacağını öğrenmek için dokümanları inceleyin.

2fcb84f70448118c.png

AlloyDB Studio arayüzü açılır. Veritabanındaki komutları çalıştırmak için sağdaki "Untitled Query" (Adsız Sorgu) sekmesini tıklayın.

a127047c343731ff.png

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

9d312d5053c1296c.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.

5ac657387f7b6ec3.png

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

309e09003db414c3.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 "Cymbal" 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:

c6b0663eb31c3347.png

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

select count(*) from ecomm.products;

a1d5301989c10a25.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 yerleştirmelerini 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.

AlloyDB Studio'da quickstart_db'ye bağlanarak aşağıdaki sorguyu kullanarak yağmurluk aramayı deneyin:

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 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 koyarak 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.

İşte yürütme planı çıkışı:

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 &lt;=&gt; '[-0.0020264734,-0.016582033,0.027258193

...

-0.0051468653,-0.012440448]'::vector)

     Limit: 10

Planlama Süresi: 136.579 ms

Yürütme süresi: 6.791 ms

(6 satır)

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ı arama özelliğini 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.5.2'den eski ise 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.5.3 olmalıdır.

SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';

Ayrıca veritabanımızda yapay zeka sorgu motoru özelliklerini etkinleştirmemiz gerekiyor. Bu işlem, örnekteki tüm veritabanları için örnek işaretine göre güncelleme yapılarak veya yalnızca veritabanımız için etkinleştirilerek yapılabilir. Hızlı başlangıç_db veritabanı için etkinleştirmek üzere AlloyDB Studio'da aşağıdaki komutu çalıştırın.

ALTER DATABASE quickstart_db SET google_ml_integration.enable_ai_query_engine = 'on';

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

664bf0bc3fc4e72d.jpeg

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. Resimleri görmek için public_url sütununu sağlayarak Cloud SDK'yı (gcloud storage cp) kullanarak indirebilir ve ardından resimlerle çalışan herhangi bir araçla açabilirsiniz.

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" komutunu kullanarak AlloyDB ScaNN dizinimizle ne kadar hızlı çalıştığını da kontrol edebiliriz.

Yürütme planının çıktısı:

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 &lt;=&gt; '[0.02119865,0.034206174,0.030682731,

...

,-0.010307034,-0.010053742]'::vector)

     Limit: 4

Planlama Süresi: 913,322 ms

Yürütme Süresi: 2.517 ms

(6 satır)

Ö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 aramaya çalıştığımız ceketin metin açıklamasını modele iletebilir ve hangi görüntüleri döndürdüğünü görmek için görüntü 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 ve resim yerleştirmelerine göz atarak doğru ceketleri 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çen 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ığı gibi 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

AlloyDB'nin deneme sürümünü kullandıysanız Deneme kümesini kullanarak diğer laboratuvarları ve kaynakları test etmeyi planlıyorsanız deneme kümesini silmeyin. Aynı projede başka bir deneme kümesi oluşturamazsınız.

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.

Google Cloud öğrenme rotası

Bu laboratuvar, Google Cloud ile Üretime Hazır Yapay Zeka öğrenme rotasının bir parçasıdır.

  • Prototip aşamasından üretim aşamasına geçiş yapmak için tüm müfredatı inceleyin.
  • İlerleme durumunuzu #ProductionReadyAI hashtag'iyle paylaşın.

İşlediğimiz konular

  • Postgres için AlloyDB'yi dağıtma
  • AlloyDB Studio'yu kullanma
  • Ç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