इस कोडलैब (कोड बनाना सीखने के लिए ट्यूटोरियल) के बारे में जानकारी
1. परिचय
इस कोडलैब में, आपको वेक्टर सर्च को Vertex AI एम्बेड के साथ जोड़कर, AlloyDB एआई का इस्तेमाल करने का तरीका पता चलेगा.
ज़रूरी शर्तें
- Google Cloud Console के बारे में बुनियादी जानकारी
- कमांड-लाइन इंटरफ़ेस और Google शेल की बुनियादी जानकारी
आपको क्या सीखने को मिलेगा
- AlloyDB क्लस्टर और प्राइमरी इंस्टेंस को डिप्लॉय करने का तरीका
- Google Compute Engine VM से AlloyDB से कनेक्ट करने का तरीका
- डेटाबेस बनाने और AlloyDB एआई को चालू करने का तरीका
- डेटाबेस में डेटा लोड करने का तरीका
- AlloyDB में Vertex AI के एम्बेडिंग मॉडल का इस्तेमाल करने का तरीका
- Vertex AI के जनरेटिव मॉडल का इस्तेमाल करके, नतीजे को बेहतर बनाने का तरीका
- वेक्टर इंडेक्स का इस्तेमाल करके परफ़ॉर्मेंस को बेहतर बनाने का तरीका
आपको इन चीज़ों की ज़रूरत होगी
- Google Cloud खाता और Google Cloud प्रोजेक्ट
- 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 alloydb.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 alloydb.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.
Vertex AI के एम्बेडिंग मॉडल का इस्तेमाल करने के लिए, अपना डिफ़ॉल्ट क्षेत्र कॉन्फ़िगर करें. Vertex AI की सुविधाएं किन देशों/इलाकों में उपलब्ध हैं, इस बारे में ज़्यादा जानें. उदाहरण में, हम us-central1 क्षेत्र का इस्तेमाल कर रहे हैं.
gcloud config set compute/region us-central1
4. AlloyDB को डिप्लॉय करना
AlloyDB क्लस्टर बनाने से पहले, हमें अपने वीपीसी में उपलब्ध निजी आईपी रेंज की ज़रूरत होती है, ताकि आने वाले समय में AlloyDB इंस्टेंस का इस्तेमाल किया जा सके. अगर हमारे पास यह नहीं है, तो हमें इसे बनाना होगा और Google की इंटरनल सेवाओं के इस्तेमाल के लिए इसे असाइन करना होगा. इसके बाद, हम क्लस्टर और इंस्टेंस बना पाएंगे.
निजी आईपी रेंज बनाना
हमें AlloyDB के लिए, अपने VPC में निजी सेवा ऐक्सेस कॉन्फ़िगरेशन कॉन्फ़िगर करना होगा. यहां यह माना गया है कि हमारे पास प्रोजेक्ट में "डिफ़ॉल्ट" VPC नेटवर्क है और इसका इस्तेमाल सभी कार्रवाइयों के लिए किया जाएगा.
निजी आईपी रेंज बनाएं:
gcloud compute addresses create psa-range \
--global \
--purpose=VPC_PEERING \
--prefix-length=24 \
--description="VPC private service access" \
--network=default
असाइन की गई आईपी रेंज का इस्तेमाल करके निजी कनेक्शन बनाएं:
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=psa-range \
--network=default
कंसोल का अनुमानित आउटपुट:
student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \ --global \ --purpose=VPC_PEERING \ --prefix-length=24 \ --description="VPC private service access" \ --network=default Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range]. student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \ --service=servicenetworking.googleapis.com \ --ranges=psa-range \ --network=default Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully. student@cloudshell:~ (test-project-402417)$
AlloyDB क्लस्टर बनाना
इस सेक्शन में, हम us-central1 क्षेत्र में AlloyDB क्लस्टर बना रहे हैं.
postgres उपयोगकर्ता के लिए पासवर्ड तय करें. आपके पास खुद का पासवर्ड तय करने या पासवर्ड जनरेट करने के लिए, रैंडम फ़ंक्शन का इस्तेमाल करने का विकल्प होता है
export PGPASSWORD=`openssl rand -hex 12`
कंसोल का अनुमानित आउटपुट:
student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`
आने वाले समय में इस्तेमाल करने के लिए, PostgreSQL का पासवर्ड नोट करें:
echo $PGPASSWORD
कंसोल का अनुमानित आउटपुट:
student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD bbefbfde7601985b0dee5723
मुफ़्त में आज़माने की सुविधा वाला क्लस्टर बनाना
अगर आपने पहले कभी AlloyDB का इस्तेमाल नहीं किया है, तो मुफ़्त में आज़माने के लिए क्लस्टर बनाने के लिए:
क्षेत्र और AlloyDB क्लस्टर का नाम तय करें. हम क्लस्टर के नाम के तौर पर, us-central1 क्षेत्र और alloydb-aip-01 का इस्तेमाल करेंगे:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
क्लस्टर बनाने के लिए, यह कमांड चलाएं:
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION \
--subscription-type=TRIAL
कंसोल का अनुमानित आउटपुट:
export REGION=us-central1 export ADBCLUSTER=alloydb-aip-01 gcloud alloydb clusters create $ADBCLUSTER \ --password=$PGPASSWORD \ --network=default \ --region=$REGION \ --subscription-type=TRIAL Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4 Creating cluster...done.
उसी क्लाउड शेल सेशन में, हमारे क्लस्टर के लिए AlloyDB का प्राइमरी इंस्टेंस बनाएं. अगर आपका कनेक्शन टूट गया है, तो आपको क्षेत्र और क्लस्टर के नाम के एनवायरमेंट वैरिएबल फिर से तय करने होंगे.
gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=8 \
--region=$REGION \
--cluster=$ADBCLUSTER
कंसोल का अनुमानित आउटपुट:
student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \ --instance-type=PRIMARY \ --cpu-count=8 \ --region=$REGION \ --availability-type ZONAL \ --cluster=$ADBCLUSTER Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721 Creating instance...done.
AlloyDB स्टैंडर्ड क्लस्टर बनाना
अगर यह प्रोजेक्ट में आपका पहला AlloyDB क्लस्टर नहीं है, तो स्टैंडर्ड क्लस्टर बनाने की प्रोसेस जारी रखें.
क्षेत्र और AlloyDB क्लस्टर का नाम तय करें. हम क्लस्टर के नाम के तौर पर, us-central1 क्षेत्र और alloydb-aip-01 का इस्तेमाल करेंगे:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
क्लस्टर बनाने के लिए, यह कमांड चलाएं:
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION
कंसोल का अनुमानित आउटपुट:
export REGION=us-central1 export ADBCLUSTER=alloydb-aip-01 gcloud alloydb clusters create $ADBCLUSTER \ --password=$PGPASSWORD \ --network=default \ --region=$REGION Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4 Creating cluster...done.
उसी क्लाउड शेल सेशन में, हमारे क्लस्टर के लिए AlloyDB का प्राइमरी इंस्टेंस बनाएं. अगर आपका कनेक्शन टूट गया है, तो आपको क्षेत्र और क्लस्टर के नाम के एनवायरमेंट वैरिएबल फिर से तय करने होंगे.
gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=2 \
--region=$REGION \
--cluster=$ADBCLUSTER
कंसोल का अनुमानित आउटपुट:
student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \ --instance-type=PRIMARY \ --cpu-count=2 \ --region=$REGION \ --availability-type ZONAL \ --cluster=$ADBCLUSTER Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721 Creating instance...done.
5. AlloyDB से कनेक्ट करना
AlloyDB को सिर्फ़ निजी कनेक्शन का इस्तेमाल करके डिप्लॉय किया जाता है. इसलिए, डेटाबेस के साथ काम करने के लिए, हमें PostgreSQL क्लाइंट इंस्टॉल किए गए किसी वर्चुअल मशीन (VM) की ज़रूरत होती है.
GCE वीएम डिप्लॉय करना
AlloyDB क्लस्टर के उसी क्षेत्र और वीपीसी में GCE वीएम बनाएं.
Cloud Shell में, यह कमांड चलाएं:
export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE \
--create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
--scopes=https://www.googleapis.com/auth/cloud-platform
कंसोल का अनुमानित आउटपुट:
student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a gcloud compute instances create instance-1 \ --zone=$ZONE \ --create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \ --scopes=https://www.googleapis.com/auth/cloud-platform Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/zones/us-central1-a/instances/instance-1]. NAME: instance-1 ZONE: us-central1-a MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.0.2 EXTERNAL_IP: 34.71.192.233 STATUS: RUNNING
Postgres क्लाइंट इंस्टॉल करना
डिप्लॉय की गई वर्चुअल मशीन (वीएम) पर PostgreSQL क्लाइंट सॉफ़्टवेयर इंस्टॉल करना
वीएम से कनेक्ट करने के लिए:
gcloud compute ssh instance-1 --zone=us-central1-a
कंसोल का अनुमानित आउटपुट:
student@cloudshell:~ (test-project-402417)$ gcloud compute ssh instance-1 --zone=us-central1-a Updating project ssh metadata...working..Updated [https://www.googleapis.com/compute/v1/projects/test-project-402417]. Updating project ssh metadata...done. Waiting for SSH key to propagate. Warning: Permanently added 'compute.5110295539541121102' (ECDSA) to the list of known hosts. Linux instance-1.us-central1-a.c.gleb-test-short-001-418811.internal 6.1.0-18-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. student@instance-1:~$
वीएम में सॉफ़्टवेयर चलाने का निर्देश इंस्टॉल करें:
sudo apt-get update
sudo apt-get install --yes postgresql-client
कंसोल का अनुमानित आउटपुट:
student@instance-1:~$ sudo apt-get update sudo apt-get install --yes postgresql-client Get:1 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable InRelease [5146 B] Get:2 https://packages.cloud.google.com/apt cloud-sdk-bullseye InRelease [6406 B] Hit:3 https://deb.debian.org/debian bullseye InRelease Get:4 https://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB] Get:5 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable/main amd64 Packages [1930 B] Get:6 https://deb.debian.org/debian bullseye-updates InRelease [44.1 kB] Get:7 https://deb.debian.org/debian bullseye-backports InRelease [49.0 kB] ...redacted... update-alternatives: using /usr/share/postgresql/13/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode Setting up postgresql-client (13+225) ... Processing triggers for man-db (2.9.4-2) ... Processing triggers for libc-bin (2.31-13+deb11u7) ...
इंस्टेंस से कनेक्ट करना
psql का इस्तेमाल करके, वीएम से प्राइमरी इंस्टेंस से कनेक्ट करें.
उसी Cloud Shell टैब में, जहां आपने अपने इंस्टेंस-1 VM के लिए एसएसएच सेशन खोला है.
GCE वीएम से AlloyDB से कनेक्ट करने के लिए, नोट की गई AlloyDB पासवर्ड (PGPASSWORD) वैल्यू और AlloyDB क्लस्टर आईडी का इस्तेमाल करें:
export PGPASSWORD=<Noted password>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
psql "host=$INSTANCE_IP user=postgres sslmode=require"
कंसोल का अनुमानित आउटपुट:
student@instance-1:~$ export PGPASSWORD=CQhOi5OygD4ps6ty student@instance-1:~$ ADBCLUSTER=alloydb-aip-01 student@instance-1:~$ REGION=us-central1 student@instance-1:~$ INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)") gleb@instance-1:~$ psql "host=$INSTANCE_IP user=postgres sslmode=require" psql (15.6 (Debian 15.6-0+deb12u1), server 15.5) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off) Type "help" for help. postgres=>
psql सेशन बंद करने के लिए:
exit
6. डेटाबेस तैयार करना
इसके लिए, हमें डेटाबेस बनाना होगा, Vertex AI इंटिग्रेशन चालू करना होगा, डेटाबेस ऑब्जेक्ट बनाना होगा, और डेटा इंपोर्ट करना होगा.
AlloyDB को ज़रूरी अनुमतियां देना
AlloyDB के सर्विस एजेंट में Vertex AI की अनुमतियां जोड़ें.
सबसे ऊपर मौजूद "+" साइन का इस्तेमाल करके, Cloud Shell का दूसरा टैब खोलें.
नए क्लाउड शेल टैब में, यह तरीका अपनाएं:
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
कंसोल का अनुमानित आउटपुट:
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project) Your active configuration is: [cloudshell-11039] student@cloudshell:~ (test-project-001-402417)$ gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \ --role="roles/aiplatform.user" Updated IAM policy for project [test-project-001-402417]. bindings: - members: - serviceAccount:service-4470404856@gcp-sa-alloydb.iam.gserviceaccount.com role: roles/aiplatform.user - members: ... etag: BwYIEbe_Z3U= version: 1
टैब में, "exit" कमांड का इस्तेमाल करके टैब बंद करें:
exit
डेटाबेस बनाना
डेटाबेस क्विकस्टार्ट बनाएं.
GCE वीएम सेशन में, यह तरीका अपनाएं:
डेटाबेस बनाएं:
psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db"
कंसोल का अनुमानित आउटपुट:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db" CREATE DATABASE student@instance-1:~$
Vertex AI इंटिग्रेशन की सुविधा चालू करना
डेटाबेस में Vertex AI इंटिग्रेशन और pgvector एक्सटेंशन चालू करें.
GCE वीएम में, यह तरीका अपनाएं:
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"
कंसोल का अनुमानित आउटपुट:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE" psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector" CREATE EXTENSION CREATE EXTENSION student@instance-1:~$
डेटा इंपोर्ट करना
तैयार किया गया डेटा डाउनलोड करें और उसे नए डेटाबेस में इंपोर्ट करें.
GCE वीएम में, यह तरीका अपनाएं:
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"
कंसोल का अनुमानित आउटपुट:
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" SET SET SET SET SET set_config ------------ (1 row) SET SET SET SET SET SET CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE SEQUENCE ALTER TABLE ALTER SEQUENCE ALTER TABLE ALTER TABLE ALTER TABLE student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header" COPY 941 student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header" COPY 263861 student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header" COPY 4654 student@instance-1:~$
7. एम्बेड की गिनती करना
डेटा इंपोर्ट करने के बाद, हमें cymbal_products टेबल में अपना प्रॉडक्ट डेटा मिला. साथ ही, cymbal_inventory टेबल में हर स्टोर में उपलब्ध प्रॉडक्ट की संख्या दिखाने वाली इन्वेंट्री और cymbal_stores टेबल में स्टोर की लिस्ट भी मिली. हमें अपने प्रॉडक्ट की जानकारी के आधार पर वेक्टर डेटा का हिसाब लगाना है. इसके लिए, हम एम्बेड करने वाले फ़ंक्शन का इस्तेमाल करेंगे. फ़ंक्शन का इस्तेमाल करके, हम Vertex AI इंटिग्रेशन का इस्तेमाल करेंगे. इससे, प्रॉडक्ट के ब्यौरे के आधार पर वेक्टर डेटा का हिसाब लगाया जाएगा और उसे टेबल में जोड़ा जाएगा. इस्तेमाल की गई टेक्नोलॉजी के बारे में ज़्यादा जानने के लिए, दस्तावेज़ पढ़ें.
एम्बेड करने के लिए कॉलम बनाना
psql का इस्तेमाल करके डेटाबेस से कनेक्ट करें और cymbal_products टेबल में एम्बेड करने वाले फ़ंक्शन का इस्तेमाल करके, वेक्टर डेटा के साथ वर्चुअल कॉलम बनाएं. एम्बेड करने वाला फ़ंक्शन, product_description कॉलम से दिए गए डेटा के आधार पर Vertex AI से वेक्टर डेटा दिखाता है.
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
डेटाबेस से कनेक्ट करने के बाद, psql सेशन में यह कमांड चलाएं:
ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-005',product_description)) STORED;
यह कमांड, वर्चुअल कॉलम बनाकर उसे वेक्टर डेटा से पॉप्युलेट करेगा.
कंसोल का अनुमानित आउटपुट:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" psql (13.11 (Debian 13.11-0+deb11u1), server 14.7) WARNING: psql major version 13, server major version 14. Some psql features might not work. SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type "help" for help. quickstart_db=> ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED; ALTER TABLE quickstart_db=>
8. मिलते-जुलते कॉन्टेंट की खोज करना
अब हम मिलती-जुलती खोज का इस्तेमाल करके, ब्यौरे के लिए कैलकुलेट की गई वेक्टर वैल्यू और अपने अनुरोध के लिए मिली वेक्टर वैल्यू के आधार पर खोज कर सकते हैं.
SQL क्वेरी को उसी psql कमांड लाइन इंटरफ़ेस से या इसके विकल्प के तौर पर, AlloyDB Studio से चलाया जा सकता है. कई पंक्तियों वाला और जटिल आउटपुट, AlloyDB Studio में बेहतर दिख सकता है.
AlloyDB Studio से कनेक्ट करना
यहां दिए गए चैप्टर में, डेटाबेस से कनेक्ट करने वाले सभी SQL निर्देशों को AlloyDB Studio में भी चलाया जा सकता है. निर्देश चलाने के लिए, आपको प्राइमरी इंस्टेंस पर क्लिक करके, अपने AlloyDB क्लस्टर के लिए वेब कंसोल इंटरफ़ेस खोलना होगा.
इसके बाद, बाईं ओर मौजूद AlloyDB Studio पर क्लिक करें:
quickstart_db डेटाबेस और उपयोगकर्ता postgres चुनें. साथ ही, क्लस्टर बनाते समय नोट किया गया पासवर्ड डालें. इसके बाद, "पुष्टि करें" बटन पर क्लिक करें.
इससे AlloyDB Studio इंटरफ़ेस खुल जाएगा. डेटाबेस में निर्देश चलाने के लिए, दाईं ओर मौजूद "एडिटर 1" टैब पर क्लिक करें.
इससे इंटरफ़ेस खुलता है, जहां एसक्यूएल कमांड चलाए जा सकते हैं
अगर आपको कमांड लाइन psql का इस्तेमाल करना है, तो दूसरे तरीके का इस्तेमाल करें. इसके बाद, अपने वीएम एसएसएच सेशन से डेटाबेस से कनेक्ट करें. इसके बारे में पिछले चैप्टर में बताया गया है.
psql से मिलती-जुलती चीज़ों की खोज करना
अगर आपका डेटाबेस सेशन डिसकनेक्ट हो गया था, तो psql या AlloyDB Studio का इस्तेमाल करके, डेटाबेस से फिर से कनेक्ट करें.
डेटाबेस से कनेक्ट करने के लिए:
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
क्लाइंट के अनुरोध से मिलते-जुलते उपलब्ध प्रॉडक्ट की सूची पाने के लिए, कोई क्वेरी चलाएं. वेक्टर वैल्यू पाने के लिए, हम 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-005','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;
इसका अनुमानित आउटपुट यह होगा:
quickstart_db=> 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; 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
9. जवाब को बेहतर बनाना
क्वेरी के नतीजे का इस्तेमाल करके, क्लाइंट ऐप्लिकेशन के जवाब को बेहतर बनाया जा सकता है. साथ ही, Vertex AI के जनरेटिव फ़ाउंडेशन लैंग्वेज मॉडल के प्रॉम्प्ट के हिस्से के तौर पर, दिए गए क्वेरी के नतीजों का इस्तेमाल करके, काम का आउटपुट तैयार किया जा सकता है.
ऐसा करने के लिए, हम वेक्टर सर्च के नतीजों के साथ JSON जनरेट करने की योजना बना रहे हैं. इसके बाद, Vertex AI में टेक्स्ट एलएलएम मॉडल के प्रॉम्प्ट के साथ जनरेट किए गए JSON का इस्तेमाल करके, काम का आउटपुट तैयार करेंगे. पहले चरण में, हम JSON जनरेट करते हैं. इसके बाद, हम Vertex AI Studio में इसकी जांच करते हैं. आखिर में, हम इसे SQL स्टेटमेंट में शामिल करते हैं, जिसका इस्तेमाल किसी ऐप्लिकेशन में किया जा सकता है.
JSON फ़ॉर्मैट में आउटपुट जनरेट करना
क्वेरी में बदलाव करके, JSON फ़ॉर्मैट में आउटपुट जनरेट करें और Vertex AI को पास करने के लिए सिर्फ़ एक लाइन दिखाएं
क्वेरी का उदाहरण यहां दिया गया है:
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-005','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 खोलें.
"सहमति दें और जारी रखें" बटन को दबाएं
इंटरफ़ेस में सबसे नीचे, अपना प्रॉम्प्ट लिखें.
यह आपसे अन्य एपीआई चालू करने के लिए कह सकता है. हालांकि, इस अनुरोध को अनदेखा किया जा सकता है. लैब को पूरा करने के लिए, हमें किसी और एपीआई की ज़रूरत नहीं है.
यहां वह प्रॉम्प्ट दिया गया है जिसका इस्तेमाल, पेड़ों के बारे में की गई शुरुआती क्वेरी के JSON आउटपुट के साथ किया जाएगा:
आप एक सलाहकार हैं, जो ग्राहक की ज़रूरतों के हिसाब से प्रॉडक्ट ढूंढने में मदद करते हैं.
क्लाइंट के अनुरोध के आधार पर, हमने खोज से मिलते-जुलते प्रॉडक्ट की सूची लोड की है.
JSON फ़ॉर्मैट में वैल्यू की सूची, जैसे कि {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
प्रॉडक्ट की सूची यहां दी गई है:
{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. यह एक d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}
ग्राहक ने पूछा, "यहां कौनसा पेड़ सबसे अच्छी तरह से बढ़ रहा है?"
प्रॉम्प्ट के तौर पर, आपको प्रॉडक्ट, कीमत, और कुछ अन्य जानकारी देनी चाहिए
JSON वैल्यू के साथ प्रॉम्प्ट चलाने और gemini-2.0-flash-001 मॉडल का इस्तेमाल करने पर, हमें यह नतीजा मिला:
इस उदाहरण में, मॉडल से हमें जो जवाब मिला वह यहां दिया गया है. ध्यान दें कि समय के साथ मॉडल और पैरामीटर में होने वाले बदलावों की वजह से, आपका जवाब अलग हो सकता है:
"ठीक है, मैं इसमें आपकी मदद कर सकता/सकती हूं! मेरे पास प्रॉडक्ट की सीमित सूची है. इस आधार पर, चेरी ट्री एक अच्छा विकल्प हो सकता है.
मुझे यह जानकारी मिली है:
प्रॉडक्ट: चेरी ट्री
ब्यौरा: "यह एक खूबसूरत चेरी का पेड़ है, जो स्वादिष्ट चेरी देगा. यह एक d" (माफ़ करें, ब्यौरा अधूरा है)
कीमत: 75.00 डॉलर
पिन कोड: 93230 (यह जानने के लिए ज़रूरी है कि आपके इलाके में यह प्रॉडक्ट अच्छी तरह से उगता है या नहीं!) "
PSQL में प्रॉम्प्ट चलाना
Vertex AI के साथ AlloyDB एआई इंटिग्रेशन का इस्तेमाल करके, सीधे डेटाबेस में SQL का इस्तेमाल करके जनरेटिव मॉडल से वही जवाब पाया जा सकता है. हालांकि, gemini-1.5-flash मॉडल का इस्तेमाल करने के लिए, हमें पहले इसे रजिस्टर करना होगा.
google_ml_integration एक्सटेंशन की पुष्टि करें. यह 1.4.2 या उसके बाद का वर्शन होना चाहिए.
psql से quickstart_db डेटाबेस से कनेक्ट करें, जैसा कि पहले दिखाया गया है (या AlloyDB Studio का इस्तेमाल करें) और यह फ़ंक्शन चलाएं:
SELECT extversion from pg_extension where extname='google_ml_integration';
google_ml_integration.enable_model_support डेटाबेस फ़्लैग देखें.
show google_ml_integration.enable_model_support;
psql सेशन का अनुमानित आउटपुट "चालू है" होना चाहिए:
postgres=> show google_ml_integration.enable_model_support; google_ml_integration.enable_model_support -------------------------------------------- on (1 row)
अगर यह "बंद" दिखता है, तो हमें google_ml_integration.enable_model_support डेटाबेस फ़्लैग को "चालू" पर सेट करना होगा. ऐसा करने के लिए, AlloyDB वेब कंसोल इंटरफ़ेस का इस्तेमाल किया जा सकता है या नीचे दिया गया gcloud कमांड चलाया जा सकता है.
PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
ADBCLUSTER=alloydb-aip-01
gcloud beta alloydb instances update $ADBCLUSTER-pr \
--database-flags google_ml_integration.enable_model_support=on \
--region=$REGION \
--cluster=$ADBCLUSTER \
--project=$PROJECT_ID \
--update-mode=FORCE_APPLY
बैकग्राउंड में कमांड को लागू होने में करीब 3 से 5 मिनट लगते हैं. इसके बाद, फ़्लैग की फिर से पुष्टि की जा सकती है.
अब हमें दो मॉडल रजिस्टर करने होंगे. पहला मॉडल, पहले से इस्तेमाल किया जा रहा text-embedding-005 मॉडल है. मॉडल को रजिस्टर करना ज़रूरी है, क्योंकि हमने मॉडल को रजिस्टर करने की सुविधाएं चालू की हैं.
psql या AlloyDB Studio में चलाए गए मॉडल को रजिस्टर करने के लिए, यह कोड इस्तेमाल करें:
CALL
google_ml.create_model(
model_id => 'text-embedding-005',
model_provider => 'google',
model_qualified_name => 'text-embedding-005',
model_type => 'text_embedding',
model_auth_type => 'alloydb_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 => 'publishers/google/models/gemini-2.0-flash-001:streamGenerateContent',
model_provider => 'google',
model_auth_type => 'alloydb_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 text-embedding-005 | text_embedding gemini-2.0-flash-001 | generic (4 rows)
अब हम सबक्वेरी JSON में जनरेट किए गए डेटा का इस्तेमाल कर सकते हैं. साथ ही, SQL का इस्तेमाल करके जनरेटिव एआई टेक्स्ट मॉडल के प्रॉम्प्ट के हिस्से के तौर पर इसे उपलब्ध करा सकते हैं.
डेटाबेस के psql या AlloyDB 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 <=> embedding('text-embedding-005',
'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;
यहां अनुमानित आउटपुट दिया गया है. मॉडल के वर्शन और पैरामीटर के आधार पर, आपका आउटपुट अलग-अलग हो सकता है.:
"Okay" ", based on" " the product list, the \"Cherry Tree\" seems like a potential option for you.\n\n" "* **Product:** Cherry Tree\n* **Description:** It's a beautiful" " deciduous tree that grows to about 15 feet tall. You'll get dark green leaves in the summer that turn red in the fall. These trees are known for" " their beauty, shade, and privacy. Plus, you'll get delicious cherries!\n* **Growing Conditions:** Cherry trees prefer a cool, moist climate" " and sandy soil.\n* **USDA Zones:** They are best suited for USDA zones 4-9. (You may want to confirm that zone 4-9 is appropriate for your location.)\n* **Price:** \\$" "75.00\n\n**To make sure this is the *best* fit for you, could you tell me:**\n\n1. **Your Zip Code:** While the product lists zip code 93230, I" " would like to confirm where you are to verify that the USDA zone is a match for your area.\n2. **What kind of soil do you have?** The product description says that cherry trees prefer sandy soil.\n\nOnce I have this information, I can give you a more confident recommendation!\n"
10. वेक्टर इंडेक्स बनाना
हमारा डेटासेट काफ़ी छोटा है और जवाब मिलने में लगने वाला समय, मुख्य रूप से एआई मॉडल के साथ इंटरैक्शन पर निर्भर करता है. हालांकि, अगर आपके पास लाखों वेक्टर हैं, तो वेक्टर खोज का हिस्सा हमारे जवाब देने में लगने वाले समय का ज़्यादातर हिस्सा ले सकता है. साथ ही, सिस्टम पर ज़्यादा लोड डाल सकता है. इसे बेहतर बनाने के लिए, हम अपने वैक्टर के ऊपर एक इंडेक्स बना सकते हैं.
ScaNN इंडेक्स बनाना
SCANN इंडेक्स बनाने के लिए, हमें एक और एक्सटेंशन चालू करना होगा. alloydb_scann एक्सटेंशन, Google ScaNN एल्गोरिदम का इस्तेमाल करके एएनएन टाइप वेक्टर इंडेक्स के साथ काम करने के लिए इंटरफ़ेस उपलब्ध कराता है.
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
अनुमानित आउटपुट:
quickstart_db=> CREATE EXTENSION IF NOT EXISTS alloydb_scann; CREATE EXTENSION Time: 27.468 ms quickstart_db=>
अब हम इंडेक्स बना सकते हैं. नीचे दिए गए उदाहरण में, मैंने ज़्यादातर पैरामीटर को डिफ़ॉल्ट के तौर पर छोड़ा है और इंडेक्स के लिए सिर्फ़ एक सेक्शन (num_leaves) की संख्या दी है:
CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products
USING scann (embedding cosine)
WITH (num_leaves=31, max_num_levels = 2);
इंडेक्स पैरामीटर को ट्यून करने के बारे में जानने के लिए, दस्तावेज़ पढ़ें.
अनुमानित आउटपुट:
quickstart_db=> CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products USING scann (embedding cosine) WITH (num_leaves=31, max_num_levels = 2); 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-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;
अनुमानित आउटपुट:
Aggregate (cost=16.59..16.60 rows=1 width=32) (actual time=2.875..2.877 rows=1 loops=1) -> Subquery Scan on trees (cost=8.42..16.59 rows=1 width=142) (actual time=2.860..2.862 rows=1 loops=1) -> Limit (cost=8.42..16.58 rows=1 width=158) (actual time=2.855..2.856 rows=1 loops=1) -> Nested Loop (cost=8.42..6489.19 rows=794 width=158) (actual time=2.854..2.855 rows=1 loops=1) -> Nested Loop (cost=8.13..6466.99 rows=794 width=938) (actual time=2.742..2.743 rows=1 loops=1) -> Index Scan using cymbal_products_embeddings_scann on cymbal_products cp (cost=7.71..111.99 rows=876 width=934) (actual time=2.724..2.724 rows=1 loops=1) Order By: (embedding <=> '[0.008864171,0.03693164,-0.024245683,-0.00355923,0.0055611245,0.015985578,...<redacted>...5685,-0.03914233,-0.018452475,0.00826032,-0.07372604]'::vector) -> Index Scan using walmart_inventory_pkey on cymbal_inventory ci (cost=0.42..7.26 rows=1 width=37) (actual time=0.015..0.015 rows=1 loops=1) Index Cond: ((store_id = 1583) AND (uniq_id = (cp.uniq_id)::text))
आउटपुट से साफ़ तौर पर पता चलता है कि क्वेरी, "cymbal_products पर cymbal_products_embeddings_scann का इस्तेमाल करके इंडेक्स स्कैन" का इस्तेमाल कर रही थी.
अगर हम 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-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;
अनुमानित आउटपुट:
[{"product_name":"Meyer Lemon Tree","description":"Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by ","sale_price":34,"zip_code":93230,"product_id":"02056727942aeb714dc9a2313654e1b0"}]
हम देख सकते हैं कि नतीजा थोड़ा अलग है. इंडेक्स किए बिना की गई खोज में सबसे ऊपर चेरी ट्री दिख रहा था, लेकिन इंडेक्स किए जाने के बाद, नतीजों में दूसरे नंबर पर मेयर लेमन ट्री दिख रहा है. इसलिए, इंडेक्स से हमें परफ़ॉर्मेंस की जानकारी मिल रही है. हालांकि, यह अब भी अच्छे नतीजे देने के लिए ज़रूरत के मुताबिक सटीक है.
दस्तावेज़ वाले पेज पर, लैंगचैन इंटिग्रेशन के साथ उपलब्ध लैब और उदाहरणों के साथ-साथ, वेक्टर के लिए उपलब्ध अलग-अलग इंडेक्स आज़माए जा सकते हैं.
11. एनवायरमेंट को साफ़ करना
प्रयोग पूरा होने के बाद, AlloyDB इंस्टेंस और क्लस्टर को मिटाना
AlloyDB क्लस्टर और सभी इंस्टेंस मिटाना
'बेहतर तरीके से मिटाएं' विकल्प का इस्तेमाल करके क्लस्टर को मिटाया जा सकता है. इससे क्लस्टर के सभी इंस्टेंस भी मिट जाते हैं.
अगर आपका कनेक्शन टूट गया है और पिछली सभी सेटिंग मिट गई हैं, तो क्लाउड शेल में प्रोजेक्ट और एनवायरमेंट वैरिएबल तय करें:
gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)
क्लस्टर मिटाने के लिए:
gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
कंसोल का अनुमानित आउटपुट:
student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force All of the cluster data will be lost when the cluster is deleted. Do you want to continue (Y/n)? Y Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f Deleting cluster...done.
AlloyDB के बैकअप मिटाना
क्लस्टर के लिए, AlloyDB के सभी बैकअप मिटाएं:
for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
कंसोल का अनुमानित आउटपुट:
student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f Deleting backup...done.
अब हम अपना VM मिटा सकते हैं
GCE वीएम मिटाना
Cloud Shell में, यह कमांड चलाएं:
export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
--zone=$ZONE \
--quiet
कंसोल का अनुमानित आउटपुट:
student@cloudshell:~ (test-project-001-402417)$ export GCEVM=instance-1 export ZONE=us-central1-a gcloud compute instances delete $GCEVM \ --zone=$ZONE \ --quiet Deleted
12. बधाई हो
कोडलैब पूरा करने के लिए बधाई.
हमने क्या-क्या शामिल किया है
- AlloyDB क्लस्टर और प्राइमरी इंस्टेंस को डिप्लॉय करने का तरीका
- Google Compute Engine VM से AlloyDB से कनेक्ट करने का तरीका
- डेटाबेस बनाने और AlloyDB एआई को चालू करने का तरीका
- डेटाबेस में डेटा लोड करने का तरीका
- AlloyDB में Vertex AI के एम्बेडिंग मॉडल का इस्तेमाल करने का तरीका
- Vertex AI के जनरेटिव मॉडल का इस्तेमाल करके, नतीजे को बेहतर बनाने का तरीका
- वेक्टर इंडेक्स का इस्तेमाल करके परफ़ॉर्मेंस को बेहतर बनाने का तरीका