অ্যান্ড্রয়েডের জন্য এআই এজ ফাংশন কলিং গাইড

AI Edge Function Calling SDK (FC SDK) হল একটি লাইব্রেরি যা ডেভেলপারদের ডিভাইসে LLM ব্যবহার করে ফাংশন কলিং ব্যবহার করতে সক্ষম করে। ফাংশন কলিং আপনাকে মডেলগুলিকে বহিরাগত সরঞ্জাম এবং API-এর সাথে সংযুক্ত করতে দেয়, যা মডেলগুলিকে বাস্তব-বিশ্বের ক্রিয়া সম্পাদন করার জন্য প্রয়োজনীয় পরামিতি সহ নির্দিষ্ট ফাংশনগুলিকে কল করতে সক্ষম করে।

শুধুমাত্র টেক্সট তৈরি করার পরিবর্তে, FC SDK ব্যবহার করে একটি LLM একটি ফাংশনে একটি কাঠামোগত কল তৈরি করতে পারে যা একটি ক্রিয়া সম্পাদন করে, যেমন হালনাগাদ তথ্য অনুসন্ধান করা, অ্যালার্ম সেট করা বা সংরক্ষণ করা।

এই নির্দেশিকাটি আপনাকে একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশনে FC SDK-এর সাথে LLM ইনফারেন্স API যোগ করার একটি প্রাথমিক কুইকস্টার্ট সম্পর্কে জানাবে। এই নির্দেশিকাটি একটি অন-ডিভাইস LLM-এ ফাংশন কলিং ক্ষমতা যোগ করার উপর আলোকপাত করে। LLM ইনফারেন্স API ব্যবহার সম্পর্কে আরও তথ্যের জন্য, LLM ইনফারেন্স ফর অ্যান্ড্রয়েড নির্দেশিকা দেখুন।

দ্রুত শুরু

আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশনে FC SDK ব্যবহার করতে নিম্নলিখিত ধাপগুলি অনুসরণ করুন। এই কুইকস্টার্টটি Hammer 2.1 (1.5B) সহ LLM Inference API ব্যবহার করে। LLM Inference APIটি Pixel 8 এবং Samsung S23 বা তার পরবর্তী সংস্করণের মতো উচ্চ-সম্পন্ন অ্যান্ড্রয়েড ডিভাইসের জন্য অপ্টিমাইজ করা হয়েছে এবং এটি নির্ভরযোগ্যভাবে ডিভাইস এমুলেটরগুলিকে সমর্থন করে না।

নির্ভরতা যোগ করুন

FC SDK com.google.ai.edge.localagents:localagents-fc লাইব্রেরি ব্যবহার করে এবং LLM Inference API com.google.mediapipe:tasks-genai লাইব্রেরি ব্যবহার করে। আপনার অ্যান্ড্রয়েড অ্যাপের build.gradle ফাইলে উভয় নির্ভরতা যোগ করুন:

dependencies {
    implementation 'com.google.mediapipe:tasks-genai:0.10.24'
    implementation 'com.google.ai.edge.localagents:localagents-fc:0.1.0'
}

অ্যান্ড্রয়েড ১২ (এপিআই ৩১) বা তার বেশি ভার্সনের ডিভাইসের জন্য, নেটিভ ওপেনসিএল লাইব্রেরি ডিপেন্ডেন্সি যোগ করুন। আরও তথ্যের জন্য, uses-native-library ট্যাগের ডকুমেন্টেশন দেখুন।

AndroidManifest.xml ফাইলে নিম্নলিখিত uses-native-library ট্যাগগুলি যোগ করুন:

<uses-native-library android:name="libOpenCL.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-car.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-pixel.so" android:required="false"/>

একটি মডেল ডাউনলোড করুন

Hugging Face থেকে ৮-বিট কোয়ান্টাইজড ফরম্যাটে Hammer 1B ডাউনলোড করুন। উপলব্ধ মডেলগুলি সম্পর্কে আরও তথ্যের জন্য, মডেল ডকুমেন্টেশন দেখুন।

hammer2.1_1.5b_q8_ekv4096.task ফোল্ডারের কন্টেন্টটি অ্যান্ড্রয়েড ডিভাইসে পুশ করুন।

$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push hammer2.1_1.5b_q8_ekv4096.task /data/local/tmp/llm/hammer2.1_1.5b_q8_ekv4096.task

ফাংশনের সংজ্ঞা ঘোষণা করুন

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

নিম্নলিখিতটি getWeather এবং getTime ফাংশনগুলিকে সংজ্ঞায়িত করে:

class ToolsForLlm {
    public static String getWeather(String location) {
        return "Cloudy, 56°F";
    }

    public static String getTime(String timezone) {
        return "7:00 PM " + timezone;
    }

