API de reescrita de IA generativa

Com a API de reescrita de IA geral do Kit de ML, é possível ajudar os usuários a reescrever mensagens de chat ou pequenos conteúdos com um estilo ou tom diferente.

Os usuários podem achar útil receber sugestões sobre como reescrever um conteúdo nos seguintes casos:

  • Reestruturar uma mensagem para ser mais profissional ao se comunicar com partes interessadas
  • Encurtar uma mensagem para que ela seja mais adequada para postagens em plataformas de mídia social
  • Reformule uma mensagem para falantes não nativos que procuram maneiras alternativas de transmitir a mensagem.

Principais recursos

A API de reescrita de GenAI do Kit de ML pode reescrever pequenos trechos de conteúdo em um dos seguintes estilos:

  • Detalhar: expande o texto de entrada com mais detalhes e linguagem descritiva.
  • Emojify: adiciona emojis relevantes ao texto de entrada, tornando-o mais expressivo e divertido.
  • Encurtar: condensa o texto de entrada em uma versão mais curta, mantendo a mensagem principal intacta.
  • Amigável: reescreve o texto de entrada para ser mais informal e acessível, usando um tom de conversa.
  • Profissional: reescreve o texto de entrada para que seja mais formal e profissional, usando um tom respeitoso.
  • Reformular: reescreve o texto de entrada usando palavras e estruturas de frases diferentes, mantendo o significado original.

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 Estilo de reescrita Saída
Quer conversar mais? Profissional Você gostaria de marcar outra reunião para discutir melhor o assunto?
Gostaria de convidar você para um encontro casual na minha casa neste sábado à noite Encurtar Quer participar de um encontro casual na minha casa neste sábado à noite?
O evento foi concluído Elaborar O evento foi um sucesso, superando todas as nossas expectativas e provando ser um grande triunfo.
Vamos tomar um café em breve Transformar em emoji Vamos tomar um café ☕ em breve 👋.
Enviar o relatório até o fim do dia Amigável Você pode enviar o relatório até o fim do dia?
Preciso disso o mais rápido possível Profissional Poderia enviar o documento solicitado assim que possível?
O projeto está atrasado Reformular A linha do tempo do projeto precisa ser ajustada para atender ao prazo original

Primeiros passos

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

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

Em seguida, instancie o cliente Rewriter com as opções necessárias, verifique se os recursos necessários do modelo no dispositivo estão disponíveis (e faça o download deles, se necessário), prepare o texto de entrada como uma solicitação, execute o processo de reescrita para receber sugestões e libere os recursos.

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

Recursos compatíveis e limitações

A API de reescrita da IA generativa oferece suporte aos seguintes idiomas: inglês, japonês, francês, alemão, italiano, espanhol e coreano, que são definidos em RewriterOptions.Language. A entrada precisa ter menos de 256 tokens.

A disponibilidade da configuração específica do recurso (especificada por RewriterOptions) pode variar dependendo da configuração do dispositivo e dos modelos que foram transferidos por download para ele.

A maneira mais confiável para os desenvolvedores garantirem que o recurso de API pretendido tenha suporte em um dispositivo com o RewriterOptions solicitado é chamar o método checkFeatureStatus(). Esse método fornece o status definitivo da disponibilidade do recurso no dispositivo no momento da 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 redefinição) ou o app AICore é redefinido (por exemplo, dados limpos, desinstalado e reinstalado), o app AICore 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 do ML Kit GenAI podem não funcionar como esperado. Confira as mensagens de erro comuns de configuração e como lidar com elas:

Exemplo de mensagem de erro Como lidar com
O AICore falhou com o tipo de erro 4-CONNECTION_ERROR e o código de erro 601-BINDING_FAILURE: o serviço AICore falhou na vinculação. Isso pode acontecer quando você instala o app usando as APIs do ML Kit GenAI imediatamente após a configuração do dispositivo ou quando o AICore é desinstalado após a instalação do app. Atualize o app AICore e reinstale o app 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 fazer o download das configurações mais recentes. Mantenha a conexão de rede e aguarde de alguns minutos a algumas horas.

Se o carregador de inicialização do dispositivo estiver desbloqueado, esse erro também vai aparecer. Essa API não oferece suporte a dispositivos com carregador de inicialização desbloqueado.
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: INDISPONÍVEL: não foi possível resolver o host ... Mantenha a conexão de rede, aguarde alguns minutos e tente novamente.