GenAI Summarization API

ML Kit'in GenAI Summarization API'si ile makalelerin ve sohbetlerin özetlerini otomatik olarak madde işareti listesi olarak oluşturabilirsiniz. Bu, kullanıcıların büyük metin parçalarını anlamasına yardımcı olur.

Özetleme, veri gizliliği ve maliyet verimliliği ile ilgili endişeleri giderdiği için cihaz üzerinde üretken yapay zekadan yararlanır. Kişisel sohbetleri, e-postaları, notları ve hatırlatıcıları özetleyen uygulamalar genellikle hassas bilgilerle çalışır. Bu nedenle, cihaz üzerinde işleme özelliği kullanıcı gizliliği açısından önemlidir. Ayrıca, özetleme görevleri (özellikle uzun bağlamlara veya çok sayıda öğeye sahip olanlar) önemli miktarda işlem gücü gerektirebilir. Bu içeriğin cihazda işlenmesi, sunucu yükünü azaltır ve kullanıcı verilerini gizli tutarken yayınlama maliyetlerini düşürür.

Temel özellikler

Üretken yapay zeka özetleme API'si aşağıdaki özellikleri kapsar:

  • Makale veya görüşme olarak sınıflandırılan metinleri özetleyin.
  • Çıkış özetini bir, iki veya üç madde işaretiyle gösterin.

Başlayın

build.gradle yapılandırmanıza bağımlılık olarak ML Kit özetleme API'sini ekleyin.

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

Ardından kodu projenize uygulayın:

  1. Bir Summarizer nesnesi oluşturun.
  2. İndirilebilirse özelliği indirin.
  3. Özetleme isteği oluşturun.
  4. Tahmini çalıştırın ve sonucu alın.

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

Model farklı giriş türlerini nasıl işler?

Metin girişi InputType.CONVERSATION olarak belirtildiğinde model aşağıdaki biçimde giriş bekler:

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

Bu sayede model, sohbeti ve etkileşimleri daha iyi anlayarak daha doğru bir özet oluşturabilir.

Desteklenen özellikler ve sınırlamalar

Giriş 4.000 jetondan (veya yaklaşık 3.000 İngilizce kelimeden) kısa olmalıdır. Giriş 4.000 jetonu aşıyorsa aşağıdaki seçenekleri değerlendirin:

  • İlk 4.000 jetonun özetlenmesine öncelik verin. Testler, bunun genellikle daha uzun girişler için iyi sonuçlar verdiğini gösteriyor. Fazla girişin otomatik olarak kısaltılması için setLongInputAutoTruncationEnabled çağrısı yaparak otomatik kısaltmayı etkinleştirebilirsiniz.
  • Girişleri 4.000 jetonluk gruplara ayırın ve bunları ayrı ayrı özetleyin.
  • Daha büyük girişlere daha uygun bir bulut çözümü kullanmayı düşünebilirsiniz.

InputType.ARTICLE için giriş de 400 karakterden uzun olmalıdır. Model, makale en az 300 kelime olduğunda en iyi performansı gösterir.

GenAI Summarization API, İngilizce, Japonca ve Korece'yi destekler ve SummarizerOptions.Language içinde tanımlanır.

Belirli özellik yapılandırmasının (SummarizerOptions ile belirtilir) kullanılabilirliği, ilgili cihazın yapılandırmasına ve cihaza indirilen modellere bağlı olarak değişiklik gösterebilir.

Geliştiricilerin, istenen SummarizerOptions özelliğine sahip bir cihazda istenen API özelliğinin desteklenip desteklenmediğini kontrol etmenin en güvenilir yolu checkFeatureStatus() yöntemini çağırmaktır. Bu yöntem, çalışma zamanında cihazda özellik kullanılabilirliğinin kesin durumunu sağlar.

Sık karşılaşılan kurulum sorunları

ML Kit GenAI API'leri, Gemini Nano'ya erişmek için Android AICore uygulamasından yararlanır. Bir cihaz yeni kurulduğunda (sıfırlama dahil) veya AICore uygulaması yeni sıfırlandığında (ör. veriler temizlenir, uygulama kaldırılır ve yeniden yüklenir), AICore uygulamasının ilklendirmeyi tamamlaması (sunucudan en son yapılandırmaların indirilmesi dahil) için yeterli zamanı olmayabilir. Sonuç olarak ML Kit GenAI API'leri beklendiği gibi çalışmayabilir. Karşılaşabileceğiniz yaygın kurulum hata mesajları ve bunların nasıl ele alınacağı aşağıda açıklanmıştır:

Örnek hata mesajı Nasıl ele alınır?
AICore, 4-CONNECTION_ERROR hata türü ve 601-BINDING_FAILURE hata koduyla başarısız oldu: AICore hizmeti bağlanamadı. Bu durum, uygulamayı cihaz kurulumundan hemen sonra ML Kit GenAI API'lerini kullanarak yüklediğinizde veya uygulamanız yüklendikten sonra AICore'un kaldırıldığı durumlarda ortaya çıkabilir. AICore uygulamasını güncelleyip uygulamanızı yeniden yüklediğinizde sorun düzelecektir.
AICore, 3-PREPARATION_ERROR hata türü ve 606-FEATURE_NOT_FOUND hata koduyla başarısız oldu: ... özelliği kullanılamıyor. Bu durum, AICore en son yapılandırmaları indirmeyi tamamlamadığında ortaya çıkabilir. Ağ bağlantısını koruyun ve birkaç dakika ila birkaç saat bekleyin.

Cihazın önyükleyicisinin kilidi açıksa bu hatayı da göreceğinizi unutmayın. Bu API, önyükleyicisinin kilidi açık cihazları desteklemez.
AICore, 1-DOWNLOAD_ERROR hata türü ve 0-UNKNOWN hata koduyla başarısız oldu: ... özelliği, 0 hata durumu ve esz hatasıyla başarısız oldu: UNAVAILABLE: Unable to resolve host ... Ağ bağlantısını koruyun, birkaç dakika bekleyip tekrar deneyin.