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. | 
