1. Giriş

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
- Google Cloud Console'da oturum açın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.
İş veya okul hesabı yerine kişisel hesap kullanıyorsanız.
- 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 pop-up pencere açacak olan Proje seç düğmesini tıklayın.

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

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

- 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.
- Bu bağlantıyı tıklayın ve kişisel bir Google Hesabı ile oturum açın.
- Şuna benzer bir şey görürsünüz:

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

- Artık bir Google Cloud Platform deneme sürümü faturalandırma hesabına bağlısınız. Onayla'yı tıklayın.

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ı tamamlamak için 3 ABD dolarından daha az tutarda bulut kaynağı kullanmanız gerekir.
- Daha fazla ücret ödememek için bu laboratuvarın sonundaki adımları uygulayarak kaynakları silebilirsiniz.
- Yeni kullanıcılar 300 ABD doları değerinde ücretsiz deneme sürümünden 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:

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 temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır. İşlem tamamlandığında aşağıdakine benzer bir sonuç görürsünüz:

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 güçlenir. 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
AlloyDB, Compute Engine, ağ hizmetleri ve Vertex AI'ı kullanmak için Google Cloud projenizde ilgili API'leri etkinleştirmeniz gerekir.
Cloud Shell'deki terminalde proje kimliğinizin ayarlandığından emin olun. Proje kimliği, komut isteminde aşağıdaki gibi parantez içinde gösterilmelidir:
student@cloudshell:~ (test-project-001-402417)$
Proje kimliği burada gösterilmiyorsa tarayıcı sekmenizi yenileyin ve Cloud Shell'de yeniden kimlik doğrulayın.
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 \
discoveryengine.googleapis.com \
secretmanager.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 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 vardır. 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 şifreyi 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.

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" komutunu çalıştırarak 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.

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

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.

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.

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

Veritabanı Oluşturma
Veritabanı oluşturma hızlı başlangıç kılavuzu.
AlloyDB Studio Düzenleyici'de aşağıdaki komutu yürütü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.

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

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 verilerle kurgusal bir "Cymbal" mağazası kullanacağız.
Verileri içe aktarmadan önce veri türlerini ve dizinleri destekleyen uzantıları etkinleştirmemiz gerekir. İki uzantıya ihtiyacımız var: Biri vektör veri türünü, diğeri ise AlloyDB ScaNN dizinini desteklemelidir.
AlloyDB Studio'da quickstart_db'ye bağlanın ve şunu çalıştırı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:

Ayrıca tablolardan birindeki satır sayısını doğrulayın.
select count(*) from ecomm.products;

Ö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ğlanın ve 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 araması yapabiliriz ancak bu durumda bile az çok tam kelimeler ve yanıtın alaka düzeyiyle ilgili sınırlamalarla karşılaşırız.
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 <=> '[-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 görsellerimiz var ve bunları arama ile 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
Metin tabanlı 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 resimlerinin yerleştirilmiş halleri hesaplanmış durumda. Kullanılan modeli product_image_embedding_model sütununda 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 gerekir. 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. quickstart_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 burada bulabilirsiniz. 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.

Bu fotoğraf, 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;
Ayrıca envanterde sıcak tutan bazı ceketler bulduk. Resimleri görmek için public_url sütununu sağlayarak Cloud SDK (gcloud storage cp) kullanarak indirebilir ve ardından resimlerle çalışan herhangi bir araçla açabilirsiniz.
|
|
|
|
Görsel arama, karşılaştırma için sağlanan resmimize 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ızda depolanan resim vektörleriyle karşılaştırmak için geri döndürür.
Ayrıca, AlloyDB ScaNN dizinimizle ne kadar hızlı çalıştığını kontrol etmek için "EXPLAIN ANALYZE" komutunu da kullanabiliriz.
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 <=> '[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ürmekle geçtiğini 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 mont aldık.
|
|
|
|
Biraz farklı bir ceket grubu elde ettik ancak resim yerleştirmelerinde arama yaparken açıklamamıza göre doğru ceketleri seçti.
Arama görseli 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 bir yerleştirme ileterek ve ürün resimleri için aynı yerleştirmede arama yaparak resim aramayı da denedik. Şimdi resmimiz için bir yerleştirme kullanmayı deneyelim ve bunu ürün açıklamalarının metin yerleştirmeleriyle karşılaştıralım. Bu yerleştirmeler 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, arama yaptığımız diğer yöntemlerle seçilenlere benzer veya çok yakın olan bazıları gri ya da koyu renkli, biraz farklı bir ceket grubu elde ettik.
|
|
|
|
Resimlerin yerleştirilmesine bağlı olarak, metin açıklaması için hesaplanan yerleştirmelerle karşılaştırma yapabilir ve doğru ürün grubunu döndürebilir.
Karma metin ve görsel arama
Ayrıca, örneğin karşılıklı sıralama birleştirme yöntemini 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. Ayrıca, dokümanda açıklandığı gibi sonuçları sıralamak için diğer yapay zeka operatörlerini de kullanabilirsiniz.
Laboratuvarı tamamladınız. Beklenmedik ücretleri önlemek için kullanılmayan kaynakların silinmesi önerilir.
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
#ProductionReadyAIhashtag'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ış:










