Gemini की मदद से Java में फ़ंक्शन कॉल करने की सुविधा के साथ जनरेटिव एआई को तय करें

1. परिचय

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

यह कोडलैब इस कॉन्सेप्ट को, पूरा होने और स्टैंडर्ड तय करने के इस्तेमाल के उदाहरण के साथ दिखाता है. इसके लिए हम एक ऐसा Java क्लाउड फ़ंक्शन बनाएंगे, जो ये काम करेगा:

  1. अक्षांश और देशांतर निर्देशांक लेता है
  2. संबंधित पते पाने के लिए Google Maps Geocoding API को कॉल करता है
  3. इसमें Gemini 1.0 Pro फ़ंक्शन कॉलिंग की सुविधा का इस्तेमाल किया जाता है, ताकि उन पतों को तय करने के लिए, तय मानकों के हिसाब से उनकी ज़रूरत के हिसाब से खास जानकारी दी जा सके

चलिए, शुरू करते हैं!

2. Gemini से कॉल करने की सुविधा

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

Gemini फ़ंक्शन के लिए कॉल करने की सुविधा लागू करने के लिए, आपको ये टास्क पूरे करने होंगे:

  1. फ़ंक्शन तय करना: फ़ंक्शन के बारे में साफ़ तौर पर बताएं. ब्यौरे में यह जानकारी शामिल होनी चाहिए:
  • फ़ंक्शन का नाम, जैसे कि getAddress.
  • फ़ंक्शन के लिए ज़रूरी पैरामीटर, जैसे कि स्ट्रिंग के तौर पर latlng.
  • फ़ंक्शन से मिलने वाले डेटा का टाइप, जैसे कि पते की स्ट्रिंग की सूची.
  1. Gemini के लिए टूल बनाएं: एपीआई की खास बातों के तौर पर टूल में पैकेज के फ़ंक्शन का ब्यौरा दें. Gemini, एपीआई के काम करने के तरीके को समझने के लिए एक खास टूलबॉक्स की तरह काम करता है.
  2. Gemini का इस्तेमाल करके एपीआई को व्यवस्थित करना: जब Gemini को प्रॉम्प्ट भेजा जाता है, तो वह आपके अनुरोध का विश्लेषण कर सकता है. साथ ही, यह पता लगा सकता है कि आपके दिए गए टूल का इस्तेमाल कहां किया जा सकता है. इसके बाद, Gemini एक स्मार्ट ऑर्केस्ट्रेटर की तरह काम करता है और यहां दिए गए टास्क करता है:
  • आपके तय किए गए फ़ंक्शन को कॉल करने के लिए, ज़रूरी एपीआई पैरामीटर जनरेट करता है. Gemini आपकी तरफ़ से एपीआई को कॉल नहीं करता. Gemini फ़ंक्शन से कॉल करने के लिए जनरेट किए गए पैरामीटर और हस्ताक्षर के आधार पर, आपको एपीआई को कॉल करना होगा.
  • Gemini, आपके एपीआई कॉल के नतीजों को फिर से जनरेट करके नतीजों को प्रोसेस करता है. इन नतीजों को प्रोसेस करते समय, स्ट्रक्चर्ड जानकारी को शामिल किया जाता है. अपने आवेदन के मुताबिक, इस जानकारी को अपने हिसाब से प्रोसेस किया जा सकता है.

नीचे दी गई इमेज में, डेटा के फ़्लो, उन्हें लागू करने के चरणों, और हर चरण के मालिक को दिखाया गया है. जैसे, ऐप्लिकेशन, एलएलएम या एपीआई:

b9a39f55567072d3.png

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

आपको ऐसा Java क्लाउड फ़ंक्शन बनाना और डिप्लॉय करना होगा जो ये काम करता हो:

  • इसमें अक्षांश और देशांतर के निर्देशांक इस्तेमाल किए जाते हैं.
  • संबंधित पते पाने के लिए, Google Maps Geocoding API को कॉल करता है.
  • यह Gemini 1.0 Pro फ़ंक्शन के कॉल करने की सुविधा का इस्तेमाल करके, उन पतों को एक तय फ़ॉर्मैट में तय करता है और उनकी ख़ास जानकारी देता है.

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

  • Chrome या Firefox जैसा ब्राउज़र.
  • आपके पास ऐसा Google Cloud प्रोजेक्ट होना चाहिए जिसमें बिलिंग की सुविधा चालू हो.

4. शुरू करने से पहले

  1. Google Cloud Console में, प्रोजेक्ट सिलेक्टर पेज पर, Google Cloud प्रोजेक्ट चुनें या बनाएं.
  2. पक्का करें कि आपके Google Cloud प्रोजेक्ट के लिए बिलिंग की सुविधा चालू हो. किसी प्रोजेक्ट के लिए बिलिंग की सुविधा चालू है या नहीं, यह देखने का तरीका जानें.
  3. Google Cloud Console से Cloud Shell को चालू करें. ज़्यादा जानकारी के लिए, Cloud Shell का इस्तेमाल करना देखें.
  4. अगर आपका प्रोजेक्ट सेट नहीं है, तो अपना प्रोजेक्ट सेट करने के लिए नीचे दिए गए कमांड का इस्तेमाल करें:
gcloud config set project <YOUR_PROJECT_ID>
  1. Cloud Shell में, ये एनवायरमेंट वैरिएबल सेट करें:
export GCP_PROJECT=<YOUR_PROJECT_ID>
export GCP_REGION=us-central1
  1. Cloud Shell में इन निर्देशों को लागू करके, ज़रूरी Google Cloud API चालू करें:
gcloud services enable cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com logging.googleapis.com storage-component.googleapis.com cloudaicompanion.googleapis.com aiplatform.googleapis.com
  1. Cloud Shell Editor खोलें और एक्सटेंशन पर क्लिक करें. इसके बाद, Gemini + Google Cloud Code एक्सटेंशन इंस्टॉल करें.

5. Cloud फ़ंक्शन लागू करना

  1. Cloud Shell एडिटर को लॉन्च करें.
  2. Cloud Code पर क्लिक करें और फिर Cloud Functions सेक्शन को बड़ा करें.
  3. फ़ंक्शन बनाएं (+) आइकॉन पर क्लिक करें.
  4. नया ऐप्लिकेशन बनाएं डायलॉग में, Java: Hello World विकल्प चुनें.
  5. प्रोजेक्ट पाथ में, प्रोजेक्ट का कोई नाम दें, जैसे कि GeminiFunctionCalling.
  6. प्रोजेक्ट का स्ट्रक्चर देखने के लिए, Explorer पर क्लिक करें. इसके बाद, pom.xml फ़ाइल खोलें. नीचे दी गई इमेज में प्रोजेक्ट का स्ट्रक्चर दिखाया गया है:

bdf07515f413dd9e.png

  1. pom.xml फ़ाइल के <dependencies>... </dependencies> टैग में, ज़रूरी डिपेंडेंसी जोड़ें. इस प्रोजेक्ट के Gmail डेटा स्टोर करने की जगह से पूरे pom.xml को ऐक्सेस किया जा सकता है. pom.xml को वहां से अपने मौजूदा प्रोजेक्ट की pom.xml फ़ाइल में कॉपी करें, जिसमें आपको बदलाव करना है.
  2. GeminiFunctionCalling GitHub लिंक से HelloWorld.java क्लास कॉपी करें. API_KEY और project_id को जियोकोडिंग एपीआई पासकोड और Google Cloud के प्रोजेक्ट आईडी का इस्तेमाल करके अपडेट करना होगा.

6. HelloWorld.java क्लास का इस्तेमाल करके फ़ंक्शन कॉलिंग को समझें

प्रॉम्प्ट इनपुट

इस उदाहरण में, इनपुट प्रॉम्प्ट यह है: Latlong वैल्यू 40.714224,-73.961452 का पता क्या है.

फ़ाइल में दिए गए इनपुट प्रॉम्प्ट से जुड़ा कोड स्निपेट यहां दिया गया है:

String promptText = "What's the address for the latlong value '" + latlngString + "'?"; //40.714224,-73.961452

एपीआई की खास बातें

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

/* Declare the function for the API to invoke (Geo coding API) */ 
FunctionDeclaration functionDeclaration =
    FunctionDeclaration.newBuilder()
        .setName("getAddress")
        .setDescription("Get the address for the given latitude and longitude value.")
        .setParameters(
            Schema.newBuilder()
                .setType(Type.OBJECT)
                .putProperties(
                    "latlng",
                    Schema.newBuilder()
                        .setType(Type.STRING)
                        .setDescription("This must be a string of latitude and longitude coordinates separated by comma")
                        .build())
                .addRequired("latlng")
                .build())
        .build();

