1. परिचय
इस कोडलैब में, AlloyDB को डिप्लॉय करने के बारे में बताया गया है. साथ ही, मल्टीमोडल एम्बेडिंग का इस्तेमाल करके सिमैंटिक सर्च के लिए, एआई इंटिग्रेशन का फ़ायदा पाने के बारे में भी बताया गया है. यह लैब, AlloyDB AI की सुविधाओं के लिए बनाए गए लैब कलेक्शन का हिस्सा है. दस्तावेज़ में AlloyDB AI पेज पर जाकर, इस बारे में ज़्यादा पढ़ें.
ज़रूरी शर्तें
- Google Cloud और Console की बुनियादी जानकारी
- कमांड लाइन इंटरफ़ेस और Cloud Shell में बुनियादी कौशल
आपको क्या सीखने को मिलेगा
- AlloyDB for Postgres को डिप्लॉय करने का तरीका
- मल्टीमोडल वेक्टर सर्च का इस्तेमाल कैसे करें
- AlloyDB AI ऑपरेटर चालू करने का तरीका
- मल्टीमॉडल सर्च के लिए, AlloyDB AI के अलग-अलग ऑपरेटर इस्तेमाल करने का तरीका
- टेक्स्ट और इमेज के खोज नतीजों को एक साथ देखने के लिए, AlloyDB 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 Console में बिलिंग चालू करनी होगी, ताकि Cloud संसाधनों/एपीआई का इस्तेमाल किया जा सके. इस कोडलैब को पूरा करने में ज़्यादा समय नहीं लगेगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, बनाए गए संसाधनों को बंद किया जा सकता है. इसके लिए, बनाए गए संसाधनों को मिटाएं या प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त में आज़माने वाले प्रोग्राम के लिए ज़रूरी शर्तें पूरी करते हैं.
Cloud Shell शुरू करें
Google Cloud को अपने लैपटॉप से रिमोटली ऐक्सेस किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जाएगा. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.
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 \
discoveryengine.googleapis.com \
secretmanager.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.
4. AlloyDB डिप्लॉय करना
AlloyDB क्लस्टर और प्राइमरी इंस्टेंस बनाएं. Google Cloud SDK का इस्तेमाल करके, AlloyDB क्लस्टर और इंस्टेंस बनाने का तरीका यहां बताया गया है. अगर आपको कंसोल का इस्तेमाल करना है, तो यहां दिया गया दस्तावेज़ पढ़ें.
AlloyDB क्लस्टर बनाने से पहले, हमें अपने वीपीसी में एक उपलब्ध निजी आईपी रेंज की ज़रूरत होती है, ताकि इसका इस्तेमाल आने वाले समय में AlloyDB इंस्टेंस के लिए किया जा सके. अगर हमारे पास यह नहीं है, तो हमें इसे बनाना होगा. साथ ही, इसे Google की आंतरिक सेवाओं के लिए इस्तेमाल करने की अनुमति देनी होगी. इसके बाद, हम क्लस्टर और इंस्टेंस बना पाएंगे.
निजी आईपी रेंज बनाना
हमें AlloyDB के लिए, अपने वीपीसी में Private Service Access कॉन्फ़िगरेशन को कॉन्फ़िगर करना होगा. यहां यह मान लिया गया है कि प्रोजेक्ट में "डिफ़ॉल्ट" वीपीसी नेटवर्क है और इसका इस्तेमाल सभी कार्रवाइयों के लिए किया जाएगा.
निजी आईपी पते की रेंज बनाएं:
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
postgres उपयोगकर्ता के तौर पर इंस्टेंस से कनेक्ट करने के लिए, आपको आने वाले समय में इस पासवर्ड की ज़रूरत होगी. हमारा सुझाव है कि आप इसे लिख लें या कहीं कॉपी कर लें, ताकि बाद में इसका इस्तेमाल किया जा सके.
अनुमानित कंसोल आउटपुट:
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.
उसी Cloud Shell सेशन में, हमारे क्लस्टर के लिए 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 Standard क्लस्टर बनाना
अगर यह प्रोजेक्ट में आपका पहला 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.
उसी Cloud Shell सेशन में, हमारे क्लस्टर के लिए 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. डेटाबेस तैयार करना
हमें एक डेटाबेस बनाना होगा. साथ ही, 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
AlloyDB Studio से कनेक्ट करना
यहां दिए गए अध्यायों में, डेटाबेस से कनेक्ट करने के लिए ज़रूरी सभी SQL कमांड को AlloyDB Studio में भी चलाया जा सकता है. कमांड चलाने के लिए, आपको प्राइमरी इंस्टेंस पर क्लिक करके, अपने AlloyDB क्लस्टर के लिए वेब कंसोल इंटरफ़ेस खोलना होगा.
इसके बाद, बाईं ओर मौजूद AlloyDB Studio पर क्लिक करें:
postgres डेटाबेस और postgres उपयोगकर्ता चुनें. साथ ही, क्लस्टर बनाते समय नोट किया गया पासवर्ड डालें. इसके बाद, "Authenticate" बटन पर क्लिक करें.
इससे AlloyDB Studio का इंटरफ़ेस खुल जाएगा. डेटाबेस में कमांड चलाने के लिए, दाईं ओर मौजूद "Editor 1" टैब पर क्लिक करें.
इससे एक इंटरफ़ेस खुलता है, जहां एसक्यूएल कमांड चलाई जा सकती हैं
डेटाबेस बनाएं
डेटाबेस बनाने के बारे में क्विकस्टार्ट गाइड.
AlloyDB Studio Editor में, यहां दिया गया निर्देश चलाएं.
डेटाबेस बनाना:
CREATE DATABASE quickstart_db
अनुमानित आउटपुट:
Statement executed successfully
quickstart_db से कनेक्ट करें
उपयोगकर्ता/डेटाबेस बदलने के बटन का इस्तेमाल करके, स्टूडियो से फिर से कनेक्ट करें.
ड्रॉपडाउन सूची से नई quickstart_db डेटाबेस चुनें. साथ ही, पहले की तरह ही उपयोगकर्ता नाम और पासवर्ड का इस्तेमाल करें.
इससे एक नया कनेक्शन खुलेगा. यहां quickstart_db डेटाबेस के ऑब्जेक्ट के साथ काम किया जा सकता है.
6. सैंपल डेटा
अब हमें डेटाबेस में ऑब्जेक्ट बनाने और डेटा लोड करने की ज़रूरत है. हम काल्पनिक डेटा के साथ "Cymbal" नाम के काल्पनिक स्टोर का इस्तेमाल करेंगे.
डेटा इंपोर्ट करने से पहले, हमें डेटा टाइप और इंडेक्स के साथ काम करने वाले एक्सटेंशन चालू करने होंगे. हमें दो एक्सटेंशन की ज़रूरत है. इनमें से एक वेक्टर डेटा टाइप के साथ काम करता है और दूसरा AlloyDB ScaNN इंडेक्स के साथ काम करता है.
AlloyDB Studio में, quickstart_db से कनेक्ट करें.
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
डेटासेट को एसक्यूएल फ़ाइल के तौर पर तैयार किया जाता है और इसे इंपोर्ट इंटरफ़ेस का इस्तेमाल करके डेटाबेस में लोड किया जा सकता है. Cloud Shell में ये कमांड चलाएं:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters import $ADBCLUSTER --region=$REGION --database=quickstart_db --gcs-uri='gs://sample-data-and-media/ecomm-retail/ecom_generic_vectors.sql' --user=postgres --sql
यह कमांड, AlloyDB SDK का इस्तेमाल करती है. साथ ही, agentspace_user नाम का उपयोगकर्ता बनाती है. इसके बाद, GCS बकेट से सीधे डेटाबेस में सैंपल डेटा इंपोर्ट करती है. इससे सभी ज़रूरी ऑब्जेक्ट बन जाते हैं और डेटा डाला जाता है.
इंपोर्ट करने के बाद, हम AlloyDB Studio में टेबल देख सकते हैं. टेबल, ecomm स्कीमा में हैं:
साथ ही, किसी एक टेबल में मौजूद लाइनों की संख्या की पुष्टि करें.
हमने सैंपल डेटा को इंपोर्ट कर लिया है. अब हम अगले चरणों को पूरा कर सकते हैं.
7. टेक्स्ट एम्बेडिंग का इस्तेमाल करके सिमैंटिक सर्च करना
इस चैप्टर में, हम टेक्स्ट एम्बेडिंग का इस्तेमाल करके सिमैंटिक सर्च का इस्तेमाल करने की कोशिश करेंगे. साथ ही, इसकी तुलना Postgres के पारंपरिक टेक्स्ट और फ़ुलटेक्स्ट सर्च से करेंगे.
आइए, सबसे पहले LIKE ऑपरेटर के साथ स्टैंडर्ड PostgreSQL एसक्यूएल का इस्तेमाल करके, क्लासिक तरीके से खोज करने की कोशिश करते हैं.
अगर हम यहां दी गई क्वेरी का इस्तेमाल करके रेन जैकेट खोजते हैं:
SET session.my_search_var='%wet%conditions%jacket%';
SELECT
name,
product_description,
retail_price, replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM
ecomm.products
WHERE
name ILIKE current_setting('session.my_search_var')
OR product_description ILIKE current_setting('session.my_search_var')
LIMIT
10;
क्वेरी से कोई भी लाइन नहीं मिलती है, क्योंकि प्रॉडक्ट के नाम या ब्यौरे में, 'बारिश के मौसम' और 'जैकेट' जैसे सटीक शब्दों का होना ज़रूरी है. साथ ही, ‘बारिश में पहनने वाली जैकेट' और ‘पानी से बचाने वाली जैकेट' एक जैसी नहीं होतीं.
हम खोज के सभी संभावित वर्शन शामिल करने की कोशिश कर सकते हैं. आइए, सिर्फ़ दो शब्दों को शामिल करने की कोशिश करते हैं. उदाहरण के लिए:
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM
ecomm.products
WHERE
name ILIKE '%wet%jacket%'
OR name ILIKE '%jacket%wet%'
OR name ILIKE '%jacket%'
OR name ILIKE '%%wet%'
OR product_description ILIKE '%wet%jacket%'
OR product_description ILIKE '%jacket%wet%'
OR product_description ILIKE '%jacket%'
OR product_description ILIKE '%wet%'
LIMIT
10;
इससे कई लाइनें दिखेंगी, लेकिन उनमें से सभी लाइनें जैकेट के लिए किए गए हमारे अनुरोध से पूरी तरह मेल नहीं खाती हैं. साथ ही, उन्हें काम के हिसाब से क्रम में लगाना मुश्किल है. उदाहरण के लिए, अगर हम "पुरुषों के लिए" जैसी और शर्तें जोड़ते हैं, तो क्वेरी काफ़ी जटिल हो जाएगी. इसके अलावा, हम पूरे टेक्स्ट को खोज सकते हैं. हालांकि, इसमें भी हमें कुछ सीमाओं का सामना करना पड़ता है. जैसे, जवाब में इस्तेमाल किए गए शब्दों का सटीक होना और जवाब का काम का होना.
अब हम एम्बेडिंग का इस्तेमाल करके, मिलती-जुलती खोज कर सकते हैं. हमने अलग-अलग मॉडल का इस्तेमाल करके, अपने प्रॉडक्ट के लिए एम्बेडिंग पहले से ही कैलकुलेट कर ली हैं. हम Google के नए gemini-embedding-001 मॉडल का इस्तेमाल करेंगे. हमने उन्हें ecomm.products टेबल के "product_embedding" कॉलम में सेव किया है. अगर हम "पुरुषों के लिए रेन जैकेट" की खोज की शर्त के लिए, यहां दी गई क्वेरी का इस्तेमाल करते हैं:
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_embedding <=> embedding ('gemini-embedding-001','wet conditions jacket for men')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
10;
इससे न सिर्फ़ बारिश के मौसम में पहनने वाली जैकेट के नतीजे मिलेंगे, बल्कि सभी नतीजों को इस तरह से क्रम में लगाया जाएगा कि सबसे काम के नतीजे सबसे ऊपर दिखें.
एम्बेडिंग वाली क्वेरी के नतीजे 90 से 150 मि॰से॰ में मिलते हैं. इसमें से कुछ समय, क्लाउड एम्बेडिंग मॉडल से डेटा पाने में लगता है. अगर हम एक्ज़ीक्यूशन प्लान देखें, तो मॉडल से किए गए अनुरोध को प्लानिंग के समय में शामिल किया जाता है. क्वेरी का वह हिस्सा जिसमें खोज की जाती है काफ़ी छोटा है. AlloyDB ScaNN इंडेक्स का इस्तेमाल करके, 29 हज़ार रिकॉर्ड में खोज करने में सात मिलीसेकंड से भी कम समय लगता है.
Limit (cost=2709.20..2718.82 rows=10 width=490) (actual time=6.966..7.049 rows=10 loops=1)
-> Index Scan using embedding_scann on products (cost=2709.20..30736.40 rows=29120 width=490) (actual time=6.964..7.046 rows=10 loops=1)
Order By: (product_embedding <=> '[-0.0020264734,-0.016582033,0.027258193
...
-0.0051468653,-0.012440448]'::vector)
Limit: 10
Planning Time: 136.579 ms
Execution Time: 6.791 ms
(6 rows)
यह सिर्फ़ टेक्स्ट एम्बेडिंग मॉडल का इस्तेमाल करके, टेक्स्ट एम्बेडिंग की खोज की गई थी. हालांकि, हमारे पास अपने प्रॉडक्ट की इमेज भी हैं और हम उन्हें खोज के साथ इस्तेमाल कर सकते हैं. अगले चैप्टर में हम दिखाएंगे कि मल्टीमॉडल मॉडल, खोज के लिए इमेज का इस्तेमाल कैसे करता है.
8. मल्टीमोडल सर्च का इस्तेमाल करना
टेक्स्ट पर आधारित सिमैंटिक सर्च (शब्दों के मतलब के हिसाब से खोज) काम की होती है. हालांकि, इसमें जटिल जानकारी देना मुश्किल हो सकता है. AlloyDB की मल्टीमॉडल सर्च सुविधा, इमेज इनपुट के ज़रिए प्रॉडक्ट खोजने की सुविधा देती है. इससे आपको फ़ायदा मिलता है. यह खास तौर पर तब मददगार होता है, जब विज़ुअल प्रज़ेंटेशन से, सिर्फ़ टेक्स्ट के ब्यौरे की तुलना में खोज के इरादे को ज़्यादा असरदार तरीके से समझा जा सकता है. उदाहरण के लिए - "मुझे इस तस्वीर में दिख रहा कोट ढूंढकर दिखाओ".
आइए, जैकेट वाले उदाहरण पर वापस चलते हैं. अगर मेरे पास किसी ऐसी जैकेट की तस्वीर है जो मुझे ढूंढनी है, तो मैं उसे Google के मल्टीमॉडल एम्बेडिंग मॉडल को भेज सकता हूं. इसके बाद, मैं उसकी तुलना अपने प्रॉडक्ट की इमेज के एम्बेडिंग से कर सकता हूं. हमारी टेबल में, हमने product_image_embedding कॉलम में अपने प्रॉडक्ट की इमेज के लिए एम्बेडिंग पहले ही कैलकुलेट कर ली हैं. साथ ही, product_image_embedding_model कॉलम में इस्तेमाल किए गए मॉडल को देखा जा सकता है.
खोज के लिए, हम image_embedding फ़ंक्शन का इस्तेमाल करके, अपनी इमेज के लिए एम्बेडिंग पा सकते हैं. साथ ही, इसकी तुलना पहले से कैलकुलेट की गई एम्बेडिंग से कर सकते हैं. इस फ़ंक्शन को चालू करने के लिए, हमें यह पक्का करना होगा कि हम google_ml_integration एक्सटेंशन के सही वर्शन का इस्तेमाल कर रहे हों.
आइए, एक्सटेंशन के मौजूदा वर्शन की पुष्टि करते हैं. AlloyDB Studio में जाकर, इस क्वेरी को चलाएं.
SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
अगर वर्शन 1.4.4 से कम है, तो यह तरीका अपनाएं.
CALL google_ml.upgrade_to_preview_version();
साथ ही, एक्सटेंशन का वर्शन फिर से देखें. यह 1.4.4 होना चाहिए.
यहां खोज के लिए मेरी सैंपल इमेज दी गई है. हालांकि, आपके पास किसी भी कस्टम इमेज का इस्तेमाल करने का विकल्प है. आपको बस इसे Google स्टोरेज या सार्वजनिक तौर पर उपलब्ध किसी अन्य संसाधन पर अपलोड करना होगा. इसके बाद, क्वेरी में यूआरआई डालना होगा.
इसे gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png पर अपलोड किया गया है
इमेज की मदद से इमेज खोजना
सबसे पहले, हम सिर्फ़ इमेज की मदद से खोज करने की कोशिश करते हैं:
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_image_embedding <=> google_ml.image_embedding (model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
4;
साथ ही, हमें इन्वेंट्री में कुछ गर्म जैकेट मिलीं.
इमेज खोज की सुविधा से, हमें ऐसे आइटम मिलते हैं जो तुलना के लिए दी गई हमारी इमेज से मिलते-जुलते हैं. जैसा कि मैंने पहले ही बताया है, आपके पास अपनी इमेज को किसी सार्वजनिक बकेट में अपलोड करने का विकल्प है. इससे यह पता लगाया जा सकता है कि क्या यह अलग-अलग तरह के कपड़ों की पहचान कर सकता है.
हमने इमेज से खोजने की सुविधा के लिए, Google के ‘multimodalembedding@001' मॉडल का इस्तेमाल किया है. हमारा image_embedding फ़ंक्शन, इमेज को Vertex AI पर भेजता है. इसके बाद, यह उसे वेक्टर में बदलता है और वापस भेजता है, ताकि हमारी डेटाबेस में मौजूद इमेज के सेव किए गए वेक्टर से तुलना की जा सके.
"EXPLAIN ANALYZE" का इस्तेमाल करके, यह भी देखा जा सकता है कि यह हमारे AlloyDB ScaNN इंडेक्स के साथ कितनी तेज़ी से काम करता है.
Limit (cost=971.70..975.55 rows=4 width=490) (actual time=2.453..2.477 rows=4 loops=1)
-> Index Scan using product_image_embedding_scann on products (cost=971.70..28998.90 rows=29120 width=490) (actual time=2.451..2.475 rows=4 loops=1)
Order By: (product_image_embedding <=> '[0.02119865,0.034206174,0.030682731,
...
,-0.010307034,-0.010053742]'::vector)
Limit: 4
Planning Time: 913.322 ms
Execution Time: 2.517 ms
(6 rows)
पिछले उदाहरण की तरह, इस उदाहरण में भी हम देख सकते हैं कि क्लाउड एंडपॉइंट का इस्तेमाल करके, इमेज को एम्बेडिंग में बदलने में ज़्यादा समय लगा. वहीं, वेक्टर सर्च में सिर्फ़ 2.5 मि॰से॰ लगे.
टेक्स्ट डालकर इमेज खोजना
मल्टीमॉडल की मदद से, हमें जिस जैकेट को खोजना है उसके बारे में टेक्स्ट में जानकारी दी जा सकती है. इसके लिए, google_ml.text_embedding का इस्तेमाल किया जा सकता है. साथ ही, इमेज एम्बेडिंग से तुलना करके यह देखा जा सकता है कि मॉडल कौनसी इमेज दिखाता है.
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_image_embedding <=> google_ml.text_embedding (model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
4;
इसके अलावा, हमें ग्रे या गहरे रंग की पफ़ी जैकेट का एक सेट मिला.
हमें जैकेट का थोड़ा अलग सेट मिला है. हालांकि, इसने हमारी जानकारी के आधार पर जैकेट को सही तरीके से चुना है. साथ ही, इमेज एम्बेडिंग के ज़रिए खोज की है.
आइए, खोज के लिए इस्तेमाल की गई इमेज के एम्बेड किए गए डेटा का इस्तेमाल करके, जानकारी में खोज करने का कोई दूसरा तरीका आज़माएं.
इमेज की मदद से टेक्स्ट खोजना
हमने अपनी इमेज के लिए, एम्बेडिंग पास करने वाली इमेज खोजीं. साथ ही, अपने प्रॉडक्ट के लिए पहले से कैलकुलेट की गई इमेज एम्बेडिंग से उनकी तुलना की. हमने टेक्स्ट के लिए एम्बेडिंग पास करके इमेज खोजने की कोशिश की. साथ ही, प्रॉडक्ट की इमेज के लिए, उसी एम्बेडिंग में खोज की. अब हम अपनी इमेज के लिए एम्बेडिंग का इस्तेमाल करके देखते हैं और प्रॉडक्ट के ब्यौरे के लिए टेक्स्ट एम्बेडिंग से इसकी तुलना करते हैं. एम्बेडिंग को product_description_embedding कॉलम में सेव किया जाता है. साथ ही, यह multimodalembedding@001 मॉडल का इस्तेमाल करता है.
हमारी क्वेरी यहां दी गई है:
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_description_embedding <=> google_ml.image_embedding (model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
4;
यहां हमें कुछ अलग तरह की जैकेट मिली हैं. ये जैकेट, गहरे या हल्के रंग की हैं. इनमें से कुछ जैकेट, खोज के अलग-अलग तरीकों से मिली जैकेट से मिलती-जुलती हैं या उनके जैसी हैं.
साथ ही, यह ऊपर दी गई जैकेट को थोड़े अलग क्रम में दिखाता है. इमेज के लिए एम्बेडिंग के आधार पर, यह टेक्स्ट के ब्यौरे के लिए कैलकुलेट की गई एम्बेडिंग से तुलना कर सकता है. साथ ही, प्रॉडक्ट का सही सेट दिखा सकता है.
टेक्स्ट और इमेज, दोनों का इस्तेमाल करके खोज करना
टेक्स्ट और इमेज, दोनों के एम्बेडिंग को एक साथ मिलाकर भी एक्सपेरिमेंट किया जा सकता है. इसके लिए, उदाहरण के तौर पर रेसिप्रोकल रैंक फ़्यूज़न का इस्तेमाल किया जा सकता है. यहां ऐसी क्वेरी का एक उदाहरण दिया गया है, जिसमें हमने दो खोजों को मिलाकर, हर रैंक को एक स्कोर असाइन किया है. साथ ही, मिले हुए स्कोर के आधार पर नतीजों को क्रम से लगाया है.
WITH image_search AS (
SELECT id,
RANK () OVER (ORDER BY product_image_embedding <=>google_ml.image_embedding(model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector) AS rank
FROM ecomm.products
ORDER BY product_image_embedding <=>google_ml.image_embedding(model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector LIMIT 5
),
text_search AS (
SELECT id,
RANK () OVER (ORDER BY product_description_embedding <=>google_ml.text_embedding(model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour'
)::vector) AS rank
FROM ecomm.products
ORDER BY product_description_embedding <=>google_ml.text_embedding(model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour'
)::vector LIMIT 5
),
rrf_score AS (
SELECT
COALESCE(image_search.id, text_search.id) AS id,
COALESCE(1.0 / (60 + image_search.rank), 0.0) + COALESCE(1.0 / (60 + text_search.rank), 0.0) AS rrf_score
FROM image_search FULL OUTER JOIN text_search ON image_search.id = text_search.id
ORDER BY rrf_score DESC
)
SELECT
ep.name,
ep.product_description,
ep.retail_price,
replace(ep.product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM ecomm.products ep, rrf_score
WHERE
ep.id=rrf_score.id
ORDER by rrf_score DESC
LIMIT 4;
क्वेरी में अलग-अलग पैरामीटर का इस्तेमाल करके देखें कि इससे खोज के नतीजों को बेहतर बनाया जा सकता है या नहीं.
इससे लैब बंद हो जाएगा. हमारा सुझाव है कि आप इस्तेमाल न किए गए संसाधनों को मिटा दें, ताकि आपसे अनचाहा शुल्क न लिया जाए.
इसके अलावा, नतीजों को रैंक करने के लिए अन्य एआई ऑपरेटरों का इस्तेमाल किया जा सकता है. इसके बारे में दस्तावेज़ में बताया गया है.
9. एनवायरमेंट को साफ़ करना
लैब का इस्तेमाल पूरा हो जाने पर, 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.
10. बधाई हो
कोडलैब पूरा करने के लिए बधाई. आपने टेक्स्ट और इमेज के लिए एम्बेडिंग फ़ंक्शन का इस्तेमाल करके, AlloyDB में मल्टीमॉडल सर्च का इस्तेमाल करने का तरीका सीखा. AlloyDB AI ऑपरेटर के लिए कोडलैब का इस्तेमाल करके, मल्टीमॉडल सर्च को आज़माया जा सकता है. साथ ही, google_ml.rank फ़ंक्शन का इस्तेमाल करके इसे बेहतर बनाया जा सकता है.
हमने क्या-क्या बताया
- AlloyDB for Postgres को डिप्लॉय करने का तरीका
- मल्टीमोडल वेक्टर सर्च का इस्तेमाल कैसे करें
- AlloyDB AI ऑपरेटर चालू करने का तरीका
- मल्टीमॉडल सर्च के लिए, AlloyDB AI के अलग-अलग ऑपरेटर इस्तेमाल करने का तरीका
- टेक्स्ट और इमेज के खोज नतीजों को एक साथ देखने के लिए, AlloyDB AI का इस्तेमाल कैसे करें
11. सर्वे
आउटपुट: