1. खास जानकारी
आज के समय में, रीटेल इंडस्ट्री में तेज़ी से बदलाव हो रहे हैं. ऐसे में, खरीदारों को उनकी पसंद के हिसाब से खरीदारी का अनुभव देने के साथ-साथ, उन्हें बेहतरीन ग्राहक सेवा देना बहुत ज़रूरी है. हम आपको तकनीकी जानकारी देंगे. इसमें, नॉलेज-ड्रिवन चैट ऐप्लिकेशन बनाने के बारे में बताया जाएगा. इस ऐप्लिकेशन को खरीदारों के सवालों के जवाब देने, प्रॉडक्ट खोजने में उनकी मदद करने, और खोज के नतीजों को उनकी पसंद के मुताबिक बनाने के लिए डिज़ाइन किया गया है. इस इनोवेटिव समाधान में, डेटा स्टोरेज के लिए AlloyDB, कॉन्टेक्स्ट को समझने के लिए इन-हाउस ऐनलिटिक्स इंजन, काम की जानकारी की पुष्टि करने के लिए Gemini (लार्ज लैंग्वेज मॉडल), और तेज़ी से एक इंटेलिजेंट बातचीत करने वाला असिस्टेंट बनाने के लिए Google का Agent Builder शामिल है.
चुनौती: आज के खुदरा खरीदार, तुरंत जवाब और प्रॉडक्ट के ऐसे सुझाव चाहते हैं जो उनकी खास प्राथमिकताओं के मुताबिक हों. खोज के पुराने तरीकों से, अक्सर इस तरह के मनमुताबिक नतीजे नहीं मिलते.
समाधान: हमारा चैट ऐप्लिकेशन, इस चुनौती का सामना करने में आपकी मदद करता है. यह आपके खुदरा कारोबार के डेटा से मिली जानकारी का इस्तेमाल करता है. इससे खरीदार की दिलचस्पी को समझने, स्मार्ट तरीके से जवाब देने, और काम के नतीजे देने में मदद मिलती है.
आपको क्या बनाना है
इस लैब (पहला हिस्सा) में, आपको ये काम करने होंगे:
- AlloyDB इंस्टेंस बनाना और ई-कॉमर्स डेटासेट लोड करना
- AlloyDB में pgvector और जनरेटिव एआई मॉडल एक्सटेंशन चालू करना
- प्रॉडक्ट के ब्यौरे से एम्बेडिंग जनरेट करना
- उपयोगकर्ता के खोज टेक्स्ट के लिए, कोसाइन सिमिलैरिटी सर्च को रीयल टाइम में लागू करना
- सर्वरलेस Cloud Run फ़ंक्शन में समाधान डिप्लॉय करना
लैब के दूसरे हिस्से में, एजेंट बिल्डर के चरणों के बारे में बताया जाएगा.
ज़रूरी शर्तें
2. आर्किटेक्चर
डेटा फ़्लो: आइए, इस बारे में ज़्यादा जानें कि हमारे सिस्टम में डेटा कैसे ट्रांसफ़र होता है:
डेटा डालना:
हमारा पहला चरण, खुदरा कारोबार से जुड़े डेटा (इन्वेंट्री, प्रॉडक्ट के ब्यौरे, ग्राहक के इंटरैक्शन) को AlloyDB में डालना है.
Analytics Engine:
हम AlloyDB का इस्तेमाल, आंकड़ों के विश्लेषण वाले इंजन के तौर पर करेंगे. इससे ये काम किए जा सकेंगे:
- कॉन्टेक्स्ट एक्सट्रैक्शन: इंजन, AlloyDB में सेव किए गए डेटा का विश्लेषण करता है. इससे उसे प्रॉडक्ट, कैटगरी, खरीदार के व्यवहार वगैरह के बीच के संबंधों को समझने में मदद मिलती है.
- एम्बेडिंग बनाना: उपयोगकर्ता की क्वेरी और AlloyDB में सेव की गई जानकारी, दोनों के लिए एम्बेडिंग (टेक्स्ट का गणितीय प्रतिनिधित्व) जनरेट की जाती हैं.
- वेक्टर सर्च: यह इंजन, मिलती-जुलती चीज़ों को खोजने की सुविधा देता है. इसके लिए, यह क्वेरी एम्बेडिंग की तुलना, प्रॉडक्ट के ब्यौरे, समीक्षाओं, और अन्य काम के डेटा की एम्बेडिंग से करता है. इससे "सबसे नज़दीकी पड़ोसी" के तौर पर, सबसे काम के 25 पॉइंट की पहचान की जाती है.
Gemini की पुष्टि:
इन संभावित जवाबों को Gemini के पास आकलन के लिए भेजा जाता है. Gemini यह तय करता है कि ये जवाब, उपयोगकर्ता के लिए वाकई काम के हैं या नहीं. साथ ही, यह भी कि इन्हें उपयोगकर्ता के साथ शेयर करना सुरक्षित है या नहीं.
जवाब जनरेट करने की सुविधा:
पुष्टि किए गए जवाबों को JSON ऐरे में स्ट्रक्चर किया जाता है. साथ ही, पूरे इंजन को सर्वरलेस Cloud Run फ़ंक्शन में पैकेज किया जाता है. इसे Agent Builder से शुरू किया जाता है.
बातचीत वाला इंटरैक्शन:
Agent Builder, उपयोगकर्ता को सामान्य भाषा में जवाब देता है, जिससे बातचीत को आगे बढ़ाया जा सकता है. इस हिस्से के बारे में, फ़ॉलो-अप लैब में बताया जाएगा.
3. शुरू करने से पहले
प्रोजेक्ट बनाना
- Google Cloud Console में, प्रोजेक्ट चुनने वाले पेज पर जाकर, Google Cloud प्रोजेक्ट चुनें या बनाएं.
- पक्का करें कि आपके Cloud प्रोजेक्ट के लिए बिलिंग चालू हो. किसी प्रोजेक्ट के लिए बिलिंग चालू है या नहीं, यह देखने का तरीका जानें .
- आपको Cloud Shell का इस्तेमाल करना होगा. यह Google Cloud में चलने वाला कमांड-लाइन एनवायरमेंट है. इसमें bq पहले से लोड होता है. Google Cloud Console में सबसे ऊपर मौजूद, Cloud Shell चालू करें पर क्लिक करें.

- Cloud Shell से कनेक्ट होने के बाद, यह देखने के लिए कि आपकी पुष्टि हो चुकी है और प्रोजेक्ट को आपके प्रोजेक्ट आईडी पर सेट किया गया है, इस निर्देश का इस्तेमाल करें:
gcloud auth list
- यह पुष्टि करने के लिए कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है, Cloud Shell में यह कमांड चलाएं.
gcloud config list project
- अगर आपका प्रोजेक्ट सेट नहीं है, तो इसे सेट करने के लिए इस निर्देश का इस्तेमाल करें:
gcloud config set project <YOUR_PROJECT_ID>
- ज़रूरी एपीआई चालू करें.
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com
gcloud कमांड के बजाय, कंसोल का इस्तेमाल करके भी ऐसा किया जा सकता है. इसके लिए, हर प्रॉडक्ट को खोजें या इस लिंक का इस्तेमाल करें.
अगर कोई एपीआई छूट जाता है, तो उसे लागू करने के दौरान कभी भी चालू किया जा सकता है.
gcloud कमांड और उनके इस्तेमाल के बारे में जानने के लिए, दस्तावेज़ देखें.
4. डेटाबेस सेटअप करना
इस लैब में, हम खुदरा कारोबार से जुड़े डेटा को सेव करने के लिए, डेटाबेस के तौर पर AlloyDB का इस्तेमाल करेंगे. यह सभी संसाधनों को सेव करने के लिए, क्लस्टर का इस्तेमाल करता है. जैसे, डेटाबेस और लॉग. हर क्लस्टर में एक प्राइमरी इंस्टेंस होता है, जो डेटा का ऐक्सेस पॉइंट उपलब्ध कराता है. टेबल में असल डेटा होगा.
आइए, एक AlloyDB क्लस्टर, इंस्टेंस, और टेबल बनाएं. इसमें ई-कॉमर्स डेटासेट लोड किया जाएगा.
क्लस्टर और इंस्टेंस बनाना
- Cloud Console में AlloyDB पेज पर जाएं. Cloud Console में ज़्यादातर पेजों को आसानी से ढूंढने के लिए, कंसोल के खोज बार का इस्तेमाल करके उन्हें खोजें.
- उस पेज पर जाकर, क्लस्टर बनाएं चुनें:

- आपको नीचे दी गई इमेज जैसी स्क्रीन दिखेगी. नीचे दी गई वैल्यू के साथ क्लस्टर और इंस्टेंस बनाएं:
- क्लस्टर आईडी: "
shopping-cluster" - password: "
alloydb" - PostgreSQL 15 के साथ काम करता है
- देश/इलाका: "
us-central1" - नेटवर्किंग: "
default"

- डिफ़ॉल्ट नेटवर्क चुनने पर, आपको नीचे दी गई इमेज जैसी स्क्रीन दिखेगी. कनेक्शन सेट अप करें को चुनें.

- इसके बाद, "अपने-आप असाइन की गई आईपी रेंज का इस्तेमाल करें" को चुनें और जारी रखें पर क्लिक करें. जानकारी देखने के बाद, कनेक्शन बनाएं को चुनें.

- नेटवर्क सेट अप हो जाने के बाद, क्लस्टर बनाना जारी रखा जा सकता है. नीचे दिए गए तरीके से क्लस्टर सेट अप करने के लिए, CREATE CLUSTER पर क्लिक करें:

पक्का करें कि आपने इंस्टेंस आईडी को "shopping-instance" में बदल दिया हो.
ध्यान दें कि क्लस्टर बनने में करीब 10 मिनट लगेंगे. पुष्टि हो जाने के बाद, आपको इस तरह की स्क्रीन दिखेगी:

5. डेटा डालना
अब स्टोर के बारे में जानकारी देने वाली टेबल जोड़ें. AlloyDB पर जाएं. इसके बाद, प्राइमरी क्लस्टर और फिर AlloyDB Studio चुनें:

आपको इंस्टेंस बनने तक इंतज़ार करना पड़ सकता है. इसके बाद, क्लस्टर बनाते समय बनाए गए क्रेडेंशियल का इस्तेमाल करके, AlloyDB में साइन इन करें. PostgreSQL में पुष्टि करने के लिए, इस डेटा का इस्तेमाल करें:
- उपयोगकर्ता नाम : "
postgres" - डेटाबेस : "
postgres" - पासवर्ड : "
alloydb"
AlloyDB Studio में पुष्टि हो जाने के बाद, SQL कमांड को एडिटर में डाला जाता है. आखिरी विंडो के दाईं ओर मौजूद प्लस आइकॉन का इस्तेमाल करके, एक से ज़्यादा Editor विंडो जोड़ी जा सकती हैं.

एडिटर विंडो में, AlloyDB के लिए कमांड डाली जाती हैं. इसके लिए, ज़रूरत के हिसाब से 'चलाएं', 'फ़ॉर्मैट करें', और 'मिटाएं' विकल्पों का इस्तेमाल किया जाता है.
एक्सटेंशन चालू करना
इस ऐप्लिकेशन को बनाने के लिए, हम pgvector और google_ml_integration एक्सटेंशन का इस्तेमाल करेंगे. pgvector एक्सटेंशन की मदद से, वेक्टर एम्बेडिंग को सेव किया जा सकता है और उन्हें खोजा जा सकता है. google_ml_integration एक्सटेंशन, ऐसे फ़ंक्शन उपलब्ध कराता है जिनका इस्तेमाल करके, Vertex AI के अनुमान लगाने वाले एंडपॉइंट को ऐक्सेस किया जा सकता है. इससे एसक्यूएल में अनुमान मिलते हैं. इन एक्सटेंशन को चालू करें. इसके लिए, ये DDL चलाएं:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
अगर आपको अपने डेटाबेस पर चालू किए गए एक्सटेंशन देखने हैं, तो यह एसक्यूएल कमांड चलाएं:
select extname, extversion from pg_extension;
टेबल बनाना
नीचे दिए गए डीडीएल स्टेटमेंट का इस्तेमाल करके, एक टेबल बनाएं:
CREATE TABLE
apparels ( id BIGINT,
category VARCHAR(100),
sub_category VARCHAR(50),
uri VARCHAR(200),
image VARCHAR(100),
content VARCHAR(2000),
pdt_desc VARCHAR(5000),
embedding vector(768) );
ऊपर दिए गए निर्देश को चलाने के बाद, आपको डेटाबेस में टेबल दिखनी चाहिए. यहाँ एक सैंपल स्क्रीनशॉट दिखाया गया है:

डेटा डालना
इस लैब के लिए, हमारे पास इस SQL फ़ाइल में करीब 200 रिकॉर्ड का टेस्ट डेटा है. इसमें id, category, sub_category, uri, image और content शामिल हैं. अन्य फ़ील्ड को लैब में बाद में भरा जाएगा.
वहां से 20 लाइनों/INSERT स्टेटमेंट को कॉपी करें. इसके बाद, उन लाइनों को खाली एडिटर टैब में चिपकाएं और 'चलाएं' को चुनें.
टेबल का कॉन्टेंट देखने के लिए, एक्सप्लोरर सेक्शन को तब तक बड़ा करें, जब तक आपको कपड़े के नाम वाली टेबल न दिख जाए. टेबल से क्वेरी करने का विकल्प देखने के लिए, तीन बिंदु (⋮) चुनें. SELECT स्टेटमेंट, नए एडिटर टैब में खुलेगा.

अनुमति दें
उपयोगकर्ता postgres को embedding फ़ंक्शन पर कार्रवाई करने के अधिकार देने के लिए, नीचे दिया गया स्टेटमेंट चलाएं:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
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"
6. कॉन्टेक्स्ट
AlloyDB इंस्टेंस पेज पर वापस जाएं.
एम्बेडिंग बनाने के लिए, हमें context की ज़रूरत होगी. इसका मतलब है कि हमें एक फ़ील्ड में वह सारी जानकारी शामिल करनी होगी जो हमें एम्बेड करनी है. इसके लिए, हम प्रॉडक्ट का ब्यौरा (इसे हम pdt_desc कहेंगे) तैयार करेंगे. हम अपने मामले में, हर प्रॉडक्ट के बारे में पूरी जानकारी का इस्तेमाल करेंगे. हालांकि, जब आप अपने डेटा के साथ ऐसा करते हैं, तो डेटा को किसी भी तरह से व्यवस्थित करें. इससे आपको अपने कारोबार के लिए फ़ायदेमंद जानकारी मिल सकती है.
हाल ही में बनाए गए इंस्टेंस के AlloyDB studio से यह स्टेटमेंट चलाएं. इससे pdt_desc फ़ील्ड, कॉन्टेक्स्ट डेटा के साथ अपडेट हो जाएगा:
UPDATE
apparels
SET
pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
id IS NOT NULL;
यह डीएमएल, टेबल में मौजूद सभी फ़ील्ड और अन्य डिपेंडेंसी (अगर आपके इस्तेमाल के उदाहरण में कोई डिपेंडेंसी है) से मिली जानकारी का इस्तेमाल करके, कॉन्टेक्स्ट की खास जानकारी बनाता है. ज़्यादा सटीक जानकारी और कॉन्टेक्स्ट बनाने के लिए, डेटा को अपने कारोबार के हिसाब से किसी भी तरीके से व्यवस्थित करें.
7. कॉन्टेक्स्ट के लिए एंबेडिंग बनाना
कंप्यूटर के लिए, टेक्स्ट को प्रोसेस करने की तुलना में नंबर को प्रोसेस करना ज़्यादा आसान होता है. एम्बेडिंग सिस्टम, टेक्स्ट को फ़्लोटिंग पॉइंट नंबर की सीरीज़ में बदलता है. यह सीरीज़, टेक्स्ट को दिखाती है. इससे कोई फ़र्क़ नहीं पड़ता कि टेक्स्ट को किस तरह से लिखा गया है, उसमें किस भाषा का इस्तेमाल किया गया है वगैरह.
समुद्र के किनारे की किसी जगह के बारे में बताएं. इसे "पानी के किनारे", "समुद्र के किनारे", "कमरे से समुद्र तक पैदल जाने की दूरी", "sur la mer", "на берегу океана" वगैरह कहा जा सकता है. ये सभी शब्द अलग-अलग दिखते हैं, लेकिन इनका सिमैंटिक मतलब या मशीन लर्निंग की शब्दावली में, इनके एम्बेडिंग एक-दूसरे से बहुत मिलते-जुलते होने चाहिए.
डेटा और कॉन्टेक्स्ट तैयार होने के बाद, हम एसक्यूएल चलाएंगे, ताकि प्रॉडक्ट के ब्यौरे की एम्बेडिंग को फ़ील्ड embedding में टेबल में जोड़ा जा सके. आपके पास कई तरह के एम्बेडिंग मॉडल इस्तेमाल करने का विकल्प होता है. हम Vertex AI से text-embedding-004 का इस्तेमाल कर रहे हैं. पक्का करें कि पूरे प्रोजेक्ट में एक ही एम्बेडिंग मॉडल का इस्तेमाल किया गया हो!
ध्यान दें: अगर आपको कुछ समय पहले बनाए गए किसी मौजूदा Google Cloud प्रोजेक्ट का इस्तेमाल करना है, तो आपको टेक्स्ट एम्बेड करने वाले मॉडल के पुराने वर्शन का इस्तेमाल जारी रखना पड़ सकता है. जैसे, textembedding-gecko.
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-004',
pdt_desc)
WHERE
TRUE;
कुछ एम्बेड देखने के लिए, apparels टेबल को फिर से देखें. बदलाव देखने के लिए, SELECT स्टेटमेंट को फिर से चलाना न भूलें.
SELECT
id,
category,
sub_category,
content,
embedding
FROM
apparels;
इससे एम्बेडिंग वेक्टर मिलना चाहिए. यह क्वेरी में मौजूद सैंपल टेक्स्ट के लिए, फ़्लोट की एक कैटगरी की तरह दिखता है. इसे यहां दिखाया गया है:

ध्यान दें: मुफ़्त टियर के तहत बनाए गए नए Google Cloud प्रोजेक्ट को, एम्बेडिंग मॉडल के लिए हर सेकंड में एम्बेडिंग के अनुरोधों की संख्या से जुड़ी समस्याएं आ सकती हैं. हमारा सुझाव है कि आईडी के लिए फ़िल्टर क्वेरी का इस्तेमाल करें. इसके बाद, एम्बेडिंग जनरेट करते समय, एक से पांच रिकॉर्ड और इसी तरह के अन्य रिकॉर्ड चुनें.
8. वेक्टर सर्च करना
अब टेबल, डेटा, और एम्बेडिंग तैयार हैं. इसलिए, उपयोगकर्ता के खोज टेक्स्ट के लिए रीयल टाइम वेक्टर सर्च करते हैं.
मान लें कि उपयोगकर्ता ने पूछा:
"मुझे महिलाओं के टॉप चाहिए, जो सिर्फ़ गुलाबी रंग के हों और पूरी तरह से कॉटन के बने हों."
इसके लिए, यहां दी गई क्वेरी चलाकर मैच देखे जा सकते हैं:
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
आइए, इस क्वेरी के बारे में ज़्यादा जानें:
इस क्वेरी में,
- उपयोगकर्ता का खोज टेक्स्ट यह है: "मुझे महिलाओं के टॉप चाहिए, जो सिर्फ़ गुलाबी रंग के हों और कैज़ुअल हों. साथ ही, वे पूरी तरह से कॉटन के बने हों."
- हम इसे
embedding()तरीके से एम्बेडिंग में बदल रहे हैं. इसके लिए,text-embedding-004मॉडल का इस्तेमाल किया जा रहा है. यह चरण पिछले चरण जैसा ही है. पिछले चरण में, हमने टेबल में मौजूद सभी आइटम पर एम्बेड करने की सुविधा लागू की थी. - "
<=>" का मतलब, COSINE SIMILARITY डिस्टेंस मेथड के इस्तेमाल से है. pgvector के दस्तावेज़ में, समानता मापने के सभी तरीके देखे जा सकते हैं. - हम एम्बेड करने के तरीके के नतीजे को वेक्टर टाइप में बदल रहे हैं, ताकि यह डेटाबेस में सेव किए गए वेक्टर के साथ काम कर सके.
- LIMIT 5 का मतलब है कि हमें खोजे गए टेक्स्ट के लिए, पांच सबसे मिलते-जुलते टेक्स्ट निकालने हैं.
नतीजा ऐसा दिखता है:

नतीजों में देखा जा सकता है कि खोज के लिए इस्तेमाल किए गए टेक्स्ट से मिलते-जुलते नतीजे मिले हैं. नतीजों में बदलाव देखने के लिए, रंग बदलकर देखें.
अहम जानकारी:
अब मान लें कि हमें ScaNN इंडेक्स का इस्तेमाल करके, वेक्टर सर्च के इस नतीजे की परफ़ॉर्मेंस (क्वेरी का समय), दक्षता, और रीकॉल को बढ़ाना है. कृपया इंडेक्स के साथ और इंडेक्स के बिना मिले नतीजों की तुलना करने के लिए, इस ब्लॉग में दिए गए तरीके पढ़ें. यहां इंडेक्स बनाने के चरणों की सूची दी गई है, ताकि आपको आसानी हो:
- हमारे पास पहले से ही क्लस्टर, इंस्टेंस, कॉन्टेक्स्ट, और एम्बेडिंग बनाए गए हैं. इसलिए, हमें सिर्फ़ ScaNN एक्सटेंशन इंस्टॉल करना होगा. इसके लिए, हमें यह स्टेटमेंट इस्तेमाल करना होगा:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- इसके बाद, हम इंडेक्स (ScaNN) बनाएंगे:
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);
ऊपर दिए गए DDL में, apparel_index इंडेक्स का नाम है
"apparels" मेरी टेबल है
"scann" इंडेक्स करने का तरीका है
"embedding" टेबल में मौजूद वह कॉलम है जिसे मुझे इंडेक्स करना है
"cosine" वह दूरी का तरीका है जिसका इस्तेमाल मुझे इंडेक्स के साथ करना है
"54" इस इंडेक्स पर लागू किए जाने वाले विभाजनों की संख्या है. इसकी वैल्यू 1 से 1048576 के बीच में सेट करें. इस वैल्यू को तय करने के तरीके के बारे में ज़्यादा जानने के लिए, ScaNN इंडेक्स को ट्यून करना लेख पढ़ें.
मैंने डेटा पॉइंट की संख्या के वर्गमूल का इस्तेमाल किया है. ऐसा ScaNN repo में सुझाया गया है. (पार्टिशन करते समय, num_leaves, डेटापॉइंट की संख्या के वर्गमूल के आस-पास होना चाहिए.).
- देखें कि इंडेक्स, इस क्वेरी का इस्तेमाल करके बनाया गया हो:
SELECT * FROM pg_stat_ann_indexes;
- हमने इंडेक्स के बिना जिस क्वेरी का इस्तेमाल किया था उसी का इस्तेमाल करके, वेक्टर सर्च करें:
select * from apparels
ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
LIMIT 20
ऊपर दी गई क्वेरी वही है जिसका इस्तेमाल हमने लैब में आठवें चरण में किया था. हालांकि, अब हमने फ़ील्ड को इंडेक्स कर लिया है.
- इंडेक्स के साथ और इंडेक्स के बिना (इंडेक्स हटाकर) एक सामान्य खोज क्वेरी से टेस्ट करें:
white tops for girls without any print
ऊपर दिए गए खोज के लिए इस्तेमाल किए गए टेक्स्ट को इंडेक्स किए गए एम्बेडिंग डेटा पर वेक्टर सर्च क्वेरी में इस्तेमाल करने से, खोज के बेहतर नतीजे मिलते हैं और खोज ज़्यादा असरदार तरीके से होती है. इंडेक्स की मदद से, परफ़ॉर्मेंस को काफ़ी बेहतर बनाया गया है. जैसे, ScaNN के बिना इंडेक्स बनाने में 10.37 मि॰से॰ और ScaNN के साथ इंडेक्स बनाने में 0.87 मि॰से॰ लगते हैं. इस विषय के बारे में ज़्यादा जानने के लिए, कृपया यह ब्लॉग पढ़ें.
9. एलएलएम की मदद से मैच की पुष्टि करना
आगे बढ़ने और किसी ऐप्लिकेशन के लिए सबसे सही जवाब देने वाली सेवा बनाने से पहले, आइए जनरेटिव एआई मॉडल का इस्तेमाल करके यह पुष्टि करें कि ये संभावित जवाब, उपयोगकर्ता के लिए वाकई काम के हैं और इन्हें शेयर करना सुरक्षित है.
यह पक्का करना कि Gemini के लिए इंस्टेंस सेट अप किया गया हो
सबसे पहले, यह देखें कि आपके क्लस्टर और इंस्टेंस के लिए, Google ML Integration पहले से चालू है या नहीं. AlloyDB Studio में, यह कमांड दें:
show google_ml_integration.enable_model_support;
अगर वैल्यू "चालू है" के तौर पर दिखती है, तो अगले दो चरणों को छोड़कर सीधे AlloyDB और Vertex AI मॉडल इंटिग्रेशन को सेट अप किया जा सकता है.
- अपने AlloyDB क्लस्टर के प्राइमरी इंस्टेंस पर जाएं और प्राइमरी इंस्टेंस में बदलाव करें पर क्लिक करें

- ऐडवांस कॉन्फ़िगरेशन के विकल्पों में जाकर, फ़्लैग सेक्शन पर जाएं. साथ ही, पक्का करें कि
google_ml_integration.enable_model_support flagको नीचे दिखाए गए तरीके से "on" पर सेट किया गया हो:

अगर यह "चालू है" पर सेट नहीं है, तो इसे "चालू है" पर सेट करें. इसके बाद, अपडेट इंस्टेंस बटन पर क्लिक करें. इस चरण में कुछ मिनट लगेंगे.
AlloyDB और Vertex AI मॉडल का इंटिग्रेशन
अब AlloyDB Studio से कनेक्ट करें और यहां दिया गया DML स्टेटमेंट चलाएं. इससे AlloyDB से Gemini मॉडल का ऐक्सेस सेट अप किया जा सकेगा. इसके लिए, आपको अपनी प्रोजेक्ट आईडी का इस्तेमाल करना होगा. कमांड चलाने से पहले, आपको सिंटैक्स की गड़बड़ी के बारे में चेतावनी मिल सकती है. हालांकि, यह ठीक से काम करेगी.
सबसे पहले, हम Gemini 1.5 मॉडल का कनेक्शन बनाते हैं. इसे नीचे दिखाया गया है. नीचे दिए गए कमांड में, $PROJECT_ID की जगह अपना Google Cloud प्रोजेक्ट आईडी डालना न भूलें.
CALL
google_ml.create_model( model_id => 'gemini-1.5',
model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-1.5-pro:streamGenerateContent',
model_provider => 'google',
model_auth_type => 'alloydb_service_agent_iam');
AlloyDB Studio में, ऐक्सेस के लिए कॉन्फ़िगर किए गए मॉडल की जांच करने के लिए, इस निर्देश का इस्तेमाल करें:
select model_id,model_type from google_ml.model_info_view;
आखिर में, हमें डेटाबेस के उपयोगकर्ताओं को ml_predict_row फ़ंक्शन को लागू करने की अनुमति देनी होगी, ताकि वे Google Vertex AI मॉडल के ज़रिए अनुमान लगा सकें. यह कमांड चलाएं:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
ध्यान दें: अगर किसी मौजूदा Google Cloud प्रोजेक्ट और AlloyDB के ऐसे मौजूदा क्लस्टर/इंस्टेंस का इस्तेमाल किया जा रहा है जिसे कुछ समय पहले बनाया गया था, तो आपको gemini-1.5 मॉडल के पुराने रेफ़रंस हटाने पड़ सकते हैं. साथ ही, ऊपर दिए गए CALL स्टेटमेंट का इस्तेमाल करके, उन्हें फिर से बनाना पड़ सकता है. इसके अलावा, अगर आपको gemini-1.5 के आने वाले इनवोकेशन में समस्याएं आती हैं, तो आपको ml_predict_row फ़ंक्शन पर grant execute को फिर से चलाना पड़ सकता है.
जवाबों का आकलन करना
अगले सेक्शन में, हम एक बड़ी क्वेरी का इस्तेमाल करेंगे, ताकि यह पक्का किया जा सके कि क्वेरी से मिले जवाब सही हों. हालांकि, क्वेरी को समझना मुश्किल हो सकता है. अब हम इन हिस्सों पर नज़र डालेंगे और देखेंगे कि ये कुछ ही मिनटों में कैसे एक साथ जुड़ जाते हैं.
- सबसे पहले, हम डेटाबेस को एक अनुरोध भेजेंगे, ताकि उपयोगकर्ता की क्वेरी से मिलते-जुलते पांच जवाब मिल सकें. हम इस क्वेरी को आसान बनाने के लिए, इसे हार्डकोड कर रहे हैं. हालांकि, चिंता न करें. हम इसे बाद में क्वेरी में इंटरपोलेट कर देंगे. हम
apparelsटेबल से प्रॉडक्ट का ब्यौरा शामिल कर रहे हैं. साथ ही, दो नए फ़ील्ड जोड़ रहे हैं. इनमें से एक फ़ील्ड में, ब्यौरे के साथ इंडेक्स को जोड़ा गया है और दूसरे में ओरिजनल अनुरोध को जोड़ा गया है. यह सबxyzनाम की टेबल में सेव किया जा रहा है. यह सिर्फ़ टेबल का अस्थायी नाम है.
CREATE TABLE
xyz AS
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' AS user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
इस क्वेरी का आउटपुट, उपयोगकर्ताओं की क्वेरी से मिलती-जुलती पांच लाइनें होंगी. नई टेबल xyz में पांच लाइनें होंगी. हर लाइन में ये कॉलम होंगे:
literaturecontentuser_text
- जवाब कितने सही हैं, यह पता लगाने के लिए हम एक मुश्किल क्वेरी का इस्तेमाल करेंगे. इसमें हम यह बताएंगे कि जवाबों का आकलन कैसे किया जाता है. यह क्वेरी के हिस्से के तौर पर,
xyzटेबल मेंuser_textऔरcontentका इस्तेमाल करती है.
"Read this user search text: ', user_text,
' Compare it against the product inventory data set: ', content,
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
- उस क्वेरी का इस्तेमाल करके, हम
xyzटेबल में दिए गए जवाबों की "गुणवत्ता" की समीक्षा करेंगे.
CREATE TABLE
x AS
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
xyz;
predict_row, नतीजे को JSON फ़ॉर्मैट में दिखाता है. कोड "-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"का इस्तेमाल, उस JSON से असल टेक्स्ट निकालने के लिए किया जाता है. अगर आपको असली JSON देखना है, तो इस कोड को हटाया जा सकता है.- आखिर में, एलएलएम फ़ील्ड पाने के लिए, आपको इसे x टेबल से निकालना होगा:
SELECT
LLM_RESPONSE
FROM
x;
- इसे अगली क्वेरी में इस तरह से शामिल किया जा सकता है.
अगर आपने इंटरमीडिएट नतीजों की जांच करने के लिए ऊपर दी गई क्वेरी चलाई हैं, तो आपको इस क्वेरी को चलाने से पहले, AlloyDB डेटाबेस से xyz और x टेबल मिटानी/हटाने होंगी.
SELECT
LLM_RESPONSE
FROM (
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM (
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
हालांकि, यह अब भी मुश्किल लग सकता है, लेकिन उम्मीद है कि आपको इससे कुछ मदद मिलेगी. नतीजों से पता चलता है कि कोई मिलता-जुलता कॉन्टेंट है या नहीं. साथ ही, यह भी पता चलता है कि वह कॉन्टेंट कितने प्रतिशत तक मिलता-जुलता है. इसके अलावा, रेटिंग के बारे में कुछ जानकारी भी मिलती है.
ध्यान दें कि Gemini मॉडल में स्ट्रीमिंग की सुविधा डिफ़ॉल्ट रूप से चालू होती है. इसलिए, असल जवाब कई लाइनों में फैला होता है: 
10. ऐप्लिकेशन को वेब पर ले जाना
क्या आपको इस ऐप्लिकेशन को वेब पर उपलब्ध कराना है? Cloud Run Functions की मदद से, इस नॉलेज इंजन को सर्वरलेस बनाने के लिए यहां दिया गया तरीका अपनाएं:
- Google Cloud Console में Cloud Run Functions पर जाकर, नया Cloud Run फ़ंक्शन बनाएं. इसके लिए, इस लिंक का भी इस्तेमाल किया जा सकता है: https://console.cloud.google.com/functions/add.
- एनवायरमेंट के तौर पर "Cloud Run फ़ंक्शन" चुनें. फ़ंक्शन का नाम "retail-engine" डालें और क्षेत्र के तौर पर "us-central1" चुनें. पुष्टि करने की सुविधा को "बिना पुष्टि किए गए अनुरोधों को अनुमति दें" पर सेट करें. इसके बाद, आगे बढ़ें पर क्लिक करें. सोर्स कोड के लिए, रनटाइम के तौर पर Java 17 और Inline Editor चुनें.
- डिफ़ॉल्ट रूप से, यह एंट्री पॉइंट को "
gcfv2.HelloHttpFunction" पर सेट करेगा. अपने Cloud Run फ़ंक्शन केHelloHttpFunction.javaऔरpom.xmlमें मौजूद प्लेसहोल्डर कोड को, Java फ़ाइल और XML के कोड से बदलें. - Java फ़ाइल में, $PROJECT_ID प्लेसहोल्डर और AlloyDB कनेक्शन क्रेडेंशियल को अपनी वैल्यू से बदलना न भूलें. AlloyDB क्रेडेंशियल वही हैं जिनका इस्तेमाल हमने इस कोडलैब की शुरुआत में किया था. अगर आपने अलग-अलग वैल्यू का इस्तेमाल किया है, तो कृपया Java फ़ाइल में जाकर उनमें बदलाव करें.
- डिप्लॉय करें पर क्लिक करें.
डिप्लॉय करने के बाद, Cloud फ़ंक्शन को हमारे AlloyDB डेटाबेस इंस्टेंस को ऐक्सेस करने की अनुमति देने के लिए, हम VPC कनेक्टर बनाएंगे.
अहम चरण:
डिप्लॉयमेंट के लिए सेट करने के बाद, आपको Google Cloud Run Functions कंसोल में फ़ंक्शन दिखने चाहिए. नए बनाए गए फ़ंक्शन (retail-engine) को खोजें. इसके बाद, उस पर क्लिक करें. फिर, बदलाव करें पर क्लिक करें और इनमें बदलाव करें:
- रनटाइम, बिल्ड, कनेक्शन, और सुरक्षा सेटिंग पर जाएं
- टाइम आउट की अवधि को 180 सेकंड तक बढ़ाओ
- कनेक्शन टैब पर जाएं:

- Ingress सेटिंग में जाकर, पक्का करें कि "Allow all traffic" चुना गया हो.
- ईग्रैस सेटिंग में जाकर, नेटवर्क ड्रॉपडाउन पर क्लिक करें. इसके बाद, "नया वीपीसी कनेक्टर जोड़ें" विकल्प चुनें. इसके बाद, पॉप-अप होने वाले डायलॉग बॉक्स में दिए गए निर्देशों का पालन करें:

- VPC कनेक्टर को कोई नाम दें. साथ ही, पक्का करें कि क्षेत्र वही हो जो आपके इंस्टेंस का है. नेटवर्क वैल्यू को डिफ़ॉल्ट के तौर पर छोड़ दें. साथ ही, सबनेट को कस्टम आईपी रेंज के तौर पर सेट करें. इसके लिए, 10.8.0.0 या इसी तरह की कोई अन्य उपलब्ध आईपी रेंज का इस्तेमाल करें.
- 'स्केलिंग सेटिंग दिखाएं' को बड़ा करें और पक्का करें कि आपने कॉन्फ़िगरेशन को ठीक इस तरह सेट किया हो:

- CREATE पर क्लिक करें. अब यह कनेक्टर, इग्रेस सेटिंग में दिखना चाहिए.
- नया कनेक्टर चुनें
- इस वीपीसी कनेक्टर के ज़रिए सभी ट्रैफ़िक को रूट करने का विकल्प चुनें.
- आगे बढ़ें और फिर लागू करें पर क्लिक करें.
11. ऐप्लिकेशन को टेस्ट करना
अपडेट किए गए क्लाउड फ़ंक्शन को डिप्लॉय करने के बाद, आपको एंडपॉइंट इस फ़ॉर्मैट में दिखेगा:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/retail-engine
Cloud Shell टर्मिनल से, इस कमांड को चलाकर इसकी जांच की जा सकती है:
gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'
इसके अलावा, Cloud Run फ़ंक्शन को इस तरह से भी आज़माया जा सकता है:
PROJECT_ID=$(gcloud config get-value project)
curl -X POST https://us-central1-$PROJECT_ID.cloudfunctions.net/retail-engine \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
और नतीजा:

हो गया! AlloyDB डेटा पर Embeddings मॉडल का इस्तेमाल करके, Similarity Vector Search करना इतना ही आसान है.
बातचीत करने वाले एजेंट को बनाया जा रहा है!
इस लैब के दूसरे हिस्से में एजेंट बनाया गया है.
12. व्यवस्थित करें
अगर आपको इस लैब का दूसरा हिस्सा पूरा करना है, तो इस चरण को छोड़ दें. ऐसा इसलिए, क्योंकि इससे मौजूदा प्रोजेक्ट मिट जाएगा.
इस पोस्ट में इस्तेमाल की गई संसाधनों के लिए, अपने Google Cloud खाते से शुल्क न लिए जाने के लिए, यह तरीका अपनाएं:
- Google Cloud Console में, संसाधन मैनेज करें पेज पर जाएं.
- प्रोजेक्ट की सूची में, वह प्रोजेक्ट चुनें जिसे आपको मिटाना है. इसके बाद, मिटाएं पर क्लिक करें.
- डायलॉग बॉक्स में, प्रोजेक्ट आईडी टाइप करें. इसके बाद, प्रोजेक्ट मिटाने के लिए बंद करें पर क्लिक करें.
13. बधाई हो
बधाई हो! आपने AlloyDB, pgvector, और वेक्टर सर्च का इस्तेमाल करके, मिलती-जुलती इमेज खोजने की सुविधा का इस्तेमाल कर लिया है. AlloyDB, Vertex AI, और Vector Search की क्षमताओं को मिलाकर, हमने कॉन्टेक्स्ट और वेक्टर सर्च को ज़्यादा बेहतर, असरदार, और काम का बना दिया है. इस लैब के अगले हिस्से में, एजेंट बनाने के चरणों के बारे में बताया गया है.