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