API de revisão da IA generativa

Com a API de revisão de texto da GenAI do Kit de ML, você pode ajudar os usuários a verificar a gramática e a ortografia em textos curtos.

Principais recursos

  • Revisar o texto inserido por teclado ou voz
  • As solicitações vão retornar pelo menos uma sugestão. Se várias sugestões forem retornadas, os resultados serão classificados por confiança decrescente.

Resultados de exemplo

Entrada

Tipo de entrada

Saída

esta é uma msg curta

Teclado

Esta é uma mensagem curta

O projeto está quase concluído, mas precisa ser revisado

Teclado

O projeto está quase concluído, mas precisa ser revisado

Por favor, me encontre no urso,

Voz

Me encontre no bar.

Primeiros passos

Para começar a usar a API GenAI Proofreading, adicione esta dependência ao arquivo de build do seu projeto.

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

Em seguida, configure e obtenha um cliente Proofreader com configurações específicas de idioma e tipo de entrada. Verifique se os recursos necessários do modelo no dispositivo estão disponíveis (iniciando um download, se necessário). Envie o texto que você quer analisar em um ProofreadingRequest, execute a inferência de revisão e, por fim, processe as sugestões retornadas para corrigir o texto.

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();

Como o modelo processa diferentes tipos de entrada

Quando o modelo tem mais informações sobre como o usuário inseriu o texto (teclado ou voz), ele pode prever melhor o tipo de erros que podem estar presentes. O texto inserido pelo teclado é mais propenso a erros de ortografia com teclas próximas, enquanto o texto inserido por voz é mais propenso a erros de ortografia de palavras com a mesma pronúncia.

Recursos e limitações compatíveis

A revisão ortográfica está disponível nos seguintes idiomas: inglês, japonês, francês, alemão, italiano, espanhol e coreano, definidos em ProofreaderOptions.Language. A entrada precisa ter menos de 256 tokens.

A disponibilidade da configuração de recurso específica (especificada por ProofreaderOptions) pode variar dependendo da configuração do dispositivo e dos modelos baixados nele.

A maneira mais confiável para os desenvolvedores garantirem que o recurso de API pretendido seja compatível com um dispositivo com o ProofreaderOptions solicitado é chamar o método checkFeatureStatus(). Esse método fornece o status definitivo da disponibilidade de recursos no dispositivo durante a execução.

Problemas comuns de configuração

As APIs GenAI do Kit de ML dependem do app Android AICore para acessar o Gemini Nano. Quando um dispositivo é configurado (incluindo a redefinição) ou o app AICore é redefinido (por exemplo, limpar dados, desinstalar e reinstalar), ele pode não ter tempo suficiente para concluir a inicialização (incluindo o download das configurações mais recentes do servidor). Como resultado, as APIs de IA generativa do ML Kit podem não funcionar como esperado. Confira as mensagens de erro de configuração comuns que você pode encontrar e como lidar com elas:

Exemplo de mensagem de erro Como proceder
O AICore falhou com o tipo de erro 4-CONNECTION_ERROR e o código de erro 601-BINDING_FAILURE: falha ao vincular o serviço AICore. Isso pode acontecer quando você instala o app usando as APIs de IA generativa do ML Kit imediatamente após a configuração do dispositivo ou quando o AICore é desinstalado depois que o app é instalado. Atualize e reinstale o app AICore para corrigir o problema.
O AICore falhou com o tipo de erro 3-PREPARATION_ERROR e o código de erro 606-FEATURE_NOT_FOUND: o recurso ... não está disponível. Isso pode acontecer quando o AICore não termina de baixar as configurações mais recentes. Quando o dispositivo está conectado à Internet, geralmente leva de alguns minutos a algumas horas para atualizar. Reiniciar o dispositivo pode acelerar a atualização.

Se o carregador de inicialização do dispositivo estiver desbloqueado, esse erro também vai aparecer. A API não é compatível com dispositivos com carregadores de inicialização desbloqueados.
O AICore falhou com o tipo de erro 1-DOWNLOAD_ERROR e o código de erro 0-UNKNOWN: o recurso ... falhou com o status de falha 0 e o erro esz: UNAVAILABLE: não foi possível resolver o host ... Mantenha a conexão de rede, aguarde alguns minutos e tente de novo.