PostgreSQL için Cloud SQL'de Vektör Yerleşimleri'ni kullanmaya başlama

1. Giriş

Bu kod laboratuvarında, vektör aramayı Vertex AI yerleştirmeleriyle birleştirerek PostgreSQL için Cloud SQL'in yapay zeka entegrasyonunu kullanmayı öğreneceksiniz.

8aa6ba3bc12a1593.png

Ö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?

Gerekenler

  • Google Cloud hesabı ve Google Cloud projesi
  • Google Cloud Console ve Cloud Shell'i destekleyen Chrome gibi bir web tarayıcısı

2. Kurulum ve Gereksinimler

Proje Kurulumu

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

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

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

295004821bab6a87.png

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

37d264871000675d.png

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

96d86d3d5655cdbe.png

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

Faturalandırmayı etkinleştirme

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

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

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

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

f54628965f465486.png

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

20e88842cf2a732e.png

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

cdc87f1c57777951.png

Kişisel faturalandırma hesabı oluşturma

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

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

Bazı notlar:

  • Bu laboratuvarın tamamlanması için 3 ABD dolarından daha az bir tutarda bulut kaynağı kullanılması gerekir.
  • Daha fazla ödeme alınmaması için bu laboratuvarın sonundaki adımları uygulayarak kaynakları silebilirsiniz.
  • Yeni kullanıcılar 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir. Ancak bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.

Google Cloud Console'da sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:

Cloud Shell'i etkinleştirme

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

Ortamın sağlanması ve bağlantının kurulması yalnızca birkaç saniye sürer. İşlem tamamlandığında aşağıdakine benzer bir sonuç görürsünüz:

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

Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde iyileştirilir. Bu codelab'deki tüm çalışmalarınızı tarayıcıda yapabilirsiniz. Herhangi bir yazılım yüklemeniz gerekmez.

3. Başlamadan önce

API'yi etkinleştirme

Çıkış:

Cloud SQL, Compute Engine, ağ hizmetleri ve Vertex AI'ı kullanmak için Google Cloud projenizde ilgili API'leri etkinleştirmeniz gerekir.

Cloud Shell terminalinde 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 sqladmin.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.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 sqladmin.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

API'lerle tanışın

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

4. Cloud SQL örneği oluşturma

Vertex AI ile veritabanı entegrasyonu olan bir Cloud SQL örneği oluşturun.

Veritabanı şifresi oluşturma

Varsayılan veritabanı kullanıcısı için şifre tanımlayın. Kendi şifrenizi tanımlayabilir veya rastgele bir şifre oluşturmak için rastgele işlevini kullanabilirsiniz:

export CLOUDSQL_PASSWORD=`openssl rand -hex 12`

Şifre için oluşturulan değeri not edin:

echo $CLOUDSQL_PASSWORD

PostgreSQL için Cloud SQL örneği oluşturma

Cloud SQL örnekleri; Google Cloud Console, Terraform gibi otomasyon araçları veya Google Cloud SDK gibi farklı yöntemlerle oluşturulabilir. Laboratuvarda öncelikle Google Cloud SDK gcloud aracını kullanacağız. Diğer araçları kullanarak nasıl örnek oluşturacağınızı dokümanlardan öğrenebilirsiniz.

Cloud Shell oturumunda şunu çalıştırın:

gcloud sql instances create my-cloudsql-instance \
--database-version=POSTGRES_17 \
--tier=db-custom-1-3840 \
--region=us-central1 \
--edition=ENTERPRISE \
--enable-google-ml-integration \
--database-flags cloudsql.enable_google_ml_integration=on

Örneği oluşturduktan sonra, örnekteki varsayılan kullanıcı için bir şifre belirlememiz ve bu şifreyle bağlanıp bağlanamayacağımızı doğrulamamız gerekir.

gcloud sql users set-password postgres \
    --instance=my-cloudsql-instance \
    --password=$CLOUDSQL_PASSWORD

"gcloud sql connect" komutunu kutuda gösterildiği gibi çalıştırın ve bağlanmaya hazır olduğunda isteme şifrenizi girin.

