Làm quen với Prompt API

Trang này mô tả cách thực hiện những việc sau:

  • Định cấu hình dự án để sử dụng Prompt API
  • Cung cấp dữ liệu đầu vào chỉ bằng văn bản và nhận câu trả lời
  • Cung cấp dữ liệu đầu vào là hình ảnh kèm theo dữ liệu đầu vào là văn bản liên quan và nhận câu trả lời

Để biết thêm thông tin chi tiết về Prompt API, hãy xem tài liệu tham khảo về Kotlin (com.google.mlkit.genai.prompt) và Java (com.google.mlkit.genai.prompt.java, com.google.mlkit.genai.prompt).

Định cấu hình dự án

Thêm Prompt API của Bộ công cụ học máy làm phần phụ thuộc trong cấu hình build.gradle:

implementation("com.google.mlkit:genai-prompt:1.0.0-beta2")

Nếu cần câu trả lời ở một định dạng nhất định bằng cách sử dụng Structured Output API, bạn cần định cấu hình KSP và thêm các phần phụ thuộc khác. Để biết thông tin chi tiết, hãy xem Tạo dữ liệu đầu ra có cấu trúc.

Triển khai mô hình tạo sinh

Để triển khai mã trong dự án, hãy làm theo các bước sau:

  • Tạo đối tượng generativeModel:

    Kotlin

    // Get a GenerativeModel instance
    val generativeModel = Generation.getClient()
    

    Java

    // Get a GenerativeModel instance
    GenerativeModelFutures generativeModelFutures = GenerativeModelFutures
        .from(Generation.INSTANCE.getClient());
    
  • Kiểm tra xem Gemini Nano có ở trạng thái AVAILABLE, DOWNLOADABLE hay UNAVAILABLE hay không. Sau đó, hãy tải tính năng này xuống nếu có thể tải xuống:

    Kotlin

    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));
    
    

Cung cấp dữ liệu đầu vào chỉ bằng văn bản

Kotlin

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();

Ngoài ra, hãy thêm các tham số không bắt buộc:

Kotlin

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();

Để biết thêm thông tin về các tham số không bắt buộc, hãy xem phần Cấu hình không bắt buộc.

Cung cấp dữ liệu đầu vào đa phương thức (hình ảnh và văn bản)

Gộp hình ảnh và dữ liệu đầu vào là văn bản vào hàm generateContentRequest(), trong đó câu lệnh văn bản là câu hỏi hoặc lệnh liên quan đến hình ảnh. Bạn có thể gộp nhiều hình ảnh và văn bản vào cùng một yêu cầu.

Kotlin

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();

Xử lý kết quả suy luận

  • Chạy quá trình suy luận và truy xuất kết quả. Bạn có thể chọn đợi kết quả đầy đủ hoặc truyền trực tuyến câu trả lời khi câu trả lời được tạo cho cả câu lệnh chỉ bằng văn bản và câu lệnh đa phương thức.

    • Cách này sử dụng quá trình suy luận không truyền trực tuyến, truy xuất toàn bộ kết quả từ mô hình AI trước khi trả về kết quả:

    Kotlin

    // 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();
    
    • Các đoạn mã sau đây là ví dụ về cách sử dụng quá trình suy luận truyền trực tuyến, truy xuất kết quả theo từng phần khi kết quả đang được tạo:

    Kotlin

    // 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);
            });
    

Để biết thêm thông tin về quá trình suy luận truyền trực tuyến và không truyền trực tuyến, hãy xem bài viết Truyền trực tuyến so với không truyền trực tuyến.

Tối ưu hoá độ trễ

Để tối ưu hoá cho lệnh gọi suy luận đầu tiên, ứng dụng của bạn có thể tuỳ ý gọi warmup(). Thao tác này sẽ tải Gemini Nano vào bộ nhớ và khởi chạy các thành phần thời gian chạy.

Cấu hình không bắt buộc

