API di sintesi di GenAI

Con l'API di riassunto di AI generativa di ML Kit, puoi generare automaticamente riassunti di articoli e conversazioni sotto forma di elenco puntato. In questo modo, gli utenti possono comprendere grandi quantità di testo.

Il riassunto con l'AI generativa on-device è vantaggioso perché risolve i problemi relativi alla privacy dei dati e all'efficienza dei costi. Le app che riassumono chat personali, email, note e promemoria spesso gestiscono informazioni sensibili, il che rende l'elaborazione on-device importante per la privacy degli utenti. Inoltre, le attività di riassunto, 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 la privacy dei dati degli utenti.

Funzionalità chiave

L'API di riassunto di AI generativa copre le seguenti funzionalità:

  • Riassumere il testo, classificato come articolo o conversazione.
  • Generare il riassunto in uno, due o tre punti elenco.

Inizia

Aggiungi l'API di riassunto di ML Kit come dipendenza nella configurazione build.gradle.

implementation("com.google.mlkit:genai-summarization:1.0.0-beta1")

Poi, implementa il codice nel tuo progetto:

  1. Crea un oggetto Summarizer.
  2. Scarica la funzionalità, se è scaricabile.
  3. Crea una richiesta di riassunto.
  4. 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();

Come 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 riassunto più accurato 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:

  • Dai la priorità al riassunto dei primi 4000 token. I test indicano che in genere questa opzione produce buoni risultati per gli input più lunghi. Valuta la possibilità di attivare il troncamento auto matico chiamando setLongInputAutoTruncationEnabled in modo che l'input aggiuntivo venga troncato automaticamente.
  • Segmenta l'input in gruppi di 4000 token e riassumili singolarmente.
  • Valuta una soluzione cloud più adatta all'input più grande.

Per InputType.ARTICLE, l'input deve contenere anche più di 400 caratteri e il modello funziona meglio quando l'articolo contiene almeno 300 parole.

L'API di riassunto di AI generativa supporta l'inglese, il giapponese e il coreano ed è definita in SummarizerOptions.Language.

La disponibilità della configurazione specifica della funzionalità (specificata da SummarizerOptions) può variare a seconda della configurazione del dispositivo specifico e dei modelli scaricati sul dispositivo.

Il modo più affidabile per gli sviluppatori di assicurarsi che la funzionalità API prevista sia supportata su un dispositivo con le SummarizerOptions richieste è chiamare il checkFeatureStatus() metodo. Questo metodo fornisce lo stato definitivo della disponibilità delle funzionalità sul dispositivo in fase di runtime.

Problemi di configurazione comuni

Le API di AI generativa di ML Kit si basano sull'app Android AICore per accedere a Gemini Nano. Quando un dispositivo viene configurato (incluso il ripristino) o l'app AICore viene ripristinata (ad es. cancellazione dei dati, disinstallazione e reinstallazione), 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 di AI generativa di ML Kit potrebbero non funzionare come previsto. Di seguito sono riportati i messaggi di errore di configurazione comuni che potresti visualizzare e come gestirli:

Esempio di messaggio di errore Come gestirla
AICore non è riuscito a eseguire l'operazione con il tipo di errore 4-CONNECTION_ERROR e il codice di errore 601-BINDING_FAILURE: impossibile associare il servizio AICore. Questo problema può verificarsi quando installi l'app utilizzando le API di AI generativa di ML Kit immediatamente dopo la configurazione del dispositivo o quando AICore viene disinstallato dopo l'installazione dell'app. L'aggiornamento dell'app AICore e la reinstallazione dell'app dovrebbero risolvere il problema.
AICore non è riuscito a eseguire l'operazione con il tipo di errore 3-PREPARATION_ERROR e il codice di errore 606-FEATURE_NOT_FOUND: la funzionalità ... non è disponibile. Questo problema può verificarsi quando AICore non ha completato il download delle configurazioni più recenti. Quando il dispositivo è connesso a internet, in genere l'aggiornamento richiede da pochi minuti a qualche ora. Il riavvio del dispositivo può velocizzare l'aggiornamento.

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 a eseguire l'operazione 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: impossibile risolvere l'host ... Mantieni la connessione di rete, attendi qualche minuto e riprova.

Codice campione