MySQL için Cloud SQL'de Vektör Embedding'leri kullanmaya başlama

1. Giriş

Bu codelab'de, yerleştirmeleri kullanarak anlamsal arama için MySQL İçin Cloud SQL yapay zeka entegrasyonunu nasıl kullanacağınızı ve vektör verilerinde dizin kullanarak performansı nasıl artıracağınızı öğreneceksiniz.

8aa6ba3bc12a1593.png

Ön koşullar

  • Google Cloud ve Google Cloud Console hakkında temel düzeyde bilgi sahibi olmak
  • Komut satırı arayüzü ve Cloud Shell ile ilgili temel deneyim

Neler öğreneceksiniz?

Gerekenler

  • Google Cloud Hesabı ve Google Cloud Projesi
  • 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 Google Hesabı 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 araç çubuğunda Proje seç'i tıklayın.

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 bir Proje adı girin ve Konum'u 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 istendiğinde değiştirilebilir.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Google Cloud Console, otomatik olarak benzersiz bir kimlik oluşturur ancak bu kimliği özelleştirebilirsiniz. Oluşturulan kimliği beğenmediyseniz başka bir rastgele kimlik oluşturabilir veya kullanılabilirliğini kontrol etmek için kendi kimliğinizi girebilirsiniz. Çoğu codelab'de, genellikle yer tutucusuyla tanımlanan proje kimliğinize referans verirsiniz.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi Proje oluşturma ve yönetme belgelerinde 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.

Google Cloud kredilerini kullanma (isteğe bağlı)

Bu atölyeyi düzenlemek için kredili bir faturalandırma hesabınızın olması gerekir. Başlamak için atölye düzenleyicileri tarafından sağlanan kredileri veya bu codelab'in üst kısmındaki banner'da sağlanan kredileri kullanın. Zaten bir faturalandırma hesabına bağlıysanız bu adımı atlayabilirsiniz.

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 Google Cloud Billing konsolu'nda faturalandırmayı etkinleştirin.

Notlar:

Cloud Shell'i başlatma

Google Cloud'u bilgisayarınızdan uzaktan çalıştırabilirsiniz ancak bu codelab'de 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:

Cloud Shell'i etkinleştirme

Alternatif olarak, Google Cloud Console'da g ve ardından s tuşuna basın veya Cloud Shell'i açın.

Birkaç saniye içinde ortam sağlanır ve bağlantı kurulur. İşlem tamamlandığında bağlı terminali 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ç duyduğunuz 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 güçlenir. Bu codelab'deki tüm çalışmalarınızı tarayıcıda yapabilirsiniz.

3. Başlamadan önce

API'yi etkinleştirme

Cloud SQL, Compute Engine, Service Networking ve Gemini Enterprise Agent Platform'u kullanmak için Google Cloud projenizde ilgili API'leri etkinleştirin.

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

gcloud config get project

Boş bir dize döndürürse aşağıdaki komutla ayarlayın:

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 API'leri 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.

Etkinleştirilen her API hakkında bilgiyi dokümanlarda bulabilirsiniz.

4. Cloud SQL örneği oluşturma

Gemini Enterprise Agent Platform veritabanı entegrasyonu ile Cloud SQL örneği oluşturun.

Veritabanı şifresi oluşturma

