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

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

Bu codelab hakkında

subjectSon güncelleme Nis 22, 2025
account_circleYazan: Gleb Otochkin

1. Giriş

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

30b7c4dcdd8bb68f.png

  • Google Cloud ve Console hakkında temel düzeyde bilgi
  • Komut satırı arayüzü ve Cloud Shell'de temel beceriler
  • MySQL 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ğerlerin üçü 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. Ancak bu kod laboratuvarında, 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:

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 ihtiyacınız olan 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

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

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

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

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

Cloud Shell'den çalıştırdığımız bağlantımızı doğrulayabiliriz

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

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

Beklenen çıkış:

$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>

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-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 MySQL için mysql, SDK veya Cloud SQL Studio gibi komut satırı veritabanı istemcileri gibi farklı seçeneklerimiz vardır. Veritabanını oluşturmak 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

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 SQL (şema için) ve CSV biçiminde (veriler için) kullanılabilir.

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

Öncelikle Cloud Shell genel IP'mizi Cloud SQL örneğimizin yetkili ağlar listesine eklememiz gerekir. Cloud Shell'de şunları yürütün:

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

Oturumunuz kaybolduysa, sıfırlandıysa veya başka bir araçtan çalışıyorsanız CLOUDSQL_PASSWORD değişkeninizi tekrar dışa aktarın:

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

Artık veritabanımızda gerekli tüm nesneleri oluşturabiliriz. Bunun için MySQL mysql yardımcı programını, verileri herkese açık kaynaktan alan curl yardımcı programıyla birlikte kullanacağız.

Cloud Shell'de şunları yürütü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

Ö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ım, cymbal_products verilerini yüklemektir. Aynı curl ve mysql yardımcı programlarını kullanırız.

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;"

Ardından cymbal_stores ile devam ediyoruz.

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;"

Ardından, 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;"

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

7. Yerleştirilmiş öğeler oluşturma

Sonraki adımda, Google Vertex AI'daki textembedding-005 modelini kullanarak ürün açıklamalarımız için embeddings oluşturacağız ve bunları cymbal_products tablosundaki yeni sütunda depolayacağız.

Vektör verilerini depolamak için Cloud SQL örneğimizde vektör işlevini etkinleştirmemiz gerekir. Cloud Shell'de yürütü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

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) using varbinary;
UPDATE cymbal_products SET embedding = mysql.ml_embedding('text-embedding-005', product_description);

2.000 satır için vektör yerleştirme işlemi genellikle 5 dakikadan kısa sürer ancak bazen biraz daha uzun sürebilir ve genellikle çok daha hızlı tamamlanır.

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

Artık açıklamalarımız için hesaplanan vektör değerlerine ve aynı yerleştirme modelini kullanarak isteğimiz için oluşturduğumuz vektör değerine dayalı benzerlik araması kullanarak aramamızı çalıştırabiliriz.

SQL sorgusu, 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.

Kullanıcı Oluşturma

Cloud SQL Studio'yu kullanabilecek yeni bir kullanıcıya ihtiyacımız var. Kök kullanıcı için kullandığımız şifreyle aynı şifreye sahip yerleşik türde bir öğrenci kullanıcısı oluşturacağız.

Cloud Shell'de şunları yürütün:

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

Cloud SQL Studio'yu başlatma

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

667b658dbf98eb0b.png

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

a879e8ac914a8ce9.png

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

  • Veritabanı: quickstart_db
  • Kullanıcı: öğrenci
  • Şifre: Kullanıcı için not ettiğiniz şifre

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

36e6036847333d18.png

Bu işlemle, SQL Düzenleyici'yi açmak için sağ taraftaki "Düzenleyici" sekmesini tıklamanız gereken bir sonraki pencere açılır.

d803b7b6a798094f.png

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

Sorgu Çalıştır

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.

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

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;

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.

dffc70835901cf03.png

