Za pomocą interfejsu GenAI Summarization API w ML Kit możesz automatycznie generować podsumowania artykułów i rozmów w postaci listy punktów. Ułatwia to użytkownikom zrozumienie długich tekstów.
Podsumowywanie z użyciem generatywnej AI na urządzeniu jest korzystne, ponieważ rozwiązuje problemy związane z ochroną danych i opłacalnością. Aplikacje, które podsumowują prywatne czaty, e-maile, notatki i przypomnienia, często przetwarzają informacje poufne, dlatego przetwarzanie na urządzeniu jest ważne z punktu widzenia ochrony prywatności użytkowników. Dodatkowo zadania podsumowywania, 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 reklam, a jednocześnie zapewnia prywatność danych użytkowników.
Najważniejsze funkcje
Interfejs GenAI Summarization API obejmuje te funkcje:
- podsumowywać tekst sklasyfikowany jako artykuł lub rozmowa,
- Podsumowanie wyników w 1, 2 lub 3 punktach.
Rozpocznij
Dodaj interfejs ML Kit Summarization API jako zależność w konfiguracji build.gradle.
implementation("com.google.mlkit:genai-summarization:1.0.0-beta1")
Następnie wdróż kod w projekcie:
- Utwórz obiekt
Summarizer. - Pobierz funkcję, jeśli jest dostępna do pobrania.
- Utwórz prośbę o streszczenie.
- 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();
Jak model obsługuje różne typy danych wejściowych
Jeśli dane wejściowe są określone jako InputType.CONVERSATION, model oczekuje danych wejściowych w tym formacie:
<name>: <message>
<name2>: <message2>
<name>: <message3>
<name3>: <message4>
Dzięki temu model może generować dokładniejsze podsumowania, ponieważ lepiej rozumie rozmowę i interakcje.
Obsługiwane funkcje i ograniczenia
Dane wejściowe muszą zawierać mniej 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:
- Priorytetem jest podsumowanie pierwszych 4000 tokenów. Testy wskazują, że w przypadku dłuższych danych wejściowych zwykle daje to dobre wyniki. Rozważ włączenie automatycznego obcinania przez wywołanie funkcji
setLongInputAutoTruncationEnabled, aby dodatkowe dane wejściowe były automatycznie obcinane. - Podziel dane wejściowe na grupy po 4000 tokenów i podsumuj je osobno.
- Rozważ użycie rozwiązania w chmurze, które lepiej sprawdzi się w przypadku większych danych wejściowych.
W przypadku InputType.ARTICLE wpisany tekst musi mieć też ponad 400 znaków. Model działa najlepiej, gdy artykuł ma co najmniej 300 słów.
Interfejs GenAI Summarization API obsługuje język angielski, japoński i koreański. Jest on zdefiniowany w SummarizerOptions.Language.
Dostępność konkretnej konfiguracji funkcji (określonej przez SummarizerOptions) może się różnić w zależności od konfiguracji danego urządzenia i modeli pobranych na urządzenie.
Najbardziej niezawodnym sposobem, w jaki deweloperzy mogą się upewnić, że zamierzona funkcja interfejsu API jest obsługiwana na urządzeniu z wymaganym SummarizerOptions, jest wywołanie metody checkFeatureStatus(). Ta metoda podaje ostateczny stan dostępności funkcji na urządzeniu w czasie działania.
Typowe problemy z konfiguracją
Interfejsy ML Kit GenAI API korzystają z aplikacji Android AICore, aby uzyskać dostęp do Gemini Nano. Gdy urządzenie jest dopiero konfigurowane (w tym resetowane) lub aplikacja AICore jest dopiero resetowana (np. przez wyczyszczenie danych, odinstalowanie i ponowne zainstalowanie), może nie mieć wystarczająco dużo czasu na zakończenie inicjowania (w tym pobranie najnowszych konfiguracji z serwera). W związku z tym interfejsy ML Kit GenAI API mogą nie działać zgodnie z oczekiwaniami. Oto typowe komunikaty o błędach konfiguracji, które możesz zobaczyć, oraz sposoby ich rozwiązywania:
| Przykładowy komunikat o błędzie | Jak sobie z tym poradzić |
| Usługa AICore nie działa z powodu błędu typu 4-CONNECTION_ERROR i kodu błędu 601-BINDING_FAILURE: nie udało się powiązać usługi AICore. | Może się to zdarzyć, gdy zainstalujesz aplikację za pomocą interfejsów ML Kit GenAI API natychmiast po skonfigurowaniu urządzenia lub gdy po zainstalowaniu aplikacji odinstalujesz AICore. Zaktualizowanie aplikacji AICore, a następnie ponowne zainstalowanie aplikacji powinno rozwiązać ten problem. |
| Usługa AICore nie działa z błędem typu 3-PREPARATION_ERROR i kodem błędu 606-FEATURE_NOT_FOUND: funkcja ... jest niedostępna. |
Może się tak zdarzyć, gdy AICore nie zakończyło pobierania najnowszych konfiguracji. Gdy urządzenie jest połączone z internetem, aktualizacja trwa zwykle od kilku minut do kilku godzin. Ponowne uruchomienie urządzenia może przyspieszyć aktualizację.
Pamiętaj, że ten błąd pojawi się też, jeśli program rozruchowy urządzenia jest odblokowany – ten interfejs API nie obsługuje urządzeń z odblokowanymi programami rozruchowymi. |
| Usługa AICore zwróciła 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 udało się rozpoznać hosta ... | Utrzymuj połączenie z siecią, poczekaj kilka minut i spróbuj ponownie. |