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 sugestie dotyczące tego, jak napisać ponownie fragment treści, w tych przypadkach:
- Przeredagowywanie wiadomości, aby brzmiała bardziej profesjonalnie w kontaktach z interesariuszami
- skracanie wiadomości, aby lepiej nadawała się 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: rozbudowuje 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óć tekst wejściowy, zachowując jego główną treść.
- Przyjazny: przepisuje tekst, 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 zwracają co najmniej 1 sugestię. Jeśli zwróconych zostanie kilka sugestii, wyniki zostaną posortowane według malejącego poziomu ufności.
Przykładowe wyniki
| Wejście | Styl ponownego pisania | Dane wyjściowe | 
| Chcesz się spotkać, żeby porozmawiać więcej? | Profesjonalny | Czy możemy spotkać się ponownie, aby omówić to dokładniej? | 
| 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ę powodzeniem | 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 pobranych na nie modeli.
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 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. | 
