AlloyDB ve sunucusuz çalışma ortamları ile yapay zeka destekli kıyafet önerisi uygulaması oluşturma

1. Genel Bakış

En yeni üretken yapay zeka entegrasyonu sayesinde hem mükemmel kıyafeti bulmanıza yardımcı olan hem de anında stil önerileri sunan bir moda uygulaması hayal edin. Bu konuşmada, AlloyDB'nin vektör arama özelliklerini Google'ın ScaNN diziniyle birlikte kullanarak nasıl bir uygulama geliştirdiğimizi ele alacağız. Bu uygulama, kıyafetleri eşleştirmek için ışık hızında arama yapmayı ve anında moda önerileri sunmayı mümkün kılıyor.

Ayrıca, AlloyDB'nin ScaNN dizininin, kişiselleştirilmiş stil önerileri oluşturmak için karmaşık sorguları nasıl optimize ettiğini de inceleyeceğiz. Ayrıca, yaratıcı stil ilhamı vermek ve kişiselleştirilmiş görünümlerinizi görselleştirmek için güçlü üretken yapay zeka modelleri olan Gemini ve Imagen'i de kullanacağız. Bu uygulamanın tamamı, sunucusuz bir mimari üzerine kurulmuştur ve kullanıcılar için sorunsuz ve ölçeklenebilir bir deneyim sağlar.

Zorluk: Uygulama, kişiselleştirilmiş kıyafet önerileri sunarak moda konusunda kararsızlık yaşayan kişilere yardımcı olmayı amaçlıyor. Ayrıca kıyafet planlamasıyla ilgili karar yorgunluğunu önlemeye de yardımcı olur.

Çözüm: Kıyafet önerisi uygulaması, kullanıcılara akıllı, kişiselleştirilmiş ve ilgi çekici bir moda deneyimi sunarken AlloyDB, üretken yapay zeka ve sunucusuz teknolojilerin özelliklerini sergileyerek bu sorunu çözüyor.

Ne oluşturacaksınız?

Bu laboratuvar kapsamında şunları yapacaksınız:

  1. AlloyDB örneği oluşturma ve e-ticaret veri kümesini yükleme
  2. AlloyDB'de pgvector ve üretken yapay zeka modeli uzantılarını etkinleştirme
  3. Ürün açıklamasından yerleştirilmiş öğeler oluşturma
  4. Çözümü sunucusuz Cloud Run Functions'ta dağıtma
  5. Gemini'a bir resim yükleyip resim açıklaması istemi oluşturun.
  6. E-ticaret veri kümesi yerleştirmeleriyle birlikte istemlere dayalı arama sonuçları oluşturun.
  7. İstemi özelleştirmek ve stil önerileri oluşturmak için ek istemler ekleyin.
  8. Çözümü sunucusuz Cloud Run Functions'ta dağıtma

Şartlar

  • Chrome veya Firefox gibi bir tarayıcı
  • Faturalandırmanın etkin olduğu bir Google Cloud projesi.

2. Mimari

Uygulamanın üst düzey mimarisi şu şekildedir:

ce32f865dfe59142.png

Aşağıdaki bölümlerde eğitimin bağlamsal akışı vurgulanmaktadır:

Besleme:

İlk adımımız, perakende verilerini (envanter, ürün açıklamaları, müşteri etkileşimleri) AlloyDB'ye aktarmaktır.

Analytics Engine:

Aşağıdaki işlemleri gerçekleştirmek için analiz motoru olarak AlloyDB'yi kullanacağız:

  1. Bağlam Çıkarma: Motor, ürünler, kategoriler, müşteri davranışı vb. arasındaki ilişkileri anlamak için AlloyDB'de depolanan verileri analiz eder.
  2. Yerleştirme Oluşturma: Hem kullanıcının sorgusu hem de AlloyDB'de saklanan bilgiler için yerleştirmeler (metnin matematiksel temsilleri) oluşturulur.
  3. Vektör Arama: Motor, sorgu yerleştirmesini ürün açıklamalarının, yorumların ve diğer alakalı verilerin yerleştirmeleriyle karşılaştırarak benzerlik araması yapar. Bu, en alakalı 25 "en yakın komşuyu" tanımlar.

Gemini önerisi:

Resim bayt dizisi, Vertex AI API aracılığıyla Gemini modeline iletilir. Bu sırada, üst giyimin metin açıklamasının yanı sıra alt giyim önerileri de istenir.

AlloyDB RAG ve vektör araması:

Üst giyim açıklaması, veritabanını sorgulamak için kullanılır. Sorgu, arama metnini (alt giyimle eşleşme için Gemini modelinden alınan öneri) yerleştirmelere dönüştürür ve en yakın komşuları (eşleşen sonuçlar) bulmak için veritabanında depolanan yerleştirmelerde Vektör Araması gerçekleştirir. AlloyDB veritabanındaki vektör yerleştirmeleri, daha iyi hatırlanabilirlik için ScaNN dizini kullanılarak dizine eklenir.

Yanıt Görüntüsü Üretme:

Doğrulanmış yanıtlar bir JSON dizisi olarak yapılandırılır ve motorun tamamı, Agent Builder'dan çağrılan sunucusuz bir Cloud Run işlevi olarak paketlenir.

Imagen ile görüntü üretme:

Kullanıcının stil istemi, kullanıcı tarafından seçilen bir öneri ve tüm kişiselleştirme istekleri birleştirilerek Imagen 3'e mevcut bir resimle istem gönderilir. Stil resmi, Vertex AI API kullanılarak bu isteme göre oluşturulur.

3. Başlamadan önce

Proje oluşturma

  1. Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
  2. Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Bir projede faturalandırmanın etkin olup olmadığını kontrol etmeyi öğrenin .
  3. bq'nun önceden yüklendiği, Google Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanacaksınız. Google Cloud Console'un üst kısmından Cloud Shell'i etkinleştir'i ( f2ae85166a716c5c.png) tıklayın.
  4. Cloud Shell'e bağlandıktan sonra aşağıdaki komutu kullanarak kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını doğrulayın:
gcloud auth list
  1. Gelecekteki gcloud komutlarının projenizi doğru şekilde tanımlayacağını onaylamak için aşağıdaki komutu çalıştırın.
gcloud config list project
  1. Projeniz ayarlanmamışsa açıkça ayarlamak için aşağıdaki komutu kullanın:
gcloud config set project <YOUR_PROJECT_ID>
  1. Gerekli API'leri etkinleştirin.

API'leri etkinleştirmek için bağlantıyı takip edin.

Etkinleştirmeyi unuttuğunuz bir API olursa bunu uygulama sırasında istediğiniz zaman etkinleştirebilirsiniz.

gcloud komutları ve kullanımı hakkında daha fazla bilgi için belgelere bakın.

4. Veritabanı kurulumu

Bu laboratuvarda, perakende e-ticaret veri kümesini depolamak için veritabanı olarak AlloyDB'yi kullanacağız. Veritabanları ve günlükler gibi tüm kaynakları depolamak için kümeler kullanılır. Her kümede, verilere erişim noktası sağlayan bir birincil örnek bulunur. Tablolar, verileri depolayan gerçek kaynaktır.

E-ticaret veri kümesinin yükleneceği bir AlloyDB kümesi, örneği ve tablosu oluşturalım.

Küme ve örnek oluşturma

  1. Google Cloud Console'da AlloyDB'yi arayın. Cloud Console'daki çoğu sayfayı bulmanın kolay bir yolu, konsolun arama çubuğunu kullanarak arama yapmaktır.
  2. KÜME OLUŞTUR'u tıklayın.

f76ff480c8c889aa.png

  1. Aşağıdaki değerleri kullanarak bir küme ve örnek oluşturun:
  • küme kimliği: "shopping-cluster"
  • password: "alloydb"
  • PostgreSQL 15 ile uyumlu
  • Bölge: "us-central1"
  • Ağ: "default"

538dba58908162fb.png

  1. Ağ bölümünde varsayılan ağı seçtiğinizde aşağıdaki seçenek gösterilir. Varsayılan bir ağ ayarlamak için BAĞLANTIYI AYARLA'yı tıklayın.
    7939bbb6802a91bf.png
  2. Otomatik olarak atanmış bir IP aralığı kullan'ı seçin ve Devam'ı tıklayın. Bilgileri inceledikten sonra BAĞLANTI OLUŞTUR'u tıklayın. 768ff5210e79676f.png

Varsayılan ağ oluşturma işleminin tamamlanmasını bekleyin.

  1. Birincil örneğinizi yapılandırın bölümünde, örnek kimliğini "shopping-instance"" olarak ayarlayın.

2bddecf6b7c7407b.png

  1. Kümeyi aşağıdaki gibi ayarlamayı tamamlamak için KÜME OLUŞTUR'u tıklayın:

24eec29fa5cfdb3e.png

5. Veri kullanımı

Şimdi de mağazayla ilgili verilerin bulunduğu bir tablo ekleme zamanı. Örneğinizin oluşturulmasının tamamlanmasını bekleyin. Küme oluşturulduktan sonra, küme oluşturulurken belirlediğiniz kimlik bilgilerini kullanarak AlloyDB'de oturum açabilirsiniz.

AlloyDB veritabanında kimlik doğrulama

  1. Google Cloud Console'da AlloyDB'ye gidin. Birincil kümeyi seçin ve soldaki gezinme menüsünde AlloyDB Studio'yu tıklayın:

847e35f1bf8a8bd8.png

  1. AlloyDB veritabanında kimlik doğrulaması yapmak için aşağıdaki ayrıntıları girin:
  • Kullanıcı adı : "postgres"
  • Veritabanı : "postgres"
  • Şifre : "alloydb"

AlloyDB Studio'da kimliğinizi başarıyla doğruladıktan sonra SQL komutları Düzenleyici sekmelerine girilir. İlk düzenleyici sekmesinin sağındaki artı işaretini kullanarak birden fazla düzenleyici penceresi ekleyebilirsiniz.

