С помощью API GenAI Summarization из ML Kit можно автоматически создавать краткие пересказы статей и разговоров в виде списка пунктов. Это помогает пользователям лучше понимать большие объемы текста.
Краткий пересказ выигрывает от использования генеративного искусственного интеллекта на устройстве, поскольку это решает проблемы конфиденциальности данных и экономической эффективности. Приложения, которые обобщают личные чаты, электронные письма, заметки и напоминания, часто обрабатывают конфиденциальную информацию, поэтому обработка на устройстве важна для защиты конфиденциальности пользователей. Кроме того, задачи по созданию краткого пересказа, особенно с длинным контекстом или большим количеством элементов, могут требовать значительной вычислительной мощности. Обработка этого контента на устройстве снижает нагрузку на сервер и расходы на показ, а также обеспечивает конфиденциальность пользовательских данных.
Основные возможности
API для краткого изложения с помощью генеративного ИИ поддерживает следующие функции:
- Краткий пересказ текста, классифицированного как статья или чат.
- Суммирование в виде одного, двух или трех пунктов.
Начать
Добавьте API для создания краткого пересказа ML Kit в качестве зависимости в конфигурацию build.gradle.
implementation("com.google.mlkit:genai-summarization:1.0.0-beta1")
Затем добавьте код в проект:
- Создайте объект
Summarizer. - Скачайте функцию, если это доступно для скачивания.
- Создайте запрос на обобщение.
- Выполните вывод и получите результат.
Kotlin
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 слов.
GenAI Summarization API поддерживает английский, корейский и японский языки и описан в SummarizerOptions.Language.
Доступность определенной конфигурации функции (указанной в SummarizerOptions) может зависеть от конфигурации конкретного устройства и моделей, которые были на него скачаны.
Чтобы убедиться, что на устройстве с запрошенной версией SummarizerOptions поддерживается нужная функция API, разработчики могут вызвать метод checkFeatureStatus(). Этот метод позволяет определить, доступна ли функция на устройстве во время выполнения.
Распространенные проблемы с настройкой
API GenAI ML Kit используют приложение Android AICore для доступа к Gemini Nano. Если устройство только что настроено (в том числе после сброса) или приложение AICore только что сброшено (например, очищены данные, приложение удалено и установлено заново), у AICore может не хватить времени, чтобы завершить инициализацию (в том числе скачать последние конфигурации с сервера). В результате API генеративного ИИ ML Kit могут работать неправильно. Ниже приведены распространенные сообщения об ошибках, которые могут появляться при настройке, и способы их устранения.
| Пример сообщения об ошибке | Как устранить проблему |
| AICore не удалось запустить из-за ошибки типа 4 (CONNECTION_ERROR) и кода ошибки 601 (BINDING_FAILURE): не удалось привязать сервис AICore. | Это может произойти, если вы установите приложение с помощью ML Kit GenAI API сразу после настройки устройства или если AICore будет удален после установки приложения. Обновите приложение AICore, а затем переустановите свое приложение. |
| Ошибка AICore типа 3-PREPARATION_ERROR с кодом ошибки 606-FEATURE_NOT_FOUND: функция ... недоступна. |
Это может произойти, если AICore не завершил скачивание последних конфигураций. Когда устройство подключено к интернету, обновление обычно занимает от нескольких минут до нескольких часов. Чтобы ускорить обновление, перезапустите устройство.
Обратите внимание, что если загрузчик операционной системы устройства разблокирован, вы также увидите эту ошибку. API не поддерживает устройства с разблокированными загрузчиками операционной системы. |
| AICore failed with error type 1-DOWNLOAD_ERROR and error code 0-UNKNOWN: Feature ... failed with failure status 0 and error esz: UNAVAILABLE: Unable to resolve host ... | Сохраните подключение к сети, подождите несколько минут и повторите попытку. |