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

1. परिचय

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

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

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

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

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

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

  • Chrome वेब ब्राउज़र
  • Google खाता
  • बिलिंग की सुविधा वाला Cloud प्रोजेक्ट

यह लैब, शुरुआती डेवलपर के साथ-साथ सभी लेवल के डेवलपर के लिए है. हालांकि, आपको 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 के संसाधनों/एपीआई का इस्तेमाल करने के लिए, 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 पहली बार शुरू किया जा रहा है, तो आपको एक इंटरमीडियरी स्क्रीन दिखेगी. इसमें 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. gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है या नहीं, इसकी पुष्टि करने के लिए Cloud Shell में यह कमांड चलाएं:
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 (Language) पर जाएं. आपको ऐसा पेज दिखेगा:

bfe5706041ae6454.png

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

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

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

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

8aa89a1970ea9335.png

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

  • यह वह इलाका है जहां आपका जनरेशन अनुरोध चलना चाहिए.
  • मॉडल यह चुनता है कि आपको किस लार्ज लैंग्वेज मॉडल का इस्तेमाल करना है. इस कोडलैब के लिए, "gemini-1.0-pro-001" का इस्तेमाल करें.
  • तापमान की मदद से, टोकन चुनने में किसी भी तरह की गड़बड़ी को कंट्रोल किया जाता है. कम तापमान, उन प्रॉम्प्ट के लिए अच्छा होता है जिनमें सही या सटीक जवाब की उम्मीद होती है. वहीं, ज़्यादा तापमान से अलग-अलग या अनचाहे नतीजे मिल सकते हैं.
  • टोकन की सीमा से यह तय होता है कि एक प्रॉम्प्ट से ज़्यादा से ज़्यादा कितना टेक्स्ट आउटपुट मिलेगा. टोकन में करीब चार वर्ण होते हैं. डिफ़ॉल्ट तौर पर, यह वैल्यू 1024 है.
  • Top-k, मॉडल के आउटपुट के लिए टोकन चुनने के तरीके को बदलता है. अगर टॉप-k की वैल्यू 1 है, तो इसका मतलब है कि चुना गया टोकन, मॉडल की शब्दावली (जिसे ग्रैडी डीकोडिंग भी कहा जाता है) में मौजूद सभी टोकन में से सबसे ज़्यादा संभावना वाला टोकन है. वहीं, अगर टॉप-k की वैल्यू 3 है, तो इसका मतलब है कि अगला टोकन, सबसे ज़्यादा संभावना वाले तीन टोकन में से चुना जाता है. इसके लिए, टेम्परेचर का इस्तेमाल किया जाता है. डिफ़ॉल्ट टॉप-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 LLM में प्रोग्राम के हिसाब से प्रॉम्प्ट सबमिट करने के लिए किया जा सकता है. अगर आपको Python के अलावा किसी दूसरी प्रोग्रामिंग भाषा का इस्तेमाल करना है, तो https://cloud.google.com/vertex-ai/docs/samples?text=generative पर जाएं.

4. आसान वेब सर्वर बनाना

c73008bb8a72b57b.png

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

Cloud Shell पैनल में सबसे ऊपर मौजूद Open Editor बटन पर क्लिक करके शुरू करें. यह इस तरह दिखता है:

e2a06b5304079efc.png

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

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

8dea35450851af53.png

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

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

अब requirements.txt फ़ाइल बनाएं. इससे Python को पता चलता है कि आपका ऐप्लिकेशन किन लाइब्रेरी पर निर्भर है. इस आसान वेब ऐप्लिकेशन के लिए, आपको वेब सर्वर बनाने के लिए एक लोकप्रिय Python मॉड्यूल का इस्तेमाल करना होगा. इसे Flask, google-cloud-aiplatform क्लाइंट लाइब्रेरी कहा जाता है. साथ ही, आपको 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

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

इसी तकनीक का इस्तेमाल करके, 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

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

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

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 Cloud में चल रहा है. आपका ऐप्लिकेशन, TLS (एचटीटीपीएस) एन्क्रिप्शन के साथ सार्वजनिक तौर पर उपलब्ध होता है. साथ ही, यह ट्रैफ़िक के ज़बरदस्त लेवल के हिसाब से अपने-आप स्केल होता है.

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

9927db1725bcd5d6.png

इस आखिरी चरण में, हम quizaic ऐप्लिकेशन के हिस्से के तौर पर आपका क्विज़ जनरेटर चलाने के लिए तैयार हैं. quizaic के यूआरएल पर जाएं, अपने 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 इनोवेटर कार्यक्रम में शामिल होना चाहिए!

498cab7d87ec12d3.png

Google Cloud Innovators बिना किसी शुल्क के उपलब्ध है. इसमें ये चीज़ें शामिल हैं:

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

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