gcloud sql connect my-cloudsql-instance --user=postgres

Şimdilik ctrl+d klavye kısayolunu kullanarak veya exit komutunu çalıştırarak psql oturumundan çıkın.

exit

Vertex AI entegrasyonunu etkinleştirme

Vertex AI entegrasyonunu kullanabilmek için dahili Cloud SQL hizmet hesabına gerekli ayrıcalıkları verin.

Cloud SQL dahili hizmet hesabı e-postasını bulup değişken olarak dışa aktarın.

SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL

Cloud SQL hizmet hesabına Vertex AI'a erişim izni verin:

PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
  --role="roles/aiplatform.user"

Örnek oluşturma ve yapılandırma hakkında daha fazla bilgiyi Cloud SQL belgelerinde burada bulabilirsiniz.

5. Veritabanını Hazırlama

Şimdi bir veritabanı oluşturmamız ve vektör desteğini etkinleştirmemiz gerekiyor.

Veritabanı Oluşturma

quickstart_db adlı bir veritabanı oluşturun. Bunu yapmak için farklı seçeneklerimiz var. Örneğin, PostgreSQL için psql gibi komut satırı veritabanı istemcileri, SDK veya Cloud SQL Studio. Veritabanı oluşturmak ve örneğe bağlanmak için SDK'yı (gcloud) kullanacağız.

Cloud Shell'de veritabanı oluşturma komutunu yürütün.

gcloud sql databases create quickstart_db --instance=my-cloudsql-instance

Uzantıları etkinleştirme

Vertex AI ve vektörlerle çalışabilmek için oluşturduğumuz veritabanında iki uzantıyı etkinleştirmemiz gerekir.

Cloud Shell'de, oluşturulan veritabanına bağlanmak için komut yürütün (şifrenizi girmeniz gerekir).

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Ardından, bağlantı başarılı olduktan sonra SQL oturumunda iki komut çalıştırmanız gerekir:

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector CASCADE;

SQL oturumundan çıkma:

exit;

6. Verileri Yükle

Şimdi veritabanında nesneler oluşturmamız ve verileri yüklememiz gerekiyor. Kurgusal Cymbal Store verilerini kullanacağız. Veriler, herkese açık Google Storage paketinde CSV biçiminde sunulur.

Öncelikle veritabanımızda gerekli tüm nesneleri oluşturmamız gerekir. Bunu yapmak için şema nesnelerini veritabanımıza indirmek ve içe aktarmak üzere zaten bildiğimiz gcloud sql connect ve gcloud storage komutlarını kullanacağız.

Cloud Shell'de, örneği oluştururken not edilen şifreyi çalıştırın ve girin:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Önceki komutta tam olarak ne yaptık? Veritabanımıza bağlandık ve tablolar, dizinler ve diziler oluşturan indirilen SQL kodunu yürüttük.

Bir sonraki adım, verileri yüklemektir. Bunu yapmak için CSV dosyalarını Google Cloud Storage'dan indirmemiz gerekir.

gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv .

Ardından veritabanına bağlanmamız gerekir.

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Ayrıca CSV dosyalarımızdaki verileri içe aktarabiliriz.

\copy cymbal_products from 'cymbal_products.csv' csv header
\copy cymbal_inventory from 'cymbal_inventory.csv' csv header
\copy cymbal_stores from 'cymbal_stores.csv' csv header

Kendi verileriniz varsa ve CSV dosyalarınız Cloud Console'da bulunan Cloud SQL içe aktarma aracıyla uyumluysa komut satırı yaklaşımı yerine bu aracı kullanabilirsiniz.

7. Yerleştirilmiş Öğeler Oluşturma

Bir sonraki adım, Google Vertex AI'daki textembedding-004 modelini kullanarak ürün açıklamalarımız için yerleştirmeler oluşturmak ve bunları vektör verileri olarak depolamaktır.

