На этой странице описано, как выполнить следующие действия:
- Настройте свой проект для использования Prompt API.
- Введите текст и получите ответ.
- Введите изображение и соответствующий текст в поле ввода и получите ответ.
Для получения более подробной информации об API Prompt см. справочную документацию для Kotlin ( com.google.mlkit.genai.prompt ) и Java ( com.google.mlkit.genai.prompt.java , com.google.mlkit.genai.prompt ).
Настройка проекта
Добавьте API ML Kit Prompt в качестве зависимости в файл конфигурации build.gradle :
implementation("com.google.mlkit:genai-prompt:1.0.0-beta2")
Реализовать генеративную модель
Чтобы внедрить этот код в свой проект, выполните следующие шаги:
Создайте объект
generativeModel:Котлин
// Get a GenerativeModel instance val generativeModel = Generation.getClient()Java
// Get a GenerativeModel instance GenerativeModelFutures generativeModelFutures = GenerativeModelFutures .from(Generation.INSTANCE.getClient());Проверьте,
AVAILABLE,DOWNLOADABLEилиUNAVAILABLEфункция Gemini Nano. Затем, если функция доступна для загрузки, загрузите её:Котлин
val status = generativeModel.checkStatus() when (status) { FeatureStatus.UNAVAILABLE -> { // Gemini Nano not supported on this device or device hasn't fetched the latest configuration to support it } FeatureStatus.DOWNLOADABLE -> { // Gemini Nano can be downloaded on this device, but is not currently downloaded generativeModel.download().collect { status -> when (status) { is DownloadStatus.DownloadStarted -> Log.d(TAG, "starting download for Gemini Nano") is DownloadStatus.DownloadProgress -> Log.d(TAG, "Nano ${status.totalBytesDownloaded} bytes downloaded") DownloadStatus.DownloadCompleted -> { Log.d(TAG, "Gemini Nano download complete") modelDownloaded = true } is DownloadStatus.DownloadFailed -> { Log.e(TAG, "Nano download failed ${status.e.message}") } } } } FeatureStatus.DOWNLOADING -> { // Gemini Nano currently being downloaded } FeatureStatus.AVAILABLE -> { // Gemini Nano currently downloaded and available to use on this device } }Java
ListenableFuture<Integer> status = generativeModelFutures.checkStatus(); Futures.addCallback(generativeModelFutures.checkStatus(), new FutureCallback<>() { @Override public void onSuccess(Integer featureStatus) { switch (featureStatus) { case FeatureStatus.AVAILABLE - > { // Gemini Nano currently downloaded and available to use on this device } case FeatureStatus.UNAVAILABLE - > { // Gemini Nano not supported on this device or device hasn't fetched the latest configuration to support it } case FeatureStatus.DOWNLOADING - > { // Gemini Nano currently being downloaded } case FeatureStatus.DOWNLOADABLE - > { generativeModelFutures.download(new DownloadCallback() { @Override public void onDownloadStarted(long l) { Log.d(TAG, "starting download for Gemini Nano"); } @Override public void onDownloadProgress(long l) { Log.d(TAG, "Nano " + l + " bytes downloaded"); } @Override public void onDownloadCompleted() { Log.d(TAG, "Gemini Nano download complete"); } @Override public void onDownloadFailed(@NonNull GenAiException e) { Log.e(TAG, "Nano download failed: " + e.getMessage()); } }); } } } @Override public void onFailure(@NonNull Throwable t) { // Failed to check status } }, ContextCompat.getMainExecutor(context));
Предоставьте текстовый ввод.
Котлин
val response = generativeModel.generateContent("Write a 3 sentence story about a magical dog.")
Java
GenerateContentResponse response = generativeModelFutures.generateContent(
new GenerateContentRequest.Builder(
new TextPart("Write a 3 sentence story about a magical dog."))
.build())
.get();
В качестве альтернативы можно добавить необязательные параметры:
Котлин
val response = generativeModel.generateContent(
generateContentRequest(
TextPart("Write a 3 sentence story about a magical dog."),
) {
// Optional parameters
temperature = 0.2f
topK = 10
candidateCount = 3
},
)
Java
GenerateContentRequest.Builder requestBuilder =
new GenerateContentRequest.Builder(
new TextPart("Write a 3 sentence story about a magical dog."));
requestBuilder.setTemperature(.2f);
requestBuilder.setTopK(10);
requestBuilder.setCandidateCount(3);
GenerateContentResponse response =
generativeModelFutures.generateContent(requestBuilder.build()).get();
Для получения дополнительной информации о необязательных параметрах см. раздел «Необязательные параметры конфигурации» .
Обеспечьте многомодальный ввод (изображение и текст).
В функции generateContentRequest() объедините изображение и текстовое поле ввода, при этом текстовая подсказка должна представлять собой вопрос или команду, связанную с изображением:
Котлин
val response = generativeModel.generateContent(
generateContentRequest(ImagePart(bitmap), TextPart(textPrompt)) {
// optional parameters
...
},
)
Java
GenerateContentResponse response = generativeModelFutures.generateContent(
new GenerateContentRequest.Builder(
new ImagePart(bitmap),
new TextPart("textPrompt"))
// optional parameters
.build())
.get();
Результат вывода процесса
Выполните вывод и получите результат. Вы можете либо дождаться полного результата, либо получать ответ по мере его генерации как для текстовых, так и для мультимодальных запросов.
В этом методе используется вывод без потоковой передачи данных, который извлекает весь результат из модели ИИ, прежде чем вернуть результат:
Котлин
// Call the AI model to generate content and store the complete // in a new variable named 'response' once it's finished val response = generativeModel.generateContent("Write a 3 sentence story about a magical dog")Java
GenerateContentResponse response = generativeModelFutures.generateContent( new GenerateContentRequest.Builder( new TextPart("Write a 3 sentence story about a magical dog.")) .build()) .get();Приведенные ниже фрагменты кода являются примерами использования потокового вывода, который получает результат по мере его генерации:
Котлин
// Streaming inference var fullResponse = "" generativeModel.generateContentStream("Write a 3 sentence story about a magical dog").collect { chunk -> val newChunkReceived = chunk.candidates[0].text print(newChunkReceived) fullResponse += newChunkReceived }Java
// Streaming inference StringBuilder fullResponse = new StringBuilder(); generativeModelFutures.generateContent(new GenerateContentRequest.Builder( (new TextPart("Write a 3 sentence story about a magical dog"))).build(), chunk -> { Log.d(TAG, chunk); fullResponse.append(chunk); });
Для получения дополнительной информации о потоковом и непотоковом выводе данных см. раздел «Потоковое и непотоковое вычисление» .
Оптимизация задержки
Для оптимизации первого вызова функции вывода данных ваше приложение может дополнительно вызвать warmup() . Это загружает Gemini Nano в память и инициализирует компоненты среды выполнения.
Дополнительные конфигурации
В рамках каждого GenerateContentRequest можно задать следующие необязательные параметры:
-
temperature: Регулирует степень случайности при выборе токенов. -
seed: Позволяет получать стабильные и детерминированные результаты. -
topK: Обеспечивает контроль случайности и разнообразия результатов. -
candidateCount: Запрашивает количество уникальных полученных ответов. Обратите внимание, что точное количество ответов может не совпадать сcandidateCount, поскольку повторяющиеся ответы автоматически удаляются. -
maxOutputTokens: Определяет максимальное количество токенов, которые могут быть сгенерированы в ответе.
Дополнительные инструкции по настройке дополнительных параметров см. в разделе GenerateContentRequest .
Поддерживаемые функции и ограничения
- Вводимого текста должно быть менее 4000 токенов (или приблизительно 3000 английских слов). Для получения дополнительной информации см. справочник
countTokens. - Следует избегать сценариев использования, требующих большого объема выходных данных (более 256 токенов).
- AICore устанавливает квоту на вывод данных для каждого приложения. Для получения дополнительной информации см. раздел «Квота на приложение» .
- Для работы с API Prompt были проверены следующие языки:
- Английский
- корейский
Распространенные проблемы настройки
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: Не удалось разрешить хост ... | Поддерживайте стабильное сетевое соединение, подождите несколько минут и повторите попытку. |