Varsayılan veritabanı kullanıcısı için bir ş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 16`

Oluşturulan şifre değerini görüntüleyin:

echo $CLOUDSQL_PASSWORD

Daha sonra kullanmak üzere oluşturulan şifreyi not edin.

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

Cloud SQL örnekleri, Google Cloud Console, Terraform veya Google Cloud KSA (gcloud) gibi çeşitli yöntemler kullanılarak oluşturulabilir. Bu codelab'de gcloud'yı kullanacaksınız. Diğer araçlarla örnek oluşturmayı öğrenmek için Örnek oluşturma dokümanına bakın.

cloudsql_vector işareti, örnek oluşturulurken etkinleştirilebilir. Vektör desteği, MySQL 8.0 R20241208.01_00 veya daha yeni sürümlerde kullanılabilir.

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

gcloud sql instances create my-cloudsql-instance \
--database-version=MYSQL_8_4 \
--tier=db-custom-2-8192 \
--region=us-central1 \
--enable-google-ml-integration \
--edition=ENTERPRISE \
--root-password=$CLOUDSQL_PASSWORD

gcloud sql connect kullanarak örneğe bağlanın. İstendiğinde şifreyi girin:

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

Beklenen çıktı:

$gcloud sql connect my-cloudsql-instance --user=root
Allowlisting your IP for incoming connection for 5 minutes...done.                                                                                                                           
Connecting to database with SQL user [root].Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 71
Server version: 8.4.4-google (Google)

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Ctrl+D tuşlarına basarak veya exit girerek mysql oturumundan çıkın:

exit

Gemini Enterprise Agent Platform entegrasyonunu etkinleştirme

Gemini Enterprise Agent Platform entegrasyonunu etkinleştirmek için Cloud SQL hizmet hesabına gerekli IAM rolünü atayın.

Cloud SQL hizmet hesabı e-posta adresini alın ve ortam değişkeni 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 roles/aiplatform.user rolünü 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 Cloud SQL belgelerinde burada bulabilirsiniz.

5. Veritabanını hazırlama

Veritabanı oluşturun ve vektör desteğini etkinleştirin.

Veritabanı oluşturma

quickstart_db adlı bir veritabanı oluşturun. Veritabanı istemcilerini (ör. mysql), Google Cloud CLI'yı veya Cloud SQL Studio'yu kullanarak veritabanları oluşturabilirsiniz. Bu adımda gcloud simgesini kullanın.

Veritabanını oluşturmak için Cloud Shell'de aşağıdaki komutu çalıştırın:

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

6. Verileri Yükle

Veritabanında tablolar oluşturun ve CSV biçiminde herkese açık bir Cloud Storage paketinde depolanan kurgusal Cymbal Store veri kümesi dosyalarını kullanarak verileri yükleyin.

Cloud Shell, bir veritabanına bağlanmak, tüm nesneleri oluşturmak ve verileri yüklemek için kullanacağınız ana ortamınız olacaktır.

Cloud Shell genel IP'nizi Cloud SQL örneğimizin yetkilendirilmiş ağlar listesine ekleyin.

Cloud Shell'de şunu çalıştırın:

gcloud sql instances patch my-cloudsql-instance --authorized-networks=$(curl ifconfig.me)

Oturumunuz kaybolursa, sıfırlanırsa veya başka bir araçtan çalışırsanız CLOUDSQL_PASSWORD değişkeninizi tekrar dışa aktarın:

export CLOUDSQL_PASSWORD=...your password defined for the instance...

Gerekli veritabanı nesnelerini oluşturun. Herkese açık kaynaktaki şemayı indirip uygulamak için mysql ile birlikte curl komutunu kullanın.

Cloud Shell'de şunu çalıştırın:

export INSTANCE_IP=$(gcloud sql instances describe my-cloudsql-instance --format="value(ipAddresses.ipAddress)")
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_mysql_schema.sql | mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db

Komut dökümü. Önceki adımda veritabanınıza bağlanmış ve tablolar, dizinler ve diziler oluşturmak için SQL komut dosyasını çalıştırmıştınız.

Ardından, cymbal_products ve mysql komutlarını çalıştırarak veritabanını curl verileriyle doldurun:

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_products.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_products FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

cymbal_stores ile devam edin.

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_stores.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_stores FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

Ayrıca, her mağazadaki her ürünün sayısını içeren cymbal_inventory ile tamamlayın.

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_inventory.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_inventory FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

İsteğe bağlı: Kendi örnek veri kümeniz varsa bunun yerine Google Cloud Console'daki içe aktarma aracını kullanarak uyumlu CSV dosyalarını içe aktarabilirsiniz.

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

Gemini Enterprise Agent Platform'daki text-embedding-005 modelini kullanarak ürün açıklamaları için yerleştirmeler oluşturun ve bunları vektör verileri olarak saklayın.

Vektör verilerini depolamak için Cloud SQL örneğinizde vektör işlevini etkinleştirmeniz gerekir.

Cloud Shell'de çalıştırın:

gcloud sql instances patch my-cloudsql-instance \
--database-flags=cloudsql_vector=on

Veritabanına bağlanın:

mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db

Yerleştirme işlevini kullanarak cymbal_products tablosunda yeni bir sütun embedding oluşturun. Bu yeni sütunda, product_description sütunundaki metne dayalı vektör yerleştirmeleri yer alır:

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) using varbinary;
UPDATE cymbal_products SET embedding = mysql.ml_embedding('text-embedding-005', product_description);

Not: 2.000 satır için yerleştirme oluşturma işlemi genellikle 5 dakikadan kısa sürer.

MySQL oturumundan çıkın:

exit

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

Ürün açıklamaları için hesaplanan vektör yerleştirmelerini bir arama sorgusunun yerleştirmesiyle karşılaştırarak benzerlik araması yapın.

SQL sorgularını komut satırından veya Cloud SQL Studio'dan çalıştırabilirsiniz. Cloud SQL Studio, çıkışta birden fazla satır içeren uzun SQL ifadelerini düzenlemek ve yürütmek için daha uygun bir yol sunar.

Cloud SQL Studio için MySQL kullanıcısı oluşturma

Cloud SQL Studio'da kullanılabilecek yeni bir veritabanı kullanıcısına ihtiyacınız var. Kök kullanıcı için kullandığınız şifreyle student yerleşik türde bir kullanıcı oluşturun.

Cloud Shell'de şunu çalıştırın:

gcloud sql users create student  --instance=my-cloudsql-instance --password=$CLOUDSQL_PASSWORD --host=%

Cloud SQL Studio'yu başlatma

  1. Google Cloud Console'da Cloud SQL örnekleri'ne gidin ve my-cloudsql-instance simgesini tıklayın.

Google Cloud Console'da Cloud SQL örnekleri listesi

  1. Gezinme menüsünde Cloud SQL Studio'yu tıklayın.

Cloud SQL Studio menü öğesi

  1. Kimlik doğrulama iletişim kutusunda veritabanı adını ve kimlik bilgilerini girin:
    • Veritabanı: quickstart_db
    • Kullanıcı: student
    • Şifre:
  2. Kimlik doğrula'yı tıklayın.

Cloud SQL Studio kimlik doğrulama iletişim kutusu

  1. SQL düzenleyiciyi açmak için Untitled query (Adsız sorgu) sekmesini tıklayın.

Cloud SQL Studio SQL düzenleyici sekmesi

Sorgu Çalıştır

Müşteri sorgusuyla en alakalı ilk 5 ürünü almak için bir sorgu çalıştırın: "Burada hangi meyve ağaçları iyi yetişir?"

cosine_distance işlevini kullanarak isteğimize en uygun ilk 5 öğeyi seçmek için çalıştırabileceğiniz sorgu aşağıda verilmiştir:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cosine_distance(cp.embedding ,@query_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 5;

Cloud SQL Studio'da sorguyu girip Run'ı (Çalıştır) tıklayın (veya sorguyu sql oturumunuzda çalıştırın):

Cloud SQL Studio'da SQL sorgusu çalıştırma

Sorgu, kosinüs uzaklığına göre sıralanmış eşleşen ürünleri döndürür:

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set (0.13 sec)

Sorgu yürütme süresi, cosine_distance işleviyle yaklaşık 0,13 saniyedir.

approx_distance işlevini kullanarak KNN aramasıyla aynı sorguyu çalıştırın. Yerleştirmeleriniz için ANN dizininiz yoksa arka planda otomatik olarak tam arama kullanılır:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') 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 5;

Aşağıda, sorgu tarafından döndürülen ürünlerin listesini bulabilirsiniz.

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set, 1 warning (0.12 sec)

Sorgu yürütme işlemi yalnızca 0,12 saniye sürdü. KNN exact cosine_distance işleviyle aynı sonuçları aldık.

İşlev hakkında daha fazla bilgiyi MySQL İçin Cloud SQL belgelerinde bulabilirsiniz.

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

Bir istemde sorgu sonuçlarını Gemini Enterprise Agent Platform temel dil modeline dayalı bağlam olarak ileterek istemci uygulamasına verilen üretken yapay zeka yanıtını iyileştirin.

Bunu yapabilmek için:

  1. Cloud SQL'deki vektör arama sonucundan bir JSON yükü oluşturun.
  2. İstemi Agent Platform Studio'da test edin.
  3. google_ml entegrasyonunu kullanarak uçtan uca istemi doğrudan SQL'den yürütün.

JSON biçiminde çıkış oluşturma

Sonucu JSON olarak biçimlendirmek ve tek bir satır döndürmek için sorguyu değiştirin:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
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
        (approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine')) ASC
LIMIT 1)
SELECT json_arrayagg(json_object('product_name',product_name,'description',description,'sale_price',sale_price,'zip_code',zip_code,'product_id',product_id)) FROM trees;

Beklenen JSON çıkışı:

[{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}]

İstemi Agent Platform Studio'da çalıştırma

Oluşturulan JSON'u Agent Platform Studio'daki bir üretken modelin isteminde bağlam olarak sağlayın.

  1. Google Cloud Console'da Agent Platform Studio'yu açın.

Agent Platform Studio'da gezinme

  1. Agent Platform Studio'ya aşağıdaki istemi girin:

Agent Platform Studio'da istem girme

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:
<JSON_OUTPUT>
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.

yerine sorgunuzdan gelen JSON yanıtını girin:

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:
{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}
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.

Agent Platform Studio'daki istem

  1. İstemi çalıştırın.

Agent Platform Studio'da istem sonucu

Yanıtta, ağaç ve konumla ilgili bilgilere dayalı olarak modelin harici kaynaklardan aldığı fiyat, açıklama ve ek bilgiler yer alır.

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

Ayrıca, üretken modelden doğrudan SQL içinde yanıt almak için Gemini Enterprise Agent Platform ile Cloud SQL yapay zeka entegrasyonunu da kullanabilirsiniz.

Öncelikle modeli kaydedin.

  1. Yanıt oluşturmak için gemini-3.5-flash modelini kaydedin ( yerine proje kimliğinizi yazın):
CALL
  mysql.ml_create_model_registration(
  'gemini-3.5-flash',
  'https://aiplatform.googleapis.com/v1/projects/<PROJECT_ID>/locations/global/publishers/google/models/gemini-3.5-flash:generateContent',
  'google',
  'GENERIC',
  NULL,
  'auth_type_cloudsql_service_agent_iam',
  NULL, NULL, NULL, NULL);

Ayrıca, doğrudan veritabanında SQL kullanarak üretken bir modelden benzer yanıt almak için Cloud SQL'in Gemini Enterprise Agent Platform ile yapay zeka entegrasyonunu da kullanabiliriz.

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

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

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
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
         (approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine')) ASC
LIMIT 1),
prompt AS (
SELECT
       CONCAT( '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_arrayagg(json_object('product_name',trees.product_name,'description',trees.description,'sale_price',trees.sale_price,'zip_code',trees.zip_code,'product_id',trees.product_id)) , '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
       mysql.ML_PREDICT_ROW('gemini-3.5-flash',
        json_object('contents',
        json_object('role',
        'user',
        'parts',
        json_array(
        json_object('text',
        prompt_text))))) AS resp
FROM
        prompt)
SELECT
JSON_EXTRACT(resp, '$.candidates[0].content.parts[0].text')
FROM
        response;

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

"Hello there! I'd be happy to help you find the perfect fruit tree for your space. \n\nBased on your area, a wonderful option we currently have in stock is the **Malus Domestica** (the classic Apple Tree)!\n\nHere are the key details:\n\n* **Product Name:** Malus Domestica (Classic Apple Tree)\n* **Price:** $100.00\n\n### Why it's a great choice:\n* **Beautiful Seasonal Foliage:** It features vibrant green leaves during the summer that turn into gorgeous shades of red, orange, and yellow in the autumn. \n* **Shade & Size:** It grows to approximately 30 feet tall, making it a strong, durable tree that offers excellent shade for your yard alongside delicious fresh fruit.\n* **Growing Conditions:** It thrives best in cool, moist climates with well-draining, loamy soil and is ideal for USDA Hardiness Zones 4–8.\n\n### Supplemental Care Tips:\n* **Planting Location:** Choose a spot that gets full sunlight (at least 6 hours a day) to ensure maximum fruit production.\n* **Soil:** Make sure the soil is rich and loamy with good drainage so the roots stay healthy.\n* **Cross-Pollination:** Apple trees often produce a higher yield when planted near another compatible apple tree variety, so if you have extra space, adding a companion tree in the future can boost your harvest!\n\nLet me know if you have any questions about planting or care, or if you'd like help adding this to your cart!"

Çıkış, Markdown biçiminde sağlanır.

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

Milyonlarca vektör içeren büyük veri kümelerinde vektör araması önemli işlem kaynakları gerektirebilir. Sorgu performansını artırmak için vektör yerleştirmelerinde bir dizin oluşturun.

ScaNN dizini oluşturma

Testimizde ScaNN dizin türünü deneyeceğiz.

Yerleştirme sütununun dizinini oluşturmak için yerleştirme sütununda mesafe ölçümümüzü tanımlamanız gerekir. Parametreler hakkında ayrıntılı bilgiyi dokümanlarda bulabilirsiniz.

CREATE VECTOR INDEX cymbal_products_embedding_idx ON cymbal_products(embedding) USING SCANN DISTANCE_MEASURE=COSINE;

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

Vektör arama sorgusunu tekrar çalıştırın ve sonuçları inceleyin:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') 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 5;

Beklenen çıktı:

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set (0.08 sec)

Performanstaki iyileşmeler yalnızca biraz farklıdır ancak bu kadar küçük bir veri kümesi için bu durum beklenir. Bu durum, milyonlarca vektör içeren büyük veri kümelerinde çok daha belirgin olur.

EXPLAIN komutunu kullanarak yürütme planını kontrol edin:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
EXPLAIN ANALYZE SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') 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 5;

Yürütme planı (alıntı):

...
-> Nested loop inner join  (cost=443 rows=5) (actual time=1.14..1.18 rows=5 loops=1)
                                -> Vector index scan on cp  (cost=441 rows=5) (actual time=1.1..1.1 rows=5 loops=1)
                                -> Single-row index lookup on cp using PRIMARY (uniq_id=cp.uniq_id)  (cost=0.25 rows=1) (actual time=0.0152..0.0152 rows=1 loops=5)

...

cp tablosunda(cymbal_products tablosunun diğer adı) vektör dizini taraması gösterilir.

Semantik aramanın MySQL'de nasıl çalıştığını görmek için kendi verilerinizle deneyin veya farklı arama sorgularını test edin.

11. Ortamı temizleme

Cloud SQL örneğini silme

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

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.

Google Cloud öğrenme rotası

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.

Kapsam dahilinde olanlar

AlloyDB için benzer bir codelab veya Postgres için Cloud SQL codelab'i deneyin.

Anket

Çıkış:

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

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