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

1. Giriş

Bu codelab'de, vektör aramayı Vertex AI gömmeleriyle birleştirerek PostgreSQL için Cloud SQL AI entegrasyonunu nasıl kullanacağınızı öğreneceksiniz.

30b7c4dcdd8bb68f.png

Ön koşullar

  • Google Cloud ve Console hakkında temel düzeyde bilgi
  • Komut satırı arayüzü ve Cloud Shell'de temel beceriler

Neler öğreneceksiniz?

  • PostgreSQL için Cloud SQL örneği dağıtma
  • Veritabanı oluşturma ve Cloud SQL yapay zeka entegrasyonunu etkinleştirme
  • Verileri veritabanına yükleme
  • Cloud SQL'de Vertex AI embedding modelini kullanma
  • Vertex AI üretken modelini kullanarak sonucu zenginleştirme
  • Vektör dizini kullanarak performansı iyileştirme

Gerekenler

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

2. Kurulum ve Gereksinimler

Kendine ait tempoda ortam oluşturma

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Proje adı, bu projenin katılımcılarının görünen adıdır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dize otomatik olarak oluşturur. Bu dizenin ne olduğu genellikle önemli değildir. Çoğu kod laboratuvarında proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) referans vermeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele başka bir kimlik oluşturabilirsiniz. Alternatif olarak, kendi anahtarınızı deneyerek kullanılabilir olup olmadığını görebilirsiniz. Bu adımdan sonra değiştirilemez ve proje boyunca geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer (Proje Numarası) olduğunu belirtmek isteriz. Bu üç değer hakkında daha fazla bilgiyi dokümanlar bölümünde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmak çok pahalı değildir. Bu eğitimden sonra faturalandırılmamak için kaynakları kapatmak istiyorsanız oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programına uygundur.

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir olsa da bu kod laboratuvarında bulutta ç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:

55efc1aaa7a4d3ad.png

Ortam sağlanıp bağlantı kurulabilmesi için birkaç saniye beklemeniz gerekir. İşlem tamamlandığında aşağıdakine benzer bir ekran görürsünüz:

7ffe5cbb04455448.png

Bu sanal makinede ihtiyaç duyacağınız tüm geliştirme araçları yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu codelab'deki tüm çalışmalarınızı tarayıcıda yapabilirsiniz. Hiçbir şey yüklemeniz gerekmez.

3. Başlamadan önce

API'yi etkinleştirme

Çıkış:

Cloud Shell'de proje kimliğinizin ayarlandığından emin olun:

gcloud config set project [YOUR-PROJECT-ID]

PROJECT_ID ortam değişkenini ayarlayın:

PROJECT_ID=$(gcloud config get-value project)

Gerekli tüm hizmetleri etkinleştirin:

gcloud services enable sqladmin.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com

Beklenen çıkış

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.

4. Cloud SQL örneği oluşturma

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

Veritabanı şifresi oluşturma

Varsayılan veritabanı kullanıcısının şifresini tanımlayın. Kendi şifrenizi tanımlayabilir veya rastgele bir işlev kullanarak şifre oluşturabilirsiniz:

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 Shell oturumunda şunları yürütün:

gcloud sql instances create my-cloudsql-instance \
--database-version=POSTGRES_16 \
--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 ayarlamamız ve ş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

Komutu çalıştırın ve bağlanmaya hazır olduğunda şifrenizi istem kutusuna girin.

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

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ının e-posta adresini öğrenin ve 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'ya erişim izni verin:

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 buradaki Cloud SQL dokümanlarında bulabilirsiniz.

5. Veritabanı hazırlama

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

Veritabanı Oluştur

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

Cloud Shell'de veritabanını oluşturmak için yürütme komutunu çalıştırı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.

Oluşturulan veritabanına bağlanmak için Cloud Shell'de execute komutunu çalıştırın (şifrenizi girmeniz gerekir)

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

Ardından, başarılı bir bağlantıdan 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 veri yüklememiz gerekiyor. Hayali bir Zil Mağazası'nın verilerini kullanacağız. Veriler, herkese açık Google Storage paketinde CSV biçiminde mevcuttur.

Öncelikle veritabanımızda gerekli tüm nesneleri oluşturmamız gerekir. Bunun için, şema nesnelerini indirip veritabanımıza aktarmak üzere zaten aşina olduğumuz gcloud sql connect ve gcloud storage komutlarını kullanacağız.

Cloud Shell'de, örneği oluştururken not ettiğimiz şifreyi uygulayıp sağlayın:

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ına bağlandık ve tablolar, dizinler ve sıralamalar oluşturan indirilen SQL kodunu yürüttük.

