প্রম্পট এপিআই দিয়ে শুরু করুন

এই পৃষ্ঠায় নিম্নলিখিত কাজগুলি কীভাবে করবেন তা বর্ণনা করা হয়েছে:

  • প্রম্পট API ব্যবহার করার জন্য আপনার প্রকল্পটি কনফিগার করুন
  • শুধুমাত্র টেক্সট ইনপুট প্রদান করুন এবং একটি প্রতিক্রিয়া পান
  • সম্পর্কিত টেক্সট ইনপুট সহ একটি ছবি ইনপুট প্রদান করুন এবং একটি প্রতিক্রিয়া পান

প্রম্পট এপিআই সম্পর্কে আরও বিস্তারিত জানার জন্য, কোটলিন ( com.google.mlkit.genai.prompt ) এবং জাভা ( com.google.mlkit.genai.prompt.java , com.google.mlkit.genai.prompt ) এর রেফারেন্স ডকুমেন্টেশন দেখুন।

[ঐচ্ছিক] Gemma 3n মডেলের সাথে পরীক্ষার প্রম্পট

বাস্তবায়নের আগে, AI স্টুডিওতে Gemma 3n E4B মডেল দিয়ে আপনার প্রম্পট পরীক্ষা করার কথা বিবেচনা করুন। Gemma 3n এর আউটপুট nano-v3 এর আউটপুটের সাথে খুব মিল বলে আশা করা যেতে পারে।

প্রকল্প কনফিগার করুন

আপনার build.gradle কনফিগারেশনে নির্ভরতা হিসেবে ML Kit Prompt API যোগ করুন:

implementation("com.google.mlkit:genai-prompt:1.0.0-alpha1")

জেনারেটিভ মডেল বাস্তবায়ন করুন

আপনার প্রকল্পে কোডটি বাস্তবায়ন করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  • একটি 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();

প্রক্রিয়া অনুমানের ফলাফল

  • অনুমানটি চালান এবং ফলাফলটি উদ্ধার করুন। আপনি সম্পূর্ণ ফলাফলের জন্য অপেক্ষা করতে পারেন অথবা প্রতিক্রিয়াটি স্ট্রিম করতে পারেন কারণ এটি কেবল-টেক্সট এবং মাল্টিমোডাল প্রম্পট উভয়ের জন্যই তৈরি হয়।

    • এটি নন-স্ট্রিমিং ইনফারেন্স ব্যবহার করে, যা ফলাফল ফেরত দেওয়ার আগে AI মডেল থেকে সম্পূর্ণ ফলাফল উদ্ধার করে:

    কোটলিন

    // 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 প্রতিটি অ্যাপের জন্য একটি অনুমান কোটা প্রয়োগ করে। আরও তথ্যের জন্য, প্রতিটি অ্যাপ্লিকেশনের জন্য কোটা দেখুন।
  • নিম্নলিখিত ভাষাগুলি প্রম্পট API-এর জন্য বৈধ করা হয়েছে:
    • ইংরেজী
    • কোরিয়ান

সাধারণ সেটআপ সমস্যা

ML Kit GenAI API গুলি Gemini Nano অ্যাক্সেস করার জন্য Android AICore অ্যাপের উপর নির্ভর করে। যখন কোনও ডিভাইস সবেমাত্র সেটআপ করা হয় (রিসেট সহ), অথবা AICore অ্যাপ সবেমাত্র রিসেট করা হয় (যেমন ডেটা সাফ করা, আনইনস্টল করা এবং পুনরায় ইনস্টল করা), তখন AICore অ্যাপটি আরম্ভকরণ শেষ করার জন্য পর্যাপ্ত সময় নাও পেতে পারে (সার্ভার থেকে সর্বশেষ কনফিগারেশন ডাউনলোড সহ)। ফলস্বরূপ, ML Kit GenAI API গুলি প্রত্যাশা অনুযায়ী কাজ নাও করতে পারে। আপনি যে সাধারণ সেটআপ ত্রুটির বার্তাগুলি দেখতে পারেন এবং সেগুলি কীভাবে পরিচালনা করবেন তা এখানে দেওয়া হল:

উদাহরণ ত্রুটি বার্তা কিভাবে সামলাবেন
AICore ত্রুটি টাইপ 4-CONNECTION_ERROR এবং ত্রুটি কোড 601-BINDING_FAILURE সহ ব্যর্থ হয়েছে: AICore পরিষেবা বাঁধতে ব্যর্থ হয়েছে। ডিভাইস সেটআপের পরপরই ML Kit GenAI API ব্যবহার করে অ্যাপটি ইনস্টল করলে অথবা আপনার অ্যাপ ইনস্টল করার পর AICore আনইনস্টল করলে এটি ঘটতে পারে। AICore অ্যাপ আপডেট করে তারপর পুনরায় ইনস্টল করলে এটি ঠিক হয়ে যাবে।
AICore ব্যর্থ হয়েছে ত্রুটি টাইপ 3-PREPARATION_ERROR এবং ত্রুটি কোড 606-FEATURE_NOT_FOUND: বৈশিষ্ট্য ... উপলব্ধ নয়। AICore যখন সর্বশেষ কনফিগারেশন ডাউনলোড করা শেষ না করে তখন এটি ঘটতে পারে। যখন ডিভাইসটি ইন্টারনেটের সাথে সংযুক্ত থাকে, তখন আপডেট হতে সাধারণত কয়েক মিনিট থেকে কয়েক ঘন্টা সময় লাগে। ডিভাইসটি পুনরায় চালু করলে আপডেটের গতি বাড়ানো যেতে পারে।

মনে রাখবেন যে যদি ডিভাইসের বুটলোডার আনলক করা থাকে, তাহলে আপনি এই ত্রুটিটিও দেখতে পাবেন—এই API আনলক করা বুটলোডার সহ ডিভাইসগুলিকে সমর্থন করে না।
AICore ত্রুটি টাইপ 1-DOWNLOAD_ERROR এবং ত্রুটি কোড 0-UNKNOWN সহ ব্যর্থ হয়েছে: বৈশিষ্ট্য ... ব্যর্থতার স্থিতি 0 এবং ত্রুটি esz সহ ব্যর্থ হয়েছে: উপলব্ধ নেই: হোস্ট সমাধান করতে অক্ষম ... নেটওয়ার্ক সংযোগ রাখুন, কয়েক মিনিট অপেক্ষা করুন এবং পুনরায় চেষ্টা করুন।