Prompt API ব্যবহার শুরু করা

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

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

Prompt API সম্পর্কে আরও জানতে, Kotlin (com.google.mlkit.genai.prompt) এবং Java (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-beta4")

Structured Output API ব্যবহার করে নির্দিষ্ট কোনও ফর্ম্যাটে উত্তর পেতে চাইলে, আপনাকে KSP কনফিগার করতে হবে এবং অতিরিক্ত ডিপেন্ডেন্সি যোগ করতে হবে। বিস্তারিত জানতে, স্ট্রাকচার্ড আউটপুট জেনারেট করুন দেখুন।

জেনারেটিভ মডেল প্রয়োগ করুন

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

  • generativeModel অবজেক্ট তৈরি করুন:

    Kotlin

    // Get a GenerativeModel instance
    val generativeModel = Generation.getClient()
    

    Java

    // Get a GenerativeModel instance
    GenerativeModelFutures generativeModelFutures = GenerativeModelFutures
        .from(Generation.INSTANCE.getClient());
    
  • Gemini Nano AVAILABLE, DOWNLOADABLE, নাকি UNAVAILABLE তা চেক করুন। তারপর, ফিচারটি ডাউনলোড করা গেলে, সেটি ডাউনলোড করুন:

    Kotlin

    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
        }
    }
    

    Java

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

শুধু টেক্সট ইনপুট দিন

Kotlin

val response = generativeModel.generateContent("Write a 3 sentence story about a magical dog.")

Java

GenerateContentResponse response = generativeModelFutures.generateContent(
  new GenerateContentRequest.Builder(
    new TextPart("Write a 3 sentence story about a magical dog."))
  .build())
  .get();

বিকল্প হিসেবে, ঐচ্ছিক প্যারামিটার যোগ করুন:

Kotlin

val response = generativeModel.generateContent(
    generateContentRequest(
        TextPart("Write a 3 sentence story about a magical dog."),
    ) {
        // Optional parameters
        temperature = 0.2f
        topK = 10
        candidateCount = 3
    },
)

Java

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() ফাংশনে একসাথে একাধিক ছবি ও টেক্সট ইনপুট বান্ডেল করুন, যেখানে টেক্সট প্রম্পট হল ছবি সম্পর্কিত কোনও প্রশ্ন বা কমান্ড। আপনি একই অনুরোধে সর্বাধিক ১০টি ছবি বান্ডেল করতে পারবেন।

Kotlin

val response = generativeModel.generateContent(
    generateContentRequest(ImagePart(bitmap1), ImagePart(bitmap2), TextPart(textPrompt)) {
        // optional parameters
        ...
    },
)

Java

GenerateContentResponse response = generativeModelFutures.generateContent(
    new GenerateContentRequest.Builder(
        new Content.Builder()
            .addPart(new ImagePart(bitmap1))
            .addPart(new ImagePart(bitmap2))
            .addPart(new TextPart("textPrompt"))
            .build())
    // optional parameters
    .build())
.get();

প্রসেস ইনফারেন্সের ফলাফল

  • ইনফারেন্স রান করে ফলাফল ফিরিয়ে আনুন। আপনি সম্পূর্ণ ফলাফলের জন্য অপেক্ষা করতে পারেন অথবা শুধুমাত্র টেক্সট ও মাল্টিমোডাল প্রম্পট, দুটির জন্যই উত্তর জেনারেট হওয়ার সাথে সাথে তা স্ট্রিম করতে পারেন।

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

    Kotlin

    // 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")
    

    Java

    GenerateContentResponse response = generativeModelFutures.generateContent(
            new GenerateContentRequest.Builder(
                    new TextPart("Write a 3 sentence story about a magical dog."))
                    .build())
            .get();
    
    • নিম্নলিখিত স্নিপেটগুলি স্ট্রিমিং ইনফারেন্স ব্যবহারের উদাহরণ, যা ফলাফল তৈরি হওয়ার সাথে সাথে চাঙ্কে ফলাফল ফিরিয়ে আনে:

    Kotlin

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

    Java

    // 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() কল করতে পারে। এটি মেমরিতে Gemini Nano লোড করে এবং রানটাইম কম্পোনেন্ট শুরু করে।

ঐচ্ছিক কনফিগারেশন

প্রতিটি GenerateContentRequest-এর অংশ হিসেবে, আপনি নিম্নলিখিত ঐচ্ছিক প্যারামিটার সেট করতে পারবেন:

  • temperature : টোকেন বেছে নেওয়ার ক্ষেত্রে র‍্যান্ডমনেসের ডিগ্রি কন্ট্রোল করে।
  • seed : স্টেবল ও নির্ধারক ফলাফল জেনারেট করার সুবিধা চালু করে।
  • topK : ফলাফলে র‍্যান্ডমনেস ও বৈচিত্র্য নিয়ন্ত্রণ করে।
  • candidateCount : অনন্য উত্তরের সংখ্যা ফেরত দেওয়ার অনুরোধ করে। মনে রাখবেন যে ডুপ্লিকেট উত্তর অটোমেটিক সরিয়ে দেওয়া হয় বলে উত্তরের সঠিক সংখ্যা candidateCount-এর সাথে নাও মিলতে পারে।
  • maxOutputTokens : উত্তরে সর্বাধিক কতগুলি টোকেন জেনারেট করা যাবে তা নির্ধারণ করে।

ঐচ্ছিক কনফিগারেশন সেট করার ব্যাপারে আরও নির্দেশিকা পেতে, GenerateContentRequest দেখুন।

কাজ করে এমন ফিচার ও সীমাবদ্ধতা

  • ইনপুট অবশ্যই ৪০০০ টোকেনের (বা আনুমানিক ৩০০০ ইংরেজি শব্দ) কম হতে হবে। আরও তথ্যের জন্য, countTokens রেফারেন্স দেখুন।
  • যেসব ক্ষেত্রে দীর্ঘ আউটপুট (৪ হাজারের বেশি টোকেন) প্রয়োজন হয়, সেগুলি এড়িয়ে চলুন।
  • AICore প্রতিটি অ্যাপের জন্য ইনফারেন্স কোটা এনফোর্স করে। আরও তথ্যের জন্য, প্রতি অ্যাপ্লিকেশনের কোটা দেখুন।

সেট-আপ সংক্রান্ত সাধারণ সমস্যা

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: UNAVAILABLE: হোস্ট ... সমাধান করা যায়নি নেটওয়ার্ক কানেকশন চালু রাখুন, কয়েক মিনিট অপেক্ষা করে আবার চেষ্টা করুন।