Mit der GenAI Summarization API von ML Kit können Sie automatisch Zusammenfassungen von Artikeln und Unterhaltungen als Liste von Aufzählungspunkten generieren. So können Nutzer große Textmengen besser verstehen.
Die Zusammenfassung profitiert von der On-Device-Generativ-KI, da Bedenken hinsichtlich Datenschutz und Kosteneffizienz ausgeräumt werden. Apps, die private Chats, E-Mails, Notizen und Erinnerungen zusammenfassen, verarbeiten oft sensible Daten. Daher ist die Verarbeitung auf dem Gerät für den Datenschutz der Nutzer wichtig. Außerdem können Summarisierungsaufgaben, insbesondere solche mit langen Kontexten oder vielen Elementen, erhebliche Rechenleistung erfordern. Durch die Verarbeitung dieser Inhalte auf dem Gerät wird die Serverlast reduziert und die Bereitstellungskosten gesenkt. Gleichzeitig werden die Nutzerdaten geschützt.
Hauptmerkmale
Die GenAI Summarization API bietet folgende Funktionen:
- Text zusammenfassen, der als Artikel oder Unterhaltung kategorisiert wurde
- Fassen Sie die Ergebnisse in einer, zwei oder drei Aufzählungspunkten 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 den Code dann in Ihrem Projekt:
- Erstellen Sie ein
Summarizer
-Objekt. - Laden Sie die Funktion herunter, falls dies möglich ist.
- Erstellen Sie eine Zusammenfassungsanfrage.
- 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();
Wie das Modell mit verschiedenen Eingabetypen umgeht
Wenn die Texteingabe als InputType.CONVERSATION
angegeben ist, erwartet das Modell eine Eingabe 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 Token (oder etwa 3.000 englische Wörter) umfassen. Wenn die Eingabe mehr als 4.000 Tokens enthält, haben Sie folgende Möglichkeiten:
- Die Zusammenfassung der ersten 4.000 Token hat Priorität. Tests haben gezeigt, dass dies bei längeren Eingaben in der Regel gute Ergebnisse liefert. Sie können die automatische Kürzung aktivieren, indem Sie
setLongInputAutoTruncationEnabled
aufrufen. Dadurch wird der zusätzliche Eingabetext automatisch abgeschnitten. - Segmentieren Sie die Eingabe in Gruppen von 4.000 Token und fassen Sie sie einzeln zusammen.
- Überlegen Sie, ob eine Cloud-Lösung für die größere Eingabe besser geeignet ist.
Bei InputType.ARTICLE
muss die Eingabe außerdem mehr als 400 Zeichen lang sein. Die beste Leistung erzielt das Modell, 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 jeweiligen Funktionskonfiguration (SummarizerOptions
) kann je nach Gerätekonfiguration 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 der angeforderten SummarizerOptions
unterstützt wird, ist das Aufrufen der Methode checkFeatureStatus()
. Diese Methode liefert den endgültigen Status der Funktionsverfügbarkeit auf dem Gerät zur Laufzeit.
Häufig auftretende Probleme bei der Einrichtung
ML Kit GenAI APIs nutzen die Android AICore App, um auf Gemini Nano zuzugreifen. Wenn ein Gerät gerade eingerichtet (einschließlich Zurücksetzen) oder die AICore App gerade zurückgesetzt wurde (z.B. Daten gelöscht, deinstalliert und dann wieder installiert), hat die AICore App möglicherweise nicht genug Zeit, die Initialisierung abzuschließen (einschließlich Herunterladen der neuesten Konfigurationen vom Server). Daher funktionieren die ML Kit GenAI APIs möglicherweise nicht wie erwartet. Im Folgenden finden Sie häufige Fehlermeldungen bei der Einrichtung und wie Sie damit umgehen können:
Beispiel für Fehlermeldung | Vorgehensweise |
AICore-Fehler vom Typ 4-CONNECTION_ERROR mit dem Fehlercode 601-BINDING_FAILURE: Die Bindung des AICore-Dienstes ist fehlgeschlagen. | Das kann passieren, wenn Sie die App mit ML Kit GenAI APIs direkt nach der Geräteeinrichtung installieren oder wenn AICore nach der Installation Ihrer App deinstalliert wird. Wenn Sie die AICore App aktualisieren und dann Ihre App neu installieren, sollte das Problem behoben werden. |
AICore-Fehler vom Typ 3-PREPARATION_ERROR mit dem Fehlercode 606-FEATURE_NOT_FOUND: Die Funktion „…“ ist nicht verfügbar. |
Das kann passieren, wenn AICore noch nicht mit dem Herunterladen der neuesten Konfigurationen fertig ist. Behalten Sie die Netzwerkverbindung aufrecht und warten Sie einige Minuten bis zu mehrere Stunden.
Hinweis: Wenn der Bootloader des Geräts entsperrt ist, wird auch dieser Fehler angezeigt. Diese API unterstützt keine Geräte mit entsperrtem Bootloader. |
AICore-Fehler vom Typ „1-DOWNLOAD_ERROR“ mit dem Fehlercode „0-UNKNOWN“: Die Funktion „…“ ist mit dem Fehlerstatus „0“ und dem Fehler „esz: UNAVAILABLE: Unable to resolve host…“ fehlgeschlagen. | Behalten Sie die Netzwerkverbindung aufrecht, warten Sie einige Minuten und versuchen Sie es noch einmal. |