AI এজ ফাংশন কলিং SDK (FC SDK) হল একটি লাইব্রেরি যা ডেভেলপারদের অন-ডিভাইস LLM-এর সাথে ফাংশন কলিং ব্যবহার করতে সক্ষম করে। ফাংশন কলিং আপনাকে মডেলগুলিকে বাহ্যিক সরঞ্জাম এবং API-এর সাথে সংযুক্ত করতে দেয়, মডেলগুলিকে বাস্তব-বিশ্বের ক্রিয়াগুলি চালানোর জন্য প্রয়োজনীয় প্যারামিটার সহ নির্দিষ্ট ফাংশনগুলিকে কল করতে সক্ষম করে৷
শুধু পাঠ্য তৈরি করার পরিবর্তে, FC SDK ব্যবহার করে একটি LLM একটি ফাংশনে একটি কাঠামোগত কল তৈরি করতে পারে যা একটি ক্রিয়া সম্পাদন করে, যেমন আপ-টু-ডেট তথ্য অনুসন্ধান করা, অ্যালার্ম সেট করা বা সংরক্ষণ করা।
একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশনে FC SDK-এর সাথে LLM ইনফারেন্স API যোগ করার জন্য এই নির্দেশিকাটি আপনাকে একটি প্রাথমিক কুইকস্টার্টের মাধ্যমে নিয়ে যায়। এই নির্দেশিকাটি একটি অন-ডিভাইস এলএলএম-এ ফাংশন কলিং ক্ষমতা যুক্ত করার উপর ফোকাস করে। এলএলএম ইনফারেন্স এপিআই ব্যবহার করার বিষয়ে আরও তথ্যের জন্য, অ্যান্ড্রয়েডের জন্য এলএলএম ইনফারেন্স দেখুন।
কুইকস্টার্ট
আপনার Android অ্যাপ্লিকেশনে FC SDK ব্যবহার করতে নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করুন৷ এই কুইকস্টার্টটি হ্যামার 2.1 (1.5B) সহ LLM ইনফারেন্স API ব্যবহার করে। LLM ইনফারেন্স API হাই-এন্ড অ্যান্ড্রয়েড ডিভাইসগুলির জন্য অপ্টিমাইজ করা হয়েছে, যেমন Pixel 8 এবং Samsung S23 বা তার পরে, এবং এটি নির্ভরযোগ্যভাবে ডিভাইস এমুলেটরকে সমর্থন করে না।
নির্ভরতা যোগ করুন
FC SDK com.google.ai.edge.localagents:localagents-fc
লাইব্রেরি ব্যবহার করে এবং LLM ইনফারেন্স API com.google.mediapipe:tasks-genai
লাইব্রেরি ব্যবহার করে। আপনার Android অ্যাপের build.gradle
ফাইলে উভয় নির্ভরতা যোগ করুন:
dependencies {
implementation 'com.google.mediapipe:tasks-genai:0.10.23'
implementation 'com.google.ai.edge.localagents:localagents-fc:0.1.0'
}
Android 12 (API 31) বা উচ্চতর ডিভাইসগুলির জন্য, নেটিভ OpenCL লাইব্রেরি নির্ভরতা যোগ করুন। আরও তথ্যের জন্য, 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"/>
একটি মডেল ডাউনলোড করুন
হাগিং ফেস থেকে 4-বিট কোয়ান্টাইজড ফরম্যাটে Gemma-3 1B ডাউনলোড করুন। উপলব্ধ মডেল সম্পর্কে আরও তথ্যের জন্য, মডেল ডকুমেন্টেশন দেখুন।
অ্যান্ড্রয়েড ডিভাইসে gemma3-1b-it-int4.task
ফোল্ডারের বিষয়বস্তু পুশ করুন।
$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push gemma3-1b-it-int4.task /data/local/tmp/llm/gemma3-1b-it-int4.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 ইনফারেন্স 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());
আরও তথ্যের জন্য, এলএলএম ইনফারেন্স কনফিগারেশন বিকল্পগুলি দেখুন।
মডেল ইনস্ট্যান্ট
অনুমান ব্যাকএন্ড, সিস্টেম প্রম্পট এবং সরঞ্জামগুলি সংযোগ করতে 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 response = chat.sendMessage(functionResponse);
} else if (message.hasText()) {
Log.i(message.getText());
}
নমুনা কোড একটি অতিমাত্রায় সরলীকৃত বাস্তবায়ন। একটি অ্যাপ্লিকেশন কীভাবে মডেল প্রতিক্রিয়া পরীক্ষা করতে পারে সে সম্পর্কে আরও তথ্যের জন্য, বিন্যাস এবং পার্সিং দেখুন।
এটা কিভাবে কাজ করে
এই বিভাগটি Android এর জন্য ফাংশন কলিং SDK-এর মূল ধারণা এবং উপাদানগুলির উপর আরও গভীর তথ্য প্রদান করে৷
মডেল
ফাংশন কলিং SDK-এর জন্য একটি ফর্ম্যাটার এবং পার্সার সহ একটি মডেল প্রয়োজন৷ FC SDK-তে নিম্নলিখিত মডেলগুলির জন্য একটি বিল্ট-ইন ফর্ম্যাটার এবং পার্সার রয়েছে:
- Gemma :
GemmaFormatter
ব্যবহার করুন। - Llama :
LlamaFormatter
ব্যবহার করুন। - হাতুড়ি :
HammerFormatter
ব্যবহার করুন।
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()