Con la API de GenAI Rewriting de ML Kit, puedes ayudar automáticamente a los usuarios a reescribir mensajes de chat o fragmentos de contenido breves con un estilo o tono diferente.
Es posible que a los usuarios les resulte útil recibir sugerencias sobre cómo reescribir un elemento de contenido en los siguientes casos:
- Reestructurar un mensaje para que sea más profesional cuando te comuniques con las partes interesadas
- Acortar un mensaje para que sea más adecuado para publicarlo en plataformas de redes sociales
- Reformular un mensaje para hablantes no nativos que buscan formas alternativas de comunicarlo
Funciones clave
La API de reescritura de IA generativa de ML Kit puede reescribir fragmentos de contenido breves en uno de los siguientes estilos:
- Desarrollar: Expande el texto de entrada con más detalles y un lenguaje descriptivo.
- Emojify: Agrega emojis relevantes al texto de entrada, lo que lo hace más expresivo y divertido.
- Acortar: Condensa el texto de entrada en una versión más corta, manteniendo intacto el mensaje principal.
- Amistoso: Vuelve a escribir el texto de entrada para que sea más informal y accesible, con un tono conversacional.
- Profesional: Vuelve a escribir el texto de entrada para que sea más formal y profesional, con un tono respetuoso.
- Reformula: Vuelve a escribir el texto de entrada con diferentes palabras y estructuras de oraciones, sin perder el significado original.
Las solicitudes mostrarán, al menos, una sugerencia. Si se muestran varias sugerencias, los resultados se ordenarán de forma descendente según la confianza.
Resultados de ejemplo
Entrada | Estilo de la nueva versión | Resultado |
¿Quieres reunirte para hablar más? | Profesional | ¿Te interesa volver a reunirte para hablar sobre esto? |
Me gustaría contar con tu compañía en una reunión informal en mi casa el próximo sábado por la noche. | Acortar | ¿Te gustaría unirte a mí para una reunión informal en mi casa este sábado por la tarde? |
El evento se realizó correctamente | Desarrollar | El evento fue un éxito rotundo, superó todas nuestras expectativas y demostró ser un triunfo rotundo. |
Vamos a tomar un café pronto | Emojificar | Vamos a tomar un café ☕ pronto 👋. |
Proporciona el informe al final del día | Amistoso | ¿Podrías compartir el informe antes de que finalice el día? |
Hola, necesito eso lo antes posible | Profesional | ¿Podrías proporcionar el documento solicitado lo antes posible? |
El proyecto se retrasa | Reformular | El cronograma del proyecto requiere ajustes para cumplir con la fecha límite original. |
Comenzar
Para comenzar a usar la API de GenAI Rewriting, agrega esta dependencia al archivo de compilación de tu proyecto.
implementation("com.google.mlkit:genai-rewriting:1.0.0-beta1")
Luego, crea una instancia del cliente Rewriter
con las opciones requeridas, verifica si las funciones del modelo integrado en el dispositivo requeridas están disponibles (y descárgalas si es necesario), prepara el texto de entrada como una solicitud, ejecuta el proceso de reescritura para obtener sugerencias y libera los 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();
Funciones admitidas y limitaciones
La API de GenAI Rewriting admite los siguientes idiomas: coreano, español,
francés, alemán, inglés, italiano y japonés, que se definen en
RewriterOptions.Language
. La entrada debe tener menos de 256 tokens.
La disponibilidad de la configuración de funciones específica (especificada por RewriterOptions
) puede variar según la configuración del dispositivo en particular y los modelos que se descargaron en él.
La forma más confiable para que los desarrolladores se aseguren de que la función de API prevista sea compatible con un dispositivo con el RewriterOptions
solicitado es llamar al método checkFeatureStatus()
. Este método proporciona el estado definitivo de la disponibilidad de funciones en el dispositivo durante el tiempo de ejecución.
Problemas comunes de configuración
Las APIs de IA generativa de ML Kit dependen de la app de Android AICore para acceder a Gemini Nano. Cuando un dispositivo se acaba de configurar (incluidos los restablecimientos) o se acaba de restablecer la app de AICore (p.ej., se borraron los datos, se desinstaló y se volvió a instalar), es posible que la app de AICore no tenga suficiente tiempo para terminar la inicialización (incluida la descarga de las configuraciones más recientes del servidor). Como resultado, es posible que las APIs de GenAI de ML Kit no funcionen como se espera. Estos son los mensajes de error de configuración comunes que podrías ver y cómo manejarlos:
Ejemplo de mensaje de error | Cómo manejar |
AICore falló con el tipo de error 4-CONNECTION_ERROR y el código de error 601-BINDING_FAILURE: No se pudo vincular el servicio de AICore. | Esto puede ocurrir cuando instalas la app con las APIs de GenAI de ML Kit inmediatamente después de la configuración del dispositivo o cuando se desinstala AICore después de instalar la app. Actualizar la app de AICore y, luego, reinstalar la tuya debería solucionar el problema. |
AICore falló con el tipo de error 3-PREPARATION_ERROR y el código de error 606-FEATURE_NOT_FOUND: La función ... no está disponible. |
Esto puede suceder cuando AICore no terminó de descargar las configuraciones más recientes. Mantén la conexión de red y espera unos minutos o unas horas.
Ten en cuenta que, si el bootloader del dispositivo está desbloqueado, también verás este error. Esta API no es compatible con dispositivos con bootloaders desbloqueados. |
AICore falló con el tipo de error 1-DOWNLOAD_ERROR y el código de error 0-UNKNOWN: Feature ... falló con el estado de error 0 y el error esz: UNAVAILABLE: Unable to resolve host ... | Mantén la conexión de red, espera unos minutos y vuelve a intentarlo. |