Com a API GenAI Rewriting do ML Kit, 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 que ela seja mais profissional ao se comunicar com stakeholders
- Encurtar uma mensagem para que ela seja mais adequada para postagem em plataformas de mídia social
- Reformular uma mensagem para falantes não nativos que procuram maneiras alternativas de comunicar a mensagem
Principais recursos
A API GenAI Rewriting do ML Kit 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 que seja mais informal e acessível, usando um tom de conversa.
- Profissional: reescreve o texto de entrada para que ele fique 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 |
Você quer marcar uma reunião para conversar mais? | Profissional | Você teria interesse em marcar outra reunião para discutir melhor o assunto? |
Gostaria de pedir a honra da sua presença em um encontro informal na minha casa no próximo sábado à noite. | Encurtar | Você gostaria de se juntar a mim para um encontro casual na minha casa neste sábado à noite? |
O evento foi concluído | Elaborar | O evento foi um sucesso retumbante, superando todas as nossas expectativas e provando ser um triunfo retumbante. |
Vamos tomar um café em breve | Emojificar | Vamos tomar um café ☕ em breve 👋. |
Envie o relatório até o fim do dia | Amigável | Você pode compartilhar o relatório até o final do dia? |
Ei, preciso disso o mais rápido possível | Profissional | Envie o documento solicitado assim que possível. |
O projeto está atrasado | Reformular | O cronograma do projeto precisa ser ajustado para cumprir o prazo original |
Primeiros passos
Para começar a usar a API GenAI Rewriting, adicione esta dependência ao arquivo de build do projeto.
implementation("com.google.mlkit:genai-rewriting:1.0.0-beta1")
Em seguida, crie uma instância do 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 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 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 RewriterOptions
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. |