Gemini की मदद से प्रॉम्प्ट को व्यवस्थित करें

प्रॉम्प्ट इनपुट और एपीआई की खास जानकारी, Gemini को भेजी जाती है:

// Add the function to a "tool"
Tool tool = Tool.newBuilder()
.addFunctionDeclarations(functionDeclaration)
.build();

// Invoke the Gemini model with the use of the tool to generate the API parameters from the prompt input.
GenerativeModel model = GenerativeModel.newBuilder()
.setModelName(modelName)
.setVertexAi(vertexAI)
.setTools(Arrays.asList(tool))
.build();
GenerateContentResponse response = model.generateContent(promptText);
Content responseJSONCnt = response.getCandidates(0).getContent();

इससे मिला रिस्पॉन्स, एपीआई के लिए व्यवस्थित किए गए पैरामीटर JSON है. आउटपुट का एक उदाहरण यहां दिया गया है:

role: "model"
parts {
 function_call {
   name: "getAddress"
   args {
     fields {
       key: "latlng"
       value {
         string_value: "40.714224,-73.961452"
       }
     }
   }
 }
}

इस पैरामीटर को Reverse Geocoding एपीआई में पास करें: "latlng=40.714224,-73.961452"

व्यवस्थित नतीजे को "latlng=VALUE" फ़ॉर्मैट से मैच करें.

एपीआई को शुरू करना

एपीआई को शुरू करने वाले कोड का सेक्शन नीचे दिया गया है:

// Create a request
     String url = API_STRING + "?key=" + API_KEY + params;
     java.net.http.HttpRequest request = java.net.http.HttpRequest.newBuilder()
         .uri(URI.create(url))
         .GET()
         .build();
     // Send the request and get the response
     java.net.http.HttpResponse<String> httpresponse = client.send(request, java.net.http.HttpResponse.BodyHandlers.ofString());
     // Save the response
     String jsonResult =  httpresponse.body().toString();

स्ट्रिंग jsonResult में रिवर्स जियोकोडिंग एपीआई से जवाब होता है. नीचे दिए गए आउटपुट का फ़ॉर्मैट नीचे दिया गया है:

"...277 Bedford Ave, Brooklyn, NY 11211, USA; 279 Bedford Ave, Brooklyn, NY 11211, USA; 277 Bedford Ave, Brooklyn, NY 11211, USA;..."

एपीआई से मिले जवाब को प्रोसेस करना और प्रॉम्प्ट तैयार करना

यह कोड, एपीआई से मिले जवाब को प्रोसेस करता है और रिस्पॉन्स को प्रोसेस करने के तरीके के बारे में निर्देशों के साथ प्रॉम्प्ट तैयार करता है:

// Provide an answer to the model so that it knows what the result
     // of a "function call" is.
     String promptString =
     "You are an AI address standardizer for assisting with standardizing addresses accurately. Your job is to give the accurate address in the standard format as a JSON object containing the fields DOOR_NUMBER, STREET_ADDRESS, AREA, CITY, TOWN, COUNTY, STATE, COUNTRY, ZIPCODE, LANDMARK by leveraging the address string that follows in the end. Remember the response cannot be empty or null. ";

Content content =
         ContentMaker.fromMultiModalData(
             PartMaker.fromFunctionResponse(
                 "getAddress",
                 Collections.singletonMap("address", formattedAddress)));
     String contentString = content.toString();
     String address = contentString.substring(contentString.indexOf("string_value: \"") + "string_value: \"".length(), contentString.indexOf('"', contentString.indexOf("string_value: \"") + "string_value: \"".length()));

     List<SafetySetting> safetySettings = Arrays.asList(
       SafetySetting.newBuilder()
           .setCategory(HarmCategory.HARM_CATEGORY_HATE_SPEECH)
           .setThreshold(SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH)
           .build(),
       SafetySetting.newBuilder()
           .setCategory(HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT)
           .setThreshold(SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH)
           .build()
   );

Gemini को शुरू करें और स्टैंडर्ड पता इस्तेमाल करें

यह कोड, पिछले चरण में मिले प्रोसेस किए गए आउटपुट को Gemini को प्रॉम्प्ट के तौर पर पास करता है:

GenerativeModel modelForFinalResponse = GenerativeModel.newBuilder()
     .setModelName(modelName)
     .setVertexAi(vertexAI)
     .build();
     GenerateContentResponse finalResponse = modelForFinalResponse.generateContent(promptString + ": " + address, safetySettings);
      System.out.println("promptString + content: " + promptString + ": " + address);
       // See what the model replies now
       System.out.println("Print response: ");
       System.out.println(finalResponse.toString());
       String finalAnswer = ResponseHandler.getText(finalResponse);
       System.out.println(finalAnswer);

finalAnswer वैरिएबल का स्टैंडर्ड पता, JSON फ़ॉर्मैट में होता है. आउटपुट का एक उदाहरण यह है:

{"replies":["{ \"DOOR_NUMBER\": null, \"STREET_ADDRESS\": \"277 Bedford Ave\", \"AREA\": \"Brooklyn\", \"CITY\": \"New York\", \"TOWN\": null, \"COUNTY\": null, \"STATE\": \"NY\", \"COUNTRY\": \"USA\", \"ZIPCODE\": \"11211\", \"LANDMARK\": null} null}"]}

अब आपको पता चल गया है कि Gemini Function Calling, पते के स्टैंडर्ड के हिसाब से कैसे काम करता है. इसलिए, अब Cloud Function को डिप्लॉय किया जा सकता है.

7. डिप्लॉय करें और जांच करें

  1. अगर आपने पहले ही GeminiFunctionCalling प्रोजेक्ट बना लिया है और Cloud Function लागू कर दिया है, तो दूसरे चरण पर जाएं. अगर आपने प्रोजेक्ट नहीं बनाया है, तो Cloud Shell टर्मिनल पर जाएं. इसके बाद, इस रेपो का क्लोन बनाएं: git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
  2. प्रोजेक्ट फ़ोल्डर पर जाएं: cd GeminiFunctionCalling
  3. Cloud फ़ंक्शन बनाने और डिप्लॉय करने के लिए, यह स्टेटमेंट चलाएं:
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

डिप्लॉयमेंट के बाद इस यूआरएल का फ़ॉर्मैट यहां दिया गया है: https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling

  1. टर्मिनल से यह कमांड चलाकर, Cloud Function की जांच करें:
gcloud functions call gemini-fn-calling --region=us-central1 --gen2 --data '{"calls":[["40.714224,-73.961452"]]}'

यह किसी रैंडम सैंपल प्रॉम्प्ट का जवाब है: '{"replies":["{ "DOOR_NUMBER": "277", "STREET_ADDRESS": "Bedford Ave", "AREA": null, "CITY": "Brooklyn", "TOWN": null, "COUNTY": "Kings County", "STATE": "NY", "COUNTRY": "USA", "ZIPCODE": "11211", "LANDMARK": null}}```"]}'

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

इस पोस्ट में इस्तेमाल किए गए संसाधनों के लिए, आपके Google Cloud खाते पर शुल्क न लगे, इसके लिए यह तरीका अपनाएं:

  1. Google Cloud Console में, संसाधन मैनेज करें पेज पर जाएं.
  2. प्रोजेक्ट की सूची में, वह प्रोजेक्ट चुनें जिसे मिटाना है. इसके बाद, 'मिटाएं' पर क्लिक करें.
  3. डायलॉग बॉक्स में, प्रोजेक्ट आईडी लिखें और फिर प्रोजेक्ट मिटाने के लिए शट डाउन करें पर क्लिक करें.
  4. अगर आपको अपना प्रोजेक्ट बनाए रखना है, तो ऊपर दिए गए चरणों को छोड़ दें और Cloud Functions पर जाकर, Cloud Function को मिटाएं. फ़ंक्शन की सूची में, उस फ़ंक्शन को चुनें जिसे मिटाना है. इसके बाद, 'मिटाएं' पर क्लिक करें.

9. बधाई हो

बधाई हो! आपने Java ऐप्लिकेशन में Gemini के फ़ंक्शन को कॉल करने की सुविधा का इस्तेमाल कर लिया है. इसलिए, आपने जनरेटिव एआई टास्क को डेटरमिनिस्टिक और भरोसेमंद प्रोसेस में बदल दिया है. उपलब्ध मॉडल के बारे में ज़्यादा जानने के लिए, Vertex AI एलएलएम प्रॉडक्ट के दस्तावेज़ देखें.