1. Giriş
Bu codelab'de, vektör aramayı Vertex AI yerleştirmeleriyle birleştirerek Cloud SQL for MySQL Vertex AI entegrasyonunu kullanmayı öğreneceksiniz.

Ön koşullar
- Google Cloud ve konsol hakkında temel düzeyde bilgi sahibi olmak
- Komut satırı arayüzü ve Cloud Shell'de temel beceriler
Neler öğreneceksiniz?
- PostgreSQL için Cloud SQL örneği dağıtma
- Veritabanı oluşturma ve Cloud SQL yapay zeka entegrasyonunu etkinleştirme
- Veritabanına veri yükleme
- Cloud SQL Studio'yu kullanma
- Cloud SQL'de Vertex AI yerleştirme modelini kullanma
- Vertex AI Studio'yu kullanma
- Vertex AI üretken modelini kullanarak sonucu zenginleştirme
- Vektör dizini kullanarak performansı artırma
Gerekenler
- Google Cloud hesabı ve Google Cloud projesi
- Google Cloud Console ve Cloud Shell'i destekleyen Chrome gibi bir web tarayıcısı
2. Kurulum ve Gereksinimler
Proje Kurulumu
- Google Cloud Console'da oturum açın. Gmail veya Google Workspace hesabınız yoksa oluşturmanız gerekir.
İş veya okul hesabı yerine kişisel hesap kullanın.
- Yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Google Cloud Console'da yeni bir proje oluşturmak için üstbilgide "Bir proje seçin" düğmesini tıklayın. Bu işlem, bir pop-up pencere açar.

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

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

- Proje adı, bu projenin katılımcıları için görünen addır. Proje adı, Google API'leri tarafından kullanılmaz ve istediğiniz zaman değiştirilebilir.
- Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Google Cloud Console, benzersiz bir kimliği otomatik olarak oluşturur ancak bu kimliği özelleştirebilirsiniz. Oluşturulan kimliği beğenmediyseniz başka bir rastgele kimlik oluşturabilir veya kendi kimliğinizi girerek kullanılabilirliğini kontrol edebilirsiniz. Çoğu codelab'de, genellikle PROJECT_ID yer tutucusuyla tanımlanan proje kimliğinize başvurmanız gerekir.
- Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
Faturalandırmayı etkinleştirme
Faturalandırmayı etkinleştirmek için iki seçeneğiniz vardır. Kişisel faturalandırma hesabınızı kullanabilir veya aşağıdaki adımları uygulayarak kredileri kullanabilirsiniz.
5 ABD doları değerindeki Google Cloud kredilerini kullanma (isteğe bağlı)
Bu atölyeyi düzenlemek için bir miktar kredisi olan bir faturalandırma hesabına ihtiyacınız vardır. Kendi faturalandırmanızı kullanmayı planlıyorsanız bu adımı atlayabilirsiniz.
- Bu bağlantıyı tıklayın ve kişisel bir Google Hesabı ile oturum açın.
- Aşağıdakine benzer bir ifade görürsünüz:

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

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

Kişisel faturalandırma hesabı oluşturma
Faturalandırmayı Google Cloud kredilerini kullanarak ayarladıysanız bu adımı atlayabilirsiniz.
Kişisel faturalandırma hesabı oluşturmak için Cloud Console'da faturalandırmayı etkinleştirmek üzere buraya gidin.
Bazı notlar:
- Bu laboratuvarın tamamlanması için 3 ABD dolarından daha az bir tutarda bulut kaynağı kullanılması gerekir.
- Daha fazla ödeme alınmaması için bu laboratuvarın sonundaki adımları uygulayarak kaynakları silebilirsiniz.
- Yeni kullanıcılar 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.
Cloud Shell'i başlatma
Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir. Ancak bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.
Google Cloud Console'da sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:

