GenAI Summarization API

Mit der GenAI Summarization API von ML Kit können Sie automatisch Zusammenfassungen von Artikeln und Unterhaltungen als Liste mit Aufzählungszeichen erstellen. So können Nutzer große Textmengen besser verstehen.

Die Zusammenfassung profitiert von generativer KI auf dem Gerät, da sie Bedenken hinsichtlich des Datenschutzes und der Kosteneffizienz ausräumt. Apps, die persönliche Chats, E‑Mails, Notizen und Erinnerungen zusammenfassen, verarbeiten oft vertrauliche Informationen. Daher ist die Verarbeitung auf dem Gerät wichtig für den Datenschutz der Nutzer. Außerdem können Zusammenfassungsaufgaben, insbesondere solche mit langen Kontexten oder vielen Elementen, erhebliche Rechenleistung erfordern. Die Verarbeitung dieser Inhalte auf dem Gerät verringert die Serverlast und die Bereitstellungskosten, während die Nutzerdaten vertraulich bleiben.

Hauptmerkmale

Die GenAI Summarization API bietet die folgenden Funktionen:

  • Fassen Sie Text zusammen, der als Artikel oder Unterhaltung kategorisiert ist.
  • Fasse die Ausgabe in ein, zwei oder drei Aufzählungszeichen zusammen.

Jetzt starten

Fügen Sie die ML Kit Summarization API als Abhängigkeit in Ihrer build.gradle-Konfiguration hinzu.

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

Implementieren Sie als Nächstes den Code in Ihrem Projekt:

  1. Erstellen Sie ein Summarizer-Objekt.
  2. Laden Sie die Funktion herunter, sofern dies möglich ist.
  3. Zusammenfassungsanfrage erstellen
  4. Führen Sie die Inferenz aus und rufen Sie das Ergebnis ab.

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

Umgang des Modells mit verschiedenen Eingabetypen

Wenn die Texteingabe als InputType.CONVERSATION angegeben wird, erwartet das Modell Eingaben im folgenden Format:

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

So kann das Modell eine genauere Zusammenfassung erstellen, da es die Unterhaltung und die Interaktionen besser versteht.

Unterstützte Funktionen und Einschränkungen

Die Eingabe darf maximal 4.000 Tokens (ca. 3.000 Wörter auf Englisch) umfassen. Wenn die Eingabe 4.000 Tokens überschreitet, haben Sie folgende Möglichkeiten:

  • Fasse die ersten 4.000 Tokens zusammen. Tests haben gezeigt, dass dies in der Regel gute Ergebnisse für längere Eingaben liefert. Sie können die automatische Kürzung aktivieren, indem Sie setLongInputAutoTruncationEnabled aufrufen. Dadurch wird die zusätzliche Eingabe automatisch gekürzt.
  • Teile die Eingabe in Gruppen von 4.000 Tokens auf und fasse sie einzeln zusammen.
  • Erwägen Sie eine Cloud-Lösung, die besser für die größere Eingabe geeignet ist.

Für InputType.ARTICLE muss die Eingabe ebenfalls mehr als 400 Zeichen umfassen. Das Modell funktioniert am besten, wenn der Artikel mindestens 300 Wörter lang ist.

Die GenAI Summarization API unterstützt Englisch, Japanisch und Koreanisch und ist in SummarizerOptions.Language definiert.

Die Verfügbarkeit der spezifischen Funktionskonfiguration (angegeben durch SummarizerOptions) kann je nach Konfiguration des jeweiligen Geräts und den auf das Gerät heruntergeladenen Modellen variieren.

Die zuverlässigste Methode für Entwickler, um sicherzustellen, dass die gewünschte API-Funktion auf einem Gerät mit dem angeforderten SummarizerOptions unterstützt wird, ist der Aufruf der Methode checkFeatureStatus(). Diese Methode liefert den endgültigen Status der Verfügbarkeit von Funktionen auf dem Gerät zur Laufzeit.

Häufig auftretende Probleme bei der Einrichtung

Für den Zugriff auf Gemini Nano sind die ML Kit GenAI-APIs auf die Android AICore App angewiesen. Wenn ein Gerät gerade eingerichtet (einschließlich Zurücksetzen) oder die AICore App gerade zurückgesetzt wurde (z.B. Daten löschen, deinstallieren und neu installieren), hat die AICore App möglicherweise nicht genügend Zeit, die Initialisierung abzuschließen (einschließlich des Herunterladens der neuesten Konfigurationen vom Server). Daher funktionieren die ML Kit GenAI-APIs möglicherweise nicht wie erwartet. Hier finden Sie häufige Fehlermeldungen, die während der Einrichtung angezeigt werden, und Informationen dazu, wie Sie sie beheben können:

Beispiel für Fehlermeldung Vorgehensweise
AICore ist mit dem Fehlertyp 4-CONNECTION_ERROR und dem Fehlercode 601-BINDING_FAILURE fehlgeschlagen: Der AICore-Dienst konnte nicht gebunden werden. Das kann passieren, wenn Sie die App mit ML Kit GenAI-APIs unmittelbar nach der Einrichtung des Geräts installieren oder wenn AICore nach der Installation Ihrer App deinstalliert wird. Wenn Sie die AICore App aktualisieren und Ihre App dann neu installieren, sollte das Problem behoben sein.
AICore ist mit dem Fehlertyp 3-PREPARATION_ERROR und dem Fehlercode 606-FEATURE_NOT_FOUND fehlgeschlagen: Das Feature … ist nicht verfügbar. Das kann passieren, wenn AICore die neuesten Konfigurationen noch nicht vollständig heruntergeladen hat. Wenn das Gerät mit dem Internet verbunden ist, dauert die Aktualisierung in der Regel einige Minuten bis einige Stunden. Ein Neustart des Geräts kann das Update beschleunigen.

Hinweis: Wenn der Bootloader des Geräts entsperrt ist, wird dieser Fehler ebenfalls angezeigt. Diese API unterstützt keine Geräte mit entsperrten Bootloadern.
AICore ist mit dem Fehlertyp 1-DOWNLOAD_ERROR und dem Fehlercode 0-UNKNOWN fehlgeschlagen: Die Funktion ... ist mit dem Fehlerstatus 0 und dem Fehler esz: UNAVAILABLE fehlgeschlagen: Der Host ... konnte nicht aufgelöst werden. Lassen Sie die Netzwerkverbindung bestehen, warten Sie einige Minuten und versuchen Sie es dann noch einmal.