Con l'API di sintesi GenAI di ML Kit, puoi generare automaticamente i riepiloghi di articoli e conversazioni sotto forma di elenco di elenchi puntati. In questo modo gli utenti possono comprendere più facilmente testi di grandi dimensioni.
Il riassunto trae vantaggio dall'AI generativa on-device perché risponde ai dubbi sulla privacy dei dati e sull'efficienza dei costi. Le app che riepilogano chat, email, note e promemoria personali spesso gestiscono informazioni sensibili, rendendo importante l'elaborazione sul dispositivo per la privacy dell'utente. Inoltre, le attività di sintesi, in particolare quelle con contesti lunghi o molti elementi, possono richiedere una potenza di elaborazione significativa. L'elaborazione di questi contenuti sul dispositivo riduce il carico del server e i costi di pubblicazione, mantenendo al contempo privati i dati utente.
Funzionalità chiave
L'API di sintesi di IA generativa copre le seguenti funzionalità:
- Riassumere il testo, classificato come articolo o conversazione.
- Riassumere l'output in uno, due o tre elenchi puntati.
Inizia
Aggiungi l'API di sintesi di ML Kit come dipendenza nella configurazione di build.gradle
.
implementation("com.google.mlkit:genai-summarization:1.0.0-beta1")
Poi, implementa il codice nel progetto:
- Crea un oggetto
Summarizer
. - Scaricare la funzionalità, se è scaricabile.
- Crea una richiesta di riepilogo.
- Esegui l'inferenza e recupera il risultato.
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();
In che modo il modello gestisce i diversi tipi di input
Quando l'input di testo è specificato come InputType.CONVERSATION
, il modello
si aspetta un input nel seguente formato:
<name>: <message>
<name2>: <message2>
<name>: <message3>
<name3>: <message4>
In questo modo, il modello può produrre un riepilogo più preciso fornendo una migliore comprensione della conversazione e delle interazioni.
Funzionalità supportate e limitazioni
L'input deve contenere meno di 4000 token (o circa 3000 parole in inglese). Se l'input supera i 4000 token, valuta queste opzioni:
- Dare la priorità al riepilogo dei primi 4000 token. I test indicano che solitamente questo metodo genera buoni risultati per input più lunghi. Valuta la possibilità di attivare la troncatura automatica chiamando
setLongInputAutoTruncationEnabled
in modo che l'input aggiuntivo venga troncato automaticamente. - Segmenta l'input in gruppi di 4000 token e riepilogali singolarmente.
- Valuta la possibilità di utilizzare una soluzione cloud più adatta per l'input più grande.
Per InputType.ARTICLE
, l'input deve contenere anche più di 400 caratteri e il modello ha un rendimento ottimale quando l'articolo è composto da almeno 300 parole.
L'API di sintesi GenAI supporta l'inglese, il giapponese e il coreano ed è definita in SummarizerOptions.Language
.
La disponibilità della configurazione della funzionalità specifica (specificata da
SummarizerOptions
) può variare in base alla configurazione del singolo
dispositivo e ai modelli che sono stati scaricati sul dispositivo.
Il modo più affidabile per gli sviluppatori di assicurarsi che la funzionalità dell'API prevista sia supportata su un dispositivo con il SummarizerOptions
richiesto è chiamare il metodo checkFeatureStatus()
. Questo metodo fornisce lo stato definitivo della disponibilità delle funzionalità sul dispositivo in fase di esecuzione.
Problemi di configurazione comuni
Le API ML Kit GenAI si basano sull'app Android AICore per accedere a Gemini Nano. Quando un dispositivo è appena stato configurato (incluso il ripristino dei dati di fabbrica) o l'app AICore è appena stata reimpostata (ad es. dati cancellati, disinstallata e reinstallata), l'app AICore potrebbe non avere tempo sufficiente per completare l'inizializzazione (incluso il download delle configurazioni più recenti dal server). Di conseguenza, le API ML Kit GenAI potrebbero non funzionare come previsto. Di seguito sono riportati i messaggi di errore di configurazione più comuni che potresti visualizzare e come gestirli:
Esempio di messaggio di errore | Come gestire |
AICore non è riuscito con il tipo di errore 4-CONNECTION_ERROR e il codice di errore 601-BINDING_FAILURE: non è stato possibile eseguire l'associazione del servizio AICore. | Ciò può accadere quando installi l'app utilizzando le API ML Kit GenAI immediatamente dopo la configurazione del dispositivo o quando AICore viene disinstallato dopo l'installazione dell'app. Il problema dovrebbe essere risolto aggiornando l'app AICore e reinstallando la tua app. |
AICore non è riuscito con il tipo di errore 3-PREPARATION_ERROR e il codice di errore 606-FEATURE_NOT_FOUND: la funzionalità ... non è disponibile. |
Questo può accadere quando AICore non ha completato il download delle configurazioni più recenti. Mantieni la connessione di rete e attendi da alcuni minuti a qualche ora.
Tieni presente che se il bootloader del dispositivo è sbloccato, visualizzerai anche questo errore: questa API non supporta i dispositivi con bootloader sbloccati. |
AICore non è riuscito con il tipo di errore 1-DOWNLOAD_ERROR e il codice di errore 0-UNKNOWN: la funzionalità ... non è riuscita con lo stato di errore 0 e l'errore esz: UNAVAILABLE: Unable to resolve host ... | Mantieni la connessione di rete, attendi qualche minuto e riprova. |