PostgreSQL के लिए Cloud SQL में वेक्टर एम्बेडिंग का इस्तेमाल शुरू करना

1. परिचय

इस कोडलैब में, आपको PostgreSQL के एआई इंटिग्रेशन के लिए Cloud SQL का इस्तेमाल करने का तरीका पता चलेगा. इसके लिए, वेक्टर सर्च को Vertex AI एम्बेडिंग के साथ जोड़ा जाएगा.

30b7c4dcdd8bb68f.png

ज़रूरी शर्तें

  • Google Cloud Console के बारे में बुनियादी जानकारी
  • कमांड-लाइन इंटरफ़ेस और Cloud Shell की बुनियादी स्किल

आपको क्या सीखने को मिलेगा

  • PostgreSQL के लिए Cloud SQL इंस्टेंस को डिप्लॉय करने का तरीका
  • डेटाबेस बनाने और Cloud SQL के एआई इंटिग्रेशन को चालू करने का तरीका
  • डेटाबेस में डेटा लोड करने का तरीका
  • Cloud SQL में Vertex AI एम्बेडिंग मॉडल का इस्तेमाल करने का तरीका
  • Vertex AI के जनरेटिव मॉडल का इस्तेमाल करके, नतीजे को बेहतर बनाने का तरीका
  • वेक्टर इंडेक्स का इस्तेमाल करके परफ़ॉर्मेंस को बेहतर बनाने का तरीका

आपको इन चीज़ों की ज़रूरत होगी

  • Google Cloud खाता और Google Cloud प्रोजेक्ट
  • Google Cloud Console और Cloud Shell के साथ काम करने वाला वेब ब्राउज़र, जैसे कि Chrome

2. सेटअप और ज़रूरी शर्तें

अपने हिसाब से एनवायरमेंट सेट अप करना

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से कोई Gmail या Google Workspace खाता नहीं है, तो आपको एक खाता बनाना होगा.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे सेट करने के बाद बदला नहीं जा सकता. Cloud Console, अपने-आप एक यूनीक स्ट्रिंग जनरेट करता है. आम तौर पर, आपको यह जानने की ज़रूरत नहीं होती कि यह स्ट्रिंग क्या है. ज़्यादातर कोडलैब में, आपको अपने प्रोजेक्ट आईडी का रेफ़रंस देना होगा. आम तौर पर, इसे PROJECT_ID के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं आता है, तो कोई दूसरा आईडी जनरेट किया जा सकता है. इसके अलावा, आपके पास खुद का कोई दूसरा नाम चुनने का विकल्प भी है. इस चरण के बाद, इसे बदला नहीं जा सकता. यह प्रोजेक्ट के दौरान बना रहता है.
  • आपकी जानकारी के लिए बता दें कि तीसरी वैल्यू, प्रोजेक्ट नंबर होती है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
  1. इसके बाद, आपको Cloud के संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी. इस कोडलैब को चलाने के लिए, आपसे कोई शुल्क नहीं लिया जाएगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, बनाए गए संसाधनों को बंद किया जा सकता है या प्रोजेक्ट को मिटाया जा सकता है. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले कार्यक्रम में शामिल हो सकते हैं.

Cloud Shell शुरू करना

Google Cloud को आपके लैपटॉप से रिमोट तौर पर इस्तेमाल किया जा सकता है. हालांकि, इस कोडलैब में आपको Google Cloud Shell का इस्तेमाल करना होगा. यह Cloud में चलने वाला कमांड-लाइन एनवायरमेंट है.

Google Cloud Console में, सबसे ऊपर दाएं टूलबार में मौजूद Cloud Shell आइकॉन पर क्लिक करें:

55efc1aaa7a4d3ad.png

एनवायरमेंट से कनेक्ट होने और उसे प्रोवाइड करने में सिर्फ़ कुछ मिनट लगेंगे. इसके पूरा होने पर, आपको कुछ ऐसा दिखेगा:

7ffe5cbb04455448.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल लोड होते हैं. यह 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

PostgreSQL के लिए Cloud SQL इंस्टेंस बनाना

Cloud Shell सेशन में, यह तरीका अपनाएं:

gcloud sql instances create my-cloudsql-instance \
--database-version=POSTGRES_16 \
--tier=db-custom-1-3840 \
--region=us-central1 \
--edition=ENTERPRISE \
--enable-google-ml-integration \
--database-flags cloudsql.enable_google_ml_integration=on

इंस्टेंस बनाने के बाद, हमें इंस्टेंस में डिफ़ॉल्ट उपयोगकर्ता के लिए पासवर्ड सेट करना होगा. साथ ही, यह पुष्टि करनी होगी कि हम पासवर्ड से कनेक्ट कर सकते हैं या नहीं.

gcloud sql users set-password postgres \
    --instance=my-cloudsql-instance \
    --password=$CLOUDSQL_PASSWORD

कमांड चलाएं और कनेक्ट होने के लिए तैयार होने पर, प्रॉम्प्ट में अपना पासवर्ड डालें.

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

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 नाम से डेटाबेस बनाएं. ऐसा करने के लिए, हमारे पास अलग-अलग विकल्प हैं. जैसे, कमांड-लाइन डेटाबेस क्लाइंट, जैसे कि PostgreSQL के लिए psql, SDK या Cloud SQL Studio. हम डेटाबेस बनाने और इंस्टेंस से कनेक्ट करने के लिए, SDK (gcloud) का इस्तेमाल करेंगे.

डेटाबेस बनाने के लिए, Cloud Shell में कमांड चलाएं

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

एक्सटेंशन चालू करना

Vertex AI और वैक्टर के साथ काम करने के लिए, हमें बनाए गए डेटाबेस में दो एक्सटेंशन चालू करने होंगे.

बनाए गए डेटाबेस से कनेक्ट करने के लिए, Cloud Shell में कमांड चलाएं. इसके लिए, आपको अपना पासवर्ड डालना होगा

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

इसके बाद, कनेक्शन पूरा होने के बाद, आपको SQL सेशन में दो निर्देश चलाने होंगे:

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector CASCADE;

एसक्यूएल सेशन से बाहर निकलने के लिए:

exit;

6. डेटा लोड करें

अब हमें डेटाबेस में ऑब्जेक्ट बनाने और डेटा लोड करने की ज़रूरत है. हम Cymbal Store के काल्पनिक डेटा का इस्तेमाल करेंगे. यह डेटा, Google के सार्वजनिक स्टोरेज बकेट में CSV फ़ॉर्मैट में उपलब्ध है.

सबसे पहले, हमें अपने डेटाबेस में सभी ज़रूरी ऑब्जेक्ट बनाने होंगे. इसके लिए, हम अपने डेटाबेस में स्कीमा ऑब्जेक्ट डाउनलोड और इंपोर्ट करने के लिए, पहले से इस्तेमाल किए जा रहे gcloud sql connect और gcloud स्टोरेज कमांड का इस्तेमाल करेंगे.

क्लाउड शेल में, यह कमांड चलाएं और इंस्टेंस बनाते समय नोट किया गया पासवर्ड डालें:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

पिछले निर्देश में हमने क्या किया था? हमने अपने डेटाबेस से कनेक्ट किया और डाउनलोड किए गए SQL कोड को चलाया. इससे टेबल, इंडेक्स, और क्रम बनाए गए.

अगला चरण डेटा लोड करना है. इसके लिए, हमें Google Cloud Storage से CSV फ़ाइलें डाउनलोड करनी होंगी.

gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv .

इसके बाद, हमें डेटाबेस से कनेक्ट करना होगा.

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

साथ ही, हमारी CSV फ़ाइलों से डेटा इंपोर्ट करें.

\copy cymbal_products from 'cymbal_products.csv' csv header
\copy cymbal_inventory from 'cymbal_inventory.csv' csv header
\copy cymbal_stores from 'cymbal_stores.csv' csv header

एसक्यूएल सेशन से बाहर निकलने के लिए:

exit;

अगर आपके पास अपना डेटा है और आपकी CSV फ़ाइलें, Cloud कंसोल में उपलब्ध Cloud SQL इंपोर्ट टूल के साथ काम करती हैं, तो कमांड-लाइन के बजाय इसका इस्तेमाल किया जा सकता है.

7. एम्बेड करना

अगला चरण, Google Vertex AI के textembedding-004 मॉडल का इस्तेमाल करके, अपने प्रॉडक्ट के ब्यौरे के लिए एम्बेडिंग बनाना और उन्हें वेक्टर डेटा के तौर पर सेव करना है.

डेटाबेस से कनेक्ट करने के लिए:

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

साथ ही, एम्बेड करने वाले फ़ंक्शन का इस्तेमाल करके, cymbal_products टेबल में एक वर्चुअल कॉलम एम्बेड करें.

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;

इसमें कुछ समय लग सकता है. हालांकि, 900 से 1,000 लाइनों के लिए, इसमें पांच मिनट से ज़्यादा समय नहीं लगना चाहिए. आम तौर पर, इसमें इससे भी कम समय लगता है.

8. मिलते-जुलते कॉन्टेंट की खोज करना

अब हम मिलती-जुलती खोज का इस्तेमाल करके, ब्यौरे के लिए कैलकुलेट की गई वेक्टर वैल्यू और अपने अनुरोध के लिए मिली वेक्टर वैल्यू के आधार पर खोज कर सकते हैं.

gcloud sql connect का इस्तेमाल करके, उसी कमांड-लाइन इंटरफ़ेस से SQL क्वेरी को चलाया जा सकता है. इसके अलावा, Cloud SQL Studio से भी क्वेरी को चलाया जा सकता है. कई पंक्तियों वाली और जटिल क्वेरी को Cloud SQL Studio में मैनेज करना बेहतर होता है.

Cloud SQL Studio शुरू करना

Console में, उस Cloud SQL इंस्टेंस पर क्लिक करें जिसे हमने पहले बनाया था.

b8d4844da1114a0b.png

दाएं पैनल में खुलने पर, हमें Cloud SQL Studio दिखता है. उस पर क्लिक करें.

ce3f27dc21367f2e.png

इससे एक डायलॉग बॉक्स खुलेगा, जिसमें आपको डेटाबेस का नाम और अपने क्रेडेंशियल डालने होंगे:

  • डेटाबेस: quickstart_db
  • उपयोगकर्ता: postgres
  • पासवर्ड: डेटाबेस के मुख्य उपयोगकर्ता के लिए, आपका नोट किया गया पासवर्ड

इसके बाद, "पुष्टि करें" बटन पर क्लिक करें.

2591c8bbc93e4e97.png

इससे अगली विंडो खुलेगी. यहां दाईं ओर मौजूद "एडिटर" टैब पर क्लिक करके, SQL एडिटर खोलें.

74307cb101a3ba9d.png

अब हम क्वेरी चलाने के लिए तैयार हैं.

क्वेरी चलाना

क्लाइंट के अनुरोध से मिलते-जुलते उपलब्ध प्रॉडक्ट की सूची पाने के लिए, कोई क्वेरी चलाएं. वेक्टर वैल्यू पाने के लिए, हम Vertex AI को यह अनुरोध भेजेंगे: "यहां किस तरह के फ़लों के पेड़ अच्छी तरह से उगते हैं?"

यहां एक क्वेरी दी गई है. इसे चलाकर, हमारे अनुरोध के हिसाब से सबसे सही 10 आइटम चुने जा सकते हैं:

SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 10;

क्वेरी को कॉपी करके Cloud SQL Studio एडिटर में चिपकाएं और "चालू करें" बटन दबाएं या quickstart_db डेटाबेस से कनेक्ट करने वाले अपने कमांड-लाइन सेशन में चिपकाएं.

cd07549522fd04c9.png

यहां क्वेरी से मैच करने वाले प्रॉडक्ट की सूची दी गई है.

