Dzięki interfejsowi GenAI Summarization API w ML Kit możesz automatycznie generować podsumowania artykułów i rozmów w postaci listy punktów. Pomaga to użytkownikom zrozumieć długie fragmenty tekstu.
Korzystanie z podsumowań wymaga generatywnej AI na urządzeniu, ponieważ rozwiązuje problemy związane z ochroną prywatności danych i opłacalnością. Aplikacje, które podsumowują osobiste czaty, e-maile, notatki i przypomnienia, często przetwarzają informacje poufne, co sprawia, że przetwarzanie na urządzeniu jest ważne dla prywatności użytkowników. Ponadto zadania polegające na tworzeniu podsumowań, zwłaszcza te z długimi kontekstami lub wieloma elementami, mogą wymagać znacznej mocy obliczeniowej. Przetwarzanie tych treści na urządzeniu zmniejsza obciążenie serwera i obniża koszty wyświetlania, a jednocześnie chroni dane użytkownika.
Najważniejsze funkcje
Interfejs GenAI Summarization API obejmuje te funkcje:
- streszczać tekst, który został sklasyfikowany jako artykuł lub rozmowa;
- Wygeneruj podsumowanie w jednym, 2 lub 3 punktach.
Rozpocznij
Dodaj interfejs API do podsumowywania w ML Kit jako zależność w konfiguracji build.gradle
.
implementation("com.google.mlkit:genai-summarization:1.0.0-beta1")
Następnie zastosuj kod w projekcie:
- Utwórz obiekt
Summarizer
. - Pobierz funkcję, jeśli jest dostępna do pobrania.
- Utwórz prośbę o skrót.
- Przeprowadź wnioskowanie i pobierz wynik.
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();
sposób obsługi przez model różnych typów danych wejściowych;
Gdy dane tekstowe są określone jako InputType.CONVERSATION
, model oczekuje danych w takim formacie:
<name>: <message>
<name2>: <message2>
<name>: <message3>
<name3>: <message4>
Dzięki temu model może tworzyć dokładniejsze podsumowania, ponieważ lepiej rozumie rozmowę i interakcje.
Obsługiwane funkcje i ograniczenia
Dane wejściowe nie mogą zawierać więcej niż 4000 tokenów (czyli około 3000 słów w języku angielskim). Jeśli dane wejściowe przekraczają 4000 tokenów, rozważ te opcje:
- Priorytetowo podsumuj pierwsze 4000 tokenów. Testy wskazują, że ta metoda zwykle przynosi dobre wyniki w przypadku dłuższych danych wejściowych. Rozważ włączenie automatycznego obcinania, wywołując funkcję
setLongInputAutoTruncationEnabled
, aby dodatkowe dane wejściowe były automatycznie obcinane. - Podziel dane na grupy po 4000 tokenów i podsumuj je poszczególnie.
- Rozważ skorzystanie z rozwiązania w chmurze, które lepiej pasuje do większego wejścia.
W przypadku InputType.ARTICLE
dane wejściowe muszą też zawierać ponad 400 znaków, a model działa najlepiej, gdy artykuł zawiera co najmniej 300 słów.
Interfejs API generatywnej AI do podsumowywania obsługuje języki: angielski, japoński i koreański. Jest on zdefiniowany w SummarizerOptions.Language
.
Dostępność określonej konfiguracji funkcji (określanej przez parametr SummarizerOptions
) może się różnić w zależności od konfiguracji konkretnego urządzenia i modeli pobranych na to urządzenie.
Najbardziej niezawodnym sposobem na sprawdzenie przez deweloperów, czy dana funkcja interfejsu API jest obsługiwana na urządzeniu z żądanym SummarizerOptions
, jest wywołanie metody checkFeatureStatus()
. Ta metoda zapewnia ostateczny stan dostępności funkcji na urządzeniu w czasie wykonywania.
Typowe problemy z konfiguracją
Interfejsy API ML Kit GenAI korzystają z aplikacji Android AICore, aby uzyskać dostęp do Gemini Nano. Gdy urządzenie jest dopiero skonfigurowane (w tym po zresetowaniu) lub aplikacja AICore została dopiero zresetowana (np. przez wyczyszczenie danych, odinstalowanie i ponownie zainstalowanie), może ona nie mieć wystarczająco dużo czasu na zakończenie inicjalizacji (w tym pobrania najnowszych konfiguracji z serwera). W związku z tym interfejsy API ML Kit GenAI mogą nie działać zgodnie z oczekiwaniami. Oto typowe komunikaty o błędach konfiguracji, które mogą się pojawić, oraz sposób ich rozwiązania:
Przykładowy komunikat o błędzie | Jak postępować |
Nie udało się uruchomić AICore. Wystąpił błąd typu 4-CONNECTION_ERROR i kod błędu 601-BINDING_FAILURE: nie udało się połączyć usługi AICore. | Może się tak zdarzyć, gdy zainstalujesz aplikację za pomocą interfejsów ML Kit GenAI bezpośrednio po skonfigurowaniu urządzenia lub gdy po zainstalowaniu aplikacji odinstalujesz AICore. Problem powinien rozwiązać zaktualizowanie aplikacji AICore, a następnie ponowne zainstalowanie aplikacji. |
Nie udało się uruchomić AICore. Wystąpił błąd typu 3-PREPARATION_ERROR i kod błędu 606-FEATURE_NOT_FOUND: Funkcja … jest niedostępna. |
Może się tak zdarzyć, gdy AICore nie skończyło pobierania najnowszych konfiguracji. Nie przerywaj połączenia z internetem i zaczekaj kilka minut lub godzin.
Uwaga: jeśli bootloader urządzenia jest odblokowany, zobaczysz ten sam błąd – ten interfejs API nie obsługuje urządzeń ze zwykłym bootloaderem. |
AICore nie powiodło się: błąd typu 1-DOWNLOAD_ERROR i kod błędu 0-UNKNOWN: funkcja ... nie powiodła się ze stanem błędu 0 i błędem esz: UNAVAILABLE: nie można rozpoznać hosta ... | Nie rozłączaj się z siecią, zaczekaj kilka minut i spróbuj ponownie. |