    private ToolsForLlm() {}
}

প্রতিটি ফাংশন বর্ণনা করার জন্য FunctionDeclaration ব্যবহার করুন, প্রতিটি ফাংশনের নাম এবং বর্ণনা দিন এবং প্রকারগুলি নির্দিষ্ট করুন। এটি মডেলকে ফাংশনগুলি কী করে এবং কখন ফাংশন কল করতে হবে তা অবহিত করে।

var getWeather = FunctionDeclaration.newBuilder()
    .setName("getWeather")
    .setDescription("Returns the weather conditions at a location.")
    .setParameters(
        Schema.newBuilder()
            .setType(Type.OBJECT)
            .putProperties(
                "location",
                Schema.newBuilder()
                    .setType(Type.STRING)
                    .setDescription("The location for the weather report.")
                    .build())
            .build())
    .build();
var getTime = FunctionDeclaration.newBuilder()
    .setName("getTime")
    .setDescription("Returns the current time in the given timezone.")

    .setParameters(
        Schema.newBuilder()
            .setType(Type.OBJECT)
            .putProperties(
                "timezone",
                Schema.newBuilder()
                    .setType(Type.STRING)
                    .setDescription("The timezone to get the time from.")
                    .build())
            .build())
    .build();

একটি Tool অবজেক্টে ফাংশন ঘোষণা যোগ করুন:

var tool = Tool.newBuilder()
    .addFunctionDeclarations(getWeather)
    .addFunctionDeclarations(getTime)
    .build();

অনুমান ব্যাকএন্ড তৈরি করুন

LLM Inference API ব্যবহার করে একটি ইনফারেন্স ব্যাকএন্ড তৈরি করুন এবং এটিকে আপনার মডেলের জন্য একটি ফর্ম্যাটার অবজেক্ট হিসেবে পাস করুন। FC SDK ফর্ম্যাটার ( ModelFormatter ) একটি ফর্ম্যাটার এবং পার্সার উভয় হিসেবেই কাজ করে। যেহেতু এই কুইকস্টার্টটি Gemma-3 1B ব্যবহার করে, আমরা GemmaFormatter ব্যবহার করব:

var llmInferenceOptions = LlmInferenceOptions.builder()
    .setModelPath(modelFile.getAbsolutePath())
    .build();
var llmInference = LlmInference.createFromOptions(context, llmInferenceOptions);
var llmInferenceBackend = new llmInferenceBackend(llmInference, new GemmaFormatter());

আরও তথ্যের জন্য, LLM ইনফারেন্স কনফিগারেশন বিকল্পগুলি দেখুন।

মডেলটি ইনস্ট্যান্টিয়েট করুন

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

var systemInstruction = Content.newBuilder()
      .setRole("system")
      .addParts(Part.newBuilder().setText("You are a helpful assistant."))
      .build();

GenerativeModel ব্যবহার করে মডেলটি ইন্সট্যান্ট করুন:

var generativeModel = new GenerativeModel(
    llmInferenceBackend,
    systemInstruction,
    List.of(tool),
)

একটি চ্যাট সেশন শুরু করুন

সহজ করার জন্য, এই কুইকস্টার্টটি একটি একক চ্যাট সেশন শুরু করে। আপনি একাধিক, স্বাধীন সেশনও তৈরি করতে পারেন।

GenerativeModel এর নতুন ইনস্ট্যান্স ব্যবহার করে, একটি চ্যাট সেশন শুরু করুন:

var chat = generativeModel.startChat();

sendMessage পদ্ধতি ব্যবহার করে চ্যাট সেশনের মাধ্যমে মডেলটিকে প্রম্পট পাঠান:

var response = chat.sendMessage("How's the weather in San Francisco?");

মডেলের প্রতিক্রিয়া বিশ্লেষণ করুন

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

// Extract the model's message from the response.
var message = response.getCandidates(0).getContent().getParts(0);

// If the message contains a function call, execute the function.
if (message.hasFunctionCall()) {
  var functionCall = message.getFunctionCall();
  var args = functionCall.getArgs().getFieldsMap();
  var result = null;

  // Call the appropriate function.
  switch (functionCall.getName()) {
    case "getWeather":
      result = ToolsForLlm.getWeather(args.get("location").getStringValue());
      break;
    case "getTime":
      result = ToolsForLlm.getWeather(args.get("timezone").getStringValue());
      break;
    default:
      throw new Exception("Function does not exist:" + functionCall.getName());
  }
  // Return the result of the function call to the model.
  var functionResponse =
      FunctionResponse.newBuilder()
          .setName(functionCall.getName())
          .setResponse(
              Struct.newBuilder()
                  .putFields("result", Value.newBuilder().setStringValue(result).build()))
          .build();
  var functionResponseContent = Content.newBuilder()
        .setRole("user")
        .addParts(Part.newBuilder().setFunctionResponse(functionResponse))
        .build();
  var response = chat.sendMessage(functionResponseContent);
} else if (message.hasText()) {
  Log.i(message.getText());
}

