API GenAI Rewriting

Con l'API GenAI Rewriting di ML Kit, puoi aiutare automaticamente gli utenti a riscrivere messaggi di chat o brevi contenuti con uno stile o un tono diverso.

Gli utenti potrebbero trovare utile ricevere suggerimenti su come riscrivere un contenuto nei seguenti casi:

  • Ristrutturare un messaggio per renderlo più professionale quando comunichi con gli stakeholder
  • Abbreviare un messaggio per renderlo più adatto alla pubblicazione sulle piattaforme di social media
  • Riformulazione di un messaggio per persone non madrelingua che cercano modi alternativi per comunicare il messaggio

Funzionalità chiave

L'API GenAI Rewriting di ML Kit può riscrivere brevi contenuti in uno dei seguenti stili:

  • Elabora: espande il testo inserito con maggiori dettagli e un linguaggio descrittivo.
  • Emojify: aggiunge emoji pertinenti al testo inserito, rendendolo più espressivo e divertente.
  • Abbrevia: comprime il testo inserito in una versione più breve, mantenendo intatto il messaggio principale.
  • Amichevole: riscrive il testo di input in modo che sia più informale e accessibile, utilizzando un tono colloquiale.
  • Professionale: riscrive il testo di input per renderlo più formale e aziendale, utilizzando un tono rispettoso.
  • Riformula: riscrive il testo di input utilizzando parole e strutture di frasi diverse, mantenendo il significato originale.

Le richieste restituiranno almeno un suggerimento. Se vengono restituiti più suggerimenti, i risultati verranno ordinati in base alla confidenza decrescente.

Risultati di esempio

Ingresso Riscrivi stile Output
Vuoi incontrarci per parlare di persona? Professionale Ti piacerebbe incontrarci di nuovo per approfondire l'argomento?
Vorrei invitarti a una festa informale a casa mia sabato sera. Abbrevia Ti piacerebbe raggiungermi per una serata informale a casa mia sabato sera?
L'evento è andato a buon fine Elabora L'evento ha avuto un successo clamoroso, superando tutte le nostre aspettative e dimostrandosi un trionfo assoluto.
Prendiamoci un caffè prima o poi. Aggiungi emoji Prendiamoci un caffè ☕ prima o poi 👋.
Fornisci il report entro la fine della giornata Amichevole Potresti condividere il report entro la fine della giornata?
Ehi, mi serve quella cosa al più presto Professionale Potresti fornirci il documento richiesto il prima possibile?
Il progetto è in ritardo rispetto alla pianificazione Riformula La cronologia del progetto richiede un aggiustamento per rispettare la scadenza originale

Per iniziare

Per iniziare a utilizzare l'API GenAI Rewriting, aggiungi questa dipendenza al file di build del progetto.

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

Quindi, crea un'istanza del client Rewriter con le opzioni richieste, verifica se le funzionalità del modello on-device richieste sono disponibili (e scaricale se necessario), prepara il testo di input come richiesta, esegui il processo di riscrittura per ottenere suggerimenti e rilascia le risorse.

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();

Funzionalità supportate e limitazioni

L'API GenAI Rewriting supporta le seguenti lingue: inglese, giapponese, francese, tedesco, italiano, spagnolo e coreano, definite in RewriterOptions.Language. L'input deve contenere meno di 256 token.

La disponibilità della configurazione di una funzionalità specifica (specificata da RewriterOptions) può variare in base alla configurazione del dispositivo specifico e ai modelli scaricati sul dispositivo.

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

Problemi di configurazione comuni

Le API ML Kit GenAI si basano sull'app Android AI Core per accedere a Gemini Nano. Quando un dispositivo viene appena configurato (incluso il ripristino) o l'app AICore viene appena 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 ML Kit GenAI 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: il servizio AICore non è riuscito a eseguire il binding. 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. L'aggiornamento dell'app AICore e la reinstallazione dell'app dovrebbero risolvere il problema.
AICore non è riuscito a completare l'operazione con il tipo di errore 3 - PREPARATION_ERROR e il codice di errore 606 - FEATURE_NOT_FOUND: la funzionalità ... non è disponibile. Ciò può accadere quando AICore non ha completato il download delle configurazioni più recenti. Quando il dispositivo è connesso a internet, l'aggiornamento richiede in genere 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 completare l'operazione con il tipo di errore 1-DOWNLOAD_ERROR e il codice di errore 0-UNKNOWN: Feature ... failed with failure status 0 and error esz: UNAVAILABLE: Unable to resolve host ... Mantieni la connessione di rete, attendi qualche minuto e riprova.