GenAI সংক্ষিপ্তকরণ API

এমএল কিট-এর জেনএআই সামারাইজেশন এপিআই (GenAI Summarization API) ব্যবহার করে আপনি আর্টিকেল এবং কথোপকথনের সারাংশ স্বয়ংক্রিয়ভাবে বুলেট পয়েন্টের তালিকা হিসেবে তৈরি করতে পারেন। এটি ব্যবহারকারীদের বিশাল আকারের লেখা বুঝতে সাহায্য করে।

ডিভাইসে-ভিত্তিক জেনারেটিভ এআই সারসংক্ষেপ তৈরিতে সুবিধা দেয়, কারণ এটি ডেটার গোপনীয়তা এবং খরচ সাশ্রয়ের উদ্বেগগুলো সমাধান করে। যে অ্যাপগুলো ব্যক্তিগত চ্যাট, ইমেল, নোট এবং রিমাইন্ডারের সারসংক্ষেপ তৈরি করে, সেগুলোতে প্রায়শই সংবেদনশীল তথ্য থাকে, যা ব্যবহারকারীর গোপনীয়তা রক্ষার জন্য ডিভাইসেই প্রসেসিংকে গুরুত্বপূর্ণ করে তোলে। এছাড়াও, সারসংক্ষেপ তৈরির কাজ, বিশেষ করে যেগুলোতে দীর্ঘ প্রেক্ষাপট বা অনেকগুলো আইটেম থাকে, সেগুলোর জন্য উল্লেখযোগ্য পরিমাণে প্রসেসিং ক্ষমতার প্রয়োজন হতে পারে। ডিভাইসে এই কন্টেন্ট প্রসেস করলে সার্ভারের ওপর চাপ কমে এবং পরিষেবা দেওয়ার খরচ হ্রাস পায়, পাশাপাশি ব্যবহারকারীর ডেটাও গোপন থাকে।

মূল সক্ষমতা

GenAI সামারাইজেশন API-এর নিম্নলিখিত সক্ষমতাগুলো রয়েছে:

  • প্রবন্ধ বা কথোপকথন হিসেবে শ্রেণীবদ্ধ পাঠ্যের সারসংক্ষেপ করুন।
  • এক, দুই বা তিনটি বুলেট পয়েন্টে সারসংক্ষেপ উপস্থাপন করুন।

শুরু করুন

আপনার build.gradle কনফিগারেশনে ML Kit সামারাইজেশন API-কে একটি ডিপেন্ডেন্সি হিসেবে যোগ করুন।

implementation("com.google.mlkit:genai-summarization:1.0.0-beta1")

এরপর, আপনার প্রজেক্টে কোডটি প্রয়োগ করুন:

  1. একটি Summarizer অবজেক্ট তৈরি করুন।
  2. ফিচারটি ডাউনলোডযোগ্য হলে ডাউনলোড করুন।
  3. একটি সারসংক্ষেপ অনুরোধ তৈরি করুন।
  4. অনুমানটি চালান এবং ফলাফলটি সংগ্রহ করুন।

কোটলিন

val articleToSummarize = "Announcing a set of on-device GenAI APIs..."

// Define task with required input type, output type, and language
val summarizerOptions = SummarizerOptions.builder(context)
    .setInputType(InputType.ARTICLE)
    .setOutputType(OutputType.ONE_BULLET)
    .setLanguage(Language.ENGLISH)
    .build()
val summarizer = Summarization.getClient(summarizerOptions)

suspend fun prepareAndStartSummarization() {
    // Check feature availability. Status will be one of the following:
    // UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    val featureStatus = summarizer.checkFeatureStatus().await()

    if (featureStatus == FeatureStatus.DOWNLOADABLE) {
        // Download feature if necessary. If downloadFeature is not called,
        // the first inference request will also trigger the feature to be
        // downloaded if it's not already downloaded.
        summarizer.downloadFeature(object : DownloadCallback {
            override fun onDownloadStarted(bytesToDownload: Long) { }

            override fun onDownloadFailed(e: GenAiException) { }

            override fun onDownloadProgress(totalBytesDownloaded: Long) {}

            override fun onDownloadCompleted() {
                startSummarizationRequest(articleToSummarize, summarizer)
            }
        })
    } else if (featureStatus == FeatureStatus.DOWNLOADING) {
        // Inference request will automatically run once feature is
        // downloaded. If Gemini Nano is already downloaded on the device,
        // the feature-specific LoRA adapter model will be downloaded
        // quickly. However, if Gemini Nano is not already downloaded, the
        // download process may take longer.
        startSummarizationRequest(articleToSummarize, summarizer)
    } else if (featureStatus == FeatureStatus.AVAILABLE) {
        startSummarizationRequest(articleToSummarize, summarizer)
    }
}

