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

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

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

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

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

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

  • Детализировать : дополняет входной текст более подробной информацией и описательным языком.
  • 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()

Ява

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 Rewriting поддерживает следующие языки: английский, японский, французский, немецкий, итальянский, испанский и корейский. Они определены в 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 GenAI из ML Kit сразу после настройки устройства или если AICore удаляется после установки приложения. Обновление AICore и его переустановка должны исправить проблему.
Произошла ошибка AICore с типом ошибки 3-PREPARATION_ERROR и кодом ошибки 606-FEATURE_NOT_FOUND: Функция ... недоступна. Это может произойти, если AICore не завершил загрузку последних конфигураций. При подключении устройства к интернету обновление обычно занимает от нескольких минут до нескольких часов. Перезапуск устройства может ускорить обновление.

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