91a86d9469d499c4.png

Gerekli durumlarda Çalıştır, Biçimlendir ve Temizle seçeneklerini kullanarak AlloyDB ile ilgili komutları Düzenleyici pencerelerine girersiniz.

Uzantıları etkinleştirme

Bu uygulamayı oluşturmak için "pgvector" ve "google_ml_integration" uzantılarını kullanacağız.

  • pgvector uzantısı, vektör yerleştirmelerini depolamanıza ve aramanıza olanak tanır.
  • google_ml_integration uzantısı, SQL'de tahmin almak için Vertex AI tahmin uç noktalarına erişmek üzere kullandığınız işlevleri sağlar.
  1. Aşağıdaki DDL'leri çalıştırarak bu uzantıları etkinleştirin:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
  1. Aşağıdaki SQL komutunu çalıştırarak uzantıların yüklü olup olmadığını doğrulayın:
select extname, extversion from pg_extension;

Tablo oluşturma

  1. Aşağıdaki DDL ifadesini kullanarak bir tablo oluşturun:
CREATE TABLE
 apparels ( id BIGINT,
   category VARCHAR(100),
   sub_category VARCHAR(50),
   uri VARCHAR(200),
   image VARCHAR(100),
   content VARCHAR(2000),
   pdt_desc VARCHAR(5000),
   embedding vector(768) );

Yukarıdaki komut başarıyla yürütüldüğünde tabloyu

on adres vardır. Aşağıdaki resimde bir örnek gösterilmektedir:

908e33bbff58a6d.png

Veri alma

Bu laboratuvar için SQL dosyasında yaklaşık 200 kayıttan oluşan test verileri bulunmaktadır. id, category, sub_category, uri, image ve content dahildir. Diğer alanlar laboratuvarın ilerleyen bölümlerinde doldurulacaktır.

  1. SQL dosyasındaki 20 satırı/ekleme ifadesini AlloyDB Studio'da yeni bir Düzenleyici sekmesine kopyalayın ve RUN'ı (ÇALIŞTIR) tıklayın.
  1. apparels adlı tabloyu görene kadar Gezgin bölümünü genişletin.
  2. Menü simgesini [] ve Sorgu'yu tıklayın. SELECT ifadesi yeni bir Düzenleyici sekmesinde açılır.

b31ece70e670ab89.png

  1. Satırların eklendiğini doğrulamak için Çalıştır'ı tıklayın.

Kullanıcıya izin verme

postgres kullanıcısına, .AlloyDB'den yerleştirme oluşturma izni vereceğiz. AlloyDB Studio'da, embedding işlevinde postgres kullanıcısına yürütme hakları vermek için aşağıdaki ifadeyi çalıştırın:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

AlloyDB hizmet hesabına Vertex AI Kullanıcısı ROLÜ'nü verme

Vertex AI'dan metin yerleştirme modellerini kullanarak yerleştirmeler oluşturacağız. Bu işlem için AlloyDB hizmet hesabına Vertex AI User ROLE'ü atayın.

Google Cloud Console'da Cloud Shell terminali [ f2ae85166a716c5c.png] simgesini tıklayın ve aşağıdaki komutu ç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"

6. Derleme Bağlamı

Yerleştirme oluşturmak için context olması gerekir. Yani, tek bir alana eklemek istediğimiz tüm bilgiler. Bunu, apparels tablosundaki pdt_desc sütununda saklayacağımız bir ürün açıklaması oluşturarak yaparız.

Bizim örneğimizde her ürünle ilgili tüm bilgileri kullanacağız. Ancak siz kendi verilerinizle bu işlemi yaparken verileri işletmeniz için anlamlı olacak şekilde düzenleyebilirsiniz.

AlloyDB Studio Düzenleyici sekmesinde, pdt_desc alanını içerik verisiyle güncelleyen aşağıdaki komutu çalıştırın:

UPDATE
 apparels
SET
 pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
 id IS NOT NULL;

Bu DML, tablodaki tüm alanlarda ve diğer bağımlılıklarda (kullanım alanınızda varsa) bulunan bilgileri kullanarak basit bir bağlam özeti oluşturur. Daha hassas bir bilgi derlemesi ve bağlam oluşturma için verileri işletmeniz açısından anlamlı bulduğunuz herhangi bir şekilde düzenleyebilirsiniz.

7. Bağlam için yerleştirmeler oluşturma

Bilgisayarların sayıları işlemesi, metinleri işlemesinden çok daha kolaydır. Yerleştirme sistemi, metni nasıl ifade edildiğine veya hangi dili kullandığına bakılmaksızın metni temsil etmesi gereken bir dizi kayan nokta sayısına dönüştürür.

Deniz kenarında bir yeri tarif etmeyi deneyin. Bu terimler "on the water", "beachfront", "walk from your room to the ocean", "sur la mer", "на берегу океана" vb. olarak adlandırılabilir. Bu terimlerin tümü farklı görünse de anlamsal anlamları veya makine öğrenimi terminolojisindeki yerleştirmeleri birbirine çok yakın olmalıdır.

