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

1. परिचय

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

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

हमारे इस्तेमाल के उदाहरण इन चार अहम कॉम्पोनेंट के बारे में हैं:

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

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

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

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

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

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

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

आपको एक

  • Java Cloud Functions ऐप्लिकेशन, जो Gemini 1.0 Pro को लागू करता है. यह JSON कलेक्शन के तौर पर किसी खास प्रॉम्प्ट को इनपुट के तौर पर लेता है और जवाब ("जवाब" लेबल वाली 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 में, सबसे ऊपर दाएं कोने में मौजूद 'क्लाउड शेल चालू करें' पर क्लिक करें: 6757b2fb50ddcc2d.png

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

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

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

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

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

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

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

हम ऐसा कैसे करेंगे? चलिए, Gemini से पूछते हैं, क्या हम ऐसा कर सकते हैं? हालांकि, ऐसा करने से पहले इन बातों का ध्यान रखें:

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

Gemini चैट कंसोल पर जाने के लिए, Google Cloud Console में खोज बार के बगल में मौजूद, सबसे ऊपर दाएं कोने में "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 टर्मिनल के सबसे ऊपर दाएं कोने में, 'एडिटर खोलें' आइकॉन पर क्लिक करके, Cloud Shell एडिटर खोलें. आम तौर पर, मैं टर्मिनल और एडिटर को अलग-अलग टैब में खोलना पसंद करता हूं, ताकि हम एक में कोड लिख सकें और दूसरे में उसे बिल्ड कर सकें.

edd258384bc74f1f.png

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

दोनों चालू होने के बाद, सबसे नीचे बाईं ओर मौजूद प्रोजेक्ट के नाम पर क्लिक करें. इसके बाद, "Cloud Code" टाइटल वाली पॉप-अप सूची में, नीचे की ओर स्क्रोल करके "नया ऐप्लिकेशन" पर जाएं.

ca08602b576ebd57.png

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

ac2b44245949da68.png

इसके बाद दिखने वाली सूची में, helloworld के बजाय प्रोजेक्ट का नाम "duetai-gemini-calling" टाइप करें और 'ठीक है' पर क्लिक करें.

bf9cfe86e35cdced.png

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

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

d56e410fb76f183f.png

फ़िलहाल, फ़ंक्शन को डिप्लॉय किया जा सकता है. हालांकि, हमने इसे इसलिए शुरू नहीं किया था. आइए, अब Java SDK टूल की मदद से, इस Cloud Function में 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 के वर्शन नंबर को मैनेज करने के लिए, Spring Cloud GCP BOM का इस्तेमाल किया है, तो <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 करें. इसके बाद, गड़बड़ी के बारे में पॉप-अप मैसेज में, पीले बल्ब पर क्लिक करें. इसके बाद, "HelloWorld.java को 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 स्ट्रक्चर में इनपुट की ज़रूरत होती है:

{ &quot;calls&quot;: [[&quot;YOUR_PROMPT_HERE&quot;]] }

इससे यह रिस्पॉन्स मिलता है:

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

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

66fb67507793e368.png

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

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