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