Veriler ve bağlam hazır olduğuna göre, ürün açıklaması(pdt_desc) sütununun yerleştirmelerini embedding alanındaki tabloya eklemek için SQL'i çalıştıracağız. Kullanabileceğiniz çeşitli yerleştirme modelleri vardır. Vertex AI'dan text-embedding-005 kullanıyoruz.

  1. AlloyDB Studio'da yerleştirmeler oluşturmak ve pdt_desc sütununu depoladığı verilerin yerleştirmeleriyle güncellemek için aşağıdaki komutu çalıştırın:
UPDATE
 apparels
SET
 embedding = embedding( 'text-embedding-005',
   pdt_desc)
WHERE
 TRUE;
  1. Aşağıdaki komutu çalıştırarak yerleştirmelerin oluşturulduğunu doğrulayın:
SELECT
 id,
 category,
 sub_category,
 content,
 embedding
FROM
 Apparels
LIMIT 5;

Aşağıda, sorgudaki örnek metin için kayan noktalı sayı dizisi gibi görünen bir yerleştirme vektörü örneği verilmiştir:

c69c08d085389f74.png

8. Vektör araması yapma

Tablo, veriler ve yerleştirmeler hazır olduğuna göre artık kullanıcı arama metni için anlık vektör aramasını gerçekleştirebiliriz.

Kullanıcının arama metninin "pink color, casual, pure cotton tops for women" olduğunu varsayalım.

Bu sorguyla eşleşenleri bulmak için aşağıdaki SQL sorgusunu çalıştırın:

SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
  'pink color, casual, pure cotton tops for women')::vector
LIMIT
5;

Bu sorguyu ayrıntılı olarak inceleyelim:

Bu sorguda,

  1. Kullanıcının arama metni: "I want womens tops, pink casual only pure cotton."
  2. Bu arama metnini, embedding() yöntemi ve text-embedding-005 modeliyle birlikte kullanarak yerleştirmelere dönüştürüyoruz. Bu adım, son adımda yerleştirme işlevini tablodaki tüm öğelere uyguladığımız için tanıdık gelecektir.
  3. "<=>", KOSİNÜS BENZERLİĞİ uzaklık yönteminin kullanımını gösterir. Kullanılabilen tüm benzerlik ölçülerini pgvector dokümanlarında bulabilirsiniz.
  4. Yerleştirme yönteminin sonucunu, veritabanında depolanan vektörlerle uyumlu hale getirmek için vektör veri türüne dönüştürüyoruz.
  5. LIMIT 5, arama metni için en yakın 5 komşuyu çıkarmak istediğimizi gösterir.

Aşağıda bu SQL sorgusunun örnek yanıtı gösterilmektedir:

4193a68737400535.png

Sonuçlarınızda da görebileceğiniz gibi, eşleşmeler arama metnine oldukça yakındır. Sonuçların nasıl değiştiğini görmek için rengi değiştirmeyi deneyin.

Sorgu performansı için AlloyDB ScaNN dizini

Şimdi de ScaNN dizinini kullanarak bu vektör arama sonucunun performansını (sorgu süresi), verimliliğini ve hatırlama oranını artırmak istediğimizi varsayalım.

ScaNN dizinini kullanmak istiyorsanız aşağıdaki adımları deneyin:

  1. Küme, örnek, bağlam ve yerleştirmeler zaten oluşturulduğu için ScaNN uzantısını aşağıdaki ifadeyi kullanarak yüklememiz yeterli:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  1. ScaNN dizinini oluşturun:
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);

Yukarıdaki DDL'de:

  • apparel_index, dizinin adıdır.
  • apparels, tablo adıdır.
  • scann, dizin yöntemidir.
  • embedding, tabloda dizine eklemek istediğiniz sütundur.
  • cosine, dizinle kullanmak istediğiniz mesafe yöntemidir.
  • 54, bu dizine uygulanacak bölüm sayısıdır. 1 ile 1048576 arasında herhangi bir değere ayarlayın. Bu değere nasıl karar vereceğiniz hakkında daha fazla bilgi için ScaNN dizinini ayarlama başlıklı makaleyi inceleyin.

ScaNN deposundaki öneriye göre, veri noktalarının sayısının KAREKÖKÜ kullanılmıştır. Bölümleme yaparken num_leaves, veri noktalarının sayısının karekökü olmalıdır.

  1. Dizinin aşağıdaki sorgu kullanılarak oluşturulup oluşturulmadığını kontrol edin:
SELECT * FROM pg_stat_ann_indexes;
  1. Dizini kullanmadan kullandığımız sorguyla Vector Search'ü gerçekleştirin:
select * from apparels
   ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
   LIMIT 20

Yukarıdaki sorgu, laboratuvarda 8. adımda kullandığımız sorguyla aynıdır. Ancak artık ScaNN dizini kullanılarak dizine eklenmiş bir alanımız var.

  1. Dizinle ve dizin olmadan basit bir arama sorgusuyla test edin. Dizin olmadan test etmek için dizini bırakmanız gerekir:

white tops for girls without any print

INDEXED yerleştirme verilerindeki Vector Search sorgusunda yukarıdaki arama metni kullanıldığında kaliteli arama sonuçları ve verimlilik elde edilir. Dizinle birlikte verimlilik büyük ölçüde artar (yürütme süresi açısından: ScaNN olmadan 10,37 ms ve ScaNN ile 0,87 ms). Bu konuyla ilgili daha fazla bilgi için lütfen bu blogu inceleyin.

9. LLM ile Eşleşme Doğrulama

Devam etmeden ve bir uygulamaya en iyi eşleşmeleri döndüren bir hizmet oluşturmadan önce, bu olası yanıtların gerçekten alakalı olup olmadığını ve kullanıcıyla paylaşmanın güvenli olup olmadığını doğrulamak için üretken yapay zeka modelini kullanalım.

Örneğin Gemini için ayarlandığından emin olma

  1. google_ml_integration özelliğinin Kümeniz ve Örneğiniz için etkinleştirildiğini doğrulayın. AlloyDB Studio'da aşağıdaki komutu çalıştırın:
show google_ml_integration.enable_model_support;

Değer "açık" olarak gösteriliyorsa sonraki 2 adımı atlayıp doğrudan

AlloyDB ve Vertex AI Model entegrasyonu.

  1. AlloyDB kümenizin birincil örneğine gidin ve BİRİNCİL ÖRNEĞİ DÜZENLE'yi tıklayın.

456ffdf292d3c0e0.png

  1. Gelişmiş yapılandırma seçenekleri bölümünde Yeni veritabanı işareti bölümünü genişletin ve google_ml_integration.enable_model_support flag seçeneğinin aşağıdaki gibi "on" olarak ayarlandığından emin olun:

6a59351fcd2a9d35.png 3. "on" olarak ayarlanmamışsa "on" olarak ayarlayın ve UPDATE INSTANCE (Örneği Güncelle) seçeneğini tıklayın.

Bu adım birkaç dakika sürer.

AlloyDB ve Vertex AI Model entegrasyonu

Artık AlloyDB Studio'ya bağlanabilir ve belirtilen yerlerde proje kimliğinizi kullanarak AlloyDB'den Gemini model erişimini ayarlamak için aşağıdaki DML ifadesini çalıştırabilirsiniz. Komutu çalıştırmadan önce söz dizimi hatası konusunda uyarılabilirsiniz ancak komut sorunsuz bir şekilde çalışır.

  1. Google Cloud Console'da AlloyDB'ye gidin. Birincil kümeyi seçin ve sol gezinme panelinde AlloyDB Studio'yu tıklayın.
  2. google_ml_integration uzantısıyla varsayılan olarak kullanılabilen gemini-1.5-pro:generateContent öğesini kullanırız. cdb5af753a625777.png
  3. AlloyDB Studio'da aşağıdaki komutu kullanarak erişim için yapılandırılmış modelleri kontrol edebilirsiniz:
select model_id,model_type from google_ml.model_info_view;        
  1. Aşağıdaki komutu çalıştırarak veritabanı kullanıcılarına Google Vertex AI modellerini kullanarak tahmin çalıştırmak için ml_predict_row işlevini yürütme izni verin:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;

Yanıtları değerlendirme

Uygulamayı Cloud Run'a taşıdığımız bir sonraki bölümde tek bir büyük sorgu kullanacağız. Ancak sorgudan gelen yanıtların makul olmasını sağlamak için sorguyu anlamak zor olabilir.

Sonunda kullandığımız daha büyük sorguyu oluşturan bölümlere ayrı ayrı bakacağız.

  1. Öncelikle, kullanıcı sorgusuna en yakın 5 eşleşmeyi almak için veritabanına bir istek göndeririz. Bu işlemi basit tutmak için sorguyu sabit kodluyoruz ancak endişelenmeyin, daha sonra sorguya ekleyeceğiz.

apparels tablosundaki ürün açıklamasını ekliyor ve iki yeni alan ekliyoruz. Bu alanlardan biri açıklamayı dizinle, diğeri ise orijinal istekle birleştiriyor. Bu veriler, geçici bir tablo adı olan xyz adlı bir tabloya kaydedilir.

CREATE TABLE
 xyz AS
SELECT
 id || ' - ' || pdt_desc AS literature,
 pdt_desc AS content,
 'I want womens tops, pink casual only pure cotton.' AS  user_text
FROM
 apparels