Sonraki adımda verileri yüklememiz gerekir. Bunun 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 gerekiyor.

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

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

\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

SQL oturumundan çıkma:

exit;

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

Sonraki adımda, Google Vertex AI'daki textembedding-004 modelini kullanarak ürün açıklamalarımız için gömme oluşturmalı ve bunları vektör verileri olarak saklamalıyız.

Veritabanına bağlanın:

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

Ardından, embedding işlevini kullanarak cymbal_products tablomuza yerleştirilmiş bir sanal sütun oluşturun.

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-004',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.

8. Benzerlik araması çalıştırma

Artık açıklamalarımız 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ık ve karmaşık sorguları Cloud SQL Studio'da yönetmek daha iyidir.

Cloud SQL Studio'yu başlatma

Console'da, daha önce oluşturduğumuz Cloud SQL örneğini tıklayın.

b8d4844da1114a0b.png

Açıldığında sağ panelde Cloud SQL Studio'yu görebiliriz. Bu öğeyi tıklayın.

ce3f27dc21367f2e.png

Bu işlem, veritabanı adını ve kimlik bilgilerinizi gireceğiniz bir iletişim kutusu açar:

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

Ardından "AUTHENTICATE" (DOĞRULAMA) düğmesini tıklayın.

2591c8bbc93e4e97.png

Sağ taraftaki "Düzenleyici" sekmesini tıklayarak SQL Düzenleyici'yi açacağınız bir sonraki pencere açılır.

74307cb101a3ba9d.png

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

Sorgu Çalıştır

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

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

SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-004','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 "ÇALDIR" düğmesine basın veya quickstart_db veritabanına bağlanan komut satırı oturumunuza yapıştırın.

cd07549522fd04c9.png

Sorguyla eşleşen seçili ürünlerin listesi aşağıda 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 yönelik üretken yapay zeka büyük dil modeli yanıtını iyileştirebilir ve Vertex AI üretken temel dil modeline yönelik istem kapsamında sağlanan sorgu sonuçlarını kullanarak anlamlı bir çıkış hazırlayabiliriz.

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

Çıktıyı JSON biçiminde oluşturma

Sorguyu, çıkışı JSON biçiminde oluşturacak ve Vertex AI'ya aktarılacak yalnızca bir satır döndürecek şekilde değiştirin.

PostgreSQL İçin Cloud SQL

Sorgu örneğini aşağıda bulabilirsiniz:

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-004','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

Çıktıda beklenen JSON şu şekildedir:

[{"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 istem parçası olarak sağlamak için kullanabiliriz.

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

449b5959fa0e93bd.png

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

Kullanacağımız istem şu şekildedir:

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 bu kod şu şekilde görünür:

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.

İstemimizi JSON değerlerimizle ve gemini-2.0-flash modelini kullanarak çalıştırdığımızda elde ettiğimiz sonuç:

2c5145ebc04daae1.png

Bu örnekte modelden aldığımız yanıtı aşağıda bulabilirsiniz. Zaman içinde model ve parametre değişiklikleri nedeniyle yanıtınızın farklı olabileceğini unutmayın:

"Tamam, mevcut ürün listesine göre, bölgenizde iyi yetişebilecek en iyi ağacımız kiraz ağacı.

Fiyatı 75,00 TL.

Tam posta kodunuzdaki (93230) yetiştirme koşulları hakkında net bilgim olmasa da kiraz ağaçlarının genellikle ılıman iklime ve iyi drene edilmiş toprağa sahip bölgelerde iyi geliştiği bilinmektedir. Meyve vermeleri için genellikle belirli bir süre boyunca kış soğuğuna maruz kalmaları gerekir. Ancak uygun koşullarda hem güzellik hem de lezzetli kirazlar sağlayarak bahçeye harika bir katkıda bulunabilirler."

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

Doğrudan veritabanında SQL kullanarak üretken bir modelden benzer bir yanıt almak için Cloud SQL yapay zeka entegrasyonunu Vertex AI ile de kullanabiliriz. Ancak gemini-2.0-flash-exp modelini kullanmak için önce modelin kaydını yaptırmamız 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 düşükse). 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 aşağıdakileri yürütün:

SELECT extversion from pg_extension where extname='google_ml_integration';

Döndürülen değer 1.4.2'den küçükse şunları yürütün:

ALTER EXTENSION google_ml_integration UPDATE TO '1.4.2';

Ardından google_ml_integration.enable_model_support veritabanı işaretini "açık" olarak ayarlamamız 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, psql oturumunda veya Cloud SQL Studio'yu kullanarak quickstart_db veritabanına bağlanarak yeni işareti doğrulayabilirsiniz.

show google_ml_integration.enable_model_support;

psql oturumundan beklenen çıkış "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 gerekiyor. Bunlardan ilki, daha önce kullanılan text-embedding-004 modelidir. Model kayıt özelliklerini etkinleştirdiğimiz için kayıt edilmesi gerekir.

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

CALL
  google_ml.create_model(
    model_id => 'text-embedding-004',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-004',
    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');

Kayıt etmemiz gereken bir sonraki model ise kullanıcı dostu çıkışı oluşturmak için kullanılacak gemini-2.0-flash-001.

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

google_ml.model_info_view kaynağından bilgi seçerek kayıtlı modellerin listesini 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-004                   | text_embedding
 gemini-2.0-flash-001                 | generic

Artık SQL'i kullanarak üretken yapay zeka metin modeline istem olarak göndermek için oluşturulanı bir alt sorgu JSON'unda 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-004',
        '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.0-flash-001',
        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ı şu şekildedir. Çıkışınız, model sürümüne ve parametrelere bağlı olarak farklı olabilir.:

"That" "'s a great question! Based on your location (assuming you're" " in zip code 93230), I have a suggestion for a" " fruit tree that should thrive.\n\nWe have the **Cherry Tree** available.\n\n**Product Name:** Cherry Tree\n\n**Description:** This is a beautiful cherry" " tree that will produce delicious cherries. It's a deciduous tree (meaning it loses its leaves in the fall) growing to about 15 feet tall." " The leaves are dark green in summer, turning a beautiful red in the fall. Cherry trees are known for their beauty, shade, and privacy.\n\n**Sale Price:** $75.00\n\n**Important Considerations for Growing" " Cherry Trees:**\n\n* **Climate:** Cherry trees prefer a cool, moist climate, and 93230 falls within a suitable range (USDA zones 4-9). However, it's always a good idea to" " check the specific microclimate of your property (sun exposure, drainage etc.).\n* **Soil:** They do best in sandy soil. If your soil is different, you may need to amend it to improve drainage.\n* **Pollination:** Many cherry varieties require a second, compatible cherry tree for proper pollination" ". Check the specific pollination needs of this variety before purchase if you want a significant cherry yield.\n\nThis cherry tree is a beautiful addition to any yard and will provide you with delicious cherries if you can meet its needs. Would you like to know more about its pollination requirements, or perhaps see if we have any other" " fruit trees suitable for your area?\n" ""

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 etkileşimlere bağlıdır. Ancak milyonlarca vektörünüz varsa 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 üzerine bir dizin oluşturabiliriz.

HNSW dizini oluşturma

Testimiz için HNSW dizini türünü deneyeceğiz. HNSW, Hiyerarşik Gezilebilir Küçük Dünya anlamına gelir ve çok katmanlı bir grafik dizini temsil eder.

Yerleştirme sütunumuzun dizini 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 çıkış:

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ırma

Şimdi vektör arama sorgusunu EXPLAIN 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-004','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

Beklenen çıkış:

 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ıda, sorgunun "cymbal_products_embeddings_hnsw kullanarak dizine tarama" kullandığını açıkça görebiliriz.

Sorguyu açıklama 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-004','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

Beklenen çıkış:

[{"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"}]

Sonuçların aynı olduğunu ve dizine eklenmemiş aramamızda en üstte olan aynı kiraz ağacını döndürdüğünü görebiliriz. Parametrelere ve dizin türüne bağlı olarak sonuç biraz farklı olabilir. Testlerim sırasında dizine eklenen sorgu, herhangi bir dizin olmadan 167.631 ms'de 131.301 ms'de sonuç döndürdü ancak çok küçük bir veri kümesiyle uğraşıyorduk ve fark daha büyük verilerde daha önemli olur.

Vektörler için mevcut farklı dizinleri ve dokümanlar bölümündeki dil zinciri entegrasyonuna sahip daha fazla laboratuvar ve örneği deneyebilirsiniz.

11. Ortamı temizleme

Cloud SQL örneğini silme

Laboratuvarı tamamladığınızda Cloud SQL örneğini yok edin

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

Ele aldığımız konular

  • PostgreSQL için Cloud SQL örneği dağıtma
  • Veritabanı oluşturma ve Cloud SQL yapay zeka entegrasyonunu etkinleştirme
  • Verileri veritabanına yükleme
  • Cloud SQL'de Vertex AI embedding modelini kullanma
  • Vertex AI üretken modelini kullanarak sonucu zenginleştirme
  • Vektör dizini kullanarak performansı iyileştirme

HNSW yerine ScaNN dizini içeren benzer bir AlloyDB codelab'ini deneyin.

13. Anket

Çıkış:

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

Yalnızca okuyun Okuyun ve alıştırmaları tamamlayın