Con la API de GenAI Rewriting de ML Kit, puedes ayudar automáticamente a los usuarios a reescribir mensajes de chat o fragmentos cortos de contenido con un estilo o tono diferente.
En los siguientes casos, puede ser útil que se les proporcionen sugerencias a los usuarios sobre cómo reescribir un fragmento de contenido:
- Reestructurar un mensaje para que sea más profesional cuando se comunica con las partes interesadas
- Acortar un mensaje para que sea más adecuado para publicarlo en plataformas de redes sociales
- Parafrasear un mensaje para hablantes no nativos que buscan formas alternativas de comunicarlo
Funciones clave
La API de GenAI Rewriting de ML Kit puede reescribir fragmentos cortos de contenido en uno de los siguientes estilos:
- Desarrollar: Expande el texto de entrada con más detalles y lenguaje descriptivo.
- Emojify: Agrega emojis pertinentes 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 y mantiene el mensaje principal intacto.
- Amigable: Reescribe el texto de entrada para que sea más informal y accesible, con un tono conversacional.
- Profesional: Reescribe el texto de entrada para que sea más formal y empresarial, con un tono respetuoso.
- Reformular: Vuelve a escribir el texto de entrada con diferentes palabras y estructuras de oraciones, pero manteniendo el significado original.
Las solicitudes devolverá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 reescritura | Resultado |
¿Quieres reunirte para hablar más? | Profesional | ¿Te interesaría reunirte de nuevo para hablar más sobre este tema? |
Me gustaría invitarte a una reunión informal en mi casa el próximo sábado por la noche. | Acortar | ¿Te gustaría reunirte conmigo en mi casa el sábado por la noche? |
El evento se realizó correctamente | Desarrollar | El evento fue un éxito rotundo, superó todas nuestras expectativas y demostró ser un triunfo rotundo. |
Tomemos un café pronto. | Emojificar | Tomemos un café ☕ pronto 👋. |
Proporciona el informe al final del día | Amistoso | ¿Podrías compartir el informe antes de que termine el día? |
Oye, necesito eso lo antes posible | Profesional | ¿Podrías proporcionar el documento solicitado lo antes posible? |
El proyecto está retrasado | 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 requeridas del modelo integrado en el dispositivo están disponibles (y descárgalas si es necesario), prepara tu 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: alemán, coreano, español, francés, 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íficas (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 la API deseada 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 la función 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 AICore de Android para acceder a Gemini Nano. Cuando se configura un dispositivo (incluido el restablecimiento) o se restablece la app de AICore (p.ej., se borran los datos, se desinstala y se vuelve a instalar), es posible que la app de AICore no tenga tiempo suficiente para finalizar la inicialización (incluida la descarga de las configuraciones más recientes del servidor). Como resultado, es posible que las APIs de IA generativa de ML Kit no funcionen según lo esperado. A continuación, se muestran los mensajes de error de configuración comunes que puedes ver y cómo controlarlos:
Ejemplo de mensaje de error | Cómo manejarla |
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 podría ocurrir cuando instalas la app con las APIs de IA generativa de ML Kit inmediatamente después de configurar el dispositivo o cuando se desinstala AICore después de instalar la app. Actualizar la app de AICore y, luego, reinstalar tu app 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 podría suceder cuando AICore no haya terminado de descargar los parámetros de configuración más recientes. Cuando el dispositivo está conectado a Internet, la actualización suele tardar entre unos minutos y unas horas. Reiniciar el dispositivo puede acelerar la actualización.
Ten en cuenta que, si el bootloader del dispositivo está desbloqueado, también verás este error, ya que la API no admite dispositivos con bootloaders desbloqueados. |
AICore falló con el tipo de error 1-DOWNLOAD_ERROR y el código de error 0-UNKNOWN: La función … falló con el estado de falla 0 y el error esz: UNAVAILABLE: No se pudo resolver el host … | Mantén la conexión de red, espera unos minutos y vuelve a intentarlo. |