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

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

এই কোডল্যাব সম্পর্কে

subjectমে ২৯, ২০২৪-এ শেষবার আপডেট করা হয়েছে
account_circleAuthor: Abirami Sukumaran, Editor: Muthu Sankaralingam-এর লেখা

1. ভূমিকা

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

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

  1. অক্ষাংশ এবং দ্রাঘিমাংশ স্থানাঙ্ক নেয়
  2. অনুরূপ ঠিকানা পেতে Google মানচিত্র জিওকোডিং API কল করে
  3. আমাদের প্রয়োজনীয় একটি নির্দিষ্ট বিন্যাসে সেই ঠিকানাগুলিকে নির্ধারকভাবে প্রমিত এবং সংক্ষিপ্ত করতে Gemini 1.0 Pro ফাংশন কলিং বৈশিষ্ট্য ব্যবহার করে

এর মধ্যে ডুব দেওয়া যাক!

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

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

মিথুন ফাংশন কলিং বাস্তবায়ন করতে আপনার যে কাজগুলি সম্পূর্ণ করতে হবে তা এখানে রয়েছে:

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

নিম্নলিখিত চিত্রটি ডেটার প্রবাহ, বাস্তবায়নের সাথে জড়িত পদক্ষেপগুলি এবং প্রতিটি পদক্ষেপের মালিক যেমন অ্যাপ্লিকেশন, LLM বা API দেখায়:

b9a39f55567072d3.png

আপনি কি নির্মাণ করবেন

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

  • অক্ষাংশ এবং দ্রাঘিমাংশ স্থানাঙ্ক নেয়।
  • সংশ্লিষ্ট ঠিকানাগুলি পেতে Google মানচিত্র জিওকোডিং API-কে কল করে৷
  • একটি নির্দিষ্ট বিন্যাসে সেই ঠিকানাগুলিকে নির্ধারকভাবে প্রমিত এবং সংক্ষিপ্ত করতে Gemini 1.0 Pro ফাংশন কলিং বৈশিষ্ট্য ব্যবহার করে৷

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

4. আপনি শুরু করার আগে

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

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

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

bdf07515f413dd9e.png

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

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

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

এই উদাহরণে, নিম্নলিখিতটি ইনপুট প্রম্পট: ল্যাটলং মান 40.714224,-73.961452 এর ঠিকানা কী

ফাইলের ইনপুট প্রম্পটের সাথে সম্পর্কিত কোড স্নিপেটটি নিম্নলিখিত:

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

API স্পেসিফিকেশন

এই উদাহরণে বিপরীত জিওকোডিং API ব্যবহার করা হয়েছে। নিম্নলিখিত 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();

মিথুনের সাথে প্রম্পট সাজান

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

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

এর থেকে প্রতিক্রিয়া হল API-তে অর্কেস্ট্রেটেড প্যারামিটার JSON। এখানে একটি উদাহরণ আউটপুট:

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

Reverse Geocoding API এ নিম্নলিখিত প্যারামিটারটি পাস করুন: "latlng=40.714224,-73.961452"

অর্কেস্ট্রেটেড ফলাফলটিকে "latlng=VALUE" ফরম্যাটের সাথে মেলান।

এপিআই চালু করুন

নিম্নলিখিত কোডের বিভাগ যা API-কে আহ্বান করে:

// 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 বিপরীত জিওকোডিং API থেকে প্রতিক্রিয়া ধারণ করে। নিম্নলিখিত আউটপুট একটি ফর্ম্যাট সংস্করণ:

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

API প্রতিক্রিয়া প্রক্রিয়া করুন এবং প্রম্পট প্রস্তুত করুন

নিম্নলিখিত কোডটি API থেকে প্রতিক্রিয়া প্রক্রিয়া করে এবং প্রতিক্রিয়া প্রক্রিয়া করার নির্দেশাবলী সহ প্রম্পট প্রস্তুত করে:

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

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

7. স্থাপন এবং পরীক্ষা

  1. আপনি যদি ইতিমধ্যেই GeminiFunctionCalling প্রোজেক্ট তৈরি করে থাকেন এবং ক্লাউড ফাংশন বাস্তবায়ন করেন, তাহলে ধাপ 2-এ যান। আপনি যদি প্রোজেক্ট তৈরি না করে থাকেন, তাহলে ক্লাউড শেল টার্মিনালে যান, এই রেপো ক্লোন করুন: 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}}```"]}'

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

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

  1. Google ক্লাউড কনসোলে, সম্পদ পরিচালনা পৃষ্ঠাতে যান।
  2. প্রকল্প তালিকায়, আপনি যে প্রকল্পটি মুছতে চান সেটি নির্বাচন করুন এবং তারপরে মুছুন ক্লিক করুন।
  3. ডায়ালগে, প্রজেক্ট আইডি টাইপ করুন এবং তারপরে প্রোজেক্ট মুছে ফেলতে শাট ডাউন ক্লিক করুন।
  4. আপনি যদি আপনার প্রকল্পটি রাখতে চান, উপরের ধাপগুলি এড়িয়ে যান এবং ক্লাউড ফাংশনে নেভিগেট করে ক্লাউড ফাংশনটি মুছুন এবং ফাংশনগুলির তালিকা থেকে, আপনি যেটি মুছতে চান সেটি চেক করুন এবং মুছুন ক্লিক করুন৷

9. অভিনন্দন

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