Начните работу с Prompt API

На этой странице описано, как выполнить следующие действия:

  • Настройте свой проект для использования 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: Не удалось разрешить хост ... Поддерживайте стабильное сетевое соединение, подождите несколько минут и повторите попытку.