GenAI Summarization API

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:

  1. Utwórz obiekt Summarizer.
  2. Pobierz funkcję, jeśli jest dostępna do pobrania.
  3. Utwórz prośbę o skrót.
  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();

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.