1. Genel Bakış
Günümüzün hızlı tempolu perakende ortamında, kişiselleştirilmiş alışveriş deneyimlerini mümkün kılarken olağanüstü müşteri hizmetleri sunmak çok önemlidir. Müşteri sorularını yanıtlamak, ürün keşfine rehberlik etmek ve arama sonuçlarını özelleştirmek için tasarlanmış bilgi odaklı bir sohbet uygulamasının oluşturulmasıyla ilgili teknik bir yolculuğa çıkacağız. Bu yenilikçi çözüm; veri depolama için AlloyDB'nin gücünü, bağlamsal anlayış için şirket içi bir analiz motorunu, alaka düzeyi doğrulaması için Gemini'ı (büyük dil modeli) ve akıllı bir sohbet asistanını hızlıca başlatmak için Google'ın Agent Builder'ını bir araya getirir.
Zorluk: Günümüzün perakende müşterileri anında yanıtlar ve benzersiz tercihlerine uygun ürün önerileri bekliyor. Geleneksel arama yöntemleri genellikle bu düzeyde bir kişiselleştirme sunamaz.
Çözüm: Bilgiye dayalı sohbet uygulamamız bu zorluğun üstesinden geliyor. Müşteri amacını anlamak, akıllıca yanıt vermek ve son derece alakalı sonuçlar sunmak için perakende verilerinizden elde edilen zengin bir bilgi bankasından yararlanır.
Ne oluşturacaksınız?
Bu laboratuvarın (1. Bölüm) bir parçası olarak şunları yapacaksınız:
- AlloyDB örneği oluşturma ve e-ticaret veri kümesini yükleme
- AlloyDB'de pgvector ve üretken yapay zeka modeli uzantılarını etkinleştirme
- Ürün açıklamasından yerleştirilmiş öğeler oluşturma
- Kullanıcı arama metni için anlık kosinüs benzerliği araması yapma
- Çözümü sunucusuz Cloud Run işlevlerinde dağıtma
Laboratuvarın ikinci bölümünde Agent Builder adımları ele alınacaktır.
Şartlar
2. Mimari
Veri akışı: Verilerin sistemimizde nasıl hareket ettiğine daha yakından bakalım:
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:
- Bağlam Çıkarma: Motor, ürünler, kategoriler, müşteri davranışı vb. arasındaki ilişkileri anlamak için AlloyDB'de depolanan verileri analiz eder.
- 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.
- Vector Search: 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 Doğrulaması:
Bu olası yanıtlar değerlendirilmek üzere Gemini'a gönderilir. Gemini, bu yanıtların kullanıcıyla paylaşılmaya uygun ve güvenli olup olmadığını belirler.
Yanıt Ü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.
Etkileşimli Sohbet:
Agent Builder, yanıtları kullanıcıya doğal dil biçiminde sunarak karşılıklı diyaloğu kolaylaştırır. Bu bölüm, takip laboratuvarında ele alınacaktır.
3. Başlamadan önce
Proje oluşturma
- Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
- Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Bir projede faturalandırmanın etkin olup olmadığını kontrol etmeyi öğrenin .
- 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 tıklayın.

- Cloud Shell'e bağlandıktan sonra aşağıdaki komutu kullanarak kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını kontrol edin:
gcloud auth list
- gcloud komutunun projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın.
gcloud config list project
- Projeniz ayarlanmamışsa ayarlamak için aşağıdaki komutu kullanın:
gcloud config set project <YOUR_PROJECT_ID>
- Gerekli API'leri etkinleştirin.
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com
Gcloud komutuna alternatif olarak, her ürünü arayarak veya bu bağlantıyı kullanarak konsolu kullanabilirsiniz.
Herhangi bir API atlanırsa uygulama sırasında istediğiniz zaman etkinleştirebilirsiniz.
gcloud komutları ve kullanımı için belgelere bakın.
4. Veritabanı kurulumu
Bu laboratuvarda perakende verilerini tutmak için veritabanı olarak AlloyDB'yi kullanacağız. Veritabanları ve günlükler gibi tüm kaynakları tutmak için kümeler kullanılır. Her kümede, verilere erişim noktası sağlayan bir birincil örnek bulunur. Tablolar gerçek verileri içerir.
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
- Cloud Console'da AlloyDB sayfasına gidin. Cloud Console'daki çoğu sayfayı bulmanın kolay bir yolu, konsolun arama çubuğunu kullanarak arama yapmaktır.
- Bu sayfada KÜME OLUŞTUR'u seçin:

- Aşağıdaki gibi bir ekran görürsünüz. 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"

- Varsayılan ağı seçtiğinizde aşağıdaki gibi bir ekran görürsünüz. BAĞLANTIYI AYARLA'yı seçin.

- Buradan "Otomatik olarak atanmış bir IP aralığı kullan"ı ve Devam'ı seçin. Bilgileri inceledikten sonra BAĞLANTI OLUŞTUR'u seçin.

- Ağınız kurulduktan sonra kümenizi oluşturmaya devam edebilirsiniz. Aşağıda gösterildiği gibi küme kurulumunu tamamlamak için KÜME OLUŞTUR'u tıklayın:

Örnek kimliğini "shopping-instance"" olarak değiştirdiğinizden emin olun.
Küme oluşturma işleminin yaklaşık 10 dakika süreceğini unutmayın. İşlem başarılı olduğunda aşağıdakine benzer bir ekran görürsünüz:

5. Veri kullanımı
Şimdi de mağazayla ilgili verilerin bulunduğu bir tablo ekleme zamanı. AlloyDB'ye gidin, birincil kümeyi ve ardından AlloyDB Studio'yu seçin:

Örneğinizin oluşturulma işleminin tamamlanmasını beklemeniz gerekebilir. Bu işlem tamamlandıktan sonra, kümeyi oluştururken oluşturduğunuz kimlik bilgilerini kullanarak AlloyDB'de oturum açın. PostgreSQL'de kimlik doğrulaması yapmak için aşağıdaki verileri kullanın:
- Kullanıcı adı : "
postgres" - Veritabanı : "
postgres" - Şifre : "
alloydb"
AlloyDB Studio'da kimliğinizi başarıyla doğruladıktan sonra SQL komutları Düzenleyici'ye girilir. Son pencerenin sağındaki artı işaretini kullanarak birden fazla Editor penceresi ekleyebilirsiniz.

Gerekli durumlarda Çalıştır, Biçimlendir ve Temizle seçeneklerini kullanarak AlloyDB için komutları düzenleyici pencerelerine gireceksiniz.
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. 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;
Veritabanınızda etkinleştirilen uzantıları kontrol etmek istiyorsanız şu SQL komutunu çalıştırın:
select extname, extversion from pg_extension;
Tablo oluşturma
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 tablonun veritabanında görüntülenebilmesi gerekir. Örnek ekran görüntüsü aşağıda gösterilmiştir:

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.
Buradan 20 satırı/ekleme ifadesini kopyalayın, ardından bu satırları boş bir düzenleyici sekmesine yapıştırıp ÇALIŞTIR'ı seçin.
Tablo içeriklerini görmek için Gezgin bölümünü, giysiler adlı tabloyu görene kadar genişletin. Tabloya sorgu gönderme seçeneğini görmek için üç nokta simgesini (⋮) seçin. SELECT ifadesi yeni bir Düzenleyici sekmesinde açılır.

İzin Ver
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
Cloud Shell terminaline gidip aşağıdaki komutu verin:
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. Bağlam
AlloyDB örneği sayfasına dönün.
Yerleştirme oluşturmak için context olması gerekir. Yani, tek bir alana eklemek istediğimiz tüm bilgiler. Bunu, pdt_desc olarak adlandıracağımız bir ürün açıklaması oluşturarak yapacağız. Bizim örneğimizde her ürünle ilgili tüm bilgileri kullanacağız ancak siz kendi verilerinizle bunu yaparken verileri işletmeniz için anlamlı bulduğunuz herhangi bir şekilde düzenleyebilirsiniz.
Yeni oluşturduğunuz örneğin AlloyDB Studio'sunda aşağıdaki ifadeyi çalıştırın. Bu işlem, pdt_desc alanını içerik verisiyle günceller:
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. "Su üzerinde", "sahilde", "odanızdan okyanusa yürüyerek gidebilirsiniz", "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ının 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-004 kullanıyoruz. Proje boyunca aynı yerleştirme modelini kullandığınızdan emin olun.
Not: Bir süre önce oluşturulmuş mevcut bir Google Cloud projesini kullanıyorsanız textembedding-gecko gibi metin yerleştirme modelinin eski sürümlerini kullanmaya devam etmeniz gerekebilir.
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-004',
pdt_desc)
WHERE
TRUE;
Bazı yerleştirmeleri görmek için apparels tablosuna tekrar bakın. Değişiklikleri görmek için SELECT ifadesini yeniden çalıştırdığınızdan emin olun.
SELECT
id,
category,
sub_category,
content,
embedding
FROM
apparels;
Bu işlem, sorgudaki örnek metin için aşağıdaki gibi bir kayan nokta dizisi olan yerleştirme vektörünü döndürmelidir:

