GenAI और Cloud Run की मदद से, क्विज़ जनरेटर बनाएं

1. परिचय

इस लैब में, आपको एक वेब सेवा बनाने वाली है. इसकी मदद से, क्विज़ जनरेट किए जा सकेंगे और उसे मज़ेदार और काम करने वाले ऐप्लिकेशन में इंटिग्रेट किया जा सकेगा. आपने पहले की तुलना में किसी दूसरी प्रोग्रामिंग भाषा का इस्तेमाल किया है: अंग्रेज़ी!

आपको क्या करना होगा...

  • आपको एक प्रॉम्प्ट तैयार करना होगा, जो ज़रूरी शर्तों के हिसाब से एक क्विज़ जनरेट करेगा.
  • आपको एक आसान वेब ऐप्लिकेशन बनाना होगा और पुष्टि करनी होगी कि यह आपके डेवलपमेंट एनवायरमेंट में उम्मीद के मुताबिक काम करता है.
  • आपको अपने वेब ऐप्लिकेशन में समय के साथ लॉजिक जोड़ना होगा, ताकि उसे एपीआई सर्वर में बदला जा सके. यह सर्वर, इनपुट पैरामीटर के सेट के हिसाब से क्विज़ जनरेट करता है.
  • आप Google Cloud Run का उपयोग करके यह देखेंगे कि क्विज़ जनरेट करने वाली सेवा को क्लाउड पर डिप्लॉय करना कितना आसान है.
  • आखिर में, डिप्लॉय की गई क्विज़ जनरेटर सेवा का इस्तेमाल करने के लिए, एक असली ऐप्लिकेशन ( quizaic.com) को कॉन्फ़िगर करना होगा. इसके बाद, आपको आउटपुट के आधार पर लाइव क्विज़ चलाने की सुविधा मिलेगी.

आपको इनके बारे में जानकारी मिलेगी...

  • बड़े लैंग्वेज मॉडल (एलएलएम) के लिए, टेंप्लेट वाला प्रॉम्प्ट बनाने का तरीका.
  • Python में आसानी से वेब सर्वर ऐप्लिकेशन बनाने का तरीका.
  • अपने वेब ऐप्लिकेशन में, Google के एलएलएम के लिए सहायता जोड़ने का तरीका.
  • अपने ऐप्लिकेशन को क्लाउड पर डिप्लॉय करने का तरीका, ताकि कोई भी व्यक्ति आपके नए ऐप्लिकेशन को आज़मा सके.
  • अपने क्विज़ जनरेटर को किसी बड़े ऐप्लिकेशन के साथ इंटिग्रेट करने का तरीका.

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

  • Chrome वेब ब्राउज़र
  • Google खाता
  • ऐसा क्लाउड प्रोजेक्ट जिसमें बिलिंग की सुविधा चालू हो

यह लैब सभी लेवल के डेवलपर के लिए है. इनमें नए उपयोगकर्ता भी शामिल हैं. हालांकि, आपको Python का इस्तेमाल करना होगा, लेकिन आपको Python प्रोग्रामिंग के बारे में जानकारी होने की ज़रूरत नहीं है. यह इसलिए ज़रूरी है, ताकि यह पता चल सके कि आखिर ऐसा क्यों हो रहा है. ऐसा इसलिए, क्योंकि उन सभी कोड के बारे में हम आपको बताएंगे.

2. सेटअप

a08aa5878e36b60c.png

इस सेक्शन में वह सब कुछ बताया गया है जो आपको इस लैब का इस्तेमाल शुरू करने के लिए करना होगा.

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

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

Cloud Shell शुरू करें

इस लैब में, आपको एक Cloud Shell सेशन में काम करना है. यह एक कमांड इंटरप्रेटर है, जिसे Google के क्लाउड में चल रही एक वर्चुअल मशीन के ज़रिए होस्ट किया जाता है. अपने कंप्यूटर पर, इस सेक्शन को आसानी से चलाया जा सकता है. हालांकि, Cloud Shell का इस्तेमाल करने से सभी लोगों को एक ही तरह के एनवायरमेंट में फिर से जनरेट किए जा सकने वाले अनुभव का ऐक्सेस मिल जाता है. लैब के बाद, अपने कंप्यूटर पर इस सेक्शन को फिर से पब्लिश करने की कोशिश करें.

4a95152439f0159b.png

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें 853e55310c205094.png पर क्लिक करें.

3c1dabeca90e44e5.png