fun startSummarizationRequest(text: String, summarizer: Summarizer) {
    // Create task request
    val summarizationRequest = SummarizationRequest.builder(text).build()

    // Start summarization request with streaming response
    summarizer.runInference(summarizationRequest) { newText ->
        // Show new text in UI
    }

    // You can also get a non-streaming response from the request
    // val summarizationResult = summarizer.runInference(
    //     summarizationRequest).get().summary
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
summarizer.close()

জাভা

String articleToSummarize = "Announcing: a set of on-device GenAI AI APIs.";

// Define task with required input type, output type, and language
SummarizerOptions summarizerOptions = 
    SummarizerOptions.builder(context)
        .setInputType(SummarizerOptions.InputType.ARTICLE)
        .setOutputType(SummarizerOptions.OutputType.ONE_BULLET)
        .setLanguage(SummarizerOptions.Language.ENGLISH)
        .build();
Summarizer summarizer = Summarization.getClient(summarizerOptions);

void prepareAndStartSummarization()
        throws ExecutionException, InterruptedException {
    // Check feature availability. Status will be one of the following:
    // UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    try {
        int featureStatus = summarizer.checkFeatureStatus().get();
        if (featureStatus == FeatureStatus.DOWNLOADABLE) {
            // Download feature if necessary.
            // If downloadFeature is not called, the first inference request
            // will also trigger the feature to be downloaded if it's not
            // already downloaded.
            summarizer.downloadFeature(new DownloadCallback() {
                @Override
                public void onDownloadCompleted() {
                    startSummarizationRequest(articleToSummarize, summarizer);
                }

                @Override
                public void onDownloadFailed(GenAiException e) { /* handle error */ }

                @Override
                public void onDownloadProgress(long totalBytesDownloaded) {}

                @Override
                public void onDownloadStarted(long bytesDownloaded) {}
            });
        } else if (featureStatus == FeatureStatus.DOWNLOADING) {
            // Inference request will automatically run once feature is
            // downloaded. If Gemini Nano is already downloaded on the
            // device, the feature-specific LoRA adapter model will be
            // downloaded quickly. However, if Gemini Nano is not already
            // downloaded, the download process may take longer.
            startSummarizationRequest(articleToSummarize, summarizer);
        } else if (featureStatus == FeatureStatus.AVAILABLE) {
            startSummarizationRequest(articleToSummarize, summarizer);
        }
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

void startSummarizationRequest(String text, Summarizer summarizer) {
    // Create task request
    SummarizationRequest summarizationRequest =
        SummarizationRequest.builder(text).build();

    // Start summarization request with streaming response
    summarizer.runInference(summarizationRequest, newText -> {
        // Show new text in UI
    });

    // You can also get a non-streaming response from the request
    // ListenableFuture<SummarizationResult> summarizationResult
    //         = summarizer.runInference(summarizationRequest);
    // String summary = summarizationResult.get().getSummary();
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
summarizer.close();

মডেলটি কীভাবে বিভিন্ন ধরণের ইনপুট পরিচালনা করে

যখন টেক্সট ইনপুটটি InputType.CONVERSATION হিসেবে নির্দিষ্ট করা হয়, তখন মডেলটি নিম্নলিখিত ফরম্যাটে ইনপুট প্রত্যাশা করে:

<name>: <message>
<name2>: <message2>
<name>: <message3>
<name3>: <message4>

এটি কথোপকথন এবং পারস্পরিক ক্রিয়া সম্পর্কে আরও ভালো ধারণা প্রদান করে মডেলটিকে আরও নির্ভুল সারসংক্ষেপ তৈরি করতে সক্ষম করে।

সমর্থিত বৈশিষ্ট্য এবং সীমাবদ্ধতা

ইনপুট অবশ্যই ৪০০০ টোকেনের (বা প্রায় ৩০০০ ইংরেজি শব্দের) কম হতে হবে। যদি ইনপুট ৪০০০ টোকেনের বেশি হয়, তবে এই বিকল্পগুলো বিবেচনা করুন:

  • প্রথম ৪০০০ টোকেনের সারসংক্ষেপ তৈরিতে অগ্রাধিকার দিন। পরীক্ষায় দেখা গেছে যে, দীর্ঘ ইনপুটের ক্ষেত্রে এটি সাধারণত ভালো ফলাফল দেয়। setLongInputAutoTruncationEnabled কল করে স্বয়ংক্রিয় ট্রাঙ্কেশন চালু করার কথা বিবেচনা করুন, যাতে অতিরিক্ত ইনপুটটি স্বয়ংক্রিয়ভাবে ছেঁটে ফেলা হয়।
  • ইনপুটটিকে ৪০০০ টোকেনের গ্রুপে ভাগ করুন এবং প্রতিটি টোকেনকে আলাদাভাবে সংক্ষিপ্ত করুন।
  • এমন একটি ক্লাউড সলিউশন বিবেচনা করুন যা বৃহত্তর ইনপুটের জন্য আরও উপযুক্ত।

InputType.ARTICLE এর ক্ষেত্রে, ইনপুট অবশ্যই ৪০০ অক্ষরের বেশি হতে হবে এবং আর্টিকেলটি কমপক্ষে ৩০০ শব্দের হলে মডেলটি সবচেয়ে ভালো কাজ করে।

GenAI সামারাইজেশন এপিআই ইংরেজি, জাপানি এবং কোরিয়ান ভাষা সমর্থন করে এবং এটি SummarizerOptions.Language এ সংজ্ঞায়িত করা হয়েছে।

নির্দিষ্ট ফিচার কনফিগারেশনের (যা SummarizerOptions দ্বারা নির্ধারিত) প্রাপ্যতা, নির্দিষ্ট ডিভাইসের কনফিগারেশন এবং ডিভাইসে ডাউনলোড করা মডেলগুলোর ওপর নির্ভর করে পরিবর্তিত হতে পারে।

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

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

এমএল কিট জেনএআই এপিআই (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) এরর সহ ব্যর্থ হয়েছে: হোস্ট ... রিজলভ করতে অক্ষম। নেটওয়ার্ক সংযোগ চালু রাখুন, কয়েক মিনিট অপেক্ষা করুন এবং আবার চেষ্টা করুন।

নমুনা কোড