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 cantidades de texto.
La creación de resúmenes se beneficia de la IA generativa en el dispositivo, ya que aborda las preocupaciones sobre la privacidad de los datos y la eficiencia en los costos. Las apps que resumen chats, correos electrónicos, notas y recordatorios personales suelen manejar información sensible, por lo que el procesamiento en el dispositivo es importante para la privacidad del usuario. Además, las tareas de resumen, en especial 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 los costos de entrega, a la vez que mantiene la privacidad de los datos del usuario.
Funciones clave
La API de GenAI Summarization abarca las siguientes capacidades:
- Resumir texto, categorizado como artículo o conversación
- Resumen de la salida en uno, dos o tres viñetas.
Comenzar
Agrega la API de Summarization de ML Kit como una dependencia en tu 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 la entrada en 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 la generación de resúmenes de los primeros 4,000 tokens. Las pruebas indican que, por lo general, esto produce buenos resultados para las entradas más largas. Considera activar el truncamiento automático llamando a
setLongInputAutoTruncationEnabled
para que el exceso de entrada se trunque automáticamente. - Segmenta la entrada en grupos de 4, 000 tokens y resúmelos de forma individual.
- 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 Resúmenes con IA generativa 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 la API deseada 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 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. |