GenAI Summarization API

ML Kit के GenAI Summarization API की मदद से, लेखों और बातचीत की खास जानकारी अपने-आप जनरेट की जा सकती है. यह खास जानकारी, बुलेट पॉइंट की सूची के तौर पर जनरेट होती है. इससे लोगों को बड़े टेक्स्ट को समझने में मदद मिलती है.

डिवाइस पर मौजूद जनरेटिव एआई की मदद से, खास जानकारी जनरेट करने की सुविधा का इस्तेमाल करने के कई फ़ायदे हैं. जैसे, डेटा की निजता बनाए रखने और लागत कम करने में मदद मिलती है. निजी चैट, ईमेल, नोट, और रिमाइंडर की खास जानकारी देने वाले ऐप्लिकेशन, अक्सर संवेदनशील जानकारी को मैनेज करते हैं. इसलिए, उपयोगकर्ता की निजता के लिए डिवाइस पर प्रोसेसिंग करना ज़रूरी है. इसके अलावा, जवाब को छोटा करने से जुड़े टास्क, खास तौर पर वे जिनमें लंबा कॉन्टेक्स्ट या कई आइटम शामिल होते हैं, उनके लिए ज़्यादा प्रोसेसिंग पावर की ज़रूरत पड़ सकती है. इस कॉन्टेंट को डिवाइस पर प्रोसेस करने से, सर्वर पर लोड कम होता है और कॉन्टेंट दिखाने की लागत कम होती है. साथ ही, उपयोगकर्ता का डेटा निजी रहता है.

मुख्य सुविधाएं

GenAI Summarization API में ये सुविधाएं शामिल हैं:

  • टेक्स्ट की खास जानकारी जनरेट करना. इसे लेख या बातचीत के तौर पर कैटगरी में रखा जाता है.
  • जवाब को एक, दो या तीन बुलेट पॉइंट में दिखाओ.

अपनी प्रोफ़ाइल बनाना शुरू करें

ML Kit के Summarization API को अपनी build.gradle कॉन्फ़िगरेशन फ़ाइल में डिपेंडेंसी के तौर पर जोड़ें.

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

इसके बाद, अपने प्रोजेक्ट में कोड लागू करें:

  1. Summarizer ऑब्जेक्ट बनाएं.
  2. अगर सुविधा डाउनलोड की जा सकती है, तो उसे डाउनलोड करें.
  3. जवाब को छोटा करने का अनुरोध करें.
  4. अनुमान लगाने की प्रोसेस शुरू करें और नतीजे पाएं.

Kotlin

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

Java

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>

इससे मॉडल को बातचीत और इंटरैक्शन को बेहतर तरीके से समझने में मदद मिलती है. इसलिए, वह ज़्यादा सटीक जवाब दे पाता है.

इस्तेमाल की जा सकने वाली सुविधाएं और सीमाएं

इनपुट 4,000 टोकन (या करीब 3,000 अंग्रेज़ी शब्दों) से कम होना चाहिए. अगर इनपुट में 4,000 से ज़्यादा टोकन हैं, तो ये विकल्प आज़माएं:

  • पहले 4,000 टोकन की खास जानकारी देने को प्राथमिकता दें. टेस्टिंग से पता चलता है कि आम तौर पर, लंबे इनपुट के लिए यह तरीका बेहतर नतीजे देता है. setLongInputAutoTruncationEnabled को कॉल करके, अपने-आप छोटा होने की सुविधा चालू करें, ताकि अतिरिक्त इनपुट अपने-आप छोटा हो जाए.
  • इनपुट को 4, 000 टोकन के ग्रुप में बांटो और हर ग्रुप के लिए अलग-अलग जवाब लिखो.
  • ऐसे क्लाउड सलूशन का इस्तेमाल करें जो बड़े इनपुट के लिए ज़्यादा सही हो.

InputType.ARTICLE के लिए, इनपुट में 400 से ज़्यादा वर्ण होने चाहिए. साथ ही, लेख में कम से कम 300 शब्द होने चाहिए, ताकि मॉडल सबसे अच्छा परफ़ॉर्म कर सके.

GenAI Summarization API, अंग्रेज़ी, जैपनीज़, और कोरियन भाषा में काम करता है. इसके बारे में SummarizerOptions.Language में बताया गया है.

SummarizerOptions के ज़रिए तय की गई किसी सुविधा के कॉन्फ़िगरेशन की उपलब्धता, डिवाइस के कॉन्फ़िगरेशन और डिवाइस पर डाउनलोड किए गए मॉडल के हिसाब से अलग-अलग हो सकती है.

डेवलपर के लिए, यह पक्का करने का सबसे भरोसेमंद तरीका है कि एपीआई की सुविधा, अनुरोध किए गए SummarizerOptions वाले डिवाइस पर काम करती है या नहीं. इसके लिए, checkFeatureStatus() तरीके का इस्तेमाल करें. इस तरीके से, डिवाइस पर सुविधा की उपलब्धता की स्थिति के बारे में रनटाइम में पता चलता है.

सेटअप से जुड़ी सामान्य समस्याएं

ML Kit GenAI API, Gemini Nano को ऐक्सेस करने के लिए Android AICore ऐप्लिकेशन पर निर्भर करते हैं. जब किसी डिवाइस को सेट अप किया जाता है (रीसेट करने के बाद भी), तो 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 ने नए कॉन्फ़िगरेशन डाउनलोड न किए हों. डिवाइस के इंटरनेट से कनेक्ट होने पर, अपडेट होने में कुछ मिनट से लेकर कुछ घंटे तक लग सकते हैं. डिवाइस को रीस्टार्ट करने से, अपडेट की प्रोसेस तेज़ हो सकती है.

ध्यान दें कि अगर डिवाइस का बूटलोडर अनलॉक है, तो आपको यह गड़बड़ी दिखेगी. यह एपीआई, अनलॉक किए गए बूटलोडर वाले डिवाइसों के साथ काम नहीं करता.
AICore में गड़बड़ी हुई है. गड़बड़ी का टाइप 1-DOWNLOAD_ERROR है और गड़बड़ी का कोड 0-UNKNOWN है: सुविधा ... में गड़बड़ी हुई है. गड़बड़ी की स्थिति 0 है और गड़बड़ी esz: UNAVAILABLE है: होस्ट ... को हल नहीं किया जा सका इंटरनेट कनेक्शन चालू रखें. कुछ मिनट इंतज़ार करें और फिर से कोशिश करें.