बुकशेल्फ़ बिल्डर: Gemini का इस्तेमाल करके, Gemini ऐप्लिकेशन के लिए Java Cloud Function बनाना

1. परिचय

क्या आपको किताबें पढ़ना पसंद है, लेकिन विकल्पों की भरमार देखकर आप परेशान हो जाते हैं? कल्पना करें कि आपके पास एआई की मदद से काम करने वाला एक ऐसा ऐप्लिकेशन है जो न सिर्फ़ आपको पढ़ने के लिए बेहतरीन किताब का सुझाव देता है, बल्कि आपकी चुनी हुई शैली के आधार पर किताब की खास जानकारी भी देता है. इससे आपको किताब के बारे में एक झलक मिल जाती है. इस कोडलैब में, हम आपको BigQuery और Gemini की मदद से Cloud Functions का इस्तेमाल करके, ऐसा ऐप्लिकेशन बनाने का तरीका बताएंगे.

प्रोजेक्ट की खास जानकारी

हमारा इस्तेमाल का उदाहरण इन चार मुख्य कॉम्पोनेंट पर आधारित है:

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

हम लागू करने की प्रोसेस को तीन कोडलैब में बांटेंगे:

कोडलैब 1: Gemini ऐप्लिकेशन के लिए, Java Cloud फ़ंक्शन बनाने के लिए Gemini का इस्तेमाल करें.

दूसरा कोडलैब: BigQuery की मदद से, सिर्फ़ एसक्यूएल वाले जनरेटिव एआई ऐप्लिकेशन बनाने के लिए Gemini का इस्तेमाल करें.

तीसरा कोडलैब: Gemini का इस्तेमाल करके, Java Spring Boot का ऐसा वेब ऐप्लिकेशन बनाएं जो BigQuery के साथ इंटरैक्ट करता हो.

2. Java Cloud Function पर सर्वरलेस तरीके से जनरेटिव एआई ऐप्लिकेशन बनाने के लिए Gemini का इस्तेमाल करना

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

आपको एक

  • Java Cloud Functions ऐप्लिकेशन, Gemini 1.0 Pro को लागू करता है. यह JSON ऐरे के तौर पर किसी प्रॉम्प्ट को इनपुट के तौर पर लेता है और जवाब देता है. जवाब में "replies" लेबल वाली JSON वैल्यू होती है.
  • Gemini की मदद से, आपको बनाने और डिप्लॉय करने के चरण पूरे करने होंगे

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

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

यहां ज़रूरी शर्तें दी गई हैं:

अपना प्रोजेक्ट बनाएं

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

Cloud Shell चालू करें

  1. आपको Cloud Shell का इस्तेमाल करना होगा. यह Google Cloud में चलने वाला कमांड-लाइन एनवायरमेंट है. इसमें bq पहले से लोड होता है:

Cloud Console में, सबसे ऊपर दाएं कोने में मौजूद, Cloud Shell चालू करें पर क्लिक करें: 6757b2fb50ddcc2d.png

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

gcloud कमांड और उनके इस्तेमाल के बारे में जानने के लिए, दस्तावेज़ देखें.

4. Google Cloud और ज़रूरी एपीआई के लिए Gemini को चालू करना

Gemini की सुविधा चालू करें

  1. एपीआई चालू करने के लिए, Marketplace में Gemini for Google Cloud पर जाएं. इस निर्देश का भी इस्तेमाल किया जा सकता है:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  1. Gemini के पेज पर जाएं और "चैटिंग शुरू करें" पर क्लिक करें.

अहम जानकारी: Gemini का इस्तेमाल शुरू करने और Cloud Shell IDE में Gemini को चालू करने के लिए, इस कोड लैब में दिए गए पहले और दूसरे चरण को पूरा करें.

ज़रूरी अन्य एपीआई चालू करना

हम ऐसा कैसे करेंगे? चलो, Gemini से पूछते हैं, ठीक है? हालांकि, इससे पहले यह याद रखें कि:

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

Google Cloud कंसोल में खोज बार के बगल में सबसे ऊपर दाएं कोने में मौजूद, "Gemini खोलें" आइकॉन पर क्लिक करके, Gemini चैट कंसोल पर जाएं.

26e1491322855614.png

इस सवाल को "यहां कोई प्रॉम्प्ट डालें" सेक्शन में टाइप करें:

How do I enable the cloud functions api using a gcloud command? 

आपको इस तरह का जवाब मिलेगा:

gcloud services enable cloudfunctions.googleapis.com