ORDER BY
 embedding <=> embedding('text-embedding-005',
   'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
 5;

Bu sorgunun çıktısı, kullanıcı sorgusuyla ilgili en benzer 5 satır olur. Google Cloud blogu,

Yeni tablo xyz, her satırda aşağıdaki sütunların yer alacağı 5 satır içerir:

  • literature
  • content
  • user_text
  1. Yanıtların ne kadar geçerli olduğunu belirlemek için yanıtların nasıl değerlendirileceğini açıkladığımız karmaşık bir sorgu kullanacağız. Sorgunun bir parçası olarak xyz tablosunda user_text ve content kullanılır.
"Read this user search text: ', user_text, 
' Compare it against the product inventory data set: ', content, 
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
  1. Bu sorguyu kullanarak xyz tablosundaki yanıtların "kalitesini" inceleyeceğiz. İyilik (Goodness) ile, oluşturulan yanıtların beklentilerimizi ne kadar karşıladığını kastediyoruz.
CREATE TABLE
  x AS
SELECT
  json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
      request_body => CONCAT('{
 "contents": [ 
        { "role": "user", 
          "parts": 
             [ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match." 
             } ]
         } 
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
    xyz;
  1. predict_row, sonucu JSON biçiminde döndürür. Bu JSON'dan gerçek metni çıkarmak için "-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'" kodu kullanılır. Döndürülen gerçek JSON'u görmek için bu kodu kaldırabilirsiniz.
  2. Son olarak, LLM alanını almak için x tablosundan çıkarmanız yeterlidir:
SELECT 
LLM_RESPONSE 
FROM 
        x;
  1. Bu, aşağıdaki gibi tek bir sorguda birleştirilebilir:

Uyarı: Ara sonuçları kontrol etmek için yukarıdaki sorguları çalıştırdıysanız

Bu sorguyu çalıştırmadan önce xyz ve x tablolarını AlloyDB veritabanından sildiğinizden/kaldırdığınızdan emin olun.

SELECT
 LLM_RESPONSE
FROM (
 SELECT
 json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
     request_body => CONCAT('{
     "contents": [
       { "role": "user",
         "parts":
            [ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
            } ]
        }
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
   FROM (
         SELECT
           id || ' - ' || pdt_desc AS literature,
           pdt_desc AS content,
         'I want womens tops, pink casual only pure cotton.' user_text
         FROM
           apparels
         ORDER BY
             embedding <=> embedding('text-embedding-005',
             'I want womens tops, pink casual only pure cotton.')::vector
         LIMIT
           5 ) AS xyz ) AS X;

Daha büyük sorgu, önceki adımlarda çalıştırdığımız tüm sorguların birleşimidir. Sonuçlar, eşleşme olup olmadığını, eşleşme yüzdesini ve puanla ilgili bazı açıklamaları gösterir.

Gemini modelinde akışın varsayılan olarak etkin olduğunu unutmayın. Bu nedenle, gerçek yanıt birden fazla satıra yayılır: 14e74d71293b7b9.png

10. Uygulamayı web'e taşıma

Bu uygulamayı artık internetten erişilebilecek şekilde barındıracağız.

Cloud Run işlevini oluşturma

  1. Google Cloud Console'da aşağıdaki bağlantıyı kullanarak Cloud Run Functions'a gidin:

https://console.cloud.google.com/run/create?deploymentType=function

  1. Yapılandır bölümünde, İşlev Adı'nı "retail-engine" olarak ayarlayın ve bölgeyi "us-central1" olarak seçin.
  2. Uç nokta URL'sinde çalışma zamanı olarak Java 17'yi seçin.
  3. Kimlik doğrulama bölümünde Kimliği doğrulanmayan çağrılara izin ver'i seçin.
  4. Container(s), Volumes, Networking, Security (Kapsayıcılar, Birimler, Ağ, Güvenlik) seçeneğini genişletin ve Networking (Ağ) sekmesini tıklayın.
  5. Giden trafik için bir VPC'ye bağlan'ı seçin ve ardından Sunucusuz VPC Erişimi bağlayıcılarını kullan'ı tıklayın.
  6. Ağ bölümünde Yeni VPC Bağlayıcı Ekle'yi tıklayın. Henüz etkinleştirilmemişse Sunucusuz VPC Erişimi API'si'ni etkinleştirin.
  7. Bağlayıcı oluşturma bölümünde adı alloydb-test-conn olarak ayarlayın.
  8. Bölgeyi us-central olarak ayarlayın.
  9. Ağ değerini varsayılan olarak bırakın ve Alt AğÖzel IP Aralığı olarak ayarlayın. IP aralığı 10.8.0.0 veya benzer bir değer olabilir.
  10. Ölçeklendirmeyi göster ayarlarını genişletin ve Minimum örnek sayısı'nı 2, Maksimum örnek sayısı'nı 3 olarak ayarlayın.
  11. Örnek türü olarak f1-micro'yu seçin. Aşağıda Bağlayıcı oluşturma seçenekleri gösterilmektedir:

bed4b2af6795a8ba.png

  1. Bağlayıcıyı oluşturmak için Oluştur'u tıklayın.
  2. Trafik yönlendirme bölümünde Tüm trafiği VPC'ye yönlendir'i seçin.
  3. İşlevi oluşturmak için Oluştur'u tıklayın.

Uygulamayı dağıtın

İşlev oluşturulduktan sonra kaynağı güncelleyin ve uygulamayı yeniden dağıtın.

  1. Cloud Run'da Hizmetler sekmesini ve retail-engine işlevini tıklayın.
  2. Kaynak sekmesini tıklayın. Varsayılan Function entry point'i (İşlev giriş noktası) "gcfv2.HelloHttpFunction" olarak bırakın.
  3. HelloHttpFunction.java dosyasının içeriğini bu Java dosyasının içeriğiyle değiştirin.
  4. Dosyadaki AlloyDbJdbcConnector ayrıntılarını, AlloyDB örneğinizin ve kümenizin ayrıntılarına göre güncelleyin. $PROJECT_ID kısmını AlloyDB kümenizin ve örneğinizin proje kimliğiyle değiştirin.

a89dc5af3580fbcf.png

  1. pom.xml dosyasının içeriğini bu XML dosyasının içeriğiyle değiştirin.
  2. İşlevi dağıtmak için Kaydet ve yeniden dağıt'ı tıklayın.

11. Perakende motoru uygulamasını test etme

Güncellenen Cloud Functions dağıtıldıktan sonra uç noktayı şu biçimde görürsünüz:

https://retail-engine-PROJECT_NUMBER.us-central1.run.app

Aşağıdaki komutu çalıştırarak Cloud Shell Terminali'nden test edebilirsiniz:

gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'

Alternatif olarak, Cloud Run işlevini aşağıdaki şekilde test edebilirsiniz:

PROJECT_ID=$(gcloud config get-value project)

curl -X POST https://retail-engine-$PROJECT_NUMBER.us-central1.run.app \
  -H 'Content-Type: application/json' \
  -d '{"search":"I want some kids clothes themed on Disney"}' \
  | jq .

Sonuç:

88bc1ddfb5644a28.png

AlloyDB verilerinde yerleştirme modelini kullanarak benzerlik vektörü araması yaptığımıza göre, artık bu yerleştirmeleri resminiz ve istemlerle birlikte kullanarak stil önerileri oluşturacak uygulamayı oluşturmaya başlayabiliriz.

12. Kombin önerisi akışını anlama

Kıyafet önerisi uygulaması, görsel kıyafet stili seçenekleri oluşturmak için Gemini ve Imagen ile birlikte AlloyDB perakende motoru uygulamasında oluşturduğumuz yerleştirmelerle çalışacak şekilde yapılandırılmış bir sprint boot uygulamasıdır. Ayrıca, özel istemler eklemenize ve öneriyi geliştirmenize olanak tanır.

Şöyle düşünün: Gardırobunuzdaki fuşya rengi bir üstün resmini bu uygulamaya yüklüyorsunuz. Göster'i tıkladığınızda uygulama kodu ve AlloyDB veritabanındaki yerleştirmelere göre, uygulama orijinal resimle eşleşen birden fazla seçenek oluşturuyor. Şimdi de önerilen seçeneklerin mavi bir kolyeyle nasıl görüneceğini merak ediyorsunuz. Bu nedenle, bu satırlara bir istem ekleyip Stili tıklıyorsunuz. Son olarak, orijinal resim ve önerilerin güçlü kombinasyonuyla eşleşen bir kıyafet oluşturmak için son resim üretilir.

Kıyafet önerisi uygulamasını oluşturmaya başlamak için aşağıdaki adımları uygulayın:

  1. Cloud Run'da retail-engine uygulamasını açın ve uygulamanızın URL'sini not edin. Bu, benzer öneriler oluşturmak için kullanacağımız yerleştirme deposudur.
  2. IDE'nizde https://github.com/AbiramiSukumaran/outfit-recommender/ deposunu klonlayın. Bu alıştırmada gösterilen adımlar Visual Studio Code IDE'de gerçekleştirilir.
git clone https://github.com/AbiramiSukumaran/outfit-recommender/

Uygulama dizinindeki önemli dosyalardan bazıları şunlardır:

  • src/main: Uygulama dosyalarının ve HTML'nin bulunduğu kaynak dizin:
  • HelloWorldApplication.java: Spring Boot uygulamasının ana giriş noktası.
  • HelloWorldController.java: Bir kıyafet önerisi uygulamasıyla ilgili HTTP isteklerini işleyen Spring Boot REST denetleyicisi. Bu dosya, GET ve POST isteklerini işler, kullanıcı istemlerini işler, resimleri analiz eder, AlloyDB yerleştirmeleriyle etkileşime girer ve son yanıtı kullanıcı arayüzüne döndürür. Bu denetleyici, GenerateImageSample sınıfını çağırır.
  • GenerateImageSample.java: Vertex AI'a bağlanan, kullanıcı istemini biçimlendiren, Imagen modeline API çağrıları yapan ve tahmin edilen resmi denetleyici sınıfına döndüren görüntü üretme sınıfını içerir.
  • Resources: Bu dizin, uygulama kullanıcı arayüzünü oluşturmak için gereken resimleri ve HTML dosyalarını içerir.
  • Pom.xml: Proje bağımlılıklarını ve yapılandırmalarını tanımlar.
  1. Visual Studio Code'da HelloWorldController.java dosyasını açın ve proje kimliği ile konum örneklerini, AlloyDB örneğinizin oluşturulduğu yere göre güncelleyin.

9fff8f5cbb62567.png

  1. endpoint değerini, daha önce barındırdığınız perakende motoru uygulama URL'siyle güncelleyin.

ae6227e88eec5485.png

  1. GenerateImageSample.java simgesini açın ve proje kimliğini ile konumu, AlloyDB örneğinizin oluşturulduğu yere göre güncelleyin.

db1f81a6f51d80de.png

  1. Tüm dosyaları kaydedin.

Şimdi bu uygulamayı Cloud Run sunucusuz çalışma zamanına dağıtacağız.

13. Uygulamayı web'e taşıma

Kıyafet önerme Spring Boot uygulamasına ilgili proje, konum ve perakende motoru uygulama ayrıntılarını eklediğimize göre uygulamayı Cloud Run'a dağıtabiliriz.

Uygulamayı dağıtmak için Visual Code Studio terminalinde gcloud run deploy komutunu kullanacağız. Visual Studio Code için gcloud CLI'yı kullanmaya başlamak üzere Google Cloud Code uzantısını yükleyebilirsiniz.

Uygulamayı dağıtmak için aşağıdaki adımları uygulayın:

  1. IDE'nizde, klonlanan dizini açın ve terminali başlatın. Visual Code Studio için Terminal > New Terminal'i (Yeni Terminal) tıklayın.
  2. gcloud CLI'yi yüklemek için bu belgedeki talimatları uygulayın.
  3. Visual Code Studio kullanıyorsanız Extensions'ı tıklayın, Google Cloud Code'u arayın ve uzantıyı yükleyin.
  4. IDE terminalinizde aşağıdaki komutu çalıştırarak Google Hesabınızın kimliğini doğrulayın:
gcloud auth application-default login
  1. Proje kimliğinizi, AlloyDB örneğinizin bulunduğu projeyle aynı olacak şekilde ayarlayın.
gcloud config set project PROJECT_ID
  1. Dağıtım sürecini başlatın.
gcloud run deploy
  1. Source code location içinde, klonlanan GitHub dizinini seçmek için Enter tuşuna basın.
  2. Service name alanına hizmet için bir ad (ör. outfit-recommender) girin ve Enter tuşuna basın.
  3. Please specify a region bölümünde, AlloyDB örneğinizin ve retail-engine uygulamanızın barındırıldığı konumu (ör. us-central1 için 32) girip Enter tuşuna basın.

12c0de4248660d4d.png

  1. Allow unauthenticated invocations to [..] bölümünde Y yazıp Enter tuşuna basın.

Aşağıdaki resimde, uygulamanızın dağıtım ilerleme durumu gösterilmektedir:

1babbb82faa31fce.png

14. Kıyafet öneren uygulamayı test etme

Uygulama Cloud Run'a başarıyla dağıtıldıktan sonra hizmeti Google Cloud Console'da aşağıdaki gibi görebilirsiniz:

  1. Google Cloud Console'da Cloud Run'a gidin.
  2. Hizmetler'de, dağıttığınız kıyafet önerici hizmetini tıklayın. retail-engine ve outfit-recommender hizmetlerini aşağıdaki gibi görmeniz gerekir:

24dd0aebe224059e.png

  1. Öneren uygulama kullanıcı arayüzünü açmak için uygulama URL'sini tıklayın.

cdc9c1625b1648d2.png

    The following is a sample URL that you will use:

https://outfit-recommender-22905290964.us-central1.run.app/style

Dağıtılan uygulama aşağıdaki gibi görünebilir:

76245d1a6152d313.png

Uygulamayı kullanma

Uygulamayı kullanmaya başlamak için aşağıdaki adımları uygulayın:

  1. Yükle'yi tıklayın ve bir giysi öğesinin resmini yükleyin.
  2. Görüntü yüklendikten sonra Stil'i tıklayın. Uygulama, görüntüyü istem olarak kullanır ve perakende veri kümesi için yerleştirmeler içeren perakende motoru uygulamasından gelen isteme göre alt seçenekler oluşturur.

Uygulama, stil önerileri içeren resme göre istemle birlikte resim önerileri oluşturur. Örneğin, A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.

  1. Bu otomatik olarak oluşturulan stil önerisine ek istemler iletebilirsiniz. Örneğin, STYLE RECOMMENDATION: Cute brown skirt on a curly updo. Make it photo realistic. Accessorize with cherry earrings and burgundy plastic case sling bag.
  2. Son stili görmek için Göster'i tıklayın.

38d6d08e9a0a44c0.png

15. Temizleme

Bu yayında kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız şu adımları uygulayın:

  1. Google Cloud Console'da Kaynakları yönetin sayfasına gidin.
  2. Proje listesinde silmek istediğiniz projeyi seçin ve Sil'i tıklayın.
  3. İletişim kutusunda proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.

16. Tebrikler

Tebrikler! AlloyDB, pgvector ve Vector Search'ü kullanarak benzerlik araması yaptınız ve stil önerileri oluşturmak için arama sonucunu güçlü Imagen modeliyle birlikte kullandınız.