Trong mỗi GenerateContentRequest, bạn có thể đặt các tham số không bắt buộc sau:

  • temperature : Kiểm soát mức độ ngẫu nhiên trong việc chọn mã thông báo.
  • seed : Cho phép tạo kết quả ổn định và mang tính xác định.
  • topK : Kiểm soát tính ngẫu nhiên và sự đa dạng trong kết quả.
  • candidateCount : Yêu cầu số lượng câu trả lời duy nhất được trả về. Xin lưu ý rằng số lượng câu trả lời chính xác có thể không giống với candidateCount vì các câu trả lời trùng lặp sẽ tự động bị xoá.
  • maxOutputTokens : Xác định số lượng mã thông báo tối đa có thể được tạo trong câu trả lời.

Để biết thêm hướng dẫn về cách thiết lập cấu hình không bắt buộc, hãy xem GenerateContentRequest.

Các tính năng được hỗ trợ và hạn chế

  • Dữ liệu đầu vào phải dưới 4.000 mã thông báo (hoặc khoảng 3.000 từ tiếng Anh). Để biết thêm thông tin, hãy xem tài liệu tham khảo về countTokens.
  • Bạn nên tránh các trường hợp sử dụng yêu cầu dữ liệu đầu ra dài (hơn 4.000 mã thông báo).
  • AICore thực thi hạn mức suy luận cho mỗi ứng dụng. Để biết thêm thông tin, hãy xem bài viết Hạn mức cho mỗi ứng dụng.

Các vấn đề thường gặp về hoạt động thiết lập

Các API GenAI của Bộ công cụ học máy dựa vào ứng dụng Android AICore để truy cập vào Gemini Nano. Khi một thiết bị vừa được thiết lập (bao gồm cả thiết lập lại) hoặc ứng dụng AICore vừa được thiết lập lại (ví dụ: xoá dữ liệu, gỡ cài đặt rồi cài đặt lại), ứng dụng AICore có thể không có đủ thời gian để hoàn tất quá trình khởi chạy (bao gồm cả việc tải các cấu hình mới nhất xuống từ máy chủ). Do đó, các API GenAI của Bộ công cụ học máy có thể hoạt động không như mong đợi. Dưới đây là các thông báo lỗi thường gặp về hoạt động thiết lập mà bạn có thể thấy và cách xử lý các thông báo này:

Thông báo lỗi mẫu Cách xử lý
AICore không hoạt động được với loại lỗi 4-CONNECTION_ERROR và mã lỗi 601-BINDING_FAILURE: Dịch vụ AICore không liên kết được. Lỗi này có thể xảy ra khi bạn cài đặt ứng dụng bằng các API GenAI của Bộ công cụ học máy ngay sau khi thiết lập thiết bị hoặc khi AICore bị gỡ cài đặt sau khi ứng dụng của bạn được cài đặt. Việc cập nhật ứng dụng AICore rồi cài đặt lại ứng dụng của bạn sẽ khắc phục được lỗi này.
AICore không hoạt động được với loại lỗi 3-PREPARATION_ERROR và mã lỗi 606-FEATURE_NOT_FOUND: Tính năng ... không có. Lỗi này có thể xảy ra khi AICore chưa tải xong các cấu hình mới nhất. Khi thiết bị được kết nối với Internet, thường mất vài phút đến vài giờ để cập nhật. Việc khởi động lại thiết bị có thể giúp tăng tốc quá trình cập nhật.

Xin lưu ý rằng nếu trình tải khởi động của thiết bị được mở khoá, bạn cũng sẽ thấy lỗi này – API này không hỗ trợ các thiết bị có trình tải khởi động đã mở khoá.
AICore không hoạt động được với loại lỗi 1-DOWNLOAD_ERROR và mã lỗi 0-UNKNOWN: Tính năng ... không hoạt động được với trạng thái lỗi 0 và lỗi esz: UNAVAILABLE: Không thể phân giải máy chủ ... Duy trì kết nối mạng, đợi vài phút rồi thử lại.