নমুনা কোডটি একটি অতি সরলীকৃত বাস্তবায়ন। একটি অ্যাপ্লিকেশন কীভাবে মডেল প্রতিক্রিয়া পরীক্ষা করতে পারে সে সম্পর্কে আরও তথ্যের জন্য, ফর্ম্যাটিং এবং পার্সিং দেখুন।

কিভাবে এটা কাজ করে

এই বিভাগটি অ্যান্ড্রয়েডের জন্য ফাংশন কলিং SDK-এর মূল ধারণা এবং উপাদানগুলি সম্পর্কে আরও গভীর তথ্য প্রদান করে।

মডেল

ফাংশন কলিং SDK-এর জন্য একটি ফর্ম্যাটার এবং পার্সার সহ একটি মডেল প্রয়োজন। FC SDK-তে নিম্নলিখিত মডেলগুলির জন্য একটি অন্তর্নির্মিত ফর্ম্যাটার এবং পার্সার রয়েছে:

FC SDK-এর সাথে একটি ভিন্ন মডেল ব্যবহার করার জন্য, আপনাকে অবশ্যই আপনার নিজস্ব ফর্ম্যাটার এবং পার্সার তৈরি করতে হবে যা LLM ইনফারেন্স API-এর সাথে সামঞ্জস্যপূর্ণ।

বিন্যাস এবং বিশ্লেষণ

ফাংশন কলিং সাপোর্টের একটি গুরুত্বপূর্ণ অংশ হল প্রম্পট ফর্ম্যাটিং এবং মডেল আউটপুট পার্সিং। যদিও এই দুটি পৃথক প্রক্রিয়া, FC SDK ModelFormatter ইন্টারফেসের সাথে ফর্ম্যাটিং এবং পার্সিং উভয়ই পরিচালনা করে।

ফর্ম্যাটারটি স্ট্রাকচার্ড ফাংশন ডিক্লারেশনগুলিকে টেক্সটে রূপান্তর করার জন্য, ফাংশন রেসপন্স ফর্ম্যাট করার জন্য এবং কথোপকথনের শুরু এবং শেষের দিকে নির্দেশ করার জন্য টোকেন সন্নিবেশ করার জন্য দায়ী, সেইসাথে সেই টার্নগুলির ভূমিকা (যেমন "ব্যবহারকারী", "মডেল")।

মডেল রেসপন্সে কোনও ফাংশন কল আছে কিনা তা সনাক্ত করার জন্য পার্সার দায়ী। যদি পার্সার কোনও ফাংশন কল সনাক্ত করে, তবে এটি এটিকে একটি স্ট্রাকচার্ড ডেটা টাইপে পার্স করে। অন্যথায়, এটি টেক্সটটিকে একটি প্রাকৃতিক ভাষার প্রতিক্রিয়া হিসাবে বিবেচনা করে।

সীমাবদ্ধ ডিকোডিং

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

সীমাবদ্ধ ডিকোডিং সক্ষম করতে, একটি ConstraintOptions অবজেক্টের সীমাবদ্ধতাগুলি সংজ্ঞায়িত করুন এবং একটি ChatSession ইনস্ট্যান্সের enableConstraint পদ্ধতিটি চালু করুন। সক্ষম করা হলে, এই সীমাবদ্ধতা প্রতিক্রিয়াকে কেবলমাত্র GenerativeModel এর সাথে সম্পর্কিত সরঞ্জামগুলি অন্তর্ভুক্ত করার মধ্যে সীমাবদ্ধ করবে।

নিচের উদাহরণটি দেখায় যে কীভাবে টুল কলের প্রতিক্রিয়া সীমিত করার জন্য সীমাবদ্ধ ডিকোডিং কনফিগার করতে হয়। এটি টুল কলকে ```tool_code\n উপসর্গ দিয়ে শুরু করতে এবং \n``` প্রত্যয় দিয়ে শেষ করতে বাধ্য করে।

ConstraintOptions constraintOptions = ConstraintOptions.newBuilder()
.setToolCallOnly( ConstraintOptions.ToolCallOnly.newBuilder()
.setConstraintPrefix("```tool_code\n")
  .setConstraintSuffix("\n```"))
.build(); chatSession.enableConstraint(constraintOptions);

একই সেশনের মধ্যে সক্রিয় সীমাবদ্ধতা নিষ্ক্রিয় করতে, disableConstraint পদ্ধতিটি ব্যবহার করুন:

chatSession.disableConstraint();