С помощью API GenAI Summarization от ML Kit вы можете автоматически создавать краткие обзоры статей и обсуждений в виде списка пунктов. Это помогает пользователям понимать большие объемы текста.
Использование генеративного ИИ на устройстве для создания кратких обзоров выгодно, поскольку решает проблемы конфиденциальности данных и обеспечивает экономическую эффективность. Приложения, которые обобщают личные чаты, электронные письма, заметки и напоминания, часто обрабатывают конфиденциальную информацию, поэтому обработка на устройстве важна для защиты конфиденциальности пользователей. Кроме того, задачи по созданию кратких обзоров, особенно с длинным контекстом или большим количеством элементов, могут требовать значительной вычислительной мощности. Обработка такого контента на устройстве снижает нагрузку на сервер и уменьшает затраты на обслуживание, сохраняя при этом конфиденциальность пользовательских данных.
Ключевые возможности
API для создания кратких обзоров от GenAI обладает следующими возможностями:
- Кратко изложите содержание текста, классифицированного как статья или разговор.
- Вывод в виде краткого изложения в одном, двух или трех пунктах.
Начать
Добавьте API для создания кратких обзоров ML Kit в качестве зависимости в файл конфигурации build.gradle .
implementation("com.google.mlkit:genai-summarization:1.0.0-beta1")
Далее, внедрите этот код в свой проект:
- Создайте объект
Summarizer. - Загрузите эту функцию, если она доступна для скачивания.
- Создайте запрос на составление сводной информации.
- Выполните вывод и получите результат.
Котлин
val articleToSummarize = "Announcing a set of on-device GenAI APIs..."
// Define task with required input type, output type, and language
val summarizerOptions = SummarizerOptions.builder(context)
.setInputType(InputType.ARTICLE)
.setOutputType(OutputType.ONE_BULLET)
.setLanguage(Language.ENGLISH)
.build()
val summarizer = Summarization.getClient(summarizerOptions)
suspend fun prepareAndStartSummarization() {
// Check feature availability. Status will be one of the following:
// UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
val featureStatus = summarizer.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.
summarizer.downloadFeature(object : DownloadCallback {
override fun onDownloadStarted(bytesToDownload: Long) { }
override fun onDownloadFailed(e: GenAiException) { }
override fun onDownloadProgress(totalBytesDownloaded: Long) {}
override fun onDownloadCompleted() {
startSummarizationRequest(articleToSummarize, summarizer)
}
})
} 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.
startSummarizationRequest(articleToSummarize, summarizer)
} else if (featureStatus == FeatureStatus.AVAILABLE) {
startSummarizationRequest(articleToSummarize, summarizer)
}
}
fun startSummarizationRequest(text: String, summarizer: Summarizer) {
// Create task request
val summarizationRequest = SummarizationRequest.builder(text).build()
// Start summarization request with streaming response
summarizer.runInference(summarizationRequest) { newText ->
// Show new text in UI
}
// You can also get a non-streaming response from the request
// val summarizationResult = summarizer.runInference(
// summarizationRequest).get().summary
}
// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
summarizer.close()
Java
String articleToSummarize = "Announcing: a set of on-device GenAI AI APIs.";
// Define task with required input type, output type, and language
SummarizerOptions summarizerOptions =
SummarizerOptions.builder(context)
.setInputType(SummarizerOptions.InputType.ARTICLE)
.setOutputType(SummarizerOptions.OutputType.ONE_BULLET)
.setLanguage(SummarizerOptions.Language.ENGLISH)
.build();
Summarizer summarizer = Summarization.getClient(summarizerOptions);
void prepareAndStartSummarization()
throws ExecutionException, InterruptedException {
// Check feature availability. Status will be one of the following:
// UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
try {
int featureStatus = summarizer.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.
summarizer.downloadFeature(new DownloadCallback() {
@Override
public void onDownloadCompleted() {
startSummarizationRequest(articleToSummarize, summarizer);
}
@Override
public void onDownloadFailed(GenAiException e) { /* handle error */ }
@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.
startSummarizationRequest(articleToSummarize, summarizer);
} else if (featureStatus == FeatureStatus.AVAILABLE) {
startSummarizationRequest(articleToSummarize, summarizer);
}
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
}
void startSummarizationRequest(String text, Summarizer summarizer) {
// Create task request
SummarizationRequest summarizationRequest =
SummarizationRequest.builder(text).build();
// Start summarization request with streaming response
summarizer.runInference(summarizationRequest, newText -> {
// Show new text in UI
});
// You can also get a non-streaming response from the request
// ListenableFuture<SummarizationResult> summarizationResult
// = summarizer.runInference(summarizationRequest);
// String summary = summarizationResult.get().getSummary();
}
// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
summarizer.close();
Как модель обрабатывает различные типы входных данных
Если для текстового поля ввода указано InputType.CONVERSATION , модель ожидает ввод в следующем формате:
<name>: <message>
<name2>: <message2>
<name>: <message3>
<name3>: <message4>
Это позволяет модели создавать более точные сводки, обеспечивая лучшее понимание разговора и взаимодействий.
Поддерживаемые функции и ограничения
Входные данные должны содержать менее 4000 токенов (или приблизительно 3000 английских слов). Если входные данные превышают 4000 токенов, рассмотрите следующие варианты:
- Приоритет следует отдавать суммированию первых 4000 токенов. Тестирование показывает, что это обычно дает хорошие результаты для более длинных входных данных. Рекомендуется включить автоматическое усечение, вызвав метод
setLongInputAutoTruncationEnabled, чтобы лишние входные данные автоматически усекались. - Разделите входные данные на группы по 4000 токенов и обобщите их по отдельности.
- Рассмотрите облачное решение, которое лучше подходит для обработки больших объемов входных данных.
Для InputType.ARTICLE входные данные также должны превышать 400 символов, при этом модель показывает наилучшие результаты, когда статья содержит не менее 300 слов.
API для создания кратких обзоров GenAI поддерживает английский, японский и корейский языки и определен в SummarizerOptions.Language .
Доступность конкретной конфигурации функций (указанной в параметре SummarizerOptions ) может варьироваться в зависимости от конфигурации конкретного устройства и моделей, загруженных на устройство.
Наиболее надежный способ для разработчиков убедиться в поддержке необходимой функции API на устройстве с запрошенными SummarizerOptions — это вызвать метод 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: Не удалось разрешить хост ... | Поддерживайте стабильное сетевое соединение, подождите несколько минут и повторите попытку. |