1. Giriş
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
- 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.
- 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.
- 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:
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:
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.
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.
Ardından solda 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.
AlloyDB Studio arayüzü açılır. Veritabanındaki komutları çalıştırmak için sağdaki "Editor 1" 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 ç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.
Açılır listeden yeni quickstart_db veritabanını seçin ve daha önce kullandığınız kullanıcı 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 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:
Ayrıca tablolardan birindeki satır sayısını doğrulayın.
Ö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.
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.
Karma metin ve resim araması
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ış: