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.pnga99b7ace416376c4.png5e3ff691252acf41.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते हैं. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, सभी Google Cloud प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. Cloud Console, अपने-आप एक यूनीक स्ट्रिंग जनरेट करता है. आम तौर पर, आपको इससे कोई फ़र्क़ नहीं पड़ता कि यह क्या है. ज़्यादातर कोडलैब में, आपको अपने प्रोजेक्ट आईडी (आम तौर पर PROJECT_ID के तौर पर पहचाना जाता है) का रेफ़रंस देना होगा. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो आपके पास कोई दूसरा रैंडम आईडी जनरेट करने का विकल्प होता है. इसके अलावा, आपके पास अपना नाम आज़माने का विकल्प भी है. इससे आपको पता चलेगा कि वह नाम उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. यह प्रोजेक्ट की अवधि तक बना रहता है.
  • आपकी जानकारी के लिए बता दें कि एक तीसरी वैल्यू भी होती है, जिसे प्रोजेक्ट नंबर कहते हैं. इसका इस्तेमाल कुछ एपीआई करते हैं. इन तीनों वैल्यू के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.
  1. इसके बाद, आपको Cloud Console में बिलिंग की सुविधा चालू करनी होगी, ताकि Cloud संसाधनों/एपीआई का इस्तेमाल किया जा सके. इस कोडलैब को पूरा करने में ज़्यादा खर्च नहीं आएगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, संसाधनों को शट डाउन करें. इसके लिए, बनाए गए संसाधनों को मिटाएं या प्रोजेक्ट को मिटाएं. 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 है.
  • टॉप-k से यह तय होता है कि मॉडल, आउटपुट के लिए टोकन कैसे चुनता है. टॉप-k की वैल्यू 1 होने का मतलब है कि चुना गया टोकन, मॉडल की शब्दावली में मौजूद सभी टोकन में से सबसे ज़्यादा संभावित है. इसे ग्रीडी डिकोडिंग भी कहा जाता है. वहीं, टॉप-k की वैल्यू 3 होने का मतलब है कि अगला टोकन, सबसे ज़्यादा संभावित तीन टोकन में से चुना गया है. इसके लिए, तापमान का इस्तेमाल किया जाता है. टॉप-के की डिफ़ॉल्ट वैल्यू 40 होती है.
  • टॉप-पी, मॉडल के आउटपुट के लिए टोकन चुनने के तरीके में बदलाव करता है. टोकन को सबसे ज़्यादा से लेकर सबसे कम संभावना के हिसाब से चुना जाता है. ऐसा तब तक किया जाता है, जब तक कि उनकी संभावनाओं का योग टॉप-पी वैल्यू के बराबर न हो जाए.
  • जवाबों की ज़्यादा से ज़्यादा संख्या का मतलब है कि हर प्रॉम्प्ट के लिए, मॉडल के ज़्यादा से ज़्यादा कितने जवाब जनरेट किए जा सकते हैं.
  • स्टॉप सीक्वेंस, वर्णों (इनमें स्पेस भी शामिल हैं) की एक सीरीज़ होती है. अगर मॉडल को यह सीरीज़ मिलती है, तो वह जवाब जनरेट करने की प्रोसेस बंद कर देता है.
  • 'जवाबों को रीयल टाइम में देखना' सुविधा से यह चुना जाता है कि जवाब जनरेट होते ही दिखाए जाएँ या पूरा जवाब तैयार होने के बाद दिखाया जाए.
  • सेफ़्टी फ़िल्टर के थ्रेशोल्ड से यह तय होता है कि आपको नुकसान पहुंचाने वाले जवाब दिखने की कितनी संभावना है.

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

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

8dea35450851af53.png

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

इसके बाद, एक फ़ोल्डर बनाएं. इसमें आपको इस लैब के लिए अपना काम सेव करना है. इसके लिए, फ़ोल्डर जोड़ें बटन 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

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

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

8. क्लाउड पर!

67c99bf45a7b7805.png

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

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

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

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

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

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

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

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

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

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

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

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

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 Innovators में शामिल होना चाहिए!

498cab7d87ec12d3.png

Google Cloud Innovators में शामिल होने के लिए, आपको कोई शुल्क नहीं देना होगा. इसमें ये सुविधाएं शामिल हैं:

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

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