С помощью API-интерфейса проверки подлинности GenAI Proofreading от ML Kit вы можете помочь пользователям проверить грамматику и орфографию в небольших фрагментах текста.
Ключевые возможности
- Корректировка текста, введенного с клавиатуры или голосом
- Запросы вернут по крайней мере одно предложение. Если возвращено несколько предложений, результаты будут отсортированы по убыванию уверенности.
Примеры результатов
Вход | Тип ввода | Выход |
это короткое сообщение | Клавиатура | Это короткое сообщение. |
Проект почти завершён, но его нужно пересмотреть. | Клавиатура | Проект почти завершен, но требует доработки. |
Пожалуйста, дайте мне мяса медведю, | Голос | Пожалуйста, встретимся в баре. |
Начиная
Чтобы начать работу с API проверки подлинности GenAI, добавьте эту зависимость в файл сборки вашего проекта.
implementation("com.google.mlkit:genai-proofreading:1.0.0-beta1")
Затем настройте и получите клиент Proofreader
с определенными настройками языка и типа ввода. Проверьте и убедитесь, что необходимые функции модели на устройстве доступны (при необходимости запустите загрузку). Отправьте текст, который вы хотите проанализировать, в ProofreadingRequest
, выполните вывод корректуры и, наконец, обработайте возвращенные предложения по исправлению текста.
Котлин
val textToProofread = "The praject is compleet but needs too be reviewd"
// Define task with required input and output format
val options = ProofreaderOptions.builder(context)
// InputType can be KEYBOARD or VOICE. VOICE indicates that
// the user generated text based on audio input.
.setInputType(ProofreaderOptions.InputType.KEYBOARD)
// Refer to ProofreaderOptions.Language for available
// languages
.setLanguage(ProofreaderOptions.Language.ENGLISH)
.build()
val proofreader = Proofreading.getClient(options)
suspend fun prepareAndStartProofread() {
// Check feature availability, status will be one of the
// following: UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
val featureStatus = proofreader.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.
proofreader.downloadFeature(object : DownloadCallback {
override fun onDownloadStarted(bytesToDownload: Long) { }
override fun onDownloadFailed(e: GenAiException) { }
override fun onDownloadProgress(
totalBytesDownloaded: Long
) {}
override fun onDownloadCompleted() {
startProofreadingRequest(textToProofread, proofreader)
}
})
} 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
// very quickly. However, if Gemini Nano is not already
// downloaded, the download process may take longer.
startProofreadingRequest(textToProofread, proofreader)
} else if (featureStatus == FeatureStatus.AVAILABLE) {
startProofreadingRequest(textToProofread, proofreader)
}
}
suspend fun startProofreadingRequest(
text: String, proofreader: Proofreader
) {
// Create task request
val proofreadingRequest =
ProofreadingRequest.builder(text).build()
// Start proofreading 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 proofreadingResults =
proofreader.runInference(proofreadingRequest).await().results
// You can also start a streaming request
// proofreader.runInference(proofreadingRequest) { newText ->
// // show new text in UI
// }
}
// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
proofreader.close()
Ява
String textToProofread = "The praject is compleet but needs too be reviewd";
// Define task with required input and output format
ProofreaderOptions proofreaderOptions =
ProofreaderOptions
.builder(context)
// InputType can be KEYBOARD or VOICE. VOICE indicates that the
// user generated text based on audio input.
.setInputType(ProofreaderOptions.InputType.KEYBOARD)
// Refer to ProofreaderOptions.Language for available languages
.setLanguage(ProofreaderOptions.Language.ENGLISH)
.build();
Proofreader proofreader = Proofreading.getClient(proofreaderOptions);
void prepareAndStartProofread(Context context) throws ExecutionException,
InterruptedException {
// Check feature availability, status will be one of the following:
// UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
try {
int featureStatus = proofreader.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.
proofreader.downloadFeature(new DownloadCallback() {
@Override
public void onDownloadCompleted() {
startProofreadingRequest(textToProofread, proofreader);
}
@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
// very quickly. However, if Gemini Nano is not already
// downloaded, the download process may take longer.
startProofreadingRequest(textToProofread, proofreader);
} else if (featureStatus == FeatureStatus.AVAILABLE) {
startProofreadingRequest(textToProofread, proofreader);
}
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
}
void startProofreadingRequest(String text, Proofreader proofreader) {
// Create task request
ProofreadingRequest proofreadingRequest = ProofreadingRequest
.builder(text).build();
try {
// Start proofreading request with non-streaming response
// More than 1 result may be returned. If multiple suggestions are
// returned, results will be sorted by descending confidence.
proofreader.runInference(proofreadingRequest).get().getResults();
// You can also start a streaming request
// proofreader.runInference(proofreadingRequest, 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()
proofreader.close();
Как модель обрабатывает различные типы входных данных
Когда у модели больше информации о том, как пользователь ввел текст (с клавиатуры или голосом), она может лучше предсказать тип возможных ошибок. Текст, введенный с клавиатуры, более склонен к ошибкам с близлежащими клавишами, в то время как текст, введенный голосом, более склонен к ошибкам в словах с одинаковым произношением.
Поддерживаемые функции и ограничения
Корректура поддерживается для следующих языков: английский, японский, французский, немецкий, итальянский, испанский и корейский, и они определены в ProofreaderOptions.Language
. Ввод должен содержать менее 256 токенов.
Доступность конкретной конфигурации функций (указанной ProofreaderOptions
) может различаться в зависимости от конфигурации конкретного устройства и моделей, загруженных на устройство.
Самый надежный способ для разработчиков убедиться, что предполагаемая функция API поддерживается на устройстве с запрошенным ProofreaderOptions
, — это вызвать метод 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: Не удалось разрешить хост ... | Сохраните сетевое подключение, подождите несколько минут и повторите попытку. |