product_name       |                                   description                                    | sale_price | zip_code |      distance       
-------------------------+----------------------------------------------------------------------------------+------------+----------+---------------------
 Cherry Tree             | This is a beautiful cherry tree that will produce delicious cherries. It is an d |      75.00 |    93230 | 0.43922018972266397
 Meyer Lemon Tree        | Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by  |         34 |    93230 |  0.4685112926118228
 Toyon                   | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 |  0.4835677149651668
 California Lilac        | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d |       5.00 |    93230 |  0.4947204525907498
 California Peppertree   | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e |      25.00 |    93230 |  0.5054166905547247
 California Black Walnut | This is a beautiful walnut tree that can grow to be over 80 feet tall. It is a d |     100.00 |    93230 |  0.5084219510932597
 California Sycamore     | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is  |     300.00 |    93230 |  0.5140519790508755
 Coast Live Oak          | This is a beautiful oak tree that can grow to be over 100 feet tall. It is an ev |     500.00 |    93230 |  0.5143126438081371
 Fremont Cottonwood      | This is a beautiful cottonwood tree that can grow to be over 100 feet tall. It i |     200.00 |    93230 |  0.5174774727252058
 Madrone                 | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an |      50.00 |    93230 |  0.5227400803389093
(10 rows)

9. वापस पाए गए डेटा का इस्तेमाल करके एलएलएम रिस्पॉन्स को बेहतर बनाना

हम किसी क्लाइंट ऐप्लिकेशन के लिए, जनरेटिव एआई एलएलएम के जवाब को बेहतर बना सकते हैं. इसके लिए, हम क्वेरी के नतीजे का इस्तेमाल करते हैं. साथ ही, Vertex AI के जनरेटिव फ़ाउंडेशन लैंग्वेज मॉडल के प्रॉम्प्ट के हिस्से के तौर पर, क्वेरी के दिए गए नतीजों का इस्तेमाल करके, काम का आउटपुट तैयार करते हैं.

ऐसा करने के लिए, हमें वेक्टर सर्च के नतीजों के साथ एक JSON जनरेट करना होगा. इसके बाद, Vertex AI में एलएलएम मॉडल के प्रॉम्प्ट के साथ-साथ, जनरेट किए गए उस JSON का इस्तेमाल करके काम का आउटपुट बनाना होगा. पहले चरण में, हम JSON जनरेट करते हैं. इसके बाद, हम Vertex AI Studio में इसकी जांच करते हैं. आखिर में, हम इसे SQL स्टेटमेंट में शामिल करते हैं, जिसका इस्तेमाल किसी ऐप्लिकेशन में किया जा सकता है.

JSON फ़ॉर्मैट में आउटपुट जनरेट करना

क्वेरी में बदलाव करके, JSON फ़ॉर्मैट में आउटपुट जनरेट करें और Vertex AI को पास करने के लिए सिर्फ़ एक लाइन दिखाएं

PostgreSQL के लिए Cloud SQL

क्वेरी का उदाहरण यहां दिया गया है:

WITH trees as (
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id as product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

आउटपुट में मिलने वाला अनुमानित JSON यहां दिया गया है:

[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]

Vertex AI Studio में प्रॉम्प्ट चलाना

जनरेट किए गए JSON का इस्तेमाल, Vertex AI Studio में जनरेटिव एआई टेक्स्ट मॉडल के प्रॉम्प्ट के हिस्से के तौर पर किया जा सकता है

Cloud Console में Vertex AI Studio Chat खोलें.

449b5959fa0e93bd.png

यह आपसे अन्य एपीआई चालू करने के लिए कह सकता है. हालांकि, इस अनुरोध को अनदेखा किया जा सकता है. लैब को पूरा करने के लिए, हमें किसी और एपीआई की ज़रूरत नहीं है.

यहां वह प्रॉम्प्ट दिया गया है जिसका इस्तेमाल हम करने जा रहे हैं:

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:
[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

JSON वैल्यू के साथ प्रॉम्प्ट चलाने और gemini-2.0-flash मॉडल का इस्तेमाल करने पर, हमें यह नतीजा मिलता है:

2c5145ebc04daae1.png

इस उदाहरण में, मॉडल से हमें जो जवाब मिला वह यहां दिया गया है. ध्यान दें कि समय के साथ मॉडल और पैरामीटर में होने वाले बदलावों की वजह से, आपका जवाब अलग हो सकता है:

"ठीक है, उपलब्ध प्रॉडक्ट की सूची के आधार पर, हमारे पास सबसे अच्छा पेड़ है, जो आपके इलाके में अच्छी तरह से उग सकता है. यह चेरी ट्री है.

इसकी कीमत 750 रुपये है.

मेरे पास आपके ज़िप कोड (93230) में चेरी के पेड़ों को उगाने की खास जानकारी नहीं है. हालांकि, आम तौर पर चेरी के पेड़, ऐसे इलाकों में अच्छी तरह से उगते हैं जहां मौसम सामान्य हो और मिट्टी में पानी की निकासी अच्छी तरह से हो. आम तौर पर, फल देने के लिए उन्हें सर्दियों की ठंडी के कुछ समय की ज़रूरत होती है. इसलिए, इस बात का ध्यान रखें. हालांकि, ये किसी बगीचे की खूबसूरती बढ़ाने के साथ-साथ, सही परिस्थितियों में स्वादिष्ट चेरी भी दे सकते हैं."

PSQL में प्रॉम्प्ट चलाना

हम Vertex AI के साथ Cloud SQL एआई इंटिग्रेशन का इस्तेमाल करके भी, जनरेटिव मॉडल से मिलता-जुलता जवाब पा सकते हैं. इसके लिए, सीधे डेटाबेस में SQL का इस्तेमाल किया जाता है. हालांकि, gemini-2.0-flash-exp मॉडल का इस्तेमाल करने के लिए, हमें पहले इसे रजिस्टर करना होगा.

PostgreSQL के लिए Cloud SQL में चलाना

अगर मौजूदा वर्शन कम है, तो एक्सटेंशन को 1.4.2 या इसके बाद के वर्शन पर अपग्रेड करें. gcloud sql connect से quickstart_db डेटाबेस से कनेक्ट करें, जैसा कि पहले दिखाया गया है (या Cloud SQL Studio का इस्तेमाल करें) और यह तरीका अपनाएं:

SELECT extversion from pg_extension where extname='google_ml_integration';

अगर मिली वैल्यू 1.4.2 से कम है, तो यह तरीका अपनाएं:

ALTER EXTENSION google_ml_integration UPDATE TO '1.4.2';

इसके बाद, हमें google_ml_integration.enable_model_support डेटाबेस फ़्लैग को "चालू" पर सेट करना होगा. इसके लिए, वेब कंसोल इंटरफ़ेस का इस्तेमाल किया जा सकता है या gcloud का यह कमांड चलाया जा सकता है.

gcloud sql instances patch my-cloudsql-instance \
--database-flags google_ml_integration.enable_model_support=on,cloudsql.enable_google_ml_integration=on

बैकग्राउंड में कमांड को लागू होने में करीब एक से तीन मिनट लगते हैं. इसके बाद, psql सेशन में नए फ़्लैग की पुष्टि की जा सकती है. इसके अलावा, quickstart_db डेटाबेस से कनेक्ट करके, Cloud SQL Studio का इस्तेमाल करके भी पुष्टि की जा सकती है.

show google_ml_integration.enable_model_support;

psql सेशन का अनुमानित आउटपुट "चालू" है:

quickstart_db => show google_ml_integration.enable_model_support;
 google_ml_integration.enable_model_support 
--------------------------------------------
 on
(1 row)

इसके बाद, हमें दो मॉडल रजिस्टर करने होंगे. पहला मॉडल, पहले से इस्तेमाल किया जा रहा text-embedding-004 मॉडल है. मॉडल को रजिस्टर करना ज़रूरी है, क्योंकि हमने मॉडल को रजिस्टर करने की सुविधाएं चालू की हैं.

psql या Cloud SQL Studio में चलाए गए मॉडल को रजिस्टर करने के लिए, यह कोड इस्तेमाल करें:

CALL
  google_ml.create_model(
    model_id => 'text-embedding-004',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-004',
    model_type => 'text_embedding',
    model_auth_type => 'cloudsql_service_agent_iam',
    model_in_transform_fn => 'google_ml.vertexai_text_embedding_input_transform',
    model_out_transform_fn => 'google_ml.vertexai_text_embedding_output_transform');

हमें अगला मॉडल gemini-2.0-flash-001 रजिस्टर करना होगा. इसका इस्तेमाल, उपयोगकर्ता के हिसाब से आउटपुट जनरेट करने के लिए किया जाएगा.

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

रजिस्टर किए गए मॉडल की सूची की पुष्टि कभी भी की जा सकती है. इसके लिए, google_ml.model_info_view से जानकारी चुनें.

select model_id,model_type from google_ml.model_info_view;

यहां आउटपुट का सैंपल दिया गया है

quickstart_db=> select model_id,model_type from google_ml.model_info_view;
               model_id               |   model_type   
--------------------------------------+----------------
 textembedding-gecko                  | text_embedding
 textembedding-gecko@001              | text_embedding
 gemini-1.5-pro:streamGenerateContent | generic
 gemini-1.5-pro:generateContent       | generic
 gemini-1.0-pro:generateContent       | generic
 text-embedding-004                   | text_embedding
 gemini-2.0-flash-001                 | generic

अब हम सबक्वेरी JSON में जनरेट किए गए डेटा का इस्तेमाल, SQL का इस्तेमाल करके जनरेटिव एआई टेक्स्ट मॉडल के प्रॉम्प्ट के हिस्से के तौर पर कर सकते हैं.

डेटाबेस के psql या Cloud SQL Studio सेशन में क्वेरी चलाएं

WITH trees AS (
SELECT
        cp.product_name,
        cp.product_description AS description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id AS product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci ON
        ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON
        cs.store_id = ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> google_ml.embedding('text-embedding-004',
        'What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1),
prompt AS (
SELECT
        'You are a friendly advisor helping to find a product based on the customer''s needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","product_description":"some description","sale_price":10}
Here is the list of products:' || json_agg(trees) || 'The customer asked "What kind of fruit trees grow well here?"
You should give information about the product, price and some supplemental information' AS prompt_text
FROM
        trees),
response AS (
SELECT
        json_array_elements(google_ml.predict_row( model_id =>'gemini-2.0-flash-001',
        request_body => json_build_object('contents',
        json_build_object('role',
        'user',
        'parts',
        json_build_object('text',
        prompt_text)))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
FROM
        prompt)
SELECT
        string_agg(resp::text,
        ' ')
FROM
        response;

यहां अनुमानित आउटपुट दिया गया है. मॉडल के वर्शन और पैरामीटर के आधार पर, आपका आउटपुट अलग-अलग हो सकता है.:

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

10. नियरेस्ट-नेबर इंडेक्स बनाना

हमारा डेटासेट काफ़ी छोटा है और जवाब मिलने में लगने वाला समय, मुख्य रूप से एआई मॉडल के साथ इंटरैक्शन पर निर्भर करता है. हालांकि, अगर आपके पास लाखों वेक्टर हैं, तो वेक्टर सर्च में जवाब देने में लगने वाले समय का ज़्यादातर हिस्सा लग सकता है. साथ ही, इससे सिस्टम पर ज़्यादा लोड भी पड़ सकता है. इसे बेहतर बनाने के लिए, हम अपने वैक्टर के ऊपर एक इंडेक्स बना सकते हैं.

HNSW इंडेक्स बनाना

हम अपने टेस्ट के लिए, HNSW इंडेक्स टाइप आज़माने जा रहे हैं. HNSW का मतलब है हियरार्की के हिसाब से नेविगेट की जा सकने वाली छोटी दुनिया. यह एक मल्टीलेयर ग्राफ़ इंडेक्स है.

एम्बेड किए गए कॉलम का इंडेक्स बनाने के लिए, हमें एम्बेड किए गए कॉलम, दूरी के फ़ंक्शन, और m या ef_constructions जैसे पैरामीटर तय करने होंगे. पैरामीटर के बारे में ज़्यादा जानने के लिए, दस्तावेज़ पढ़ें.

CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);

अनुमानित आउटपुट:

quickstart_db=> CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);
CREATE INDEX
quickstart_db=>

जवाब की तुलना करना

अब हम वेक्टर सर्च क्वेरी को EXPLAIN मोड में चला सकते हैं और पुष्टि कर सकते हैं कि इंडेक्स का इस्तेमाल किया गया है या नहीं.

EXPLAIN (analyze) 
WITH trees as (
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id as product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

अनुमानित आउटपुट:

 Aggregate  (cost=779.12..779.13 rows=1 width=32) (actual time=1.066..1.069 rows=1 loops=1)
   ->  Subquery Scan on trees  (cost=769.05..779.12 rows=1 width=142) (actual time=1.038..1.041 rows=1 loops=1)
         ->  Limit  (cost=769.05..779.11 rows=1 width=158) (actual time=1.022..1.024 rows=1 loops=1)
               ->  Nested Loop  (cost=769.05..9339.69 rows=852 width=158) (actual time=1.020..1.021 rows=1 loops=1)
                     ->  Nested Loop  (cost=768.77..9316.48 rows=852 width=945) (actual time=0.858..0.859 rows=1 loops=1)
                           ->  Index Scan using cymbal_products_embeddings_hnsw on cymbal_products cp  (cost=768.34..2572.47 rows=941 width=941) (actual time=0.532..0.539 rows=3 loops=1)
                                 Order By: (embedding <=> '[0.008864171,0.03693164,-0.024245683,...
<redacted>
...,0.017593635,-0.040275685,-0.03914233,-0.018452475,0.00826032,-0.07372604
]'::vector)
                           ->  Index Scan using product_inventory_pkey on cymbal_inventory ci  (cost=0.42..7.17 rows=1 width=37) (actual time=0.104..0.104 rows=0 loops=3)
                                 Index Cond: ((store_id = 1583) AND (uniq_id = (cp.uniq_id)::text))
                                 Filter: (inventory > 0)
                                 Rows Removed by Filter: 1
                     ->  Materialize  (cost=0.28..8.31 rows=1 width=8) (actual time=0.133..0.134 rows=1 loops=1)
                           ->  Index Scan using product_stores_pkey on cymbal_stores cs  (cost=0.28..8.30 rows=1 width=8) (actual time=0.129..0.129 rows=1 loops=1)
                                 Index Cond: (store_id = 1583)
 Planning Time: 112.398 ms
 Execution Time: 1.221 ms

आउटपुट से साफ़ तौर पर पता चलता है कि क्वेरी में "cymbal_products_embeddings_hnsw का इस्तेमाल करके इंडेक्स स्कैन" का इस्तेमाल किया जा रहा था.

अगर हम explain के बिना क्वेरी चलाते हैं, तो:

WITH trees as (
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id as product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

अनुमानित आउटपुट:

[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]

हम देख सकते हैं कि नतीजा एक ही है और वह चेरी का वही पेड़ है जो इंडेक्स किए बिना की गई खोज में सबसे ऊपर था. पैरामीटर और इंडेक्स टाइप के आधार पर, हो सकता है कि नतीजा थोड़ा अलग हो. मेरे टेस्ट के दौरान, इंडेक्स की गई क्वेरी ने 131.301 मिलीसेकंड में नतीजे दिखाए, जबकि बिना इंडेक्स वाली क्वेरी ने 167.631 मिलीसेकंड में नतीजे दिखाए. हालांकि, हम बहुत छोटे डेटासेट के साथ काम कर रहे थे और बड़े डेटा पर अंतर ज़्यादा होगा.

दस्तावेज़ में, वेक्टर के लिए उपलब्ध अलग-अलग इंडेक्स आज़माए जा सकते हैं. साथ ही, लैंगचैन इंटिग्रेशन के साथ ज़्यादा लैब और उदाहरण भी आज़माए जा सकते हैं.

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. बधाई हो

कोडलैब पूरा करने के लिए बधाई.

हमने क्या-क्या शामिल किया है

  • PostgreSQL के लिए Cloud SQL इंस्टेंस को डिप्लॉय करने का तरीका
  • डेटाबेस बनाने और Cloud SQL के एआई इंटिग्रेशन को चालू करने का तरीका
  • डेटाबेस में डेटा लोड करने का तरीका
  • Cloud SQL में Vertex AI एम्बेडिंग मॉडल का इस्तेमाल करने का तरीका
  • Vertex AI के जनरेटिव मॉडल का इस्तेमाल करके, नतीजे को बेहतर बनाने का तरीका
  • वेक्टर इंडेक्स का इस्तेमाल करके परफ़ॉर्मेंस को बेहतर बनाने का तरीका

HNSW के बजाय, ScaNN इंडेक्स के साथ AlloyDB के लिए मिलता-जुलता कोडलैब आज़माएं

13. सर्वे

आउटपुट:

इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?

सिर्फ़ पढ़ें इसे पढ़ें और इसमें दिए गए अभ्यास पूरे करें