इस कोडलैब (कोड बनाना सीखने के लिए ट्यूटोरियल) के बारे में जानकारी
1. परिचय
इस कोडलैब में, आपको 'MySQL के लिए Cloud SQL' के Vertex AI इंटिग्रेशन का इस्तेमाल करने का तरीका पता चलेगा. इसके लिए, वेक्टर सर्च को Vertex AI एम्बेडिंग के साथ जोड़ा जाएगा.
ज़रूरी शर्तें
- Google Cloud Console के बारे में बुनियादी जानकारी
- कमांड-लाइन इंटरफ़ेस और Cloud Shell की बुनियादी स्किल
आपको क्या सीखने को मिलेगा
- Cloud SQL for MySQL इंस्टेंस को डिप्लॉय करने का तरीका
- डेटाबेस बनाने और Cloud SQL के एआई इंटिग्रेशन को चालू करने का तरीका
- डेटाबेस में डेटा लोड करने का तरीका
- Cloud SQL में Vertex AI एम्बेडिंग मॉडल का इस्तेमाल करने का तरीका
- Vertex AI के जनरेटिव मॉडल का इस्तेमाल करके, नतीजे को बेहतर बनाने का तरीका
- वेक्टर इंडेक्स का इस्तेमाल करके परफ़ॉर्मेंस को बेहतर बनाने का तरीका
आपको इन चीज़ों की ज़रूरत होगी
- Google Cloud खाता और Google Cloud प्रोजेक्ट
- Google Cloud Console और Cloud Shell के साथ काम करने वाला वेब ब्राउज़र, जैसे कि Chrome
2. सेटअप और ज़रूरी शर्तें
अपने हिसाब से एनवायरमेंट सेट अप करना
- Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से कोई Gmail या Google Workspace खाता नहीं है, तो आपको एक खाता बनाना होगा.
- प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे कभी भी अपडेट किया जा सकता है.
- प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे सेट करने के बाद बदला नहीं जा सकता. Cloud Console, अपने-आप एक यूनीक स्ट्रिंग जनरेट करता है. आम तौर पर, आपको यह जानने की ज़रूरत नहीं होती कि यह स्ट्रिंग क्या है. ज़्यादातर कोडलैब में, आपको अपने प्रोजेक्ट आईडी का रेफ़रंस देना होगा. आम तौर पर, इसे
PROJECT_ID
के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं आता है, तो कोई दूसरा आईडी जनरेट किया जा सकता है. इसके अलावा, आपके पास खुद का कोई दूसरा नाम चुनने का विकल्प भी है. इस चरण के बाद, इसे बदला नहीं जा सकता. यह प्रोजेक्ट के दौरान बना रहता है. - आपकी जानकारी के लिए बता दें कि तीसरी वैल्यू, प्रोजेक्ट नंबर होती है. इसका इस्तेमाल कुछ एपीआई करते हैं. इन तीनों वैल्यू के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.
- इसके बाद, आपको Cloud के संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी. इस कोडलैब को चलाने के लिए, आपसे कोई शुल्क नहीं लिया जाएगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, बनाए गए संसाधनों को बंद किया जा सकता है या प्रोजेक्ट को मिटाया जा सकता है. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले कार्यक्रम में शामिल हो सकते हैं.
Cloud Shell शुरू करना
Google Cloud को आपके लैपटॉप से रिमोट तौर पर इस्तेमाल किया जा सकता है. हालांकि, इस कोडलैब में आपको Google Cloud Shell का इस्तेमाल करना होगा. यह Cloud में चलने वाला कमांड-लाइन एनवायरमेंट है.
Google Cloud Console में, सबसे ऊपर दाएं टूलबार में मौजूद Cloud Shell आइकॉन पर क्लिक करें:
एनवायरमेंट से कनेक्ट होने और उसे प्रोवाइड करने में सिर्फ़ कुछ मिनट लगेंगे. इसके पूरा होने पर, आपको कुछ ऐसा दिखेगा:
इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल लोड होते हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है. यह Google Cloud पर चलता है, जिससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की सुविधा बेहतर होती है. इस कोडलैब में, सारा काम ब्राउज़र में किया जा सकता है. आपको कुछ भी इंस्टॉल करने की ज़रूरत नहीं है.
3. शुरू करने से पहले
एपीआई चालू करना
Cloud Shell में, पक्का करें कि आपका प्रोजेक्ट आईडी सेट अप हो:
gcloud config set project [YOUR-PROJECT-ID]
एनवायरमेंट वैरिएबल PROJECT_ID सेट करें:
PROJECT_ID=$(gcloud config get-value project)
सभी ज़रूरी सेवाएं चालू करें:
gcloud services enable sqladmin.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com
अनुमानित आउटपुट
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 इंस्टेंस बनाना
Vertex AI के साथ डेटाबेस इंटिग्रेशन की मदद से, Cloud SQL इंस्टेंस बनाएं.
डेटाबेस का पासवर्ड बनाना
डिफ़ॉल्ट डेटाबेस उपयोगकर्ता के लिए पासवर्ड तय करें. आपके पास खुद का पासवर्ड तय करने या पासवर्ड जनरेट करने के लिए, रैंडम फ़ंक्शन का इस्तेमाल करने का विकल्प होता है:
export CLOUDSQL_PASSWORD=`openssl rand -hex 12`
पासवर्ड के लिए जनरेट की गई वैल्यू नोट करें:
echo $CLOUDSQL_PASSWORD
Cloud SQL for MySQL इंस्टेंस बनाना
इंस्टेंस बनाते समय, cloudsql_vector फ़्लैग को चालू किया जा सकता है. फ़िलहाल, वेक्टर की सुविधा MySQL 8.0 R20241208.01_00 या इसके बाद के वर्शन के लिए उपलब्ध है
Cloud Shell सेशन में, यह कमांड चलाएं:
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 से अपने कनेक्शन की पुष्टि की जा सकती है
gcloud sql connect my-cloudsql-instance --user=root
कमांड चलाएं और कनेक्ट होने के लिए तैयार होने पर, प्रॉम्प्ट में अपना पासवर्ड डालें.
अनुमानित आउटपुट:
$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 इंटिग्रेशन की सुविधा चालू करना
Vertex AI इंटिग्रेशन का इस्तेमाल करने के लिए, इंटरनल क्लाउड SQL सेवा खाते को ज़रूरी सुविधाएं दें.
Cloud SQL के इंटरनल सेवा खाते का ईमेल पता ढूंढें और उसे वैरिएबल के तौर पर एक्सपोर्ट करें.
SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL
Cloud SQL सेवा खाते को Vertex AI का ऐक्सेस दें:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
--role="roles/aiplatform.user"
इंस्टेंस बनाने और कॉन्फ़िगर करने के बारे में ज़्यादा जानने के लिए, Cloud SQL के दस्तावेज़ यहां पढ़ें.
5. डेटाबेस तैयार करना
अब हमें एक डेटाबेस बनाना होगा और वेक्टर की सुविधा चालू करनी होगी.
डेटाबेस बनाना
quickstart_db नाम से डेटाबेस बनाएं. ऐसा करने के लिए, हमारे पास अलग-अलग विकल्प हैं. जैसे, कमांड-लाइन डेटाबेस क्लाइंट, जैसे कि MySQL के लिए mysql, SDK या Cloud SQL Studio. हम डेटाबेस बनाने के लिए, SDK (gcloud) का इस्तेमाल करेंगे.
डेटाबेस बनाने के लिए, Cloud Shell में कमांड चलाएं
gcloud sql databases create quickstart_db --instance=my-cloudsql-instance
6. डेटा लोड करें
अब हमें डेटाबेस में ऑब्जेक्ट बनाने और डेटा लोड करने की ज़रूरत है. हम Cymbal Store के काल्पनिक डेटा का इस्तेमाल करेंगे. डेटा, स्कीमा के लिए SQL और डेटा के लिए CSV फ़ॉर्मैट में उपलब्ध है.
Cloud Shell, डेटाबेस से कनेक्ट करने, सभी ऑब्जेक्ट बनाने, और डेटा लोड करने के लिए हमारा मुख्य प्लैटफ़ॉर्म होगा.
सबसे पहले, हमें अपने Cloud SQL इंस्टेंस के लिए, अनुमति वाले नेटवर्क की सूची में Cloud Shell का सार्वजनिक आईपी जोड़ना होगा. Cloud Shell में, यह कमांड चलाएं:
gcloud sql instances patch my-cloudsql-instance --authorized-networks=$(curl ifconfig.me)
अगर आपका सेशन बंद हो गया है, रीसेट हो गया है या किसी दूसरे टूल से काम किया जा रहा है, तो CLOUDSQL_PASSWORD वैरिएबल को फिर से एक्सपोर्ट करें:
export CLOUDSQL_PASSWORD=...your password defined for the instance...
अब हम अपने डेटाबेस में सभी ज़रूरी ऑब्जेक्ट बना सकते हैं. इसके लिए, हम curl यूटिलिटी के साथ MySQL mysql यूटिलिटी का इस्तेमाल करेंगे. curl यूटिलिटी, सार्वजनिक सोर्स से डेटा हासिल करती है.
Cloud Shell में, यह कमांड चलाएं:
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
पिछले निर्देश में हमने क्या किया था? हमने अपने डेटाबेस से कनेक्ट किया और डाउनलोड किए गए SQL कोड को चलाया. इससे टेबल, इंडेक्स, और क्रम बनाए गए.
अगला चरण, cymbal_products डेटा को लोड करना है. हम curl और mysql की एक ही सुविधाओं का इस्तेमाल करते हैं.
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 पर जाएं.
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;"
साथ ही, cymbal_inventory के साथ पूरा करें, जिसमें हर स्टोर में हर प्रॉडक्ट की संख्या होती है.
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;"
अगर आपके पास अपना सैंपल डेटा है और आपकी CSV फ़ाइलें, Cloud कंसोल में उपलब्ध Cloud SQL इंपोर्ट टूल के साथ काम करती हैं, तो यहां बताए गए तरीके के बजाय, उस टूल का इस्तेमाल किया जा सकता है.
7. एम्बेड करना
अगला चरण, Google Vertex AI के textembedding-005 मॉडल का इस्तेमाल करके, अपने प्रॉडक्ट के ब्यौरे के लिए एम्बेडिंग बनाना है. साथ ही, उन्हें cymbal_products टेबल के नए कॉलम में सेव करना है.
वेक्टर डेटा को सेव करने के लिए, हमें अपने Cloud SQL इंस्टेंस में वेक्टर फ़ंक्शन चालू करना होगा. Cloud Shell में यह तरीका अपनाएं:
gcloud sql instances patch my-cloudsql-instance \
--database-flags=cloudsql_vector=on
डेटाबेस से कनेक्ट करने के लिए:
mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db
साथ ही, एम्बेड करने वाले फ़ंक्शन का इस्तेमाल करके, cymbal_products टेबल में एक वर्चुअल कॉलम एम्बेड करें.
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 लाइनों के लिए वेक्टर एम्बेड जनरेट करने में पांच मिनट से भी कम समय लगता है. हालांकि, कभी-कभी इसमें थोड़ा ज़्यादा समय भी लग सकता है. साथ ही, अक्सर यह प्रोसेस काफ़ी तेज़ी से पूरी हो जाती है.
8. मिलते-जुलते कॉन्टेंट की खोज करना
अब हम मिलती-जुलती खोज का इस्तेमाल करके, जानकारी के लिए कैलकुलेट की गई वेक्टर वैल्यू और उसी एम्बेडिंग मॉडल का इस्तेमाल करके, अपने अनुरोध के लिए जनरेट की गई वेक्टर वैल्यू के आधार पर खोज कर सकते हैं.
SQL क्वेरी को उसी कमांड लाइन इंटरफ़ेस से या इसके विकल्प के तौर पर, Cloud SQL Studio से चलाया जा सकता है. कई पंक्तियों वाली और जटिल क्वेरी को Cloud SQL Studio में मैनेज करना बेहतर होता है.
उपयोगकर्ता बनाना
हमें एक नए उपयोगकर्ता की ज़रूरत है, जो Cloud SQL Studio का इस्तेमाल कर सके. हम स्टूडेंट नाम का एक उपयोगकर्ता बनाएंगे. यह उपयोगकर्ता, डिफ़ॉल्ट रूप से मौजूद होगा. इसके लिए, हम वही पासवर्ड इस्तेमाल करेंगे जो हमने रूट उपयोगकर्ता के लिए इस्तेमाल किया है.
Cloud Shell में, यह तरीका अपनाएं:
gcloud sql users create student --instance=my-cloudsql-instance --password=$CLOUDSQL_PASSWORD --host=%
Cloud SQL Studio शुरू करना
Console में, उस Cloud SQL इंस्टेंस पर क्लिक करें जिसे हमने पहले बनाया था.
दाएं पैनल पर खुलने पर, हमें Cloud SQL Studio दिखता है. उस पर क्लिक करें.
इससे एक डायलॉग बॉक्स खुलेगा, जिसमें आपको डेटाबेस का नाम और अपने क्रेडेंशियल डालने होंगे:
- डेटाबेस: quickstart_db
- उपयोगकर्ता: छात्र/छात्रा
- पासवर्ड: उपयोगकर्ता के लिए आपका नोट किया गया पासवर्ड
इसके बाद, "पुष्टि करें" बटन पर क्लिक करें.
इससे अगली विंडो खुलेगी. यहां दाईं ओर मौजूद "एडिटर" टैब पर क्लिक करके, SQL एडिटर खोलें.
अब हम अपनी क्वेरी चलाने के लिए तैयार हैं.
क्वेरी चलाना
क्लाइंट के अनुरोध से मिलते-जुलते उपलब्ध प्रॉडक्ट की सूची पाने के लिए, कोई क्वेरी चलाएं. वेक्टर वैल्यू पाने के लिए, हम Vertex AI को यह अनुरोध भेजेंगे: "यहां किस तरह के फ़लों के पेड़ अच्छी तरह से उगते हैं?"
KNN (एग्ज़ैक्ट) वेक्टर सर्च के लिए, cosine_distance के साथ क्वेरी चलाना
cosine_distance फ़ंक्शन का इस्तेमाल करके, हमारे अनुरोध के हिसाब से सबसे सही पांच आइटम चुनने के लिए, यह क्वेरी चलाई जा सकती है:
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 एडिटर में चिपकाएं और "चालू करें" बटन दबाएं या quickstart_db डेटाबेस से कनेक्ट करने वाले अपने कमांड-लाइन सेशन में चिपकाएं.
यहां क्वेरी से मैच करने वाले प्रॉडक्ट की सूची दी गई है.
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| 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)
cosine_distance फ़ंक्शन की मदद से क्वेरी को पूरा होने में 0.13 सेकंड लगे.
केएनएन (एग्ज़ैक्ट) वेक्टर सर्च के लिए, approx_distance के साथ क्वेरी चलाना
अब हम वही क्वेरी चलाते हैं, लेकिन approx_distance फ़ंक्शन का इस्तेमाल करके, केएनएन सर्च का इस्तेमाल करते हैं. अगर हमारे पास एम्बेड के लिए एएनएन इंडेक्स नहीं है, तो यह बैकग्राउंड में अपने-आप सटीक खोज पर वापस आ जाता है:
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;
यहां क्वेरी से मिले प्रॉडक्ट की सूची दी गई है.
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| 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)
क्वेरी को पूरा होने में सिर्फ़ 0.12 सेकंड लगे. हमें cosine_distance फ़ंक्शन के लिए वही नतीजे मिले.
9. वापस पाए गए डेटा का इस्तेमाल करके एलएलएम रिस्पॉन्स को बेहतर बनाना
हम किसी क्लाइंट ऐप्लिकेशन के लिए, जनरेटिव एआई एलएलएम के जवाब को बेहतर बना सकते हैं. इसके लिए, हम क्वेरी के नतीजे का इस्तेमाल करते हैं. साथ ही, Vertex AI के जनरेटिव फ़ाउंडेशन लैंग्वेज मॉडल के प्रॉम्प्ट के हिस्से के तौर पर, क्वेरी के दिए गए नतीजों का इस्तेमाल करके, काम का आउटपुट तैयार करते हैं.
ऐसा करने के लिए, हमें वेक्टर सर्च के नतीजों के साथ एक JSON जनरेट करना होगा. इसके बाद, Vertex AI में एलएलएम मॉडल के प्रॉम्प्ट के साथ-साथ, जनरेट किए गए उस JSON का इस्तेमाल करके काम का आउटपुट बनाना होगा. पहले चरण में, हम JSON जनरेट करते हैं. इसके बाद, हम Vertex AI Studio में इसकी जांच करते हैं. आखिर में, हम इसे SQL स्टेटमेंट में शामिल करते हैं, जिसका इस्तेमाल किसी ऐप्लिकेशन में किया जा सकता है.
JSON फ़ॉर्मैट में आउटपुट जनरेट करना
क्वेरी में बदलाव करके, JSON फ़ॉर्मैट में आउटपुट जनरेट करें और Vertex AI को पास करने के लिए सिर्फ़ एक लाइन दिखाएं
एएनएन सर्च का इस्तेमाल करने वाली क्वेरी का उदाहरण यहां दिया गया है:
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;
आउटपुट में, अनुमानित 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"}]
Vertex AI Studio में प्रॉम्प्ट चलाना
जनरेट किए गए JSON का इस्तेमाल, Vertex AI Studio में जनरेटिव एआई टेक्स्ट मॉडल के प्रॉम्प्ट के हिस्से के तौर पर किया जा सकता है
Cloud Console में Vertex AI Studio Prompt खोलें.
यह आपसे अन्य एपीआई चालू करने के लिए कह सकता है. हालांकि, इस अनुरोध को अनदेखा किया जा सकता है. लैब को पूरा करने के लिए, हमें किसी और एपीआई की ज़रूरत नहीं है.
यहां वह प्रॉम्प्ट दिया गया है जिसका इस्तेमाल हम करने जा रहे हैं:
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 प्लेसहोल्डर को बदलने पर, यह कैसा दिखता है:
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.
JSON वैल्यू के साथ प्रॉम्प्ट चलाने और gemini-2.0-flash मॉडल का इस्तेमाल करने पर, हमें यह नतीजा मिलता है:
इस उदाहरण में, मॉडल से हमें जो जवाब मिला है वह सिमेंटिक सर्च के नतीजों और दिए गए पिन कोड में उपलब्ध सबसे सही मैच वाले प्रॉडक्ट का इस्तेमाल करके मिला है.
PSQL में प्रॉम्प्ट चलाना
हम Vertex AI के साथ Cloud SQL एआई इंटिग्रेशन का इस्तेमाल करके, सीधे डेटाबेस में SQL का इस्तेमाल करके जनरेटिव मॉडल से मिलता-जुलता जवाब भी पा सकते हैं.
अब हम जनरेट किए गए टेक्स्ट को JSON के नतीजों वाली सबक्वेरी में इस्तेमाल कर सकते हैं. इससे, SQL का इस्तेमाल करके जनरेटिव एआई टेक्स्ट मॉडल को प्रॉम्प्ट के हिस्से के तौर पर टेक्स्ट दिया जा सकता है.
डेटाबेस के लिए mysql या Cloud SQL Studio सेशन में क्वेरी चलाएं
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;
यहां सैंपल आउटपुट दिया गया है. मॉडल के वर्शन और पैरामीटर के आधार पर, आपका आउटपुट अलग-अलग हो सकता है.:
"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"
आउटपुट, मार्कडाउन फ़ॉर्मैट में दिया जाता है.
10. नियरेस्ट-नेबर इंडेक्स बनाना
हमारा डेटासेट काफ़ी छोटा है और जवाब मिलने में लगने वाला समय, मुख्य रूप से एआई मॉडल के साथ इंटरैक्शन पर निर्भर करता है. हालांकि, अगर आपके पास लाखों वेक्टर हैं, तो वेक्टर सर्च में जवाब देने में लगने वाले समय का ज़्यादातर हिस्सा लग सकता है. साथ ही, इससे सिस्टम पर ज़्यादा लोड भी पड़ सकता है. इसे बेहतर बनाने के लिए, हम अपने वैक्टर के ऊपर एक इंडेक्स बना सकते हैं.
ScANN इंडेक्स बनाना
हम अपने टेस्ट के लिए, ScANN इंडेक्स टाइप आज़माने जा रहे हैं.
एम्बेड किए गए कॉलम का इंडेक्स बनाने के लिए, हमें एम्बेड किए गए कॉलम के लिए दूरी का मेज़रमेंट तय करना होगा. पैरामीटर के बारे में ज़्यादा जानने के लिए, दस्तावेज़ पढ़ें.
CREATE VECTOR INDEX cymbal_products_embedding_idx ON cymbal_products(embedding) USING SCANN DISTANCE_MEASURE=COSINE;
जवाब की तुलना करना
अब हम वेक्टर सर्च क्वेरी को फिर से चला सकते हैं और नतीजे देख सकते हैं
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;
अनुमानित आउटपुट:
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ | 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)
हम देख सकते हैं कि एक्सीक्यूशन में लगने वाला समय थोड़ा अलग था, लेकिन इस तरह के छोटे डेटासेट के लिए ऐसा होना लाज़िमी है. यह लाखों वेक्टर वाले बड़े डेटासेट के लिए ज़्यादा ध्यान देने वाली बात होनी चाहिए.
साथ ही, EXPLAIN कमांड का इस्तेमाल करके, प्लान को लागू करने के तरीके की जानकारी देखी जा सकती है:
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;
प्लान लागू करने का तरीका (बाकी हिस्सा):
... -> 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 टेबल का दूसरा नाम) पर वेक्टर इंडेक्स स्कैन का इस्तेमाल कर रहा था.
MySQL में सेमैनटिक सर्च के काम करने का तरीका जानने के लिए, अपने डेटा या अलग-अलग खोज क्वेरी का इस्तेमाल करके प्रयोग किया जा सकता है.
11. एनवायरमेंट को साफ़ करना
Cloud SQL इंस्टेंस मिटाना
लैब का इस्तेमाल करने के बाद, Cloud SQL इंस्टेंस को मिटाना
अगर आपका कनेक्शन टूट गया है और पिछली सभी सेटिंग मिट गई हैं, तो क्लाउड शेल में प्रोजेक्ट और एनवायरमेंट वैरिएबल तय करें:
export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)
इंस्टेंस मिटाएं:
gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID
कंसोल का अनुमानित आउटपुट:
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. बधाई हो
कोडलैब पूरा करने के लिए बधाई.
हमने क्या-क्या शामिल किया है
- Cloud SQL for MySQL इंस्टेंस को डिप्लॉय करने का तरीका
- डेटाबेस बनाने और Cloud SQL के एआई इंटिग्रेशन को चालू करने का तरीका
- डेटाबेस में डेटा लोड करने का तरीका
- Cloud SQL में Vertex AI एम्बेडिंग मॉडल का इस्तेमाल करने का तरीका
- Vertex AI के जनरेटिव मॉडल का इस्तेमाल करके, नतीजे को बेहतर बनाने का तरीका
- वेक्टर इंडेक्स का इस्तेमाल करके परफ़ॉर्मेंस को बेहतर बनाने का तरीका
AlloyDB के लिए मिलता-जुलता कोडलैब या Postgres के लिए Cloud SQL का कोडलैब आज़माएं