С помощью 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()
Ява
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 GenAI ML Kit сразу после настройки устройства или если AICore удаляется после установки вашего приложения. Обновление приложения AICore и его переустановка должны исправить это. |
Ошибка AICore произошла с типом ошибки 3-PREPARATION_ERROR и кодом ошибки 606-FEATURE_NOT_FOUND: Функция ... недоступна. | Это может произойти, когда AICore не закончил загрузку последних конфигураций. Сохраняйте сетевое соединение и подождите от нескольких минут до нескольких часов. Обратите внимание: если загрузчик устройства разблокирован, вы также увидите эту ошибку — этот API не поддерживает устройства с разблокированными загрузчиками. |
Ошибка AICore с типом ошибки 1-DOWNLOAD_ERROR и кодом ошибки 0-UNKNOWN: Функция ... завершилась неудачей со статусом ошибки 0 и ошибкой esz: UNAVAILABLE: Не удалось разрешить хост ... | Сохраните сетевое подключение, подождите несколько минут и повторите попытку. |