Not: Ücretsiz katman kapsamında yeni oluşturulan Google Cloud projeleri, saniye başına yerleştirme modellerine izin verilen yerleştirme isteği sayısı konusunda kota sorunlarıyla karşılaşabilir. Yerleştirme oluştururken kimlik için bir filtre sorgusu kullanmanızı ve ardından 1-5 kayıt seçmenizi öneririz.
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 şu soruyu sorduğunu varsayalım:
"Kadın üstleri istiyorum, sadece pembe ve pamuklu olsun."
Aşağıdaki sorguyu çalıştırarak bununla ilgili eşleşmeleri bulabilirsiniz:
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
Bu sorguyu ayrıntılı olarak inceleyelim:
Bu sorguda,
- Kullanıcının arama metni: "Kadın üstleri istiyorum, sadece pembe ve %100 pamuklu olsun."
embedding()yöntemindetext-embedding-004modeli kullanılarak yerleştirmelere dönüştürülüyor. Bu adım, son adımda tabloya yerleştirme işlevini uyguladığımız için tanıdık gelecektir.- "
<=>", 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. - Yerleştirme yönteminin sonucunu, veritabanında depolanan vektörlerle uyumlu hale getirmek için vektör türüne dönüştürüyoruz.
- LIMIT 5, arama metni için en yakın 5 komşuyu çıkarmak istediğimizi gösterir.
Sonuç şu şekilde görünür:

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.
Önemli Not:
Ş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. Sonuçlardaki farkı dizinli ve dizinsiz olarak karşılaştırmak için lütfen bu blogdaki adımları okuyun. Kolaylık sağlamak için dizin oluşturma adımlarını burada listeliyoruz:
- 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;
- Ardından dizini (ScaNN) oluşturacağız:
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" tablom
"scann" dizin oluşturma yöntemidir.
"embedding", tablodaki dizine eklemek istediğim sütun
"cosine", dizinle kullanmak istediğim 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 deposunda önerildiği gibi veri noktalarının sayısının KAREKÖKÜNÜ kullandım (Bölümlendirme sırasında num_leaves, veri noktalarının sayısının yaklaşık olarak karekökü olmalıdır).
- Dizinin aşağıdaki sorgu kullanılarak oluşturulup oluşturulmadığını kontrol edin:
SELECT * FROM pg_stat_ann_indexes;
- Dizini kullanmadan yaptığımız sorguyla aynı sorguyu kullanarak 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 alan dizine eklenmiş durumda.
- Dizinle ve dizin olmadan (dizini bırakarak) basit bir arama sorgusuyla test edin:
white tops for girls without any print
INDEXED yerleştirme verilerindeki Vector Search sorgusunda yukarıdaki arama metni, kaliteli arama sonuçları ve verimlilik sağlar. 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
Öncelikle Google ML entegrasyonunun kümeniz ve örneğiniz için etkinleştirilmiş olup olmadığını kontrol edin. AlloyDB Studio'da aşağıdaki komutu verin:
show google_ml_integration.enable_model_support;
Değer "on" olarak gösteriliyorsa sonraki 2 adımı atlayıp doğrudan AlloyDB ve Vertex AI Model entegrasyonunu ayarlamaya gidebilirsiniz.
- AlloyDB kümenizin birincil örneğine gidin ve BİRİNCİL ÖRNEĞİ DÜZENLE'yi tıklayın.

- Gelişmiş Yapılandırma Seçenekleri'ndeki Flags (Deneysel Özellikler) bölümüne gidin. ve
google_ml_integration.enable_model_support flagseçeneğinin aşağıda gösterildiği gibi "on" olarak ayarlandığından emin olun:

"Açık" olarak ayarlanmamışsa "Açık" olarak ayarlayın ve UPDATE INSTANCE (Örneği güncelle) düğmesini tıklayın. Bu adım birkaç dakika sürer.
AlloyDB ve Vertex AI Model entegrasyonu
Artık AlloyDB Studio'ya bağlanabilir ve Gemini model erişimini AlloyDB'den ayarlamak için aşağıdaki DML ifadesini çalıştırabilirsiniz. İfadeyi çalıştırırken belirtilen yerlerde proje kimliğinizi kullanın. Komutu çalıştırmadan önce söz dizimi hatası konusunda uyarılabilirsiniz ancak komut sorunsuz şekilde çalışır.
İlk olarak, aşağıdaki şekilde gösterildiği gibi Gemini 1.5 model bağlantısını oluşturuyoruz. Aşağıdaki komutta $PROJECT_ID yerine Google Cloud proje kimliğinizi yazmayı unutmayın.
CALL
google_ml.create_model( model_id => 'gemini-1.5',
model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-1.5-pro:streamGenerateContent',
model_provider => 'google',
model_auth_type => 'alloydb_service_agent_iam');
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;
Son olarak, Google Vertex AI modelleri aracılığıyla tahmin yürütmek için veritabanı kullanıcılarına ml_predict_row işlevini yürütme izni vermemiz gerekir. Aşağıdaki komutu çalıştırın:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
Not: Mevcut bir Google Cloud projesi ve bir süre önce oluşturulmuş mevcut bir AlloyDB kümesi/örneği kullanıyorsanız gemini-1.5 modeline yapılan eski referansları bırakmanız ve yukarıdaki CALL ifadesiyle yeniden oluşturmanız gerekebilir. Ayrıca, gemini-1.5'in sonraki çağrılarında sorun yaşarsanız ml_predict_row işlevinde yürütme izni verme işlemini tekrar çalıştırmanız gerekebilir.
Yanıtları değerlendirme
Sorgudan gelen yanıtların makul olmasını sağlamak için bir sonraki bölümde tek bir büyük sorgu kullanacağız ancak bu sorguyu anlamak zor olabilir. Şimdi parçalara bakacağız ve birkaç dakika içinde nasıl bir araya geldiklerini göreceğiz.
- Ö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.
apparelstablosundaki ürün açıklamasını ekliyor ve iki yeni alan ekliyoruz. Bu alanlardan biri açıklamayı dizinle, diğeri ise orijinal istekle birleştiriyor. Tüm bunlarxyzadlı bir tabloya kaydedilir (geçici bir tablo adıdır).
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-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
Bu sorgunun çıktısı, kullanıcının sorgusuyla ilgili en benzer 5 satır olacaktır. Yeni xyz tablosu 5 satır içerir. Her satırda aşağıdaki sütunlar bulunur:
literaturecontentuser_text
- 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
xyztablosundauser_textvecontentkullanı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."
- Bu sorguyu kullanarak
xyztablosundaki yanıtların "kalitesini" inceleyeceğiz.
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;
predict_row, sonucu JSON biçiminde döndürür. Bu JSON'dan gerçek metni ayıklamak 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.- Son olarak, LLM alanını almak için x tablosundan çıkarmanız yeterlidir:
SELECT
LLM_RESPONSE
FROM
x;
- Bu, aşağıdaki gibi tek bir sonraki sorguda birleştirilebilir.
Ara sonuçları kontrol etmek için yukarıdaki sorguları çalıştırdıysanız bu sorguyu çalıştırmadan önce AlloyDB veritabanından xyz ve x tablolarını silmeniz/kaldırmanız gerekir.
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-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
Bu hala göz korkutucu görünse de umarız biraz daha anlamlı hale gelmiştir. 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: 
10. Uygulamayı web'e taşıma
Bu uygulamayı web'e taşımaya hazır mısınız? Bu bilgi motorunu Cloud Run işlevleriyle sunucusuz hale getirmek için aşağıdaki adımları uygulayın:
- Yeni bir Cloud Run işlevi OLUŞTURMAK için Google Cloud Console'da Cloud Run Functions'a gidin veya şu bağlantıyı kullanın: https://console.cloud.google.com/functions/add.
- Ortam olarak "Cloud Run işlevi"ni seçin. İşlev adı olarak "retail-engine" girin ve bölge olarak "us-central1"i seçin. Kimlik Doğrulama'yı "Kimliği doğrulanmayan çağrılara izin ver" olarak ayarlayın ve SONRAKİ'yi tıklayın. Çalışma zamanı olarak Java 17'yi, kaynak kodu için ise Satır İçi Düzenleyici'yi seçin.
- Varsayılan olarak giriş noktası "
gcfv2.HelloHttpFunction" olarak ayarlanır. Cloud Run işlevinizinHelloHttpFunction.javavepom.xmlbölümlerindeki yer tutucu kodu sırasıyla Java dosyası ve XML'deki kodla değiştirin. - Java dosyasında $PROJECT_ID yer tutucusunu ve AlloyDB bağlantı kimlik bilgilerini kendi değerlerinizle değiştirmeyi unutmayın. AlloyDB kimlik bilgileri, bu codelab'in başında kullandığımız kimlik bilgileridir. Farklı değerler kullandıysanız lütfen Java dosyasında bunları değiştirin.
- Dağıt'ı tıklayın.
Dağıtım tamamlandıktan sonra Cloud Functions işlevinin AlloyDB veritabanı örneğimize erişmesine izin vermek için VPC bağlayıcısını oluşturacağız.
ÖNEMLİ ADIM:
Dağıtıma başladıktan sonra işlevleri Google Cloud Run Functions Console'da görebilirsiniz. Yeni oluşturulan işlevi (retail-engine) arayın, işlevi tıklayın, ardından DÜZENLE'yi tıklayıp aşağıdakileri değiştirin:
- Çalışma zamanı, derleme, bağlantılar ve güvenlik ayarlarına gitme
- Zaman aşımını 180 saniyeye çıkarın
- BAĞLANTILAR sekmesine gidin:

- Giriş ayarları bölümünde "Tüm trafiğe izin ver" seçeneğinin belirlendiğinden emin olun.
- Çıkış ayarları bölümünde, Ağ açılır listesini tıklayın ve "Yeni VPC bağlayıcı ekle" seçeneğini belirleyin. Ardından, açılan iletişim kutusunda gördüğünüz talimatları uygulayın:

- VPC bağlayıcısı için bir ad girin ve bölgenin örneğinizle aynı olduğundan emin olun. Ağ değerini varsayılan olarak bırakın ve alt ağı, 10.8.0.0 IP aralığına sahip özel IP aralığı olarak ayarlayın veya benzer bir aralık kullanın.
- ÖLÇEKLENDİRME AYARLARINI GÖSTER'i genişletin ve yapılandırmanın tam olarak aşağıdaki gibi ayarlandığından emin olun:

- OLUŞTUR'u tıkladığınızda bu bağlayıcı artık çıkış ayarlarında listelenir.
- Yeni oluşturulan bağlayıcıyı seçin
- Tüm trafiğin bu VPC bağlayıcısı üzerinden yönlendirilmesini tercih edin.
- SONRAKİ'yi ve ardından DAĞIT'ı tıklayın.
11. Uygulamayı test etme
Güncellenen Cloud Functions dağıtıldıktan sonra uç noktayı şu biçimde görürsünüz:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/retail-engine
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://us-central1-$PROJECT_ID.cloudfunctions.net/retail-engine \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
Sonuç:

İşte bu kadar. AlloyDB verilerinde yerleştirme modelini kullanarak benzerlik vektör araması yapmak bu kadar kolaydır.
Konuşma Aracısını Oluşturma
Temsilci, bu laboratuvarın 2. bölümünde oluşturulur.
12. Temizleme
Bu laboratuvarın 2. bölümünü tamamlamayı planlıyorsanız mevcut proje silineceğinden bu adımı atlayın.
Bu yayında kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız şu adımları uygulayın:
- Google Cloud Console'da Kaynakları yönetin sayfasına gidin.
- Proje listesinde silmek istediğiniz projeyi seçin ve Sil'i tıklayın.
- İletişim kutusunda proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.
13. Tebrikler
Tebrikler! AlloyDB, pgvector ve Vector Search'ü kullanarak benzerlik araması yaptınız. AlloyDB, Vertex AI ve Vector Search'ün özelliklerini bir araya getirerek bağlamsal ve vektör aramalarını erişilebilir, verimli ve gerçekten anlam odaklı hale getirme konusunda büyük bir adım attık. Bu laboratuvarın bir sonraki bölümünde aracı oluşturma adımları ele alınmaktadır.