Veritabanına bağlanın (çıkış yaptıysanız veya önceki oturumunuzun bağlantısı kesildiyse):

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Ayrıca, yerleştirme işlevini kullanarak cymbal_products tablomuzda bir sanal sütun yerleştirme oluşturun. Bu komut, "product_description" sütununa göre oluşturulan yerleştirmelerle vektörlerimizi depolayacak "embedding" adlı sanal bir sütun oluşturur. Ayrıca tablodaki mevcut tüm satırlar için yerleştirmeler oluşturur. Model, yerleştirme işlevinin ilk parametresi, kaynak veriler ise ikinci parametresi olarak tanımlanır.

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-005',product_description)) STORED;

Bu işlem biraz zaman alabilir ancak 900-1.000 satır için 5 dakikadan uzun sürmez ve genellikle çok daha hızlıdır.

Tabloya yeni bir satır eklediğimizde veya mevcut bir satırın product_description özelliğini güncellediğimizde "embedding" sütunundaki sanal sütun verileri, "product_description" özelliğine göre yeniden oluşturulur.

8. Benzerlik Arama'yı çalıştırma

Artık açıklamalar için hesaplanan vektör değerlerine ve isteğimiz için aldığımız vektör değerine dayalı benzerlik araması kullanarak aramamızı çalıştırabiliriz.

SQL sorgusu, gcloud sql connect kullanılarak aynı komut satırı arayüzünden veya alternatif olarak Cloud SQL Studio'dan yürütülebilir. Çok satırlı ve karmaşık sorgular Cloud SQL Studio'da daha iyi yönetilir.

Cloud SQL Studio'yu başlatma

Konsolda daha önce oluşturduğumuz Cloud SQL örneğini tıklayın.

903eeb9bbaf4a419.png

Sağ panelde açıkken Cloud SQL Studio'yu görebiliriz. Bu sekmeyi tıklayın.

7874a11b28519b71.png

Veritabanı adını ve kimlik bilgilerinizi gireceğiniz bir iletişim kutusu açılır:

  • Veritabanı: quickstart_db
  • Kullanıcı: postgres
  • Şifre: Ana veritabanı kullanıcısı için not ettiğiniz şifre

"AUTHENTICATE" (KİMLİĞİ DOĞRULA) düğmesini tıklayın.

d5ee9e56dfef3905.png

Bir sonraki pencere açılır. Bu pencerede sağ taraftaki "Düzenleyici" sekmesini tıklayarak SQL Düzenleyici'yi açarsınız.

19a6ebd18ef6ae34.png

Artık sorgularımızı çalıştırmaya hazırız.

Sorgu Çalıştır

Bir sorgu çalıştırarak müşterinin isteğiyle en alakalı olan mevcut ürünlerin listesini alın. Vektör değerini almak için Vertex AI'a ileteceğimiz istek "Burada hangi tür meyve ağaçları iyi yetişir?" gibi bir soruya benziyor.

İsteğimize en uygun ilk 10 öğeyi seçmek için çalıştırabileceğiniz sorguyu aşağıda bulabilirsiniz:

SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 10;

Sorguyu kopyalayıp Cloud SQL Studio düzenleyicisine yapıştırın ve "RUN" (Çalıştır) düğmesine basın veya sorguyu quickstart_db veritabanına bağlanan komut satırı oturumunuza yapıştırın.

a8a2f83593aa5f37.png

Aşağıda, sorguyla eşleşen ürünlerin listesi verilmiştir.

product_name       |                                   description                                    | sale_price | zip_code |      distance       
-------------------------+----------------------------------------------------------------------------------+------------+----------+---------------------
 Cherry Tree             | This is a beautiful cherry tree that will produce delicious cherries. It is an d |      75.00 |    93230 | 0.43922018972266397
 Meyer Lemon Tree        | Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by  |         34 |    93230 |  0.4685112926118228
 Toyon                   | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 |  0.4835677149651668
 California Lilac        | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d |       5.00 |    93230 |  0.4947204525907498
 California Peppertree   | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e |      25.00 |    93230 |  0.5054166905547247
 California Black Walnut | This is a beautiful walnut tree that can grow to be over 80 feet tall. It is a d |     100.00 |    93230 |  0.5084219510932597
 California Sycamore     | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is  |     300.00 |    93230 |  0.5140519790508755
 Coast Live Oak          | This is a beautiful oak tree that can grow to be over 100 feet tall. It is an ev |     500.00 |    93230 |  0.5143126438081371
 Fremont Cottonwood      | This is a beautiful cottonwood tree that can grow to be over 100 feet tall. It i |     200.00 |    93230 |  0.5174774727252058
 Madrone                 | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an |      50.00 |    93230 |  0.5227400803389093
