GenAI Summarization API

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ą prywatności danych i efektywnością kosztową. 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 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 zaimplementuj kod w projekcie:

  1. Utwórz obiekt Summarizer.
  2. Pobierz funkcję, jeśli jest dostępna do pobrania.
  3. Utwórz prośbę o streszczenie.
  4. 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 typ danych wejściowych to 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 radzi sobie z większymi danymi wejściowymi.

W przypadku InputType.ARTICLE tekst musi mieć 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 postępowania z nimi:

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 powodu błędu typu 3-PREPARATION_ERROR i kodu 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 nie działa z błędem typu 1-DOWNLOAD_ERROR i kodem błędu 0-UNKNOWN: funkcja ... nie działa ze stanem błędu 0 i błędem esz: UNAVAILABLE: nie można rozpoznać hosta ... Utrzymuj połączenie z siecią, poczekaj kilka minut i spróbuj ponownie.