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

1. परिचय

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

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

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

आइए, शुरू करते हैं!

2. Gemini की फ़ंक्शन कॉलिंग की सुविधा

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

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

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

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

b9a39f55567072d3.png

आपको क्या बनाने को मिलेगा

आपको एक Java Cloud फ़ंक्शन बनाना और डिप्लॉय करना होगा. यह फ़ंक्शन ये काम करेगा:

  • इसमें अक्षांश और देशांतर के निर्देशांक शामिल होते हैं.
  • यह 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. ज़रूरी Google Cloud API चालू करें. इसके लिए, Cloud Shell में ये कमांड चलाएं:
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 खोलें. इसके बाद, Extensions पर क्लिक करें और Gemini + Google Cloud Code extension इंस्टॉल करें.

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

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

bdf07515f413dd9e.png

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

6. HelloWorld.java क्लास का इस्तेमाल करके, फ़ंक्शन कॉल करने की सुविधा के बारे में जानकारी

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

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

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

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

एपीआई स्पेसिफ़िकेशन

इस उदाहरण में, Reverse Geocoding API का इस्तेमाल किया गया है. एपीआई की खास जानकारी यहां दी गई है:

/* 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 में, Reverse Geocoding API से मिला रिस्पॉन्स होता है. यहां आउटपुट का फ़ॉर्मैट किया गया वर्शन दिया गया है:

"...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 की फ़ंक्शन कॉलिंग सुविधा कैसे काम करती है. अब 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 फ़ंक्शन की जांच करें:
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 LLM के प्रॉडक्ट का दस्तावेज़ देखें.