জাভাতে জেমিনি ফাংশন কলিং সহ ডিটারমিনিস্টিক জেনারেটিভ এআই

১. ভূমিকা

জেনারেটিভ এআই মডেলগুলো স্বাভাবিক ভাষা বুঝতে ও তাতে সাড়া দিতে অসাধারণ। কিন্তু ঠিকানা প্রমিতকরণের মতো গুরুত্বপূর্ণ কাজের জন্য যদি আপনার সুনির্দিষ্ট ও অনুমানযোগ্য আউটপুটের প্রয়োজন হয়, তাহলে কী হবে? প্রচলিত জেনারেটিভ মডেলগুলো কখনও কখনও একই প্রম্পটের জন্য বিভিন্ন সময়ে ভিন্ন ভিন্ন প্রতিক্রিয়া দিতে পারে, যা সম্ভাব্য অসঙ্গতির কারণ হতে পারে। এখানেই জেমিনির ফাংশন কলিং ক্ষমতা তার শ্রেষ্ঠত্ব দেখায়, যা আপনাকে এআই-এর প্রতিক্রিয়ার উপাদানগুলোকে সুনির্দিষ্টভাবে নিয়ন্ত্রণ করার সুযোগ দেয়।

এই কোডল্যাবটি অ্যাড্রেস কমপ্লিশন এবং স্ট্যান্ডার্ডাইজেশন ব্যবহারের উদাহরণের মাধ্যমে এই ধারণাটি ব্যাখ্যা করে। এর জন্য আমরা একটি জাভা ক্লাউড ফাংশন তৈরি করব যা নিম্নলিখিত কাজগুলো করবে:

  1. অক্ষাংশ এবং দ্রাঘিমাংশের স্থানাঙ্ক গ্রহণ করে
  2. সংশ্লিষ্ট ঠিকানাগুলো পেতে গুগল ম্যাপস জিওকোডিং এপিআই-কে কল করা হয়।
  3. আমাদের প্রয়োজনীয় একটি নির্দিষ্ট ফরম্যাটে সেই অ্যাড্রেসগুলোকে সুনির্দিষ্টভাবে মানসম্মত ও সংক্ষিপ্ত করার জন্য জেমিনি ১.০ প্রো-এর ফাংশন কলিং বৈশিষ্ট্য ব্যবহার করা হয়।

চলুন শুরু করা যাক!

২. মিথুন রাশির ফাংশন কলিং

জেনারেটিভ এআই যুগে জেমিনি ফাংশন কলিং স্বতন্ত্র, কারণ এটি আপনাকে জেনারেটিভ ল্যাঙ্গুয়েজ মডেলের নমনীয়তার সাথে প্রচলিত প্রোগ্রামিংয়ের নির্ভুলতার সমন্বয় করতে দেয়।

জেমিনি ফাংশন কলিং বাস্তবায়নের জন্য আপনাকে যে কাজগুলো সম্পন্ন করতে হবে তা নিচে দেওয়া হলো:

  1. ফাংশনগুলোর সংজ্ঞা দিন : ফাংশনগুলো স্পষ্টভাবে বর্ণনা করুন। বর্ণনার মধ্যে নিম্নলিখিত তথ্যগুলো অবশ্যই অন্তর্ভুক্ত থাকতে হবে:
  • ফাংশনের নাম, যেমন getAddress
  • ফাংশনটি যে প্যারামিটারগুলো প্রত্যাশা করে, যেমন স্ট্রিং হিসেবে latlng
  • ফাংশনটি যে ধরনের ডেটা ফেরত দেয়, যেমন ঠিকানা স্ট্রিংগুলির একটি তালিকা।
  1. জেমিনির জন্য টুল তৈরি করুন : ফাংশনের বিবরণগুলোকে এপিআই স্পেসিফিকেশন আকারে প্যাকেজ করে টুল তৈরি করুন। একটি টুলকে এমন একটি বিশেষায়িত টুলবক্স হিসেবে ভাবুন, যা জেমিনি এপিআই-এর কার্যকারিতা বোঝার জন্য ব্যবহার করতে পারে।
  2. জেমিনি ব্যবহার করে এপিআই অর্কেস্ট্রেট করুন : যখন আপনি জেমিনিকে কোনো প্রম্পট পাঠান, তখন এটি আপনার অনুরোধ বিশ্লেষণ করে বুঝতে পারে যে আপনার দেওয়া টুলগুলো কোথায় ব্যবহার করা যেতে পারে। এরপর জেমিনি একটি স্মার্ট অর্কেস্ট্রেটর হিসেবে নিম্নলিখিত কাজগুলো সম্পাদন করে:
  • আপনার সংজ্ঞায়িত ফাংশনগুলো কল করার জন্য প্রয়োজনীয় এপিআই প্যারামিটার তৈরি করে। জেমিনি আপনার হয়ে এপিআই কল করে না। জেমিনি ফাংশন কলিং দ্বারা আপনার জন্য তৈরি করা প্যারামিটার এবং সিগনেচারের উপর ভিত্তি করে আপনাকে অবশ্যই এপিআই কল করতে হবে।
  • জেমিনি আপনার এপিআই কল থেকে প্রাপ্ত ফলাফলগুলোকে তার জেনারেশন প্রক্রিয়ায় পুনরায় ফিড করে এবং চূড়ান্ত রেসপন্সে কাঠামোগত তথ্য অন্তর্ভুক্ত করে। আপনি আপনার অ্যাপ্লিকেশনের জন্য প্রয়োজন অনুযায়ী এই তথ্য প্রক্রিয়া করতে পারেন।

নিম্নলিখিত চিত্রটিতে ডেটার প্রবাহ, বাস্তবায়নের ধাপসমূহ এবং প্রতিটি ধাপের মালিক (যেমন অ্যাপ্লিকেশন, এলএলএম বা এপিআই) দেখানো হয়েছে:

b9a39f55567072d3.png

আপনি যা তৈরি করবেন

আপনি একটি জাভা ক্লাউড ফাংশন তৈরি ও স্থাপন করবেন যা নিম্নলিখিত কাজগুলো করবে:

  • অক্ষাংশ এবং দ্রাঘিমাংশের স্থানাঙ্ক গ্রহণ করে।
  • সংশ্লিষ্ট ঠিকানাগুলো পাওয়ার জন্য গুগল ম্যাপস জিওকোডিং এপিআই-কে কল করা হয়।
  • জেমিনি ১.০ প্রো-এর ফাংশন কলিং বৈশিষ্ট্য ব্যবহার করে সেই ঠিকানাগুলিকে একটি নির্দিষ্ট বিন্যাসে নির্ণায়কভাবে মানসম্মত ও সংক্ষিপ্ত করা হয়।

৩. প্রয়োজনীয়তা

৪. শুরু করার আগে

  1. গুগল ক্লাউড কনসোলের প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
  2. আপনার গুগল ক্লাউড প্রোজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন। কোনো প্রোজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন, তা জানুন।
  3. Google Cloud কনসোল থেকে ক্লাউড শেল সক্রিয় করুন। আরও তথ্যের জন্য, ক্লাউড শেল ব্যবহার দেখুন।
  4. আপনার প্রজেক্ট সেট করা না থাকলে, প্রজেক্ট সেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
gcloud config set project <YOUR_PROJECT_ID>
  1. ক্লাউড শেলে, নিম্নলিখিত এনভায়রনমেন্ট ভেরিয়েবলগুলো সেট করুন:
export GCP_PROJECT=<YOUR_PROJECT_ID>
export GCP_REGION=us-central1
  1. ক্লাউড শেল-এ নিম্নলিখিত কমান্ডগুলি চালিয়ে প্রয়োজনীয় গুগল ক্লাউড এপিআইগুলি সক্রিয় করুন:
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. ক্লাউড শেল এডিটর খুলুন , এক্সটেনশন-এ ক্লিক করুন এবং তারপরে Gemini + Google Cloud Code এক্সটেনশনটি ইনস্টল করুন।

৫. ক্লাউড ফাংশন বাস্তবায়ন করুন

  1. ক্লাউড শেল এডিটর চালু করুন
  2. ক্লাউড কোড-এ ক্লিক করুন এবং তারপরে ক্লাউড ফাংশন বিভাগটি প্রসারিত করুন।
  3. ফাংশন তৈরি করুন (+) আইকনে ক্লিক করুন।
  4. নতুন অ্যাপ্লিকেশন তৈরি করুন ডায়ালগ বক্সে, Java: Hello World বিকল্পটি নির্বাচন করুন।
  5. প্রজেক্ট পাথে প্রজেক্টটির জন্য একটি নাম দিন, যেমন GeminiFunctionCalling
  6. প্রজেক্ট স্ট্রাকচার দেখতে এক্সপ্লোরার-এ ক্লিক করুন এবং তারপর pom.xml ফাইলটি খুলুন। নিচের ছবিতে প্রজেক্ট স্ট্রাকচারটি দেখানো হয়েছে:

bdf07515f413dd9e.png

  1. pom.xml ফাইলের <dependencies>... </dependencies> ট্যাগের মধ্যে প্রয়োজনীয় ডিপেন্ডেন্সিগুলো যোগ করুন। আপনি এই প্রজেক্টের গিটহাব রিপোজিটরি থেকে সম্পূর্ণ pom.xml অ্যাক্সেস করতে পারবেন। সেখান থেকে pom.xml ফাইলটি কপি করে আপনার বর্তমান প্রজেক্টের যে pom.xml ফাইলটি আপনি সম্পাদনা করছেন, সেটিতে পেস্ট করুন।
  2. GeminiFunctionCalling গিটহাব লিঙ্ক থেকে HelloWorld.java ক্লাসটি কপি করুন। আপনাকে অবশ্যই API_KEY এবং project_id যথাক্রমে আপনার জিওকোডিং এপিআই কী এবং গুগল ক্লাউড প্রজেক্ট আইডি দিয়ে আপডেট করতে হবে।

৬. HelloWorld.java ক্লাস ব্যবহার করে ফাংশন কলিং বুঝুন।

প্রম্পট ইনপুট

এই উদাহরণে, ইনপুট প্রম্পটটি হলো: 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();

জেমিনির সাহায্যে প্রম্পটটি পরিচালনা করুন

প্রম্পট ইনপুট এবং এপিআই স্পেক জেমিনিতে পাঠানো হয়:

// 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()
   );

মিথুন রাশিকে আহ্বান করুন এবং প্রমিত ঠিকানাটি ফেরত দিন।

নিম্নলিখিত কোডটি পূর্ববর্তী ধাপের প্রক্রিয়াকৃত আউটপুটকে জেমিনিতে প্রম্পট হিসাবে প্রেরণ করে:

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}"]}

অ্যাড্রেস স্ট্যান্ডার্ডাইজেশন ব্যবহারের ক্ষেত্রে জেমিনি ফাংশন কলিং কীভাবে কাজ করে, তা এখন যেহেতু আপনি বুঝে গেছেন, আপনি ক্লাউড ফাংশনটি ডেপ্লয় করতে পারেন।

৭. স্থাপন ও পরীক্ষা করুন

  1. যদি আপনি ইতিমধ্যেই GeminiFunctionCalling প্রজেক্টটি তৈরি করে থাকেন এবং ক্লাউড ফাংশনটি ইমপ্লিমেন্ট করে থাকেন, তাহলে ধাপ ২-এ যান। যদি প্রজেক্টটি তৈরি না করে থাকেন, তাহলে ক্লাউড শেল টার্মিনালে গিয়ে এই রিপোটি ক্লোন করুন: git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
  2. প্রজেক্ট ফোল্ডারে যান: cd GeminiFunctionCalling
  3. ক্লাউড ফাংশনটি বিল্ড এবং ডিপ্লয় করতে নিম্নলিখিত স্টেটমেন্টটি চালান:
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

ডেপ্লয়মেন্টের পর URL ফরম্যাটটি হবে নিম্নরূপ: https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling

  1. টার্মিনাল থেকে নিম্নলিখিত কমান্ডটি চালিয়ে ক্লাউড ফাংশনটি পরীক্ষা করুন:
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}}```"]}'

৮. পরিষ্কার করুন

এই পোস্টে ব্যবহৃত রিসোর্সগুলোর জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ হওয়া এড়াতে, এই ধাপগুলো অনুসরণ করুন:

  1. গুগল ক্লাউড কনসোলে, রিসোর্স পরিচালনা (Manage resources) পৃষ্ঠায় যান।
  2. প্রজেক্ট তালিকা থেকে, আপনি যে প্রজেক্টটি মুছতে চান সেটি নির্বাচন করুন এবং তারপর ডিলিট-এ ক্লিক করুন।
  3. ডায়ালগ বক্সে প্রজেক্ট আইডি টাইপ করুন এবং তারপর প্রজেক্টটি মুছে ফেলার জন্য 'শাট ডাউন'-এ ক্লিক করুন।
  4. আপনি যদি আপনার প্রজেক্টটি রাখতে চান, তাহলে উপরের ধাপগুলো এড়িয়ে যান এবং Cloud Functions-এ গিয়ে ফাংশনগুলোর তালিকা থেকে যেটি মুছতে চান সেটি নির্বাচন করে DELETE-এ ক্লিক করুন।

৯. অভিনন্দন

অভিনন্দন! আপনি একটি জাভা অ্যাপ্লিকেশনে সফলভাবে জেমিনি ফাংশন কলিং ফিচারটি ব্যবহার করেছেন এবং একটি জেনারেটিভ এআই টাস্ককে একটি ডিটারমিনিস্টিক ও নির্ভরযোগ্য প্রক্রিয়ায় রূপান্তরিত করেছেন। উপলব্ধ মডেলগুলো সম্পর্কে আরও জানতে, ভার্টেক্স এআই এলএলএম প্রোডাক্ট ডকুমেন্টেশন দেখুন।