GenAI Rewriting API

С помощью GenAI Rewriting API из ML Kit вы можете автоматически помогать пользователям переписывать сообщения чатов или короткие фрагменты контента в другом стиле или тоне.

Пользователям могут быть полезны подсказки о том, как переписать контент, в следующих случаях:

  • Перефразировать сообщение, чтобы оно звучало более профессионально при общении с заинтересованными сторонами.
  • Сокращение сообщения, чтобы оно лучше подходило для публикации в социальных сетях.
  • Перефразировать сообщение для тех, кто не является носителем языка и ищет альтернативные способы выразить мысль.

Основные возможности

API GenAI Rewriting из ML Kit может переписывать короткие фрагменты контента в одном из следующих стилей:

  • Дополнить. Добавить в текст подробности и описания.
  • Emojify В текст добавляются подходящие эмодзи, чтобы сделать его более выразительным и интересным.
  • Сократить. Сделать текст более лаконичным, сохранив основную мысль.
  • Дружеский тон. Изменить стиль на более повседневный и простой.
  • Профессиональный. Текст переписывается в более формальном и деловом стиле с использованием уважительного тона.
  • Перефразировать. Переписать текст, используя другие слова и структуру предложений, но сохранив исходный смысл.

Запросы будут возвращать хотя бы один вариант. Если будет предложено несколько вариантов, они будут отсортированы по убыванию степени достоверности.

Пример результатов

Ввод данных Стиль переписывания Выходные данные
Хотите встретиться, чтобы обсудить это подробнее? Предметный специалист Хотите встретиться ещё раз, чтобы обсудить это подробнее?
Приглашаю вас на дружескую встречу в моем доме в субботу вечером. Сократить Хочешь прийти ко мне в гости в эту субботу вечером?
Событие прошло успешно Дополнить Мероприятие имело оглушительный успех, превзойдя все наши ожидания и оказавшись триумфальным.
Давай как-нибудь выпьем кофе Добавить эмодзи Давай как-нибудь выпьем кофе ☕. 👋
Предоставить отчет до конца дня Товарищеские матчи Не могли бы вы отправить отчет до конца дня?
Привет! Мне срочно нужна эта вещь. Предметный специалист Просим вас предоставить запрошенный документ как можно скорее.
Проект отстает от графика Перефразируй Сроки проекта необходимо скорректировать, чтобы уложиться в первоначальный срок.

Начало работы

Чтобы начать работу с GenAI Rewriting API, добавьте эту зависимость в файл сборки проекта.

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

Затем создайте экземпляр клиента [Rewriter][1] с необходимыми параметрами, проверьте, доступны ли необходимые функции модели на устройстве (и при необходимости скачайте их), подготовьте входной текст в качестве запроса, запустите процесс перезаписи, чтобы получить предложения, и освободите ресурсы.

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

Поддерживаемые функции и ограничения

GenAI Rewriting API поддерживает следующие языки: английский, испанский, итальянский, корейский, немецкий, французский и японский. Они определены в RewriterOptions.Language. Входные данные должны содержать менее 256 токенов.

Доступность определенной конфигурации функции (указанной в RewriterOptions) может зависеть от конфигурации устройства и моделей, скачанных на него.

Самый надежный способ убедиться, что нужная функция API поддерживается на устройстве с запрошенным RewriterOptions, – вызвать метод [checkFeatureStatus()][3]. Этот метод позволяет определить, доступна ли функция на устройстве во время выполнения.

Распространенные проблемы с настройкой

API GenAI ML Kit используют приложение Android AICore для доступа к Gemini Nano. Если устройство только что настроено (в том числе после сброса) или приложение AICore только что сброшено (например, удалены данные, а затем приложение удалено и установлено заново), у приложения AICore может не быть достаточно времени для завершения инициализации (включая скачивание последних конфигураций с сервера). В результате API GenAI в ML Kit могут работать неправильно. Ниже приведены распространенные сообщения об ошибках, которые могут появляться при настройке, и способы их устранения.

Пример сообщения об ошибке Как устранить проблему
AICore не удалось запустить из-за ошибки типа 4 (CONNECTION_ERROR) и кода ошибки 601 (BINDING_FAILURE): не удалось привязать сервис AICore. Это может произойти, если вы установите приложение с помощью ML Kit GenAI API сразу после настройки устройства или если AICore будет удален после установки приложения. Обновите приложение AICore, а затем переустановите свое приложение.
Ошибка AICore типа 3-PREPARATION_ERROR с кодом ошибки 606-FEATURE_NOT_FOUND: функция … недоступна. Это может произойти, если AICore ещё не скачал последние конфигурации. Когда устройство подключено к интернету, обновление обычно занимает от нескольких минут до нескольких часов. Чтобы ускорить обновление, перезапустите устройство.

Обратите внимание, что если загрузчик операционной системы устройства разблокирован, вы также увидите эту ошибку. API не поддерживает устройства с разблокированными загрузчиками операционной системы.
Ошибка AICore типа 1 (DOWNLOAD_ERROR) с кодом ошибки 0 (UNKNOWN): функция ... не выполнена со статусом 0 и ошибкой esz: UNAVAILABLE: не удается разрешить хост ... Сохраните подключение к сети, подождите несколько минут и повторите попытку.

Образец кода