Sorguyla eşleşen seçili ürünlerin listesi aşağıda verilmiştir.

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| 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 işlemi, cosine_distance işleviyle 0,13 saniye sürdü.

Şimdi aynı sorguyu, approx_distance işlevini kullanarak KNN araması ile çalıştırıyoruz. Yerleşimlerimiz için bir yapay sinir ağı dizini yoksa perde arkasında otomatik olarak tam aramaya geri döner:

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;

Sorgu tarafından döndürülen ürünlerin listesi aşağıda verilmiştir.

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| 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ü. cosine_distance işleviyle aynı sonuçları elde ettik.

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ştirebilir ve Vertex AI üretken temel dil modeline verilen 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.

Aşağıda, yapay sinir ağı araması kullanılan sorgunun örneği verilmiştir:

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;

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

[{"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 Vertex AI Studio'da çalıştırma

Oluşturulan JSON'u, Vertex AI Studio'daki üretken yapay zeka metin modeline istem olarak eklemek için kullanabiliriz.

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

411ffb9d164ac140.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 şudur:

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:
{"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.

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

9839af512686130d.png

Bu örnekteki modelden aldığımız yanıt, belirtilen posta kodunda bulunan en iyi eşleşen ürünün ve anlamsal aramanın sonuçlarını kullanır.

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

Artık, SQL'i kullanarak üretken yapay zeka metin modeline istem olarak göndermek için JSON sonuçlarıyla bir alt sorgudaki oluşturulanı kullanabiliriz.

MySQL veya Cloud SQL Studio oturumunda veritabanında 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('publishers/google/models/gemini-2.0-flash-001:generateContent',
        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 bulabilirsiniz. Çıkışınız, model sürümüne ve parametrelere bağlı olarak farklı olabilir.:

"Okay, I see you're looking for fruit trees that grow well in your area. Based on the available product, the **Malus Domestica** (Apple Tree) is a great option to consider!\n\n* **Product:** Malus Domestica (Apple Tree)\n* **Description:** This classic apple tree grows to about 30 feet tall and provides beautiful seasonal color with green leaves in summer and fiery colors in the fall. It's known for its strength and provides good shade. Most importantly, it produces delicious apples!\n* **Price:** \\$100.00\n* **Growing Zones:** This particular apple tree is well-suited for USDA zones 4-8. Since your zip code is 93230, you are likely in USDA zone 9a or 9b. While this specific tree is rated for zones 4-8, with proper care and variety selection, apple trees can still thrive in slightly warmer climates. You may need to provide extra care during heat waves.\n\n**Recommendation:** I would recommend investigating varieties of Malus Domestica suited to slightly warmer climates or contacting a local nursery/arborist to verify if it is a good fit for your local climate conditions.\n"

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

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

Veri kümemiz nispeten 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.

ScANN dizini oluşturma

Testimiz için ScANN dizini türünü deneyeceğiz.

Yerleştirme sütunumuzun dizini oluşturmak için yerleşim sütunu için mesafe ölçümümüzü tanımlamamı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ırma

Şimdi vektör arama sorgusunu tekrar çalıştırıp sonuçları görebiliriz.

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 çıkış:

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| 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)

Yürütme süresinin yalnızca biraz farklı olduğunu görüyoruz ancak bu, bu kadar küçük bir veri kümesi için beklenen bir durumdur. Bu durum, milyonlarca vektör içeren büyük veri kümelerinde çok daha belirgin olacaktır.

EXPLAIN komutunu kullanarak yürütme planına göz atabiliriz:

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 (cymbal_products tablosunun takma adı) üzerinde vektör dizini taramasının kullanıldığını görebiliriz.

MySQL'de semantik aramanın nasıl çalıştığını görmek için kendi verilerinizle denemeler yapabilir veya farklı arama sorgularını test edebilirsiniz.

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

  • MySQL 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

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

13. Anket

Çıkış:

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