Con la API de Resumen de IA generativa de ML Kit, puedes generar automáticamente resúmenes de artículos y conversaciones como una lista de viñetas. Esto ayuda a los usuarios a comprender grandes bloques de texto.
La generación de resúmenes se beneficia de la IA generativa integrada en el dispositivo porque aborda las inquietudes sobre la privacidad de los datos y la eficiencia de los costos. Las apps que resumen chats, correos electrónicos, notas y recordatorios personales suelen manejar información sensible, lo que hace que el procesamiento integrado en el dispositivo sea importante para la privacidad del usuario. Además, las tareas de resumen, especialmente las que tienen contextos largos o muchos elementos, pueden requerir una potencia de procesamiento significativa. El procesamiento de este contenido en el dispositivo reduce la carga del servidor y disminuye los costos de publicación, a la vez que mantiene la privacidad de los datos del usuario.
Funciones clave
La API de GenAI Summarization abarca las siguientes funciones:
- Resumir texto, categorizado como artículo o conversación
- Genera un resumen en uno, dos o tres viñetas.
Comenzar
Agrega la API de resumen de ML Kit como una dependencia en la configuración de build.gradle
.
implementation("com.google.mlkit:genai-summarization:1.0.0-beta1")
A continuación, implementa el código en tu proyecto:
- Crea un objeto
Summarizer
. - Descarga la función si se puede descargar.
- Crea una solicitud de resumen.
- Ejecuta la inferencia y recupera el resultado.
Kotlin
val articleToSummarize = "Announcing a set of on-device GenAI APIs..."
// Define task with required input type, output type, and language
val summarizerOptions = SummarizerOptions.builder(context)
.setInputType(InputType.ARTICLE)
.setOutputType(OutputType.ONE_BULLET)
.setLanguage(Language.ENGLISH)
.build()
val summarizer = Summarization.getClient(summarizerOptions)
suspend fun prepareAndStartSummarization() {
// Check feature availability. Status will be one of the following:
// UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
val featureStatus = summarizer.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.
summarizer.downloadFeature(object : DownloadCallback {
override fun onDownloadStarted(bytesToDownload: Long) { }
override fun onDownloadFailed(e: GenAiException) { }
override fun onDownloadProgress(totalBytesDownloaded: Long) {}
override fun onDownloadCompleted() {
startSummarizationRequest(articleToSummarize, summarizer)
}
})
} 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.
startSummarizationRequest(articleToSummarize, summarizer)
} else if (featureStatus == FeatureStatus.AVAILABLE) {
startSummarizationRequest(articleToSummarize, summarizer)
}
}
fun startSummarizationRequest(text: String, summarizer: Summarizer) {
// Create task request
val summarizationRequest = SummarizationRequest.builder(text).build()
// Start summarization request with streaming response
summarizer.runInference(summarizationRequest) { newText ->
// Show new text in UI
}
// You can also get a non-streaming response from the request
// val summarizationResult = summarizer.runInference(
// summarizationRequest).get().summary
}
// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
summarizer.close()
Java
String articleToSummarize = "Announcing: a set of on-device GenAI AI APIs.";
// Define task with required input type, output type, and language
SummarizerOptions summarizerOptions =
SummarizerOptions.builder(context)
.setInputType(SummarizerOptions.InputType.ARTICLE)
.setOutputType(SummarizerOptions.OutputType.ONE_BULLET)
.setLanguage(SummarizerOptions.Language.ENGLISH)
.build();
Summarizer summarizer = Summarization.getClient(summarizerOptions);
void prepareAndStartSummarization()
throws ExecutionException, InterruptedException {
// Check feature availability. Status will be one of the following:
// UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
try {
int featureStatus = summarizer.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.
summarizer.downloadFeature(new DownloadCallback() {
@Override
public void onDownloadCompleted() {
startSummarizationRequest(articleToSummarize, summarizer);
}
@Override
public void onDownloadFailed(GenAiException e) { /* handle error */ }
@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.
startSummarizationRequest(articleToSummarize, summarizer);
} else if (featureStatus == FeatureStatus.AVAILABLE) {
startSummarizationRequest(articleToSummarize, summarizer);
}
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
}
void startSummarizationRequest(String text, Summarizer summarizer) {
// Create task request
SummarizationRequest summarizationRequest =
SummarizationRequest.builder(text).build();
// Start summarization request with streaming response
summarizer.runInference(summarizationRequest, newText -> {
// Show new text in UI
});
// You can also get a non-streaming response from the request
// ListenableFuture<SummarizationResult> summarizationResult
// = summarizer.runInference(summarizationRequest);
// String summary = summarizationResult.get().getSummary();
}
// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
summarizer.close();
Cómo el modelo controla diferentes tipos de entrada
Cuando la entrada de texto se especifica como InputType.CONVERSATION
, el modelo espera una entrada con el siguiente formato:
<name>: <message>
<name2>: <message2>
<name>: <message3>
<name3>: <message4>
Esto permite que el modelo produzca un resumen más preciso, ya que proporciona una mejor comprensión de la conversación y las interacciones.
Funciones admitidas y limitaciones
La entrada debe tener menos de 4,000 tokens (o aproximadamente 3,000 palabras en inglés). Si la entrada supera los 4,000 tokens, considera estas opciones:
- Prioriza el resumen de los primeros 4,000 tokens. Las pruebas indican que, por lo general, esto genera buenos resultados para entradas más largas. Considera activar la truncación automática llamando a
setLongInputAutoTruncationEnabled
para que la entrada adicional se corte automáticamente. - Segmenta la entrada en grupos de 4, 000 tokens y haz un resumen de cada uno de ellos.
- Considera una solución en la nube que sea más adecuada para la entrada más grande.
En el caso de InputType.ARTICLE
, la entrada también debe tener más de 400 caracteres, y el modelo funciona mejor cuando el artículo tiene al menos 300 palabras.
La API de GenAI Summarization admite inglés, japonés y coreano, y se define en SummarizerOptions.Language
.
La disponibilidad de la configuración de la función específica (especificada por SummarizerOptions
) 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 SummarizerOptions
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. |