इसे कॉपी करें. इसके लिए, कमांड स्निपेट के सबसे ऊपर मौजूद 'कॉपी करें' आइकॉन का इस्तेमाल किया जा सकता है. इसके बाद, Cloud Functions को चालू करने के लिए, इसे Cloud Shell टर्मिनल में चलाएं. Cloud Run के लिए भी ऐसा ही करें, क्योंकि हमें Cloud Functions बनाने और डिप्लॉय करने के लिए, दोनों की ज़रूरत होती है:

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

5. Gemini की मदद से Cloud Functions टेंप्लेट तैयार करना

हम यह मानकर चल रहे हैं कि आपने Cloud Shell IDE में Gemini को पहले से ही चालू कर रखा है.

Cloud Shell Editor खोलने के लिए, Cloud Shell टर्मिनल में सबसे ऊपर दाएं कोने में मौजूद, Open Editor आइकॉन पर क्लिक करें. आम तौर पर, मैं टर्मिनल और एडिटर को अलग-अलग टैब में एक साथ खोलना पसंद करता हूं, ताकि हम एक में कोड लिख सकें और दूसरे में उसे बना सकें.

edd258384bc74f1f.png

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

दोनों के चालू होने के बाद, नीचे बाएं कोने में मौजूद प्रोजेक्ट के नाम पर क्लिक करें. इसके बाद, "क्लाउड कोड" नाम की जो पॉप-अप सूची खुलेगी उसमें नीचे की ओर स्क्रोल करके, "नया ऐप्लिकेशन" पर जाएं.

ca08602b576ebd57.png

उस सूची में, Cloud Functions ऐप्लिकेशन चुनें. पॉप-अप होने वाली सूची में से, Java चुनें:

ac2b44245949da68.png

नतीजे के तौर पर मिली सूची में, helloworld की जगह "duetai-gemini-calling" प्रोजेक्ट का नाम डालें. इसके बाद, ठीक है पर क्लिक करें.

bf9cfe86e35cdced.png

बहुत बढ़िया! आपने Gemini की मदद से, अपने सामान्य Java Cloud Functions ऐप्लिकेशन को बूटस्ट्रैप किया है. इसके अलावा, आपने कॉन्फ़िगरेशन चालू करने और उन्हें ऐक्टिवेट करने के अलावा कुछ और नहीं किया है, क्या यह सही है?

आपको प्रोजेक्ट का यह स्ट्रक्चर दिखेगा:

d56e410fb76f183f.png

फ़िलहाल, फ़ंक्शन को डिप्लॉय किया जा सकता है. हालांकि, हमने इसकी शुरुआत इस वजह से नहीं की थी. आइए, Java SDK का इस्तेमाल करके इस Cloud फ़ंक्शन में Gemini Pro API को लागू करें.

अब हम अपने इस्तेमाल के उदाहरण के लिए फ़ंक्शनैलिटी बनाते हैं. इस Cloud Function में Gemini Pro मॉडल को चालू करना है. इसके लिए, आपके पास ज़्यादा प्रॉम्प्ट जोड़ने का विकल्प होता है. साथ ही, Gemini की मदद से अपने कोड को धीरे-धीरे डेवलप करने या लॉजिक को खुद लिखने का विकल्प होता है. मैं दोनों को मिलाकर इस्तेमाल करने जा रहा/रही हूं.

6. डिपेंडेंसी जोड़ना

Gemini की चैट कंसोल (बाएं पैनल में मौजूद Cloud Code Editor में मौजूद) में, यह प्रॉम्प्ट टाइप करें:

what is the maven dependency for com.google.cloud.vertexai library

मैं खास तौर पर com.google.cloud.vertexai पैकेज के बारे में पूछ रहा हूं, क्योंकि मैं इसका इस्तेमाल अपने सोर्स कोड में कर रहा हूं. इसी में मैंने Gemini को चालू करने वाला कोड लागू किया है.

मुझे यह नतीजा मिला:

62c4295b9b4654e9.png

 <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-vertexai</artifactId>
      <version>0.1.0</version>
    </dependency>

इसे कॉपी करें और pom.xml फ़ाइल में, </dependencies> टैग से ठीक पहले चिपकाएं. वर्शन को 0.1.0 से बदलें. अगर Spring Cloud GCP BOM का इस्तेमाल, spring-cloud-gcp के वर्शन नंबर मैनेज करने के लिए किया जा रहा है, तो <version> टैग हटाया जा सकता है.

डिपेंडेंसी सेक्शन ऐसा दिखना चाहिए:

1800f10af9331210.png

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

    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.10</version>
    </dependency>

7. फ़ंक्शन के एंट्री पॉइंट और क्लास के नाम में बदलाव करना

  1. ".vscode" फ़ोल्डर में जाकर, "launch.json" फ़ाइल पर जाएं. फ़ंक्शन के नाम को "function-hello-world" से बदलकर "function-gemini-calling" करें.
  2. entryPoint की वैल्यू को "cloudcode.helloworld.HelloWorld से cloudcode.bookshelf.Bookshelf में बदलें.
  3. अब Java क्लास फ़ाइल "HelloWorld.java" पर जाएं. पैकेज का नाम बदलकर package cloudcode.bookshelf करें; दिखने वाली गड़बड़ी में, पीले रंग के बल्ब पर क्लिक करें. इसके बाद, "Move HelloWorld.java" to package cloudcode.bookshelf; विकल्प पर क्लिक करें.

38d721978bddc8a8.png

  1. क्लास का नाम बदलकर Bookshelf करें. इसके बाद, दिखने वाली गड़बड़ी में, छोटे पीले बल्ब पर क्लिक करें और "फ़ाइल का नाम बदलकर Bookshelf.java करें" चुनें. उसे चुनें.

8. Gemini Pro को कॉल करने का तरीका बनाना

आइए, इस सुविधा को Bookshelf.java क्लास में लागू करें. Bookshelf.java फ़ाइल में मौजूद कोड की जगह यहां दिया गया कोड डालें:

package cloudcode.bookshelf;
import java.io.BufferedWriter;
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import com.google.cloud.vertexai.VertexAI;
import com.google.cloud.vertexai.api.GenerateContentResponse;
import com.google.cloud.vertexai.api.GenerationConfig;
import com.google.cloud.vertexai.generativeai.preview.GenerativeModel;
import com.google.cloud.vertexai.generativeai.preview.ResponseHandler;
import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.util.Map;
import java.util.LinkedHashMap;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonArray;

public class Bookshelf implements HttpFunction {
  private static final Gson gson = new Gson();

 @Override
  public void service(HttpRequest request, HttpResponse response) throws Exception {
    BufferedWriter writer = response.getWriter();

 // Get the request body as a JSON object.
 JsonObject requestJson = new Gson().fromJson(request.getReader(), JsonObject.class);
 JsonArray calls_array = requestJson.getAsJsonArray("calls");
 JsonArray calls = (JsonArray) calls_array.get(0);
 String context = calls.get(0).toString().replace("\"", "");

 //Invoke Gemini model
  String raw_result = callGemini(context);
  raw_result = raw_result.replace("\n","");
  String trimmed = raw_result.trim();
  List<String> result_list = Arrays.asList(trimmed);
  Map<String, List<String>> stringMap = new LinkedHashMap<>();
  stringMap.put("replies", result_list);
 
  // Serialization
  String return_value = gson.toJson(stringMap);
  writer.write(return_value);
    }
  public String callGemini(String context) throws IOException{
      String res = "";
        try (VertexAI vertexAi = new VertexAI("REPLACE_WITH_YOUR_PROJECT_ID", "us-central1"); ) {
          GenerationConfig generationConfig =
              GenerationConfig.newBuilder()
                  .setMaxOutputTokens(2048)
                  .setTemperature(0.4F)
                  .setTopK(32)
                  .setTopP(1)
                  .build();  
        GenerativeModel model = new GenerativeModel("gemini-pro", generationConfig, vertexAi);
        GenerateContentResponse response = model.generateContent(context);
        res = ResponseHandler.getText(response);
      }catch(Exception e){
        System.out.println(e);
        }
        return res;
    }
}

इस क्लास को JSON स्ट्रक्चर में इनपुट की ज़रूरत होती है:

{ "calls": [["YOUR_PROMPT_HERE"]] }

यह इस तरह का जवाब देता है:

(Json) Map<String, List<String>> {"replies": ["response"]}

कोड के बारे में जानकारी पाने के लिए, बाईं ओर मौजूद पैनल में Cloud Shell Editor में जाकर, Gemini Chat का विकल्प आज़माएं. इसके अलावा, पूरे कोड को चुना जा सकता है. इसके बाद, चुने गए कोड के सबसे ऊपर बाएं कोने में मौजूद पीले रंग के बल्ब पर क्लिक करके, "इसके बारे में जानकारी दो" विकल्प को चुना जा सकता है.

66fb67507793e368.png

9. Cloud फ़ंक्शन डिप्लॉय करना

अब Cloud Function तैयार है. आइए, Gemini से पूछते हैं कि इसे कैसे डिप्लॉय किया जाए. Cloud Code एडिटर में Gemini chat पर जाएं और यह प्रॉम्प्ट डालें:

   How to deploy this Cloud Function with a gcloud command?

मुझे यह जवाब मिला है:

9f9db98933841864.png

अब मुझे इस बारे में और जानना था. इसलिए, मैंने Gemini से gcloud functions deploy कमांड देने के लिए कहा. जवाब यहां दिखाया गया है:

b77701c00dc3eaf1.png

हम यह नहीं कह सकते कि आपको भी ऐसा ही जवाब मिलेगा. हालांकि, हमें यह देखकर काफ़ी हैरानी हुई कि इस जवाब में कुछ और जानकारी भी शामिल की गई है. इसकी जानकारी नीचे दी गई इमेज में देखी जा सकती है:

अनुरोध के मुख्य हिस्से का फ़ॉर्मैट:

82bf20304143a374.png

और

जवाब का फ़ॉर्मैट:

ade55b3de5d823a6.png

अब, Gemini से मिले gcloud कमांड को चलाकर, फ़ंक्शन को डिप्लॉय करते हैं. इसके लिए, हमें Cloud Shell टर्मिनल खोलना होगा. इसे नए टैब में खोलने के लिए, https://console.cloud.google.com पर जाएं. साथ ही, पक्का करें कि सही प्रोजेक्ट चुना गया हो. कंसोल के सबसे ऊपर दाएं कोने में मौजूद, Cloud Shell चालू करें आइकॉन पर क्लिक करके Cloud Shell टर्मिनल खोलें. साथ ही, पक्का करें कि आप नीचे दिए गए कमांड का इस्तेमाल करके सही प्रोजेक्ट फ़ोल्डर में हों:

cd duetai-gemini-calling

इसके बाद, यह कमांड डालें:

gcloud functions deploy bookshelf --runtime java17 --trigger-http --entry-point cloudcode.bookshelf.Bookshelf --allow-unauthenticated

यह आपसे पूछेगा, "क्या आपको नए फ़ंक्शन [bookshelf] के लिए, बिना पुष्टि किए गए इनवॉकेशन की अनुमति देनी है?" "y" टाइप करें और Enter दबाएं. इसके बाद, आपसे कुछ सवाल पूछे जाएंगे. अगर लागू हो, तो उनके जवाब दें. इसके बाद, यह आपके सर्वरलेस क्लाउड फ़ंक्शन को डिप्लॉय किए गए यूआरएल के साथ डिप्लॉय करेगा: https://us-central1-*******.cloudfunctions.net/bookshelf.

अब डिप्लॉय किए गए Cloud Functions को शुरू करें और इसे टेस्ट करें!

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

10. डिप्लॉय किए गए Cloud फ़ंक्शन को कॉल करना

क्या हम Gemini से यह सवाल पूछें? मैंने प्रॉम्प्ट डाला

How to call the deployed cloud function?

मुझे यह नतीजा मिला: (आपको यह जवाब दिख भी सकता है और नहीं भी. प्रॉम्प्ट में बदलाव करके देखें कि जवाबों में क्या अंतर आता है).

1d2242715571fe6f.png

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

how to call the deployed cloud function using gcloud

मुझे यह जवाब मिला है: e7b29b2cfb57782c.png

टर्मिनल से इस जवाब ("gcloud functions call" कमांड) का इस्तेमाल किया जा सकता है. इसमें कुछ बदलाव करके, इसे हमारे इस्तेमाल के हिसाब से बनाया जा सकता है. इसके अलावा, प्रॉम्प्ट में ही पैरामीटर पास करके देखें कि क्या आपको जवाब में gcloud functions call की पूरी जानकारी मिल रही है:

gcloud functions call bookshelf --region=us-central1 --gen2 --data '{"calls":[["Hello! This is my test prompt."]]}'

यह रहा मेरा नतीजा:

6f396d915251db78.png

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

आपने पहले जो Cloud Functions बनाए थे उन्हें मिटाया जा सकता है. इसके लिए, Cloud Functions के जानकारी वाले पेज में मौजूद 'मिटाएं' बटन पर क्लिक करें.

12. बधाई हो

आपने Gemini का इस्तेमाल करके, Gemini 1.0 Pro को कॉल करने के लिए Java Cloud Functions को बनाया, डिप्लॉय किया, और टेस्ट किया! यह ऐप्लिकेशन, किताबों के सुझाव देने से जुड़े इनपुट प्रॉम्प्ट लेता है. इसमें किताबों का सारांश और थीम शामिल होती है.