GenAI Summarization API

Dengan GenAI Summarization API dari ML Kit, Anda dapat secara otomatis membuat ringkasan artikel dan percakapan sebagai daftar poin-poin. Hal ini membantu pengguna memahami teks yang panjang.

Fitur ringkasan memanfaatkan AI generatif di perangkat karena mengatasi masalah privasi data dan efisiensi biaya. Aplikasi yang meringkas chat, email, catatan, dan pengingat pribadi sering kali menangani informasi sensitif, sehingga pemrosesan di perangkat menjadi penting untuk privasi pengguna. Selain itu, tugas peringkasan, terutama yang memiliki konteks panjang atau banyak item, dapat memerlukan daya pemrosesan yang signifikan. Memproses konten ini di perangkat akan mengurangi beban server dan menurunkan biaya penayangan, sekaligus menjaga privasi data pengguna.

Kemampuan utama

GenAI Summarization API mencakup kemampuan berikut:

  • Meringkas teks, yang dikategorikan sebagai artikel atau percakapan.
  • Ringkasan output dalam satu, dua, atau tiga poin.

Mulai

Tambahkan API ringkasan ML Kit sebagai dependensi dalam konfigurasi build.gradle Anda.

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

Selanjutnya, terapkan kode di project Anda:

  1. Buat objek Summarizer.
  2. Download fitur jika dapat didownload.
  3. Buat permintaan ringkasan.
  4. Jalankan inferensi dan ambil hasilnya.

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

Cara model menangani berbagai jenis input

Jika input teks ditentukan sebagai InputType.CONVERSATION, model mengharapkan input dalam format berikut:

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

Hal ini memungkinkan model menghasilkan ringkasan yang lebih akurat dengan memberikan pemahaman yang lebih baik tentang percakapan dan interaksi.

Fitur yang didukung dan batasan

Input harus kurang dari 4.000 token (atau sekitar 3.000 kata dalam bahasa Inggris). Jika input melebihi 4.000 token, pertimbangkan opsi berikut:

  • Prioritaskan ringkasan 4.000 token pertama. Pengujian menunjukkan bahwa cara ini biasanya memberikan hasil yang baik untuk input yang lebih panjang. Pertimbangkan untuk mengaktifkan pemangkasan otomatis dengan memanggil setLongInputAutoTruncationEnabled sehingga input tambahan dipangkas secara otomatis.
  • Segmentasikan input ke dalam grup yang berisi 4.000 token, lalu ringkas setiap grup secara terpisah.
  • Pertimbangkan solusi cloud yang lebih cocok untuk input yang lebih besar.

Untuk InputType.ARTICLE, input juga harus lebih dari 400 karakter, dengan model yang berperforma terbaik saat artikel minimal 300 kata.

GenAI Summarization API mendukung bahasa Inggris, Jepang, dan Korea, serta ditentukan dalam SummarizerOptions.Language.

Ketersediaan konfigurasi fitur tertentu (yang ditentukan oleh SummarizerOptions) dapat bervariasi bergantung pada konfigurasi perangkat tertentu dan model yang telah didownload ke perangkat.

Cara paling andal bagi developer untuk memastikan bahwa fitur API yang dimaksud didukung di perangkat dengan SummarizerOptions yang diminta adalah dengan memanggil metode checkFeatureStatus(). Metode ini memberikan status pasti ketersediaan fitur di perangkat saat runtime.

Masalah penyiapan umum

API GenAI ML Kit mengandalkan aplikasi Android AICore untuk mengakses Gemini Nano. Saat perangkat baru disiapkan (termasuk direset), atau aplikasi AICore baru direset (misalnya, hapus data, di-uninstal lalu diinstal ulang), aplikasi AICore mungkin tidak memiliki cukup waktu untuk menyelesaikan inisialisasi (termasuk mendownload konfigurasi terbaru dari server). Akibatnya, API GenAI ML Kit mungkin tidak berfungsi seperti yang diharapkan. Berikut adalah pesan error penyiapan umum yang mungkin Anda lihat dan cara menanganinya:

Contoh pesan error Cara menangani
AICore gagal dengan jenis error 4-CONNECTION_ERROR dan kode error 601-BINDING_FAILURE: Layanan AICore gagal terikat. Hal ini dapat terjadi saat Anda menginstal aplikasi menggunakan ML Kit GenAI API segera setelah penyiapan perangkat atau saat AICore di-uninstal setelah aplikasi Anda diinstal. Mengupdate aplikasi AICore, lalu menginstal ulang aplikasi Anda akan memperbaiki masalah ini.
AICore gagal dengan jenis error 3-PREPARATION_ERROR dan kode error 606-FEATURE_NOT_FOUND: Fitur ... tidak tersedia. Hal ini dapat terjadi saat AICore belum selesai mendownload konfigurasi terbaru. Saat perangkat terhubung ke internet, biasanya perlu waktu beberapa menit hingga beberapa jam untuk melakukan update. Memulai ulang perangkat dapat mempercepat update.

Perhatikan bahwa jika bootloader perangkat tidak terkunci, Anda juga akan melihat error ini—API ini tidak mendukung perangkat dengan bootloader yang tidak terkunci.
AICore gagal dengan jenis error 1-DOWNLOAD_ERROR dan kode error 0-UNKNOWN: Fitur ... gagal dengan status kegagalan 0 dan error esz: UNAVAILABLE: Unable to resolve host ... Pertahankan koneksi jaringan, tunggu beberapa menit, lalu coba lagi.