(10 rows)

9. Alınan verileri kullanarak LLM yanıtını iyileştirme

Çalıştırılan sorgunun sonucunu kullanarak istemci uygulamasına verilen üretken yapay zeka büyük dil modeli yanıtını iyileştirebiliriz. Ayrıca, sağlanan sorgu sonuçlarını Vertex AI üretken temel dil modeline yönelik istemin bir parçası olarak kullanarak anlamlı bir çıkış hazırlayabiliriz.

Bunu yapmak için vektör aramasından elde ettiğimiz sonuçlarla bir JSON oluşturmamız, ardından anlamlı bir çıkış oluşturmak üzere Vertex AI'daki bir LLM modeli için isteme ek olarak oluşturulan JSON'u kullanmamız gerekir. İlk adımda JSON'ı oluştururuz, ardından Vertex AI Studio'da test ederiz ve son adımda bir uygulamada kullanılabilecek bir SQL ifadesine dahil ederiz.

JSON biçiminde çıktı oluşturma

Çıkışı JSON biçiminde oluşturmak ve Vertex AI'a iletilecek yalnızca bir satır döndürmek için sorguyu değiştirin.

PostgreSQL İçin Cloud SQL

Sorgu örneği:

WITH trees as (
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id as product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

Çıktıda beklenen JSON:

[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]

İstemi Vertex AI Studio'da çalıştırma

Oluşturulan JSON'u, Vertex AI Studio'daki üretken yapay zeka metin modeline istemin bir parçası olarak sağlamak için kullanabiliriz.

Cloud Console'da Vertex AI Studio'yu açın.

d48549b1b0f449b4.png

Ek API'leri etkinleştirmenizi isteyebilir ancak bu isteği yoksayabilirsiniz. Laboratuvarımızı tamamlamak için ek API'lere ihtiyacımız yok.

Studio'da istem girin.

2a6f5a338fefd229.png

Kullanacağımız istem:

You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[place your JSON here]
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

JSON yer tutucusunu sorgudan gelen yanıtla değiştirdiğimizde nasıl göründüğünü aşağıda görebilirsiniz:

You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

İstem, JSON değerlerimizle çalıştırıldığında elde edilen sonuç:

a0f7ead40d0a1d62.png

Bu örnekte modelden aldığımız yanıtı aşağıda bulabilirsiniz. Model ve parametrelerde zaman içinde yapılan değişiklikler nedeniyle yanıtınızın farklı olabileceğini unutmayın:

"Ürün listemizde belirtilen posta koduna (93230) göre, Hanford, Kaliforniya bölgesinde bulunuyorsunuz.San Joaquin Vadisi'nde yer alan bu bölge, aslında sert çekirdekli meyve yetiştirmek için ülkedeki en iyi yerlerden biridir.

Sorunuzun yanıtı olarak, bölgenizde yetişen ve seçimimizdeki en iyi ağaç Kiraz Ağacı'dır.

Ayrıntıları aşağıda bulabilirsiniz:

Ürün: Cherry Tree

Fiyat: 75,00 ABD doları

Açıklama: Bu, lezzetli kirazlar verecek güzel bir kiraz ağacıdır.2

Neden burada en iyi şekilde yetişir? San Joaquin Vadisi'nin iklimi, kirazların gelişmesi için gereken özel koşulları sunar: meyve gelişimi için uzun ve sıcak yaz günleri ve serin geceler.5 Hanford, sert çekirdekli meyve üretimiyle bilinen büyük bir tarım merkezinde yer aldığından bu ağacın yerel toprağınızda çok verimli olmasını bekleyebilirsiniz. En iyi hasadı almak için tam güneş alan ve iyi drene edilmiş toprağa diktiğinizden emin olun."

İstemi PSQL'de çalıştırma

Ayrıca, Cloud SQL'in Vertex AI ile yapay zeka entegrasyonunu kullanarak doğrudan veritabanında SQL ile üretken bir modelden benzer yanıtlar alabiliriz. Ancak gemini-2.0-flash-exp modelini kullanmak için önce kaydetmemiz gerekir.

PostgreSQL için Cloud SQL'de çalıştırma

Uzantıyı 1.4.2 veya sonraki bir sürüme yükseltin (mevcut sürüm daha eski ise). Daha önce gösterildiği gibi gcloud sql connect komutunu kullanarak quickstart_db veritabanına bağlanın (veya Cloud SQL Studio'yu kullanın) ve şu komutu çalıştırın:

SELECT extversion from pg_extension where extname='google_ml_integration';

Döndürülen değer 1.4.3'ten küçükse şunu çalıştırın:

ALTER EXTENSION google_ml_integration UPDATE TO '1.4.3';

Ardından google_ml_integration.enable_model_support veritabanı işaretini "on" olarak ayarlamamız gerekir. Mevcut ayarları doğrulamak için yürütün.

show google_ml_integration.enable_model_support;

psql oturumundan beklenen çıktı "on"dur:

quickstart_db => show google_ml_integration.enable_model_support;
 google_ml_integration.enable_model_support 
--------------------------------------------
 on
(1 row)

"Kapalı" gösteriliyorsa veritabanı işaretini güncellememiz gerekir. Bunu yapmak için web konsolu arayüzünü kullanabilir veya aşağıdaki gcloud komutunu çalıştırabilirsiniz.

gcloud sql instances patch my-cloudsql-instance \
--database-flags google_ml_integration.enable_model_support=on,cloudsql.enable_google_ml_integration=on

Komutun arka planda yürütülmesi yaklaşık 1-3 dakika sürer. Ardından, yeni işareti psql oturumunda veya quickstart_db veritabanına bağlanarak Cloud SQL Studio'yu kullanarak doğrulayabilirsiniz.

show google_ml_integration.enable_model_support;

psql oturumundan beklenen çıktı "on"dur:

quickstart_db => show google_ml_integration.enable_model_support;
 google_ml_integration.enable_model_support 
--------------------------------------------
 on
(1 row)

Ardından iki model kaydetmemiz gerekir. İlk model, daha önce kullanılan text-embedding-005 modelidir. Model kayıt özelliklerini etkinleştirdiğimiz için modelin kaydedilmesi gerekir.

Model çalıştırmayı psql veya Cloud SQL Studio'da kaydetmek için aşağıdaki kodu çalıştırın:

CALL
  google_ml.create_model(
    model_id => 'text-embedding-005',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-005',
    model_type => 'text_embedding',
    model_auth_type => 'cloudsql_service_agent_iam',
    model_in_transform_fn => 'google_ml.vertexai_text_embedding_input_transform',
    model_out_transform_fn => 'google_ml.vertexai_text_embedding_output_transform');

Kaydetmemiz gereken bir sonraki model ise kullanıcı dostu çıktı oluşturmak için kullanılacak olan gemini-2.0-flash-001.

CALL
  google_ml.create_model(
    model_id => 'gemini-2.5-flash',
    model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-2.5-flash:streamGenerateContent',
    model_provider => 'google',
    model_auth_type => 'cloudsql_service_agent_iam');

Kayıtlı modellerin listesini, google_ml.model_info_view'dan bilgi seçerek istediğiniz zaman doğrulayabilirsiniz.

select model_id,model_type from google_ml.model_info_view;

Örnek çıktı

quickstart_db=> select model_id,model_type from google_ml.model_info_view;
               model_id               |   model_type   
--------------------------------------+----------------
 textembedding-gecko                  | text_embedding
 textembedding-gecko@001              | text_embedding
 gemini-1.5-pro:streamGenerateContent | generic
 gemini-1.5-pro:generateContent       | generic
 gemini-1.0-pro:generateContent       | generic
 text-embedding-005                   | text_embedding
 gemini-2.5-flash                     | generic

Artık SQL kullanarak üretken yapay zeka metin modeline istemin bir parçası olarak sağlamak için alt sorguda oluşturulan JSON'u kullanabiliriz.

Veritabanına yönelik psql veya Cloud SQL Studio oturumunda sorguyu çalıştırın.

WITH trees AS (
SELECT
        cp.product_name,
        cp.product_description AS description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id AS product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci ON
        ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON
        cs.store_id = ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> google_ml.embedding('text-embedding-005',
        'What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1),
prompt AS (
SELECT
        'You are a friendly advisor helping to find a product based on the customer''s needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","product_description":"some description","sale_price":10}
Here is the list of products:' || json_agg(trees) || 'The customer asked "What kind of fruit trees grow well here?"
You should give information about the product, price and some supplemental information' AS prompt_text
FROM
        trees),
response AS (
SELECT
        json_array_elements(google_ml.predict_row( model_id =>'gemini-2.5-flash',
        request_body => json_build_object('contents',
        json_build_object('role',
        'user',
        'parts',
        json_build_object('text',
        prompt_text)))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
FROM
        prompt)
SELECT
        string_agg(resp::text,
        ' ')
FROM
        response;

Beklenen çıktı aşağıda verilmiştir. Çıkışınız, model sürümüne ve parametrelere bağlı olarak farklı olabilir:

"That's a great question! It sounds like you're looking to add some delicious fruit to your garden.\n\nBased on the products we have that are closely related to your search, I can tell you about a fantastic option:\n\n**Cherry Tree**" "\n* **Description:** This beautiful deciduous tree will produce delicious cherries. It grows to be about 15 feet tall, with dark green leaves in summer that turn a beautiful red in the fall. Cherry trees are known for their beauty, shade, and privacy. They prefer a cool, moist climate and sandy soil." "\n* **Price:** $75.00\n* **Grows well in:** USDA Zones 4-9.\n\nTo confirm if this Cherry Tree will thrive in your specific location, you might want to check which USDA Hardiness Zone your area falls into. If you're in zones 4-9, this" " could be a wonderful addition to your yard!"

10. En yakın komşu dizini oluşturma

Veri kümemiz oldukça küçüktür ve yanıt süresi öncelikle yapay zeka modelleriyle olan etkileşimlere bağlıdır. Ancak milyonlarca vektörünüz olduğunda vektör araması, yanıt süremizin önemli bir bölümünü alabilir ve sisteme yüksek yük bindirebilir. Bunu iyileştirmek için vektörlerimizin üzerinde bir dizin oluşturabiliriz.

HNSW dizini oluşturma

Testimizde HNSW dizin türünü deneyeceğiz. HNSW, Hierarchical Navigable Small World (Hiyerarşik Gezinilebilir Küçük Dünya) anlamına gelir ve çok katmanlı bir grafik dizinini temsil eder.

Yerleştirme sütunumuzun dizinini oluşturmak için yerleştirme sütunumuzu, mesafe işlevimizi ve isteğe bağlı olarak m veya ef_constructions gibi parametreleri tanımlamamız gerekir. Parametreler hakkında ayrıntılı bilgiyi dokümanlarda bulabilirsiniz.

CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);

Beklenen çıktı:

quickstart_db=> CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);
CREATE INDEX
quickstart_db=>

Yanıtı Karşılaştır

Artık vektör arama sorgusunu EXPLAIN (AÇIKLA) modunda çalıştırabilir ve dizinin kullanılıp kullanılmadığını doğrulayabiliriz.

EXPLAIN (analyze) 
WITH trees as (
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id as product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

Beklenen çıktı:

 Aggregate  (cost=779.12..779.13 rows=1 width=32) (actual time=1.066..1.069 rows=1 loops=1)
   ->  Subquery Scan on trees  (cost=769.05..779.12 rows=1 width=142) (actual time=1.038..1.041 rows=1 loops=1)
         ->  Limit  (cost=769.05..779.11 rows=1 width=158) (actual time=1.022..1.024 rows=1 loops=1)
               ->  Nested Loop  (cost=769.05..9339.69 rows=852 width=158) (actual time=1.020..1.021 rows=1 loops=1)
                     ->  Nested Loop  (cost=768.77..9316.48 rows=852 width=945) (actual time=0.858..0.859 rows=1 loops=1)
                           ->  Index Scan using cymbal_products_embeddings_hnsw on cymbal_products cp  (cost=768.34..2572.47 rows=941 width=941) (actual time=0.532..0.539 rows=3 loops=1)
                                 Order By: (embedding <=> '[0.008864171,0.03693164,-0.024245683,...
<redacted>
...,0.017593635,-0.040275685,-0.03914233,-0.018452475,0.00826032,-0.07372604
]'::vector)
                           ->  Index Scan using product_inventory_pkey on cymbal_inventory ci  (cost=0.42..7.17 rows=1 width=37) (actual time=0.104..0.104 rows=0 loops=3)
                                 Index Cond: ((store_id = 1583) AND (uniq_id = (cp.uniq_id)::text))
                                 Filter: (inventory > 0)
                                 Rows Removed by Filter: 1
                     ->  Materialize  (cost=0.28..8.31 rows=1 width=8) (actual time=0.133..0.134 rows=1 loops=1)
                           ->  Index Scan using product_stores_pkey on cymbal_stores cs  (cost=0.28..8.30 rows=1 width=8) (actual time=0.129..0.129 rows=1 loops=1)
                                 Index Cond: (store_id = 1583)
 Planning Time: 112.398 ms
 Execution Time: 1.221 ms

Çıktıdan, sorgunun "cymbal_products_embeddings_hnsw kullanılarak dizin taraması" kullandığı açıkça görülüyor.

Sorguyu explain olmadan çalıştırırsak:

WITH trees as (
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id as product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

Beklenen çıktı (çıktı, modele ve dizine göre farklı olabilir):

[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]

Sonucun aynı olduğunu görebilir ve dizine eklenmemiş arama sonuçlarımızda en üstte yer alan aynı kiraz ağacını döndürebiliriz. Parametrelere ve dizin türüne bağlı olarak sonuç biraz farklı olabilir ve ağaç için farklı bir üst kayıt döndürebilir. Testlerim sırasında, dizinlenmiş sorgu sonuçları 131.301 ms'de döndürdü. Dizinlenmemiş sorgu ise 167.631 ms'de sonuç döndürdü. Ancak çok küçük bir veri kümesiyle çalışıyorduk ve daha büyük bir veride fark daha belirgin olurdu.

Vektörler için kullanılabilen farklı dizinleri deneyebilir ve dokümanlarda langchain entegrasyonuyla ilgili daha fazla laboratuvar ve örnek bulabilirsiniz.

11. Ortamı temizleme

Cloud SQL örneğini silme

Laboratuvarı tamamladığınızda Cloud SQL örneğini silin.

Bağlantınız kesildiyse ve önceki tüm ayarlar kaybolduysa Cloud Shell'de proje ve ortam değişkenlerini tanımlayın:

export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)

Örneği silin:

gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID

Beklenen konsol çıkışı:

student@cloudshell:~$ gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID
All of the instance data will be lost when the instance is deleted.

Do you want to continue (Y/n)?  y

Deleting Cloud SQL instance...done.                                                                                                                
Deleted [https://sandbox.googleapis.com/v1beta4/projects/test-project-001-402417/instances/my-cloudsql-instance].

12. Tebrikler

Codelab'i tamamladığınız için tebrik ederiz.

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

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

İşlediğimiz konular

HNSW yerine ScaNN diziniyle benzer bir AlloyDB codelab'i deneyin.

13. Anket

Çıkış:

Bu eğitimi nasıl kullanacaksınız?

Sadece okuyun Okuyun ve alıştırmaları tamamlayın