С помощью 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: Не удалось разрешить хост ... | Поддерживайте стабильное сетевое соединение, подождите несколько минут и повторите попытку. |