AlloyDB और Vertex AI Agent Builder की मदद से स्मार्ट शॉपिंग असिस्टेंट बनाएं - पार्ट 1

1. खास जानकारी

आज के तेज़ी से बदलते रीटेल लैंडस्केप में, खरीदारों को उनके हिसाब से खरीदारी का अनुभव देने के साथ-साथ, उन्हें बेहतरीन ग्राहक सेवा देना ज़रूरी है. हम आपको तकनीकी जानकारी देंगे. इसमें, हम आपको जानकारी पर आधारित चैट ऐप्लिकेशन बनाने के बारे में बताएंगे. यह ऐप्लिकेशन, खरीदारों के सवालों के जवाब देने, प्रॉडक्ट खोजने में मदद करने, और खोज के नतीजों को उपयोगकर्ताओं के हिसाब से बनाने के लिए बनाया गया है. इस नए समाधान में, डेटा स्टोरेज के लिए AlloyDB, कॉन्टेक्स्ट को समझने के लिए इन-हाउस एनालिटिक्स इंजन, काम के होने की पुष्टि करने के लिए Gemini (बड़े भाषा मॉडल), और बातचीत वाली बेहतर सहायक को तुरंत बूटस्ट्रैप करने के लिए Google के एजेंट बिल्डर का इस्तेमाल किया गया है.

चुनौती: आधुनिक खुदरा दुकानदारों को तुरंत जवाब चाहिए. साथ ही, उन्हें अपनी पसंद के मुताबिक प्रॉडक्ट के सुझाव भी चाहिए. खोज के पारंपरिक तरीकों से, अक्सर इस लेवल पर खोज के नतीजे मनमुताबिक नहीं मिल पाते.

समाधान: हमारा नॉलेज-ड्रिवन चैट ऐप्लिकेशन, इस समस्या को सीधे तौर पर हल करता है. यह आपके खुदरा डेटा से मिले नॉलेज बेस का फ़ायदा उठाता है, ताकि ग्राहक के इंटेंट को समझा जा सके, बेहतर जवाब दिए जा सकें, और ज़्यादा काम के नतीजे दिए जा सकें.

आपको क्या बनाना है

इस लैब (पहला चरण) के तहत, आपको ये काम करने होंगे:

  1. AlloyDB इंस्टेंस बनाना और ई-कॉमर्स डेटासेट लोड करना
  2. AlloyDB में pgvector और जनरेटिव एआई मॉडल एक्सटेंशन चालू करना
  3. प्रॉडक्ट के ब्यौरे से एम्बेड जनरेट करना
  4. उपयोगकर्ता के खोज टेक्स्ट के लिए, रीयल टाइम में कोसाइन मिलती-जुलती खोज करना
  5. समाधान को सर्वरलेस Cloud Run फ़ंक्शन में डिप्लॉय करना

लैब के दूसरे हिस्से में, एजेंट बिल्डर के चरणों के बारे में बताया जाएगा.

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

  • कोई ब्राउज़र, जैसे कि Chrome या Firefox
  • बिलिंग की सुविधा वाला Google Cloud प्रोजेक्ट.

2. आर्किटेक्चर

डेटा फ़्लो: आइए, इस बात पर नज़र डालें कि डेटा हमारे सिस्टम में कैसे ट्रांसफ़र होता है:

डेटा डालना:

हमारा पहला चरण, खुदरा डेटा (इन्वेंट्री, प्रॉडक्ट की जानकारी, ग्राहक इंटरैक्शन) को AlloyDB में डालना है.

Analytics इंजन:

हम नीचे दी गई कार्रवाइयां करने के लिए, Analytics Engine के तौर पर AlloyDB का इस्तेमाल करेंगे:

  1. कॉन्टेक्स्ट निकालना: इंजन, AlloyDB में सेव किए गए डेटा का विश्लेषण करता है, ताकि प्रॉडक्ट, कैटगरी, ग्राहक के व्यवहार वगैरह के बीच के संबंधों को समझा जा सके.
  2. एम्बेडिंग बनाना: उपयोगकर्ता की क्वेरी और AlloyDB में सेव की गई जानकारी, दोनों के लिए एम्बेडिंग (टेक्स्ट का गणितीय रूप) जनरेट किए जाते हैं.
  3. वेक्टर सर्च: यह इंजन, मिलती-जुलती चीज़ों को खोजने की सुविधा देता है. इसके लिए, यह क्वेरी एम्बेडिंग की तुलना प्रॉडक्ट के ब्यौरे, समीक्षाओं, और काम के दूसरे डेटा के एम्बेडिंग से करता है. इससे, सबसे ज़्यादा काम के 25 "नज़दीकी नेबर" की पहचान की जाती है.

Gemini की पुष्टि:

इन संभावित जवाबों को Gemini के पास आकलन के लिए भेजा जाता है. Gemini यह तय करता है कि ये जानकारी, उपयोगकर्ता के लिए सही और सुरक्षित है या नहीं.

जवाब जनरेट करना:

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

बातचीत वाला इंटरैक्शन:

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

3. शुरू करने से पहले

प्रोजेक्ट बनाना

  1. Google Cloud Console में, प्रोजेक्ट चुनने वाले पेज पर, Google Cloud प्रोजेक्ट चुनें या बनाएं.
  2. पक्का करें कि आपके Cloud प्रोजेक्ट के लिए बिलिंग की सुविधा चालू हो. किसी प्रोजेक्ट के लिए बिलिंग की सुविधा चालू है या नहीं, यह देखने का तरीका जानें .
  3. इसके लिए, आपको Cloud Shell का इस्तेमाल करना होगा. यह Google Cloud में चलने वाला कमांड-लाइन एनवायरमेंट है, जिसमें bq पहले से लोड होता है. Google Cloud कंसोल में सबसे ऊपर, 'Cloud Shell चालू करें' पर क्लिक करें.

Cloud Shell चालू करने के लिए बटन की इमेज

  1. Cloud Shell से कनेक्ट होने के बाद, यह जांच करें कि आपकी पुष्टि पहले ही हो चुकी है या नहीं. साथ ही, यह भी देखें कि प्रोजेक्ट आपके प्रोजेक्ट आईडी पर सेट है या नहीं. इसके लिए, यह कमांड इस्तेमाल करें:
gcloud auth list
  1. Cloud Shell में यह कमांड चलाकर पुष्टि करें कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है.
gcloud config list project
  1. अगर आपका प्रोजेक्ट सेट नहीं है, तो इसे सेट करने के लिए इस निर्देश का इस्तेमाल करें:
gcloud config set project <YOUR_PROJECT_ID>
  1. ज़रूरी एपीआई चालू करें.
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 क्लस्टर, इंस्टेंस, और टेबल बनाएं, जहां ई-कॉमर्स डेटासेट लोड किया जाएगा.

क्लस्टर और इंस्टेंस बनाना

  1. Cloud Console में AlloyDB पेज पर जाएं. Cloud Console में ज़्यादातर पेजों को ढूंढने का सबसे आसान तरीका है, उन्हें कंसोल के खोज बार का इस्तेमाल करके खोजना.
  2. उस पेज से, क्लस्टर बनाएं चुनें:

f76ff480c8c889aa.png

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

538dba58908162fb.png

  1. डिफ़ॉल्ट नेटवर्क चुनने पर, आपको नीचे दी गई स्क्रीन जैसी स्क्रीन दिखेगी. कनेक्शन सेट अप करें को चुनें.
    7939bbb6802a91bf.png
  2. इसके बाद, "अपने-आप असाइन की गई आईपी रेंज का इस्तेमाल करें" चुनें और जारी रखें. जानकारी की समीक्षा करने के बाद, 'कनेक्शन बनाएं' चुनें. 768ff5210e79676f.png
  3. नेटवर्क सेट अप हो जाने के बाद, क्लस्टर बनाना जारी रखा जा सकता है. क्लस्टर सेट अप करने के लिए, 'क्लस्टर बनाएं' पर क्लिक करें. इसके बाद, नीचे दिए गए तरीके से आगे बढ़ें:

e06623e55195e16e.png

पक्का करें कि इंस्टेंस आईडी को "shopping-instance"" में बदल दिया गया हो.

ध्यान दें कि क्लस्टर बनाने में करीब 10 मिनट लगेंगे. पुष्टि हो जाने के बाद, आपको स्क्रीन पर यह मैसेज दिखेगा:

24eec29fa5cfdb3e.png

5. डेटा डालना

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

847e35f1bf8a8bd8.png

आपको इंस्टेंस बनने का इंतज़ार करना पड़ सकता है. इसके बाद, क्लस्टर बनाते समय बनाए गए क्रेडेंशियल का इस्तेमाल करके, AlloyDB में साइन इन करें. PostgreSQL की पुष्टि करने के लिए, नीचे दिए गए डेटा का इस्तेमाल करें:

  • उपयोगकर्ता नाम : "postgres"
  • डेटाबेस : "postgres"
  • पासवर्ड : "alloydb"

AlloyDB Studio में पुष्टि करने के बाद, Editor में SQL निर्देश डाले जाते हैं. आखिरी विंडो की दाईं ओर मौजूद प्लस का इस्तेमाल करके, Editor की कई विंडो जोड़ी जा सकती हैं.

91a86d9469d499c4.png

आपको एडिटर विंडो में AlloyDB के लिए निर्देश डालने होंगे. इसके लिए, ज़रूरत के हिसाब से 'चालू करें', 'फ़ॉर्मैट करें', और 'हटाएं' विकल्पों का इस्तेमाल करें.

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

इस ऐप्लिकेशन को बनाने के लिए, हम एक्सटेंशन pgvector और google_ml_integration का इस्तेमाल करेंगे. pgvector एक्सटेंशन की मदद से, वेक्टर एम्बेडमेंट को स्टोर और खोजा जा सकता है. google_ml_integration एक्सटेंशन, ऐसे फ़ंक्शन उपलब्ध कराता है जिनका इस्तेमाल करके, Vertex AI के अनुमान वाले एंडपॉइंट को ऐक्सेस किया जा सकता है. इससे, एसक्यूएल में अनुमान पाने में मदद मिलती है. इन डीडीएल को चलाकर, इन एक्सटेंशन को चालू करें:

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

अगर आपको अपने डेटाबेस में चालू किए गए एक्सटेंशन की जांच करनी है, तो यह SQL कमांड चलाएं:

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) );

ऊपर दिए गए निर्देश को पूरा करने के बाद, आपको डेटाबेस में टेबल दिखनी चाहिए. इसका सैंपल स्क्रीनशॉट यहां दिया गया है:

908e33bbff58a6d.png

डेटा डालना

इस लैब के लिए, हमारे पास इस SQL फ़ाइल में करीब 200 रिकॉर्ड का टेस्ट डेटा है. इसमें id, category, sub_category, uri, image और content शामिल हैं. अन्य फ़ील्ड, लैब में बाद में भरे जाएंगे.

वहां से 20 लाइनें/insert स्टेटमेंट कॉपी करें. इसके बाद, उन लाइनों को खाली एडिटर टैब में चिपकाएं और 'चालू करें' चुनें.

टेबल का कॉन्टेंट देखने के लिए, एक्सप्लोरर सेक्शन को तब तक बड़ा करें, जब तक आपको कपड़े वाली टेबल न दिख जाए. टेबल पर क्वेरी करने का विकल्प देखने के लिए, ट्राइकोलन (⋮) चुनें. SELECT स्टेटमेंट, Editor के नए टैब में खुलेगा.

b31ece70e670ab89.png

अनुमति दें

उपयोगकर्ता 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 स्टूडियो से, नीचे दिया गया स्टेटमेंट चलाएं. इससे 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 फ़ील्ड में टेबल में प्रॉडक्ट के ब्यौरे के एम्बेड जोड़ने के लिए, SQL चलाएंगे. एम्बेड करने के लिए कई तरह के मॉडल इस्तेमाल किए जा सकते हैं. हम 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;

इससे क्वेरी में मौजूद सैंपल टेक्स्ट के लिए, एम्बेड वैक्टर दिखेगा, जो फ़्लोट के कलेक्शन की तरह दिखता है. यह वैक्टर नीचे दिखाया गया है:

c69c08d085389f74.png

ध्यान दें: मुफ़्त टीयर के तहत बनाए गए नए 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;

आइए, इस क्वेरी के बारे में ज़्यादा जानें:

इस क्वेरी में,

  1. उपयोगकर्ता का खोज टेक्स्ट: "मुझे महिलाओं के लिए टॉप चाहिए, पिंक कैज़ुअल सिर्फ़ शुद्ध कॉटन."
  2. हम इसे मॉडल: text-embedding-004 का इस्तेमाल करके, embedding() तरीके से एम्बेड में बदल रहे हैं. पिछले चरण के बाद, यह चरण आपको जाना-पहचाना लगेगा. पिछले चरण में, हमने टेबल के सभी आइटम में एम्बेड करने की सुविधा लागू की थी.
  3. "<=>", कोसाइन मिलते-जुलते डिस्टेंस मेथड का इस्तेमाल दिखाता है. pgvector के दस्तावेज़ में, मिलती-जुलती चीज़ों के सभी मेज़र उपलब्ध हैं.
  4. हम एम्बेड करने के तरीके के नतीजे को वेक्टर टाइप में बदल रहे हैं, ताकि इसे डेटाबेस में सेव किए गए वेक्टर के साथ काम किया जा सके.
  5. LIMIT 5 से पता चलता है कि हमें खोज के लिए इस्तेमाल हुए टेक्स्ट के सबसे नज़दीकी पांच शब्दों को निकालना है.

नतीजा कुछ ऐसा दिखता है:

4193a68737400535.png

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

9. एलएलएम की मदद से मैच की पुष्टि करना

किसी ऐप्लिकेशन के लिए सबसे सही मैच दिखाने वाली सेवा बनाने से पहले, जनरेटिव एआई मॉडल का इस्तेमाल करके यह पुष्टि करें कि ये संभावित जवाब, उपयोगकर्ता के लिए सही और सुरक्षित हैं या नहीं.

यह पक्का करना कि इंस्टेंस, Gemini के लिए सेट अप किया गया हो

सबसे पहले, देखें कि आपके क्लस्टर और इंस्टेंस के लिए, Google ML इंटिग्रेशन पहले से चालू है या नहीं. AlloyDB Studio में, यह कमांड दें:

show google_ml_integration.enable_model_support;

अगर वैल्यू "चालू है" के तौर पर दिखती है, तो अगले दो चरणों को छोड़ा जा सकता है और सीधे AlloyDB और Vertex AI मॉडल इंटिग्रेशन को सेट अप किया जा सकता है.

  1. अपने AlloyDB क्लस्टर के प्राइमरी इंस्टेंस पर जाएं और प्राइमरी इंस्टेंस में बदलाव करें पर क्लिक करें

456ffdf292d3c0e0.png

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

6a59351fcd2a9d35.png

अगर यह "चालू है" पर सेट नहीं है, तो इसे "चालू है" पर सेट करें. इसके बाद, इंस्टेंस अपडेट करें बटन पर क्लिक करें. इस चरण में कुछ मिनट लगेंगे.

AlloyDB और Vertex AI मॉडल का इंटिग्रेशन

अब AlloyDB Studio से कनेक्ट करके, यहां दिया गया डीएमएल स्टेटमेंट चलाया जा सकता है. इससे, 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 को फिर से चलाएं.

जवाबों का आकलन करना

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

  1. सबसे पहले, हम उपयोगकर्ता की क्वेरी से मिलते-जुलते पांच सबसे सही नतीजे पाने के लिए, डेटाबेस को एक अनुरोध भेजेंगे. हम इसे आसान बनाने के लिए, क्वेरी को हार्डकोड कर रहे हैं. हालांकि, चिंता न करें, हम इसे बाद में क्वेरी में इंटरपोल करेंगे. हम 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 में पांच लाइनें होंगी. हर लाइन में ये कॉलम होंगे:

  • literature
  • content
  • user_text
  1. जवाबों के मान्य होने का पता लगाने के लिए, हम एक जटिल क्वेरी का इस्तेमाल करेंगे. इसमें हम जवाबों का आकलन करने का तरीका बताएंगे. यह क्वेरी के हिस्से के तौर पर, 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."
  1. उस क्वेरी का इस्तेमाल करके, हम 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;
  1. predict_row, अपना नतीजा JSON फ़ॉर्मैट में दिखाता है. कोड "-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'" का इस्तेमाल, उस JSON से असल टेक्स्ट निकालने के लिए किया जाता है. रिटर्न किया गया असल JSON देखने के लिए, इस कोड को हटाया जा सकता है.
  2. आखिर में, LLM फ़ील्ड पाने के लिए, आपको उसे x टेबल से निकालना होगा:
SELECT 
LLM_RESPONSE 
FROM 
        x;
  1. इसे इस तरह से एक ही अगली क्वेरी में जोड़ा जा सकता है.

अगर आपने बीच के नतीजों की जांच करने के लिए ऊपर दी गई क्वेरी चलाई हैं, तो इसे चलाने से पहले आपको 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 मॉडल में स्ट्रीमिंग की सुविधा डिफ़ॉल्ट रूप से चालू रहती है. इसलिए, असल जवाब कई लाइनों में दिखता है: 14e74d71293b7b9.png

10. ऐप्लिकेशन को वेब पर उपलब्ध कराना

क्या आप इस ऐप्लिकेशन को वेब पर उपलब्ध कराने के लिए तैयार हैं? Cloud Run फ़ंक्शन की मदद से, इस नॉलेज इंजन को सर्वरलेस बनाने के लिए, यह तरीका अपनाएं:

  1. नया Cloud Run फ़ंक्शन बनाने के लिए, Google Cloud Console में Cloud Run फ़ंक्शन पर जाएं या इस लिंक का इस्तेमाल करें: https://console.cloud.google.com/functions/add.
  2. एनवायरमेंट के तौर पर "Cloud Run फ़ंक्शन" चुनें. फ़ंक्शन का नाम "retail-engine" डालें और क्षेत्र के तौर पर "us-central1" चुनें. पुष्टि करने की सुविधा को "बिना पुष्टि के अनुरोध करने की अनुमति दें" पर सेट करें और आगे बढ़ें पर क्लिक करें. सोर्स कोड के लिए, रनटाइम के तौर पर Java 17 और इनलाइन एडिटर चुनें.
  3. डिफ़ॉल्ट रूप से, यह एंट्री पॉइंट को "gcfv2.HelloHttpFunction" पर सेट करेगा. अपने Cloud Run फ़ंक्शन के HelloHttpFunction.java और pom.xml में प्लेसहोल्डर कोड को Java फ़ाइल और XML के कोड से बदलें.
  4. Java फ़ाइल में, $PROJECT_ID प्लेसहोल्डर और AlloyDB कनेक्शन क्रेडेंशियल को अपनी वैल्यू से बदलना न भूलें. AlloyDB के क्रेडेंशियल वही हैं जिनका इस्तेमाल हमने इस कोडलैब की शुरुआत में किया था. अगर आपने अलग-अलग वैल्यू का इस्तेमाल किया है, तो कृपया Java फ़ाइल में जाकर उनमें बदलाव करें.
  5. डिप्लॉय करें पर क्लिक करें.

डिप्लॉय होने के बाद, Cloud फ़ंक्शन को हमारे AlloyDB डेटाबेस इंस्टेंस को ऐक्सेस करने की अनुमति देने के लिए, हम VPC कनेक्टर बनाएंगे.

अहम चरण:

डिप्लॉयमेंट सेट अप करने के बाद, आपको Google Cloud Run फ़ंक्शन कंसोल में फ़ंक्शन दिखने चाहिए. नया फ़ंक्शन (retail-engine) खोजें और उस पर क्लिक करें. इसके बाद, बदलाव करें पर क्लिक करें और इनमें बदलाव करें:

  1. रनटाइम, बिल्ड, कनेक्शन, और सुरक्षा सेटिंग पर जाएं
  2. टाइम आउट को 180 सेकंड तक बढ़ाना
  3. 'कनेक्शन' टैब पर जाएं:

4e83ec8a339cda08.png

  1. Ingress की सेटिंग में जाकर, पक्का करें कि "सभी ट्रैफ़िक की अनुमति दें" चुना गया हो.
  2. आउटगोइंग ट्रैफ़िक की सेटिंग में, नेटवर्क ड्रॉपडाउन पर क्लिक करें. इसके बाद, "नया वीपीसी कनेक्टर जोड़ें" विकल्प चुनें और पॉप-अप होने वाले डायलॉग बॉक्स में दिए गए निर्देशों का पालन करें:

8126ec78c343f199.png

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

7baf980463a86a5c.png

  1. 'बनाएं' पर क्लिक करें. इसके बाद, यह कनेक्टर अब एग्ज़िट सेटिंग में दिखेगा.
  2. नया कनेक्टर चुनें
  3. सभी ट्रैफ़िक को इस VPC कनेक्टर से रूट करने का विकल्प चुनें.
  4. आगे बढ़ें पर क्लिक करें. इसके बाद, डिप्लॉय करें पर क्लिक करें.

11. ऐप्लिकेशन की जांच करना

अपडेट किया गया Cloud फ़ंक्शन डिप्लॉय होने के बाद, आपको एंडपॉइंट इस फ़ॉर्मैट में दिखेगा:

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 .

और नतीजा:

88bc1ddfb5644a28.png

हो गया! AlloyDB डेटा पर एम्बेडिंग मॉडल का इस्तेमाल करके, मिलती-जुलती वैक्टर खोज करना इतना आसान है.

बातचीत करने वाला एजेंट बनाना!

एजेंट को इस लैब के दूसरे हिस्से में बनाया गया है.

12. व्यवस्थित करें

अगर आपको इस लैब का दूसरा चरण पूरा करना है, तो यह चरण छोड़ दें. ऐसा करने पर, मौजूदा प्रोजेक्ट मिट जाएगा.

इस पोस्ट में इस्तेमाल किए गए संसाधनों के लिए, अपने Google Cloud खाते से शुल्क न लिए जाएं, इसके लिए यह तरीका अपनाएं:

  1. Google Cloud Console में, संसाधन मैनेज करें पेज पर जाएं.
  2. प्रोजेक्ट की सूची में, वह प्रोजेक्ट चुनें जिसे मिटाना है. इसके बाद, मिटाएं पर क्लिक करें.
  3. डायलॉग बॉक्स में, प्रोजेक्ट आईडी टाइप करें. इसके बाद, प्रोजेक्ट मिटाने के लिए बंद करें पर क्लिक करें.

13. बधाई हो

बधाई हो! आपने AlloyDB, pgvector, और वेक्टर सर्च का इस्तेमाल करके, मिलती-जुलती चीज़ों की खोज की है. AlloyDB, Vertex AI, और वेक्टर सर्च की सुविधाओं को जोड़कर, हमने कॉन्टेक्स्ट और वेक्टर सर्च को ऐक्सेस करने लायक, असरदार, और ज़्यादा काम का बनाने में काफ़ी तरक्की की है. इस लैब के अगले हिस्से में, एजेंट बनाने के चरणों के बारे में बताया गया है.