API переписывания GenAI

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

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

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

Ключевые возможности

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

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

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

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

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

Начиная

Для начала работы с API перезаписи GenAI добавьте эту зависимость в файл сборки вашего проекта.

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

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

Котлин

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

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

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

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

Наиболее надежный способ для разработчиков убедиться в поддержке необходимой функции API на устройстве с запрошенными параметрами RewriterOptions — это вызвать метод checkFeatureStatus() . Этот метод предоставляет точную информацию о доступности функции на устройстве во время выполнения.

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

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

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

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

Пример кода