Alternatif olarak G, ardından S tuşuna basabilirsiniz. Bu sıra, Google Cloud Console'da veya bu bağlantıyı kullanıyorsanız Cloud Shell'i etkinleştirir.
Ortamın sağlanması ve bağlantının kurulması yalnızca birkaç saniye sürer. İşlem tamamlandığında aşağıdakine benzer bir sonuç görürsünüz:

Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde iyileştirilir. Bu codelab'deki tüm çalışmalarınızı tarayıcıda yapabilirsiniz. Herhangi bir yazılım yüklemeniz gerekmez.
3. Başlamadan önce
API'yi etkinleştirme
Cloud SQL, Compute Engine, ağ hizmetleri ve Vertex AI'ı kullanmak için Google Cloud projenizde ilgili API'leri etkinleştirmeniz gerekir.
Cloud Shell terminalinde proje kimliğinizin ayarlandığından emin olun:
gcloud config set project [YOUR-PROJECT-ID]
PROJECT_ID ortam değişkenini ayarlayın:
PROJECT_ID=$(gcloud config get-value project)
Gerekli tüm hizmetleri etkinleştirin:
gcloud services enable sqladmin.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com
Beklenen çıktı
student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable sqladmin.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.
API'lerle tanışın
- Cloud SQL Admin API (
sqladmin.googleapis.com), Cloud SQL örneklerini programatik olarak oluşturmanıza, yapılandırmanıza ve yönetmenize olanak tanır. Google'ın tümüyle yönetilen ilişkisel veritabanı hizmeti (MySQL, PostgreSQL ve SQL Server'ı destekler) için kontrol düzlemini sağlar. Bu hizmet, sağlama, yedekleme, yüksek kullanılabilirlik ve ölçeklendirme gibi görevleri yönetir. - Compute Engine API (
compute.googleapis.com), sanal makineler (VM'ler), kalıcı diskler ve ağ ayarları oluşturup yönetmenize olanak tanır. İş yüklerinizi çalıştırmak ve birçok yönetilen hizmetin temel altyapısını barındırmak için gereken temel hizmet olarak altyapı (IaaS) temelini sağlar. - Cloud Resource Manager API (
cloudresourcemanager.googleapis.com), Google Cloud projenizin meta verilerini ve yapılandırmasını programatik olarak yönetmenize olanak tanır. Kaynakları düzenlemenize, Identity and Access Management (IAM) politikalarını yönetmenize ve proje hiyerarşisi genelinde izinleri doğrulamanıza olanak tanır. - Service Networking API (
servicenetworking.googleapis.com), sanal özel bulut (VPC) ağınız ile Google'ın yönetilen hizmetleri arasındaki özel bağlantının kurulumunu otomatikleştirmenize olanak tanır. AlloyDB gibi hizmetler için özel IP erişimi oluşturmak ve bu hizmetlerin diğer kaynaklarınızla güvenli bir şekilde iletişim kurmasını sağlamak için özellikle gereklidir. - Vertex AI API (
aiplatform.googleapis.com), uygulamalarınızın makine öğrenimi modelleri oluşturmasına, dağıtmasına ve ölçeklendirmesine olanak tanır. Üretken yapay zeka modellerine (ör. Gemini) erişim ve özel model eğitimi de dahil olmak üzere Google Cloud'un tüm yapay zeka hizmetleri için birleşik bir arayüz sağlar.
4. Cloud SQL örneği oluşturma
Vertex AI ile veritabanı entegrasyonu olan bir Cloud SQL örneği oluşturun.
Veritabanı şifresi oluşturma
Varsayılan veritabanı kullanıcısı için şifre tanımlayın. Kendi şifrenizi tanımlayabilir veya rastgele bir şifre oluşturmak için rastgele işlevini kullanabilirsiniz:
export CLOUDSQL_PASSWORD=`openssl rand -hex 12`
Şifre için oluşturulan değeri not edin:
echo $CLOUDSQL_PASSWORD
MySQL için Cloud SQL örneği oluşturma
Örnek oluşturulurken cloudsql_vector işareti 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 ş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
Cloud Shell'den yürütme yaparak 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 isteme şifrenizi girin.
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>
Şimdilik Ctrl+D klavye kısayolunu kullanarak veya exit komutunu çalıştırarak mysql oturumundan çıkın.
exit
Vertex AI entegrasyonunu etkinleştirme
Vertex AI entegrasyonunu kullanabilmek için dahili Cloud SQL hizmet hesabına gerekli ayrıcalıkları verin.
Cloud SQL dahili hizmet hesabı e-postasını bulup değişken olarak dışa aktarın.
SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL
Cloud SQL hizmet hesabına Vertex AI'a erişim izni verin:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
--role="roles/aiplatform.user"
Örnek oluşturma ve yapılandırma hakkında daha fazla bilgiyi Cloud SQL belgelerinde burada bulabilirsiniz.
5. Veritabanını Hazırlama
Şimdi bir veritabanı oluşturmamız ve vektör desteğini etkinleştirmemiz gerekiyor.
Veritabanı Oluşturma
quickstart_db adlı bir veritabanı oluşturun. Bunu yapmak için farklı seçeneklerimiz var. Örneğin, MySQL için mysql gibi komut satırı veritabanı istemcileri, SDK veya Cloud SQL Studio. Veritabanını oluşturmak için SDK'yı (gcloud) kullanacağız.
Cloud Shell'de veritabanı oluşturma komutunu yürütün.
gcloud sql databases create quickstart_db --instance=my-cloudsql-instance
6. Verileri Yükle
Şimdi veritabanında nesneler oluşturmamız ve verileri yüklememiz gerekiyor. Kurgusal Cymbal Store verilerini kullanacağız. Veriler SQL (şema için) ve CSV biçiminde (veriler için) kullanılabilir.
Cloud Shell, veritabanına bağlanmak, tüm nesneleri oluşturmak ve verileri yüklemek için kullanacağımız ana ortam olacak.
Öncelikle Cloud Shell genel IP'mizi Cloud SQL örneğimizin yetkili ağlar listesine eklememiz gerekir. Cloud Shell'de şunu çalıştırı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. Bunu yapmak için, genel kaynaktan verileri alan curl yardımcı programıyla birlikte MySQL mysql yardımcı programını kullanacağız.
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
Önceki komutta tam olarak ne yaptık? Veritabanımıza bağlandık ve tablolar, dizinler ve diziler oluşturan indirilen SQL kodunu yürüttük.
Bir sonraki adım, cymbal_products verilerini yüklemektir. Aynı curl ve mysql yardımcı programlarını kullanıyoruz.
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;"
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;"
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 dosyaları kullanabilirsiniz.
7. Yerleştirilmiş Öğeler Oluşturma
Sonraki adım, Google Vertex AI'daki textembedding-005 modelini kullanarak ürün açıklamalarımız için yerleştirmeler oluşturmak ve bunları cymbal_products tablosundaki yeni sütunda depolamaktır.
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
Ayrıca, gömme işlevini kullanarak cymbal_products tablomuzda yeni bir gömme sütunu 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);
2.000 satır için vektör yerleştirmeleri oluşturmak genellikle 5 dakikadan kısa sürer ancak bazen biraz daha uzun sürebilir ve çoğu zaman çok daha hızlı tamamlanır.
8. Benzerlik Arama'yı çalıştırma
Artık açıklamalar 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ı olarak benzerlik araması kullanarak arama yapabiliriz.
SQL sorgusu aynı komut satırı arayüzünden veya alternatif olarak Cloud SQL Studio'dan yürütülebilir. Çok satırlı ve karmaşık sorgular Cloud SQL Studio'da daha iyi yönetilir.
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 yerleşik türde bir öğrenci kullanıcısı oluşturacağız.
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
Konsolda daha önce oluşturduğumuz Cloud SQL örneğini tıklayın.

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