अगर आपने Cloud Shell का इस्तेमाल पहली बार किया है, तो आपको बीच में आने वाली स्क्रीन दिखेगी. इसमें यह बताया जाएगा कि यह क्या है. अगर आपको बीच के लेवल पर मिलने वाली स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

9c92662c6a846a5c.png

प्रावधान करने और Cloud Shell से कनेक्ट होने में कुछ ही समय लगेगा.

9f0e51b578fecce5.png

इस वर्चुअल मशीन में डेवलपमेंट के सभी ज़रूरी टूल मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री ऑफ़र करता है और Google Cloud में चलता है. यह नेटवर्क की परफ़ॉर्मेंस और ऑथेंटिकेशन को बेहतर बनाता है. अगर सभी नहीं, तो इस कोडलैब में आपका बहुत सारा काम ब्राउज़र से किया जा सकता है.

Cloud Shell से कनेक्ट करने के बाद, आपको दिखेगा कि आपकी पुष्टि हो चुकी है और प्रोजेक्ट आपके प्रोजेक्ट आईडी पर सेट है.

  1. यह पुष्टि करने के लिए Cloud Shell में नीचे दिया गया कमांड चलाएं कि आपकी पुष्टि हो गई है:
gcloud auth list

कमांड आउटपुट

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell में यह कमांड चलाएं, ताकि यह पुष्टि की जा सके कि gcloud के लिए कमांड को आपके प्रोजेक्ट के बारे में जानकारी है:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो आप इसे इस निर्देश की मदद से सेट कर सकते हैं:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

कुछ एपीआई चालू करें

बाद के चरणों में, आपको दिखेगा कि इन सेवाओं की ज़रूरत कहां और क्यों है. फ़िलहाल, अपने प्रोजेक्ट को Cloud Build, Artifact Registry, Vertex AI, और Cloud Run का ऐक्सेस देने के लिए, इस कमांड को चलाएं:

gcloud services enable cloudbuild.googleapis.com        \
                       artifactregistry.googleapis.com  \
                       aiplatform.googleapis.com        \
                       run.googleapis.com          

इससे नीचे दिए जैसा एक सफल मैसेज दिखेगा:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3. प्रॉम्प्टिंग - नैचुरल लैंग्वेज में प्रोग्रामिंग

92f630373224ead8.png

सबसे पहले, हम लार्ज लैंग्वेज मॉडल के लिए प्रॉम्प्ट तैयार करने का तरीका जानेंगे. Google Cloud Console पर जाएं > Vertex AI > Vertex AI Studio (भाषा). आपको इस तरह का पेज दिखेगा:

bfe5706041ae6454.png

Generate Text के तहत, Text Prompt बटन पर क्लिक करें. अगले डायलॉग बॉक्स में, ऐसा प्रॉम्प्ट डालें जो आपके हिसाब से, यहां बताई गई ज़रूरी शर्तों के हिसाब से क्विज़ बनाने में मददगार हो:

  • विषय: विश्व का इतिहास
  • सवालों की संख्या: 5
  • कठिनाई का लेवल: इंटरमीडिएट
  • भाषा: अंग्रेज़ी

आउटपुट देखने के लिए, 'सबमिट करें' बटन पर क्लिक करें.

जैसा कि नीचे दिए गए स्क्रीनशॉट में दिखाया गया है, दाईं ओर मौजूद पैनल की मदद से, अपनी पसंद का मॉडल चुना जा सकता है. साथ ही, कुछ सेटिंग को बेहतर बनाया जा सकता है:

8aa89a1970ea9335.png

निम्न सेटिंग उपलब्ध हैं:

  • क्षेत्र वह जगह है जहां जनरेट करने का अनुरोध किया जाना चाहिए.
  • मॉडल चुनता है कि आपको किस बड़े लैंग्वेज मॉडल का इस्तेमाल करना है. इस कोडलैब के लिए, "gemini-1.0-pro-001" का इस्तेमाल करें.
  • तापमान की मदद से, टोकन चुनने में किसी भी तरह की गड़बड़ी को कंट्रोल किया जाता है. कम तापमान, ऐसे प्रॉम्प्ट के लिए अच्छा होता है जो सही या सही जवाब की उम्मीद करते हों. वहीं, ज़्यादा तापमान से अलग-अलग तरह के या अलग-अलग तरह के नतीजे मिल सकते हैं.
  • टोकन की सीमा से यह तय होता है कि एक प्रॉम्प्ट से ज़्यादा से ज़्यादा टेक्स्ट आउटपुट कितनी संख्या में मिलेगा. एक टोकन में करीब चार वर्ण होते हैं. डिफ़ॉल्ट तौर पर, यह वैल्यू 1024 है.
  • Top-k, मॉडल के आउटपुट के लिए टोकन चुनने के तरीके को बदलता है. 1 में से टॉप-k का मतलब है कि मॉडल के शब्दावली में मौजूद सभी टोकन में से, चुने गए टोकन की सबसे ज़्यादा संभावना है (इसे लालडी डिकोडिंग भी कहा जाता है). वहीं, तीन के टॉप-k का मतलब है कि अगले टोकन को, तापमान का इस्तेमाल करके दिए गए तीन सबसे संभावित टोकन में से चुना गया है. डिफ़ॉल्ट टॉप-k वैल्यू 40 है.
  • टॉप-पी की मदद से, मॉडल आउटपुट के लिए टोकन चुनने का तरीका बदल देता है. टोकन की सबसे ज़्यादा संभावना से लेकर सबसे कम संभावना तक को चुना जाता है. ऐसा तब तक किया जाता है, जब तक कि उनकी प्रायिकताओं का योग टॉप-p की वैल्यू के बराबर न हो जाए.
  • 'ज़्यादा से ज़्यादा जवाब' का मतलब है कि हर सवाल के लिए, मॉडल के जवाबों की ज़्यादा से ज़्यादा संख्या जनरेट की जा सकती है.
  • स्टॉप सीक्वेंस, वर्णों की ऐसी सीरीज़ होती है जिसमें स्पेस भी शामिल होते हैं. अगर मॉडल को मिल जाता है, तो यह रिस्पॉन्स जनरेट होना बंद कर देती है.
  • स्ट्रीमिंग के जवाब यह तय करते हैं कि जवाबों को जनरेट होने या सेव किए जाने पर प्रिंट किया जाए या नहीं. जवाब पूरे होने पर उन्हें दिखाया जाए या नहीं.
  • सुरक्षा फ़िल्टर के थ्रेशोल्ड से यह तय होता है कि आपको ऐसे संकेत मिलने की कितनी संभावना है जो नुकसान पहुंचा सकती हैं.

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

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

[
    {
        "question": "Who was the first person to walk on the moon?",
          "responses": [
              "Neil Armstrong",
              "Buzz Aldrin",
              "Michael Collins",
              "Yuri Gagarin"
           ],
           "correct": "Neil Armstrong"
    },
    {
        "question": "What was the name of the war that took place between the British and the French in North America from 1754 to 1763??",
          "responses": [
              "The French and Indian War",
              "The Seven Years' War",
              "The War of the Austrian Succession",
              "The Great War"
           ],
           "correct": "The French and Indian War"
    },

    ...
]

देखें कि क्या आपके पास अपने प्रॉम्प्ट में बदलाव करके, अब ज़रूरी JSON फ़ॉर्मैट में क्विज़ का आउटपुट देने का विकल्प है.

  1. शब्दों में वह सटीक फ़ॉर्मैट बताएं जिसकी आपको तलाश है (जैसे कि ऊपर दिया गया इटैलिक वाक्य).
  2. अपने प्रॉम्प्ट में अपनी पसंद के JSON फ़ॉर्मैट का उदाहरण शामिल करें.

अपनी पसंद के हिसाब से क्विज़ जनरेट करने के लिए प्रॉम्प्ट जनरेट करने के बाद, पेज के सबसे ऊपर दाएं कोने में मौजूद GET CODE बटन पर क्लिक करें. इससे आपको Python कोड दिखेगा. इसका इस्तेमाल प्रोग्राम के हिसाब से, Vertex AI एलएलएम पर आपके प्रॉम्प्ट को सबमिट करने के लिए किया जा सकता है. अगर आपको Python के अलावा, किसी दूसरी प्रोग्रामिंग भाषा का इस्तेमाल करना है, तो https://cloud.google.com/vertex-ai/docs/samples?text=generative लेख पढ़ें.

4. एक सिंपल वेब सर्वर बनाएं

c73008bb8a72b57b.png

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

अपने क्लाउड शेल पैनल के सबसे ऊपर मौजूद Open Editor बटन पर क्लिक करके शुरू करें. यह ऐसा दिखेगा:

e2a06b5304079efc.png

इसके बाद, आपको Visual Studio कोड की तरह एक IDE एनवायरमेंट में दिखेगा. इसमें प्रोजेक्ट बनाए जा सकते हैं, सोर्स कोड में बदलाव किया जा सकता है, और प्रोग्राम चलाए जा सकते हैं.

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

8dea35450851af53.png

आप क्रम से Open Editor और Open Terminal बटन पर क्लिक करके Editor और टर्मिनल के बीच आगे और पीछे स्विच कर सकते हैं. अब इन दो परिवेशों के बीच आगे और आगे स्विच करके देखें.

इसके बाद, फ़ोल्डर जोड़ें बटन 5f4e64909bc15e30.png पर क्लिक करके, quiz-generator दर्ज करें और enter दबाकर इस लैब के लिए अपने काम को संग्रहित करने के लिए एक फ़ोल्डर बनाएं. इस लैब में बनाई गई सभी फ़ाइलें और Cloud Shell में किया जाने वाला आपका सारा काम इस फ़ोल्डर में होगा.

अब requirements.txt फ़ाइल बनाएं. इससे Python को पता चलता है कि आपका ऐप्लिकेशन किन लाइब्रेरी पर निर्भर है. इस आसान वेब ऐप्लिकेशन के लिए, Flask, google-cloud-aiplatform क्लाइंट लाइब्रेरी नाम के वेब सर्वर बनाने के लिए, एक लोकप्रिय Python मॉड्यूल का इस्तेमाल किया जा रहा है. साथ ही, gunicorn नाम के वेब सर्वर फ़्रेमवर्क का भी इस्तेमाल किया जा सकता है. फ़ाइल के नेविगेशन पैनल में, quiz-generator फ़ोल्डर पर राइट क्लिक करें और इस तरह से New file मेन्यू आइटम चुनें:

613eb3de4b9b750a.png

जब आपसे नई फ़ाइल का नाम पूछा जाए, तब requirements.txt डालें और Enter बटन दबाएं. पक्का करें कि नई फ़ाइल, quiz-generator प्रोजेक्ट फ़ोल्डर में दिखे.

नई फ़ाइल में इन लाइनों को चिपकाएं, ताकि यह बताया जा सके कि आपका ऐप्लिकेशन, Python flask पैकेज, gunicorn वेब सर्वर, और google-cloud-aiplatform क्लाइंट लाइब्रेरी पर निर्भर करता है. साथ ही, हर ऐप्लिकेशन से जुड़े वर्शन पर भी निर्भर करता है.

flask==3.0.0
gunicorn==21.2.0
google-cloud-aiplatform==1.47.0

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

इसी तकनीक का इस्तेमाल करके, main.py नाम की दूसरी नई फ़ाइल बनाएं. यह आपके ऐप्लिकेशन की मुख्य और सिर्फ़ Python सोर्स फ़ाइल होगी. फिर से, पक्का करें कि नई फ़ाइल के आखिर में quiz-generator फ़ोल्डर हो.

इस फ़ाइल में यह कोड डालें:

from flask import Flask
import os

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
@app.route("/", methods=["GET"])
def say_hello():
    html = "<h1>Hello world!</h1>"
    return html

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

टर्मिनल पर वापस जाएं और इस निर्देश का इस्तेमाल करके, प्रोजेक्ट फ़ोल्डर में जाएं:

cd quiz-generator

अपने प्रोजेक्ट डिपेंडेंसी इंस्टॉल करने के लिए, नीचे दिया गया कमांड चलाएं:

pip3 install -r requirements.txt

डिपेंडेंसी इंस्टॉल करने के बाद, आपको कुछ इस तरह खत्म होने वाला आउटपुट दिखेगा:

Successfully installed flask-3.0.0

अब टर्मिनल में इस निर्देश को चलाकर अपना ऐप्लिकेशन लॉन्च करें:

flask --app main.py --debug run --port 8080

इस समय, आपका ऐप्लिकेशन, Cloud Shell सेशन के लिए बनाई गई वर्चुअल मशीन पर चल रहा है. Cloud Shell में प्रॉक्सी प्रोसेस मौजूद होती है. इससे आपकी वर्चुअल मशीन पर चलने वाले वेब सर्वर (जैसे, वह सर्वर जिसे आपने अभी शुरू किया है) को ग्लोबल इंटरनेट पर कहीं से भी ऐक्सेस किया जा सकता है.

web preview बटन पर क्लिक करने के बाद, Preview on Port 8080 मेन्यू आइटम पर क्लिक करें, जैसे:

7f938c0bc1b4154c.png

इससे आपके चल रहे ऐप्लिकेशन पर एक वेब ब्राउज़र टैब खुलेगा, जो कुछ ऐसा दिखाई देना चाहिए:

aaaf366f9bf74a28.png

5. पैरामीटर पार्स करने की सुविधा के साथ जनरेट करने का तरीका जोड़ें

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

from flask import Flask
from flask import request                       #<-CHANGED
import os

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])                #<-CHANGED
def generate():                                 #<-CHANGED
    params = request.args.to_dict()             #<-CHANGED
    html = f"<h1>Quiz Generator</h1>"           #<-CHANGED
    for param in params:                        #<-CHANGED
        html += f"<br>{param}={params[param]}"  #<-CHANGED
    return html                                 #<-CHANGED

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

नतीजे देखने के लिए, अब अपने मौजूदा वेब ब्राउज़र टैब को फिर से लोड करें. इस बार आपको "क्विज़ जनरेटर" के साथ-साथ, आपके यूआरएल (authuser) में अपने-आप क्वेरी पैरामीटर जुड़ जाएगा. "`&param1=val1&param2=val2`" स्ट्रिंग जोड़कर, दो अतिरिक्त पैरामीटर जोड़ें पर क्लिक करें, तो पेज को फिर से लोड करें. आपको कुछ ऐसा दिखेगा:

6e223ca358e4e009.png

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

  • topic - क्विज़ की विषय-वस्तु
  • num_q - मनचाहे सवालों की संख्या
  • diff - कठिनाई का लेवल (आसान, मध्यम, मुश्किल)
  • lang - क्विज़ की पसंदीदा भाषा
from flask import Flask
from flask import request
import os

# Default quiz settings  #<-CHANGED
TOPIC = "History"        #<-CHANGED
NUM_Q = "5"              #<-CHANGED
DIFF = "intermediate"    #<-CHANGED
LANG = "English"         #<-CHANGED

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default):  #<-CHANGED
    if name in args:             #<-CHANGED
        return args[name]        #<-CHANGED
    return default               #<-CHANGED

# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
    args = request.args.to_dict()        #<-CHANGED
    topic = check(args, "topic", TOPIC)  #<-CHANGED
    num_q = check(args, "num_q", NUM_Q)  #<-CHANGED
    diff = check(args, "diff", DIFF)     #<-CHANGED
    lang = check(args, "lang", LANG)     #<-CHANGED
    html = f"""
        <h1>Quiz Generator</h1><br>
        {topic=}<br>
        {num_q=}<br>
        {diff=}<br>
        {lang=}"""                       #<-CHANGED
    return html

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

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

15eed60f6a805212.png

अलग-अलग पैरामीटर के लिए वैल्यू सेट करने के लिए, यूआरएल में बदलाव करें. उदाहरण के लिए, "?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French" सफ़िक्स का इस्तेमाल करके देखें पर क्लिक करें:

f629dba5fa207cef.png

6. अपना प्रॉम्प्ट जोड़ना और उसे फ़ॉर्मैट करना

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

  • topic - क्विज़ की विषय-वस्तु
  • num_q - मनचाहे सवालों की संख्या
  • diff - कठिनाई का लेवल (आसान, मध्यम, मुश्किल)
  • lang - क्विज़ की पसंदीदा भाषा

Vertex Generative AI Studio की मदद से डेवलप किए गए प्रॉम्प्ट को पहले चरण में कॉपी करें. हालांकि, इन स्ट्रिंग का इस्तेमाल करके विषय, सवालों की संख्या, और मुश्किल लेवल के लिए हार्ड कोड की गई वैल्यू बदलें:

  • {topic}
  • {num_q}
  • {diff}
  • {lang}
from flask import Flask
from flask import request
import os

# Default quiz settings
TOPIC = "History"
NUM_Q = 5
DIFF = "intermediate"
LANG = "English"

PROMPT = """
Generate a quiz according to the following specifications:

- topic: {topic}
- num_q: {num_q}
- diff:  {diff}
- lang:  {lang}

Output should be (only) an unquoted json array of objects with keys:
"Question", "responses", and "correct".

"""  #<-CHANGED

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default):
    if name in args:
        return args[name]
    return default

# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
    args = request.args.to_dict()
    topic = check(args, "topic", TOPIC)
    num_q = check(args, "num_q", NUM_Q)
    diff = check(args, "diff", DIFF)
    lang = check(args, "lang", LANG)
    prompt = PROMPT.format(topic=topic, num_q=num_q, diff=diff, lang=lang)  #<-CHANGED 
    html = f"<h1>Prompt:</h1><br><pre>{prompt}</pre>"                       #<-CHANGED
    return html

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

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

