API GenAI Rewriting

Con l'API di riscrittura GenAI 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:

  • Ristrutturazione di 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
  • Riformulare un messaggio per i non madrelingua che cercano modi alternativi per comunicare il messaggio

Funzionalità chiave

L'API di riscrittura di ML Kit basata sull'IA generativa può riscrivere brevi frammenti di contenuti in uno dei seguenti stili:

  • Elabora: espande il testo inserito con ulteriori dettagli e un linguaggio descrittivo.
  • Aggiungi emoji: aggiunge emoji pertinenti al testo inserito, rendendolo più espressivo e divertente.
  • Abbrevia: comprime il testo inserito in una versione più breve, mantenendo inalterato il messaggio di base.
  • Amichevole: riformula il testo inserito in modo che sia più informale e accessibile, utilizzando un tono colloquiale.
  • Professionale: riformula il testo inserito in modo da renderlo più formale e professionale, utilizzando un tono rispettoso.
  • Riformula: riscrive il testo inserito 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 all'affidabilità decrescente.

Risultati di esempio

Ingresso Stile di riscrittura Output
Vuoi incontrarci per parlare di più? Professionale Ti andrebbe di incontrarti di nuovo per discuterne ulteriormente?
Vorrei invitarti a un incontro informale a casa mia sabato sera Abbrevia Ti andrebbe di partecipare a un incontro informale a casa mia sabato sera?
L'evento è andato a buon fine Elabora L'evento è stato un successo strepitoso, ha superato tutte le nostre aspettative e si è rivelato un trionfo.
Prendiamoci un caffè a breve Aggiungi emoji Prendiamoci un caffè ☕ a breve 👋.
Fornisci il report entro la fine della giornata Amichevole Potresti condividere il report entro la fine della giornata?
Hey, ho bisogno di quella cosa il prima possibile Professionale Potresti fornire il documento richiesto il prima possibile?
Il progetto è in ritardo Riformula Le tempistiche del progetto richiedono un aggiustamento per rispettare la scadenza originale

Per iniziare

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

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

Quindi, esegui l'inizializzazione del client Rewriter con le opzioni richieste, controlla se sono disponibili le funzionalità del modello on-device richieste (e scaricale se necessario), prepara il testo di input come richiesta, esegui la procedura di riscrittura per ricevere 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, che sono definite in RewriterOptions.Language. L'input deve contenere meno di 256 token.

La disponibilità della configurazione della funzionalità specifica (specificata da RewriterOptions) può variare in base alla configurazione del dispositivo in questione 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 RewriterOptions 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, vedrai 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.