API de reescrita de IA generativa

Com a API GenAI Rewriting do Kit de ML, você pode ajudar automaticamente os usuários a reescrever mensagens de chat ou pequenos trechos de conteúdo 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 as partes interessadas
  • Encurtar uma mensagem para que ela seja mais adequada para postagem em plataformas de rede social
  • Reformular uma mensagem para falantes não nativos que procuram maneiras alternativas de comunicar a mensagem

Principais recursos

A API GenAI Rewriting 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 casual e acessível, usando um tom conversacional.
  • Profissional: reescreve o texto de entrada para ser mais formal e empresarial, 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
Você quer se encontrar para conversar mais? Profissional Você teria interesse em se encontrar novamente para discutir isso mais a fundo?
Gostaria de pedir a sua companhia para um encontro casual na minha residência no próximo sábado à noite Encurtar Você gostaria de se juntar a mim para um encontro casual na minha casa no sábado à noite?
O evento foi um sucesso Detalhar O evento foi um sucesso retumbante, superando todas as nossas expectativas e provando ser um triunfo retumbante.
Vamos tomar um café em breve Emojify Vamos tomar um café ☕ em breve 👋.
Envie o relatório até o fim do dia Amigável Você poderia compartilhar o relatório até o fim do dia?
Ei, preciso disso o mais rápido possível Profissional Você poderia fornecer o documento solicitado assim que possível ?
O projeto está atrasado Reformular O cronograma do projeto exige ajuste 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 Rewriter cliente com as opções necessárias, verifique se os recursos de modelo no dispositivo necessários 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 e limitações compatíveis

A API GenAI Rewriting 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 de recurso específica (especificada por RewriterOptions) pode variar dependendo da configuração do dispositivo e dos modelos que foram baixados para ele.

A maneira mais confiável para os desenvolvedores garantirem que o recurso de API pretendido seja compatível com um dispositivo com o RewriterOptions solicitado é chamar o checkFeatureStatus() método. 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 AICore do Android para acessar o Gemini Nano. Quando um dispositivo é configurado (incluindo a redefinição) ou o app AICore é redefinido (por exemplo, dados limpos, desinstalados e reinstalados), 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 GenAI do Kit de ML podem não funcionar como esperado. Confira as mensagens de erro de configuração comuns que podem aparecer e como lidar com elas:

Exemplo de mensagem de erro Como lidar
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 do AICore. Isso pode acontecer quando você instala o app usando as APIs GenAI do Kit de ML imediatamente após a configuração do dispositivo ou quando o AICore é desinstalado após a instalação do app. Atualizar o app AICore e reinstalar o app deve 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 terminou de baixar as configurações mais recentes. Quando o dispositivo está conectado à Internet, geralmente leva alguns minutos a algumas horas para atualizar. Reiniciar o dispositivo pode acelerar a atualização.

Observação: se o carregador de inicialização do dispositivo estiver desbloqueado, você também vai receber esse erro. Essa API não oferece suporte a 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 novamente.

Exemplo de código