3c2b9dfcfba86b7a.png

उन चार पैरामीटर को बदलने के लिए, यूआरएल में बदलाव करें.

7. Vertex AI क्लाइंट लाइब्रेरी जोड़ना

अब हम आपकी क्विज़ जनरेट करने के लिए, Vertex AI Python क्लाइंट लाइब्रेरी का इस्तेमाल करने के लिए तैयार हैं. इससे तीसरे चरण में, इंटरैक्टिव प्रॉम्प्ट अपने-आप ट्रिगर हो जाएंगे. साथ ही, Google की एलएलएम सुविधाओं के लिए, जनरेटर सेवा को प्रोग्रैम्ड तरीके से ऐक्सेस किया जा सकेगा. अपनी main.py फ़ाइल को अपडेट करने के लिए, यहां दिया गया तरीका अपनाएं:

"YOUR_PROJECT" को बदलना न भूलें अपने असल प्रोजेक्ट आईडी से बदलें.

from flask import Flask
from flask import request
from flask import Response                                          #<-CHANGED
import os

import vertexai    
from vertexai.generative_models import GenerativeModel  #<-CHANGED

# Default quiz settings
TOPIC = "History"
NUM_Q = 5
DIFF = "intermediate"
LANG = "English"
MODEL = "gemini-1.0-pro"  #<-CHANGED

PROMPT = """
Generate a quiz according to the following specifications:

- topic: {topic}
- num_q: {num_q}
- diff:  {diff}
- lang:  {lang}

Output should be (only) an unquoted json array of objects with keys "question", "responses", and "correct".

"""

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# Initialize Vertex AI access.
vertexai.init(project="YOUR_PROJECT", location="us-central1")  #<-CHANGED
parameters = {                                                 #<-CHANGED
    "candidate_count": 1,                                      #<-CHANGED
    "max_output_tokens": 1024,                                 #<-CHANGED
    "temperature": 0.5,                                        #<-CHANGED
    "top_p": 0.8,                                              #<-CHANGED
    "top_k": 40,                                               #<-CHANGED
}                                                              #<-CHANGED
model = GenerativeModel(MODEL)             #<-CHANGED

# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default):
    if name in args:
        return args[name]
    return default

# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
    args = request.args.to_dict()
    topic = check(args, "topic", TOPIC)
    num_q = check(args, "num_q", NUM_Q)
    diff = check(args, "diff", DIFF)
    lang = check(args, "lang", LANG)
    prompt = PROMPT.format(topic=topic, num_q=num_q, diff=diff, lang=lang)
    response = model.generate_content(prompt, generation_config=parameters)  #<-CHANGED
    print(f"Response from Model: {response.text}")           #<-CHANGED
    html = f"{response.text}"                                #<-CHANGED
    return Response(html, mimetype="application/json")       #<-CHANGED

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

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

f43d3ba5102857b8.png

क्विज़ का कोई दूसरा विषय, सवालों की संख्या, और मुश्किल लेवल का अनुरोध करने के लिए, यूआरएल में बदलाव करें.

इसके साथ ही, आपकी माइक्रोसेवा खत्म हो गई है - बधाई हो! अगले चरण में, आपको क्लाउड में अपनी सेवा को डिप्लॉय करने का तरीका बताया जाएगा, ताकि इसे कोई भी व्यक्ति कहीं से भी ऐक्सेस कर सके.

8. क्लाउड के लिए!

67c99bf45a7b7805.png

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

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

अपने ऐप्लिकेशन को Google Cloud Run पर डिप्लॉय करने पर, आपको ऊपर बताई गई सभी सुविधाओं के साथ-साथ और भी सुविधाएं मिलती हैं. Cloud Run के साथ अपने ऐप्लिकेशन को शेयर करने के लिए बुनियादी बिल्डिंग ब्लॉक एक कंटेनर है.

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

कंटेनर के बारे में और Google Cloud Run में उनके काम करने के तरीके के बारे में ज़्यादा जानने के लिए, Cloud Run की मदद से तीन आसान चरणों में डेवलपर से प्रॉडक्ट बनाना कोडलैब देखें.

अपने ऐप्लिकेशन को Cloud Run पर डिप्लॉय करें

Cloud Run एक क्षेत्रीय सेवा है. इसका मतलब है कि आपकी Cloud Run सेवाओं को चलाने वाला इन्फ़्रास्ट्रक्चर, एक खास इलाके में मौजूद होता है. Google इसे मैनेज करता है, ताकि उस क्षेत्र के सभी ज़ोन में ज़रूरत के हिसाब से उपलब्ध कराया जा सके. इसे आसानी से समझने के लिए, इस लैब में हम हार्डकोड किए गए इलाके us-central1 का इस्तेमाल करेंगे.

आपका कंटेनर अपने-आप जनरेट हो, इसके लिए हम Buildpack नाम की किसी सुविधा का इस्तेमाल करेंगे. Cloud Editor में Procfile नाम की नई फ़ाइल बनाएं और टेक्स्ट की यह एक लाइन शामिल करें:

web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

यह बिल्डपैक सिस्टम को अपने-आप जनरेट होने वाले कंटेनर में आपके ऐप्लिकेशन को चलाने का तरीका बताता है. इसके बाद, Cloud Shell Terminal में (उसी quiz-generator डायरेक्ट्री से) नीचे दिया गया कमांड चलाएं :

gcloud run deploy quiz-generator  \
    --source .                    \
    --region us-central1          \
    --allow-unauthenticated

यह gcloud कमांड को बताता है कि आपको अपनी कंटेनर इमेज बनाने के लिए, बिल्डपैक का इस्तेमाल करना है. ये इमेज, मौजूदा डायरेक्ट्री में मिली सोर्स फ़ाइलों के आधार पर बनाई जाती हैं. --source . में मौजूद dot, मौजूदा डायरेक्ट्री का शॉर्टहैंड है. यह सेवा, सीधे तौर पर कंटेनर इमेज का ख्याल रखती है. इसलिए, आपको इस gcloud निर्देश के लिए इमेज डालने की ज़रूरत नहीं है.

डिप्लॉयमेंट पूरा होने तक इंतज़ार करें. सफल होने पर, gcloud कमांड नई सेवा का यूआरएल दिखाता है:

Building using Buildpacks and deploying container to Cloud Run service [quiz-generator] in project [YOUR_PROJECT] region [YOUR_REGION]
OK Building and deploying new service... Done.                                                                          
  OK Creating Container Repository...                                                                                   
  OK Uploading sources...                                                                                               
  OK Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/0cf1383f-35db-412d
  -a973-557d5e2cd4a4?project=780573810218].                                                                             
  OK Creating Revision...                                                                                               
  OK Routing traffic...                                                                                                 
  OK Setting IAM Policy...                                                                                              
Done.                                                                                                                   
Service [quiz-generator] revision [quiz-generator-00001-xnr] has been deployed and is serving 100 percent of traffic.
Service URL: https://quiz-generator-co24gukjmq-uc.a.run.app

इस निर्देश की मदद से भी, सेवा यूआरएल को वापस पाया जा सकता है:

gcloud run services describe quiz-generator  \
  --region us-central1                       \
  --format "value(status.url)"

इसमें कुछ ऐसा दिखना चाहिए:

https://quiz-generator-co24gukjmq-uc.a.run.app

यह लिंक, Cloud Run सेवा के लिए TLS सुरक्षा के साथ एक खास यूआरएल है. यह लिंक स्थायी है (जब तक कि आप अपनी सेवा अक्षम नहीं करते) और इंटरनेट पर कहीं भी उपयोग करने योग्य है. यह प्रोसेस, Cloud Shell के उस प्रॉक्सी तरीके का इस्तेमाल नहीं करती है जो कुछ समय के लिए उपलब्ध वर्चुअल मशीन पर निर्भर करता है.

अपने मौजूदा ऐप्लिकेशन पर वेब ब्राउज़र टैब खोलने के लिए, हाइलाइट किए गए Service URL पर क्लिक करें. पुष्टि करें कि नतीजा वही हो जो आपको अपने डेवलपमेंट एनवायरमेंट में मिला था. साथ ही, इस बात की पुष्टि करें कि यूआरएल के आखिर में पैरामीटर देकर, जनरेट की गई क्विज़ में बदलाव किया जा सकता है.

बधाई हो! आपका ऐप्लिकेशन अब Google के क्लाउड में चल रहा है. आपका ऐप्लिकेशन बिना किसी चिंता के सार्वजनिक रूप से उपलब्ध है. इसमें TLS (एचटीटीपीएस) एन्क्रिप्शन और ट्रैफ़िक के लेवल को अपने-आप स्केल करने की सुविधा है.

9. हर चीज़ एक साथ रखना

9927db1725bcd5d6.png

इस आखिरी चरण में, हम क्विज़ जनरेट करने वाले ऐप्लिकेशन को क्विज़ ऐप्लिकेशन के हिस्से के तौर पर चलाने के लिए तैयार हैं. क्विज़ाइक यूआरएल पर जाएं, अपने Google खाते में लॉगिन करें, और Create Quiz टैब पर जाएं. जनरेटर टाइप Custom चुनें. यूआरएल फ़ील्ड में Cloud Run यूआरएल चिपकाएं और अन्य ज़रूरी फ़ील्ड भरें. इसके बाद, फ़ॉर्म सबमिट करें.

328ee05579ea05f9.png

थोड़ी देर बाद, आपको एक नया क्विज़ दिखेगा (नीचे दी गई इमेज में "मेरी नई क्विज़" देखें). इसमें एआई से बनाई गई थंबनेल इमेज होगी. इसमें, इससे जुड़े बटन की मदद से इमेज में बदलाव किया जा सकता है, उसे चलाया, क्लोन किया जा सकता है या मिटाया जा सकता है. यह नया क्विज़ उस वेब सेवा का इस्तेमाल करके बनाया गया है जिसे आपने टेंप्लेट वाले प्रॉम्प्ट के आधार पर अभी डिप्लॉय किया है!

1719169140978b63.png

10. साफ़ हो रहा है

c1592d590c563428.png

सेवा का इस्तेमाल न करने पर Cloud Run शुल्क नहीं लेता. हालांकि, कंटेनर की बनाई गई इमेज को सेव करने के लिए आपसे अब भी शुल्क लिया जा सकता है.

शुल्क देने से बचने के लिए, अपने GCP प्रोजेक्ट को मिटाया जा सकता है. ऐसा करने पर, उस प्रोजेक्ट में इस्तेमाल किए गए सभी संसाधनों की बिलिंग बंद हो जाएगी या इस निर्देश का इस्तेमाल करके अपनी कंटेनर इमेज मिटा दी जाएगी:

gcloud config set artifacts/repository cloud-run-source-deploy
gcloud config set artifacts/location us-central1
gcloud artifacts docker images list

# Note image tag for resulting list

gcloud artifacts docker images delete <IMAGE-TAG>

अपनी Cloud Run सेवा को मिटाने के लिए, इस निर्देश का इस्तेमाल करें:

gcloud run services delete quiz-generator --region us-central1 --quiet

11. आपने कर दिखाया!

910162be58c0f6d6.png

बधाई हो - आपने एलएलएम प्रॉम्प्ट तैयार कर लिया है और उस प्रॉम्प्ट का इस्तेमाल करके Cloud Run माइक्रोसर्विस डिप्लॉय कर ली है. अब आसान भाषा में प्रोग्राम करें और दुनिया के साथ अपना कॉन्टेंट शेयर करें!

मैं आपके लिए एक ज़रूरी सवाल छोड़ना चाहता हूं:

डेवलपर एनवायरमेंट में ऐप्लिकेशन के काम करने के बाद, Cloud Run के सभी प्रोडक्शन-ग्रेड एट्रिब्यूट के साथ-साथ आपको क्लाउड पर डिप्लॉय करने के लिए, कोड की कितनी लाइनों में बदलाव करना पड़ा?

बेशक, इसका जवाब शून्य है. :)

इन कोड लैब के बारे में जानें...

रेफ़रंस दस्तावेज़...

12. कॉल-टू-ऐक्शन

अगर आपको यह कोडलैब अच्छा लगा और आप इसका इस्तेमाल Google Cloud के साथ मिलकर करना चाहते हैं, तो आपको आज ही Google Cloud Innovators से जुड़ें!

498abc7d87ec12d3.png

Google Cloud Innovators मुफ़्त है और इसमें ये सुविधाएं शामिल हैं:

  • सीधे Googlers से नई जानकारी पाने के लिए, लाइव चर्चा, एएमए, और रोडमैप सेशन
  • Google Cloud से जुड़ी ताज़ा खबरें सीधे अपने इनबॉक्स में पाएं
  • डिजिटल बैज और वीडियो कॉन्फ़्रेंस का बैकग्राउंड
  • Skills Boost पर लैब और लर्निंग के 500 क्रेडिट

रजिस्टर करने के लिए यहां क्लिक करें!