GenAI Rewriting API

Dzięki interfejsowi GenAI Rewriting API w ML Kit możesz automatycznie pomagać użytkownikom w przepisywanie wiadomości na czacie lub krótkich treści w innym stylu lub tonie.

Użytkownicy mogą potrzebować sugestii, jak zmienić treść w tych przypadkach:

  • przekształcanie wiadomości w celu nadania jej bardziej profesjonalnego charakteru podczas komunikacji z grupami zainteresowanych;
  • Skrócenie wiadomości, aby lepiej pasowała do publikacji w mediach społecznościowych
  • Przeformułowanie wiadomości dla osób, dla których językiem ojczystym nie jest język docelowy, aby mogły znaleźć alternatywne sposoby komunikowania się

Najważniejsze funkcje

Interfejs GenAI Rewriting API w ML Kit może przekształcać krótkie treści w jednym z tych stylów:

  • Rozwiń twórczo: rozszerza tekst wejściowy o szczegóły i język opisowy.
  • Emojify: dodaje odpowiednie emotikony do tekstu wejściowego, dzięki czemu staje się on bardziej wyrazisty i zabawny.
  • Skróć: skraca tekst wejściowy do krótszej wersji, zachowując główną treść.
  • Przyjazny: przepisuje tekst wejściowy, aby był bardziej swobodny i przystępny, używając języka potocznego.
  • Profesjonalny: przepisuje tekst wejściowy, aby był bardziej formalny i biznesowy, używając szacunku.
  • Zmodyfikuj: przeformułowuje podany tekst, używając innych słów i struktur zdań, przy zachowaniu pierwotnego znaczenia.

Zapytania zwracają co najmniej 1 sugestię. Jeśli zwrócono wiele sugestii, wyniki zostaną posortowane według malejącej wiarygodności.

Przykładowe wyniki

Wejście Styl przeredagowania Dane wyjściowe
Czy chcesz się spotkać, żeby porozmawiać? Profesjonalny Czy chcesz umówić się na kolejne spotkanie, aby omówić tę sprawę?
Chcielibyśmy zaprosić Cię na spotkanie w przyjemnej atmosferze w naszym domu w nadchodzącą sobotę wieczorem. Skróć Czy w sobotę wieczorem masz ochotę na spotkanie u mnie?
Zdarzenie zostało ukończone Pokaż więcej Wydarzenie okazało się wielkim sukcesem, przewyższając nasze oczekiwania.
Spotkajmy się na kawę Zamień na emotikony Spotkajmy się na kawę ☕ w najbliższym czasie. 👋
Prześlij raport do końca dnia. Towarzyski Czy możesz udostępnić raport do końca dnia?
Cześć, potrzebuję tego jak najszybciej Profesjonalny Prześlij wymagane dokumenty przy najbliższej okazji.
Projekt jest opóźniony Sparafrazuj harmonogram projektu wymaga dostosowania, aby można było dotrzymać pierwotnego terminu;

Pierwsze kroki

Aby rozpocząć korzystanie z interfejsu API do przekształcania za pomocą generatywnej AI, dodaj tę zależność do pliku kompilacji projektu.

implementation("com.google.mlkit:genai-rewriting:1.0.0-beta1")

Następnie utwórz instancję klienta Rewriter z wymaganymi opcjami, sprawdź, czy dostępne są wymagane funkcje modelu na urządzeniu (i w razie potrzeby pobierz je), przygotuj tekst wejściowy jako żądanie, uruchom proces przepisywania, aby uzyskać sugestie, i zwolnij zasoby.

Kotlin

val textToRewrite = "The event was successful"

// Define task with selected input and output format
val rewriterOptions = RewriterOptions.builder(context)
    // OutputType can be one of the following: ELABORATE, EMOJIFY, SHORTEN,
    // FRIENDLY, PROFESSIONAL, REPHRASE
    .setOutputType(RewriterOptions.OutputType.ELABORATE)
    // Refer to RewriterOptions.Language for available languages
    .setLanguage(RewriterOptions.Language.ENGLISH)
    .build()
val rewriter = Rewriting.getClient(rewriterOptions)