Veritabanı adını ve kimlik bilgilerinizi gireceğiniz bir iletişim kutusu açılır:
- Veritabanı: quickstart_db
- User (Kullanıcı): student
- Şifre: Kullanıcı için not aldığınız şifre
"AUTHENTICATE" (KİMLİĞİ DOĞRULA) düğmesini tıklayın.

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

Artık sorgularımızı çalıştırmaya hazırız.
Sorgu Çalıştır
Bir sorgu çalıştırarak müşterinin isteğiyle en alakalı olan mevcut ürünlerin listesini alın. Vektör değerini almak için Vertex AI'a ileteceğimiz istek "Burada hangi tür meyve ağaçları iyi yetişir?" gibi bir soruya benziyor.
KNN (tam) vektör araması için cosine_distance ile sorgu çalıştırma
cosine_distance işlevini kullanarak isteğimize en uygun ilk 5 öğeyi seçmek için çalıştırabileceğiniz sorguyu aşağıda bulabilirsiniz:
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 "RUN" (Çalıştır) düğmesine basın veya sorguyu quickstart_db veritabanına bağlanan komut satırı oturumunuza yapıştırın.

Aşağıda, sorguyla eşleşen ürünlerin listesi 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, cosine_distance işleviyle 0,13 saniye sürdü.
KNN (tam) vektör araması için approx_distance ile sorgu çalıştırma
Şimdi aynı sorguyu çalıştırıyoruz ancak approx_distance işlevini kullanarak KNN araması yapıyoruz. Yerleştirmelerimiz için ANN dizinimiz yoksa arka planda otomatik olarak tam arama işlemine geri dönü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 listesi yer almaktadı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, 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ştirebiliriz. Ayrıca, sağlanan sorgu sonuçlarını Vertex AI üretken temel dil modeline yönelik istemin bir parçası olarak kullanarak anlamlı bir çıkış hazırlayabiliriz.
Bunu yapmak için vektör aramasından elde ettiğimiz sonuçlarla bir JSON oluşturmamız, ardından anlamlı bir çıkış oluşturmak üzere Vertex AI'daki bir LLM modeli için isteme ek olarak oluşturulan JSON'u kullanmamız gerekir. İlk adımda JSON'ı oluştururuz, ardından Vertex AI Studio'da test ederiz ve son adımda bir uygulamada kullanılabilecek bir SQL ifadesine dahil ederiz.
JSON biçiminde çıktı oluşturma
Çıkışı JSON biçiminde oluşturmak ve Vertex AI'a iletilecek yalnızca bir satır döndürmek için sorguyu değiştirin.
ANN araması kullanan sorgu örneği:
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:
[{"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 istemin bir parçası olarak sağlamak için kullanabiliriz.
Cloud Console'da Vertex AI Studio istemini açın.

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

Kullanacağımız istem:
You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[place your JSON here]
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.
JSON yer tutucusunu sorgudan gelen yanıtla değiştirdiğimizde nasıl göründüğünü aşağıda görebilirsiniz:
You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
{"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.
İstem, JSON değerlerimizle ve gemini-2.5-flash modeli kullanılarak çalıştırıldığında elde edilen sonuç:

Bu örnekte modelden aldığımız yanıt, semantik arama sonuçlarını ve belirtilen posta kodunda bulunan en iyi eşleşen ürünü kullanır.
İstemi SQL'de çalıştırma
Ayrıca, Cloud SQL'in Vertex AI ile yapay zeka entegrasyonunu kullanarak doğrudan veritabanında SQL ile üretken bir modelden benzer yanıtlar alabiliriz.
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('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 verilmiştir. Çı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 setimiz nispeten küçüktür ve yanıt süresi öncelikle yapay zeka modelleriyle olan etkileşimlere bağlıdır. Ancak milyonlarca vektörünüz olduğunda vektör araması, yanıt süremizin önemli bir bölümünü alabilir ve sisteme yüksek yük bindirebilir. Bunu iyileştirmek için vektörlerimizin üzerinde bir dizin oluşturabiliriz.
ScANN dizini oluşturma
Testimizde ScANN dizin türünü deneyeceğiz.
Yerleştirme sütunumuzun dizinini oluşturmak için yerleştirme sütunumuzun mesafe ölçümünü 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ır
Ş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 çı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)
Yürütme süresinin yalnızca biraz farklı olduğunu görüyoruz ancak bu kadar küçük bir veri kümesi için bu durum beklenir. Milyonlarca vektör içeren büyük veri kümelerinde bu durum çok daha belirgin olmalıdı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)
...
Bu sorgunun, cp (cymbal_products tablosunun diğer adı) üzerinde vektör dizini taraması kullandığını görüyoruz.
Kendi verilerinizle deneme yapabilir veya MySQL'de semantik aramanın nasıl çalıştığını görmek için farklı arama sorgularını test edebilirsiniz.
11. Ortamı temizleme
Cloud SQL örneğini silme
Laboratuvarı tamamladığınızda Cloud SQL örneğini silin.
Bağlantınız kesildiyse ve önceki tüm ayarlar kaybolduysa Cloud Shell'de proje ve ortam değişkenlerini tanımlayın:
export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)
Örneği silin:
gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID
Beklenen konsol çıkışı:
student@cloudshell:~$ gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID All of the instance data will be lost when the instance is deleted. Do you want to continue (Y/n)? y Deleting Cloud SQL instance...done. Deleted [https://sandbox.googleapis.com/v1beta4/projects/test-project-001-402417/instances/my-cloudsql-instance].
12. Tebrikler
Codelab'i tamamladığınız için tebrik ederiz.
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
#ProductionReadyAIhashtag'iyle paylaşın.
İşlediğimiz konular
- PostgreSQL için Cloud SQL örneği dağıtma
- Veritabanı oluşturma ve Cloud SQL yapay zeka entegrasyonunu etkinleştirme
- Veritabanına veri yükleme
- Cloud SQL Studio'yu kullanma
- Cloud SQL'de Vertex AI yerleştirme modelini kullanma
- Vertex AI Studio'yu kullanma
- Vertex AI üretken modelini kullanarak sonucu zenginleştirme
- Vektör dizini kullanarak performansı artırma
Benzer bir AlloyDB codelab'i veya Postgres için Cloud SQL codelab'i deneyin.
13. Anket
Çıkış: