GenAI Proofreading API

Dzięki interfejsowi GenAI Proofreading API z ML Kit możesz pomóc użytkownikom w sprawdzaniu gramatyki i pisownia w krótkich fragmentach tekstu.

Najważniejsze funkcje

  • Sprawdzanie tekstu wpisanego za pomocą klawiatury lub głosu
  • 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

Typ danych wejściowych

Dane wyjściowe

to jest krótki komunikat

Klawiatura

To jest krótka wiadomość

Projekt jest prawie gotowy, ale wymaga sprawdzenia

Klawiatura

Projekt jest prawie gotowy, ale wymaga sprawdzenia

Spotkajmy się przy niedźwiedziu.

Głos

Spotkajmy się w barze.

Pierwsze kroki

Aby rozpocząć korzystanie z interfejsu GenAI Proofreading API, dodaj tę zależność do pliku kompilacji projektu.

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

Następnie skonfiguruj klienta Proofreader i uzyskaj do niego dostęp, korzystając z określonych ustawień języka i typu danych wejściowych. Sprawdź, czy na urządzeniu są dostępne niezbędne funkcje modelu (w razie potrzeby wywołaj pobieranie). Prześlij tekst, który chcesz przeanalizować, w formacie ProofreadingRequest, wykonaj sprawdzanie poprawności, a na koniec przetwórz zwrócone sugestie w celu poprawienia tekstu.

Kotlin

val textToProofread = "The praject is compleet but needs too be reviewd"

// Define task with required input and output format
val options = ProofreaderOptions.builder(context)
    // InputType can be KEYBOARD or VOICE. VOICE indicates that
    // the user generated text based on audio input.
    .setInputType(ProofreaderOptions.InputType.KEYBOARD)
    // Refer to ProofreaderOptions.Language for available
    // languages
    .setLanguage(ProofreaderOptions.Language.ENGLISH)
    .build()
val proofreader = Proofreading.getClient(options)

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

            override fun onDownloadFailed(e: GenAiException) { }

            override fun onDownloadProgress(
                totalBytesDownloaded: Long
            ) {}

            override fun onDownloadCompleted() {
                startProofreadingRequest(textToProofread, proofreader)
            }
        })
    } 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
        // very quickly. However, if Gemini Nano is not already
        // downloaded, the download process may take longer.
        startProofreadingRequest(textToProofread, proofreader)
    } else if (featureStatus == FeatureStatus.AVAILABLE) {
        startProofreadingRequest(textToProofread, proofreader)
    }
}

suspend fun startProofreadingRequest(
    text: String, proofreader: Proofreader
) {
    // Create task request
    val proofreadingRequest =
        ProofreadingRequest.builder(text).build()

    // Start proofreading 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 proofreadingResults =
        proofreader.runInference(proofreadingRequest).await().results

    // You can also start a streaming request
    // proofreader.runInference(proofreadingRequest) { newText ->
    //     // show new text in UI
    // }
}

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

Java

String textToProofread = "The praject is compleet but needs too be reviewd";

// Define task with required input and output format
ProofreaderOptions proofreaderOptions = 
    ProofreaderOptions
        .builder(context)
        // InputType can be KEYBOARD or VOICE. VOICE indicates that the
        // user generated text based on audio input.
        .setInputType(ProofreaderOptions.InputType.KEYBOARD)
        // Refer to ProofreaderOptions.Language for available languages
        .setLanguage(ProofreaderOptions.Language.ENGLISH)
        .build();
Proofreader proofreader = Proofreading.getClient(proofreaderOptions);

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

                @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
            // very quickly. However, if Gemini Nano is not already
            // downloaded, the download process may take longer.
            startProofreadingRequest(textToProofread, proofreader);
        } else if (featureStatus == FeatureStatus.AVAILABLE) {
            startProofreadingRequest(textToProofread, proofreader);
        }
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

void startProofreadingRequest(String text, Proofreader proofreader) {
    // Create task request
    ProofreadingRequest proofreadingRequest = ProofreadingRequest
            .builder(text).build();

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

        // You can also start a streaming request
        // proofreader.runInference(proofreadingRequest, 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()
proofreader.close();

jak model obsługuje różne typy danych wejściowych;

Gdy model ma więcej informacji o tym, jak użytkownik wprowadził tekst (za pomocą klawiatury lub głosu), może lepiej przewidzieć typy błędów, które mogą wystąpić. Tekst wpisywany za pomocą klawiatury jest bardziej podatny na błędy dotyczące sąsiadujących klawiszy, a tekst wpisywany za pomocą głosu – na błędy dotyczące słów o tej samej wymowie.

Obsługiwane funkcje i ograniczenia

Redakcja jest obsługiwana w tych językach: angielski, francuski, hiszpański, japoński, niemiecki, włoski i koreański. Definicje tych języków znajdziesz w sekcji ProofreaderOptions.Language. Dane wejściowe powinny mieć mniej niż 256 tokenów.

Dostępność określonej konfiguracji funkcji (określonej przez ProofreaderOptions) 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, czy dana funkcja interfejsu API jest obsługiwana na urządzeniu z żądanym ProofreaderOptions, 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 konfigurowane (w tym po zresetowaniu) lub aplikacja AICore została właśnie 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 pobranie 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.

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.