suspend fun prepareAndStartRewrite() {
    // Check feature availability, status will be one of the following:
    // UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    val featureStatus = rewriter.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.
        rewriter.downloadFeature(object : DownloadCallback {
            override fun onDownloadStarted(bytesToDownload: Long) { }

            override fun onDownloadFailed(e: GenAiException) { }

            override fun onDownloadProgress(totalBytesDownloaded: Long) {}

            override fun onDownloadCompleted() {
                startRewritingRequest(textToRewrite, rewriter)
            }
        })
    } 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.
        startRewritingRequest(textToRewrite, rewriter)
    } else if (featureStatus == FeatureStatus.AVAILABLE) {
        startRewritingRequest(textToRewrite, rewriter)
    }
}

suspend fun startRewritingRequest(text: String, rewriter: Rewriter) {
    // Create task request
    val rewritingRequest = RewritingRequest.builder(text).build()

    // Start rewriting request with non-streaming response
    // More than 1 result may be returned. If multiple suggestions are
    // returned, results will be sorted by descending confidence.
    val rewriteResults =
        rewriter.runInference(rewritingRequest).await().results

    // You can also start a streaming request
    // rewriter.runInference(rewritingRequest) { newText ->
    //    // Show new text in UI
    // }
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
rewriter.close()

Java

String textToRewrite = "The event was successful";

// Define task with required input and output format
RewriterOptions rewriterOptions =
    RewriterOptions.builder(context)
        // OutputType can be one of the following: ELABORATE,
        // EMOJIFY, SHORTEN, FRIENDLY, PROFESSIONAL, REPHRASE
        .setOutputType(RewriterOptions.OutputType.ELABORATE)
        // Refer to RewriterOptions.Language for available
        // languages
        .setLanguage(RewriterOptions.Language.ENGLISH)
        .build();
Rewriter rewriter = Rewriting.getClient(rewriterOptions);

void prepareAndStartRewrite()
    throws ExecutionException, InterruptedException {
    // Check feature availability, status will be one of the
    // following: UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    try {
        int featureStatus = rewriter.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.
            rewriter.downloadFeature(
                new DownloadCallback() {
                    @Override
                    public void onDownloadCompleted() {
                        startRewritingRequest(textToRewrite, rewriter);
                    }

                    @Override
                    public void onDownloadFailed(GenAIException e) {}

                    @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.
            startRewritingRequest(textToRewrite, rewriter);
        } else if (featureStatus == FeatureStatus.AVAILABLE) {
            startRewritingRequest(textToRewrite, rewriter);
        }
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

void startRewritingRequest(String text, Rewriter rewriter) {
    // Create task request
    RewritingRequest rewritingRequest =
        RewritingRequest.builder(text).build();

    try {
        // Start rewriting request with non-streaming response
        // More than 1 result may be returned. If multiple
        // suggestions are returned, results will be sorted by
        // descending confidence.
        rewriter.runInference(rewritingRequest).get().getResults();

        // You can also start a streaming request
        // rewriter.runInference(rewritingRequest, newText -> {
        //     // Show new text in UI
        // });
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
rewriter.close();

Obsługiwane funkcje i ograniczenia

Interfejs GenAI Rewriting API obsługuje te języki: angielski, francuski, hiszpański, japoński, koreański, niemiecki i włoski. Są one zdefiniowane w RewriterOptions.Language. Dane wejściowe powinny mieć mniej niż 256 tokenów.

Dostępność konfiguracji danej funkcji (określanej przez RewriterOptions) może się różnić w zależności od konfiguracji konkretnego urządzenia i modeli pobranych na urządzenie.

Najbardziej niezawodnym sposobem na sprawdzenie przez deweloperów, czy dana funkcja interfejsu API jest obsługiwana na urządzeniu z żądanym RewriterOptions, 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 zostanie dopiero skonfigurowane (w tym zresetowane) lub aplikacja AICore zostanie dopiero zresetowana (np. przez wyczyszczenie danych, odinstalowanie i ponowne 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 sposoby ich rozwiązywania:

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.

Jeśli bootloader urządzenia jest odblokowany, również zobaczysz ten 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.