GenAI Rewriting API

Dzięki interfejsowi GenAI Rewriting API w ML Kit możesz automatycznie pomagać użytkownikom w przekształcaniu wiadomości na czacie lub krótkich treści w inny styl lub ton.

Użytkownicy mogą uznać za przydatne otrzymywanie sugestii dotyczących tego, jak zmienić treść w następujących przypadkach:

  • Przeredagowanie wiadomości, aby brzmiała bardziej profesjonalnie w kontaktach z interesariuszami
  • skracanie wiadomości, aby była bardziej odpowiednia do publikowania na platformach mediów społecznościowych;
  • przeformułowanie wiadomości dla osób, które nie są rodzimymi użytkownikami języka i szukają alternatywnych sposobów na przekazanie wiadomości;

Najważniejsze funkcje

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

  • Rozwiń twórczo: rozszerza tekst wejściowy o więcej szczegółów i opisowy język.
  • Emojify dodaje do tekstu wejściowego odpowiednie emotikony, dzięki czemu jest on bardziej ekspresyjny i zabawny.
  • Skróć: skróci wprowadzony tekst, zachowując jego główną treść.
  • Przyjazny: przepisuje tekst wejściowy, aby był bardziej swobodny i przystępny, używając konwersacyjnego tonu.
  • Profesjonalny: przepisuje tekst wejściowy, aby był bardziej formalny i biznesowy, używając pełnego szacunku tonu.
  • Zmodyfikuj: tworzy inną wersję tekstu wejściowego, używając innych słów i struktur zdań, ale zachowując pierwotne znaczenie.

Żądania zwrócą co najmniej 1 sugestię. Jeśli zwróconych zostanie kilka sugestii, wyniki zostaną posortowane w kolejności malejącej według poziomu ufności.

Przykładowe wyniki

Wejście Styl ponownego pisania Dane wyjściowe
Chcesz się spotkać, żeby porozmawiać więcej? Profesjonalny Czy chciałbyś/chciałabyś spotkać się ponownie, aby omówić to bardziej szczegółowo?
Chciałbym zaprosić Cię na niezobowiązujące spotkanie w moim domu w najbliższą sobotę wieczorem. Skróć Czy chciałabyś wpaść do mnie w sobotę wieczorem na niezobowiązujące spotkanie?
Wydarzenie zakończyło się sukcesem Pokaż więcej Wydarzenie okazało się ogromnym sukcesem, przekraczając wszelkie nasze oczekiwania i okazując się wielkim triumfem.
Umówmy się wkrótce na kawę. Dodaj emotikony Skoczmy kiedyś na kawę ☕ 👋.
Prześlij raport do końca dnia Towarzyski Czy możesz udostępnić raport do końca dnia?
Hej, potrzebuję tego jak najszybciej Profesjonalny Czy możesz przesłać wymagany dokument jak najszybciej?
Projekt jest opóźniony Sparafrazuj Harmonogram projektu wymaga dostosowania, aby dotrzymać pierwotnego terminu.

Pierwsze kroki

Aby zacząć korzystać z interfejsu GenAI Rewriting API, 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 zawierać mniej niż 256 tokenów.

Dostępność konkretnej konfiguracji funkcji (określonej przez RewriterOptions) może się różnić w zależności od konfiguracji 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 RewriterOptions, 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.