এই পৃষ্ঠায় নিম্নলিখিত বিষয়গুলো কীভাবে করতে হয় তা বর্ণনা করা হয়েছে:
- আপনার প্রজেক্টটি প্রম্পট এপিআই (Prompt API) ব্যবহার করার জন্য কনফিগার করুন।
- শুধুমাত্র টেক্সট ইনপুট দিন এবং একটি প্রতিক্রিয়া গ্রহণ করুন।
- একটি ছবির সাথে সম্পর্কিত টেক্সট ইনপুট দিন এবং একটি প্রতিক্রিয়া গ্রহণ করুন।
প্রম্পট এপিআই (Prompt API) সম্পর্কে আরও বিস্তারিত জানতে, কোটলিন ( com.google.mlkit.genai.prompt ) এবং জাভা ( com.google.mlkit.genai.prompt.java , com.google.mlkit.genai.prompt ) এর রেফারেন্স ডকুমেন্টেশন দেখুন।
প্রকল্প কনফিগার করুন
আপনার build.gradle কনফিগারেশনে ML Kit Prompt API-কে একটি ডিপেন্ডেন্সি হিসেবে যোগ করুন:
implementation("com.google.mlkit:genai-prompt:1.0.0-beta2")
জেনারেটিভ মডেল বাস্তবায়ন করুন
আপনার প্রজেক্টে কোডটি প্রয়োগ করতে, এই ধাপগুলো অনুসরণ করুন:
একটি
generativeModelঅবজেক্ট তৈরি করুন:কোটলিন
// Get a GenerativeModel instance val generativeModel = Generation.getClient()জাভা
// Get a GenerativeModel instance GenerativeModelFutures generativeModelFutures = GenerativeModelFutures .from(Generation.INSTANCE.getClient());জেমিনি ন্যানো
AVAILABLE,DOWNLOADABLE, নাকিUNAVAILABLE) তা পরীক্ষা করুন। তারপর, ফিচারটি ডাউনলোডযোগ্য হলে সেটি ডাউনলোড করুন:কোটলিন
val status = generativeModel.checkStatus() when (status) { FeatureStatus.UNAVAILABLE -> { // Gemini Nano not supported on this device or device hasn't fetched the latest configuration to support it } FeatureStatus.DOWNLOADABLE -> { // Gemini Nano can be downloaded on this device, but is not currently downloaded generativeModel.download().collect { status -> when (status) { is DownloadStatus.DownloadStarted -> Log.d(TAG, "starting download for Gemini Nano") is DownloadStatus.DownloadProgress -> Log.d(TAG, "Nano ${status.totalBytesDownloaded} bytes downloaded") DownloadStatus.DownloadCompleted -> { Log.d(TAG, "Gemini Nano download complete") modelDownloaded = true } is DownloadStatus.DownloadFailed -> { Log.e(TAG, "Nano download failed ${status.e.message}") } } } } FeatureStatus.DOWNLOADING -> { // Gemini Nano currently being downloaded } FeatureStatus.AVAILABLE -> { // Gemini Nano currently downloaded and available to use on this device } }জাভা
ListenableFuture<Integer> status = generativeModelFutures.checkStatus(); Futures.addCallback(generativeModelFutures.checkStatus(), new FutureCallback<>() { @Override public void onSuccess(Integer featureStatus) { switch (featureStatus) { case FeatureStatus.AVAILABLE - > { // Gemini Nano currently downloaded and available to use on this device } case FeatureStatus.UNAVAILABLE - > { // Gemini Nano not supported on this device or device hasn't fetched the latest configuration to support it } case FeatureStatus.DOWNLOADING - > { // Gemini Nano currently being downloaded } case FeatureStatus.DOWNLOADABLE - > { generativeModelFutures.download(new DownloadCallback() { @Override public void onDownloadStarted(long l) { Log.d(TAG, "starting download for Gemini Nano"); } @Override public void onDownloadProgress(long l) { Log.d(TAG, "Nano " + l + " bytes downloaded"); } @Override public void onDownloadCompleted() { Log.d(TAG, "Gemini Nano download complete"); } @Override public void onDownloadFailed(@NonNull GenAiException e) { Log.e(TAG, "Nano download failed: " + e.getMessage()); } }); } } } @Override public void onFailure(@NonNull Throwable t) { // Failed to check status } }, ContextCompat.getMainExecutor(context));
শুধুমাত্র টেক্সট ইনপুট প্রদান করুন
কোটলিন
val response = generativeModel.generateContent("Write a 3 sentence story about a magical dog.")
জাভা
GenerateContentResponse response = generativeModelFutures.generateContent(
new GenerateContentRequest.Builder(
new TextPart("Write a 3 sentence story about a magical dog."))
.build())
.get();
বিকল্পভাবে, ঐচ্ছিক প্যারামিটার যোগ করুন:
কোটলিন
val response = generativeModel.generateContent(
generateContentRequest(
TextPart("Write a 3 sentence story about a magical dog."),
) {
// Optional parameters
temperature = 0.2f
topK = 10
candidateCount = 3
},
)
জাভা
GenerateContentRequest.Builder requestBuilder =
new GenerateContentRequest.Builder(
new TextPart("Write a 3 sentence story about a magical dog."));
requestBuilder.setTemperature(.2f);
requestBuilder.setTopK(10);
requestBuilder.setCandidateCount(3);
GenerateContentResponse response =
generativeModelFutures.generateContent(requestBuilder.build()).get();
ঐচ্ছিক প্যারামিটারগুলো সম্পর্কে আরও তথ্যের জন্য, ঐচ্ছিক কনফিগারেশন দেখুন।
মাল্টিমোডাল (ছবি এবং টেক্সট) ইনপুট প্রদান করুন
generateContentRequest() ফাংশনে একটি ছবি এবং একটি টেক্সট ইনপুট একসাথে যুক্ত করুন, যেখানে টেক্সট প্রম্পটটি হবে ছবি-সম্পর্কিত কোনো প্রশ্ন বা কমান্ড:
কোটলিন
val response = generativeModel.generateContent(
generateContentRequest(ImagePart(bitmap), TextPart(textPrompt)) {
// optional parameters
...
},
)
জাভা
GenerateContentResponse response = generativeModelFutures.generateContent(
new GenerateContentRequest.Builder(
new ImagePart(bitmap),
new TextPart("textPrompt"))
// optional parameters
.build())
.get();
প্রক্রিয়া অনুমানের ফলাফল
ইনফারেন্সটি চালান এবং ফলাফলটি সংগ্রহ করুন। আপনি চাইলে সম্পূর্ণ ফলাফলের জন্য অপেক্ষা করতে পারেন, অথবা শুধুমাত্র টেক্সট এবং মাল্টিমোডাল উভয় ধরনের প্রম্পটের জন্যই প্রতিক্রিয়াটি তৈরি হওয়ার সাথে সাথেই স্ট্রিম করে দেখতে পারেন।
এটি নন-স্ট্রিমিং ইনফারেন্স ব্যবহার করে, যা ফলাফল ফেরত দেওয়ার আগে এআই মডেল থেকে সম্পূর্ণ ফলাফলটি সংগ্রহ করে:
কোটলিন
// Call the AI model to generate content and store the complete // in a new variable named 'response' once it's finished val response = generativeModel.generateContent("Write a 3 sentence story about a magical dog")জাভা
GenerateContentResponse response = generativeModelFutures.generateContent( new GenerateContentRequest.Builder( new TextPart("Write a 3 sentence story about a magical dog.")) .build()) .get();নিম্নলিখিত কোড স্নিপেটগুলি স্ট্রিমিং ইনফারেন্স ব্যবহারের উদাহরণ, যা ফলাফল তৈরি হওয়ার সাথে সাথে সেটিকে খণ্ডে খণ্ডে গ্রহণ করে:
কোটলিন
// Streaming inference var fullResponse = "" generativeModel.generateContentStream("Write a 3 sentence story about a magical dog").collect { chunk -> val newChunkReceived = chunk.candidates[0].text print(newChunkReceived) fullResponse += newChunkReceived }জাভা
// Streaming inference StringBuilder fullResponse = new StringBuilder(); generativeModelFutures.generateContent(new GenerateContentRequest.Builder( (new TextPart("Write a 3 sentence story about a magical dog"))).build(), chunk -> { Log.d(TAG, chunk); fullResponse.append(chunk); });
স্ট্রিমিং এবং নন-স্ট্রিমিং ইনফারেন্স সম্পর্কে আরও তথ্যের জন্য, স্ট্রিমিং বনাম নন-স্ট্রিমিং দেখুন।
লেটেন্সি অপ্টিমাইজেশন
প্রথম ইনফারেন্স কলটিকে অপ্টিমাইজ করার জন্য, আপনার অ্যাপ্লিকেশনটি ঐচ্ছিকভাবে warmup() কল করতে পারে। এটি জেমিনি ন্যানোকে মেমরিতে লোড করে এবং রানটাইম কম্পোনেন্টগুলোকে ইনিশিয়ালাইজ করে।
ঐচ্ছিক কনফিগারেশন
প্রতিটি GenerateContentRequest এর অংশ হিসেবে, আপনি নিম্নলিখিত ঐচ্ছিক প্যারামিটারগুলো সেট করতে পারেন:
-
temperature: টোকেন নির্বাচনে এলোমেলোতার মাত্রা নিয়ন্ত্রণ করে। -
seed: স্থিতিশীল এবং সুনির্দিষ্ট ফলাফল তৈরি করতে সক্ষম করে। -
topK: ফলাফলের এলোমেলোভাব ও বৈচিত্র্য নিয়ন্ত্রণ করে। -
candidateCount: ফেরত আসা অনন্য প্রতিক্রিয়ার সংখ্যা জানতে চায়। উল্লেখ্য যে, প্রতিক্রিয়ার সঠিক সংখ্যাcandidateCountসমান নাও হতে পারে, কারণ সদৃশ প্রতিক্রিয়াগুলো স্বয়ংক্রিয়ভাবে মুছে ফেলা হয়। -
maxOutputTokens: রেসপন্সে সর্বোচ্চ কতগুলো টোকেন তৈরি করা যাবে তা নির্ধারণ করে।
ঐচ্ছিক কনফিগারেশন সেট করার বিষয়ে আরও নির্দেশনার জন্য, GenerateContentRequest দেখুন।
সমর্থিত বৈশিষ্ট্য এবং সীমাবদ্ধতা
- ইনপুট অবশ্যই ৪০০০ টোকেনের (বা প্রায় ৩০০০ ইংরেজি শব্দের) কম হতে হবে। আরও তথ্যের জন্য,
countTokensরেফারেন্সটি দেখুন। - যেসব ক্ষেত্রে দীর্ঘ আউটপুট (২৫৬টির বেশি টোকেন) প্রয়োজন হয়, সেগুলো পরিহার করা উচিত।
- AICore প্রতিটি অ্যাপের জন্য একটি ইনফারেন্স কোটা আরোপ করে। আরও তথ্যের জন্য, ‘প্রতি অ্যাপ্লিকেশনে কোটা’ দেখুন।
- প্রম্পট এপিআই-এর জন্য নিম্নলিখিত ভাষাগুলো যাচাই করা হয়েছে:
- ইংরেজি
- কোরিয়ান
সাধারণ সেটআপ সমস্যা
এমএল কিট জেনএআই এপিআই (ML Kit GenAI APIs) জেমিনি ন্যানো (Gemini Nano) অ্যাক্সেস করার জন্য অ্যান্ড্রয়েড এআইকোর (Android AICore) অ্যাপের উপর নির্ভর করে। যখন কোনো ডিভাইস সবেমাত্র সেটআপ করা হয় (রিসেট সহ), অথবা এআইকোর অ্যাপটি সবেমাত্র রিসেট করা হয় (যেমন ডেটা মুছে ফেলা, আনইনস্টল করে আবার ইনস্টল করা), তখন এআইকোর অ্যাপটি ইনিশিয়ালাইজেশন (সার্ভার থেকে সর্বশেষ কনফিগারেশন ডাউনলোড করা সহ) শেষ করার জন্য যথেষ্ট সময় নাও পেতে পারে। এর ফলে, এমএল কিট জেনএআই এপিআইগুলো প্রত্যাশিতভাবে কাজ নাও করতে পারে। নিচে সাধারণ কিছু সেটআপ ত্রুটির বার্তা এবং সেগুলো কীভাবে সমাধান করবেন তা দেওয়া হলো:
| ত্রুটির বার্তার উদাহরণ | কীভাবে সামলাতে হবে |
| AICore ৪-CONNECTION_ERROR এরর টাইপ এবং ৬০১-BINDING_FAILURE এরর কোড সহ ব্যর্থ হয়েছে: AICore সার্ভিস বাইন্ড করতে ব্যর্থ হয়েছে। | ডিভাইস সেটআপের ঠিক পরেই ML Kit GenAI API ব্যবহার করে অ্যাপটি ইনস্টল করলে, অথবা আপনার অ্যাপটি ইনস্টল করার পর AICore আনইনস্টল করা হলে এমনটা হতে পারে। AICore অ্যাপটি আপডেট করে তারপর আপনার অ্যাপটি পুনরায় ইনস্টল করলে সমস্যাটির সমাধান হয়ে যাবে। |
| AICore ৩-PREPARATION_ERROR এরর টাইপ এবং ৬০৬-FEATURE_NOT_FOUND এরর কোড সহ ব্যর্থ হয়েছে: ফিচার ... উপলব্ধ নয়। | AICore সর্বশেষ কনফিগারেশনগুলো ডাউনলোড করা শেষ না করলে এমনটা হতে পারে। ডিভাইসটি ইন্টারনেটের সাথে সংযুক্ত থাকলে, আপডেট হতে সাধারণত কয়েক মিনিট থেকে কয়েক ঘণ্টা সময় লাগে। ডিভাইসটি রিস্টার্ট করলে আপডেটটি দ্রুত হতে পারে। মনে রাখবেন যে, যদি ডিভাইসটির বুটলোডার আনলক করা থাকে, তাহলে আপনি এই ত্রুটিটিও দেখতে পাবেন—এই API আনলক করা বুটলোডারযুক্ত ডিভাইস সমর্থন করে না। |
| AICore ১-ডাউনলোড_এরর (1-DOWNLOAD_ERROR) এরর টাইপ এবং ০-আননোন (0-UNKNOWN) এরর কোড সহ ব্যর্থ হয়েছে: ফিচার ... ফেইলর স্ট্যাটাস ০ (0) এবং esz: আনঅ্যাভেইলেবল (UNAVAILABLE) এরর সহ ব্যর্থ হয়েছে: হোস্ট ... রিজলভ করতে অক্ষম। | নেটওয়ার্ক সংযোগ চালু রাখুন, কয়েক মিনিট অপেক্ষা করুন এবং আবার চেষ্টা করুন। |