Tạo đầu ra có cấu trúc cho trải nghiệm kết hợp trong các ứng dụng Android


Theo mặc định, các mô hình Gemini sẽ trả về câu trả lời dưới dạng văn bản không có cấu trúc. Tuy nhiên, một số trường hợp sử dụng yêu cầu văn bản có cấu trúc (chẳng hạn như JSON hoặc enum). Ví dụ: bạn có thể đang sử dụng phản hồi cho các tác vụ khác ở hạ lưu yêu cầu một giản đồ dữ liệu đã thiết lập.

Để đảm bảo rằng đầu ra do mô hình tạo luôn tuân thủ một giản đồ cụ thể, bạn có thể xác định một giản đồ. Giản đồ này hoạt động như một bản thiết kế cho các phản hồi của mô hình. Sau đó, bạn có thể trực tiếp trích xuất dữ liệu từ đầu ra của mô hình mà không cần xử lý hậu kỳ nhiều.

Sau đây là một số ví dụ về trường hợp sử dụng:

  • Đảm bảo rằng câu trả lời của mô hình tạo ra JSON hợp lệ và tuân thủ giản đồ mà bạn cung cấp.
    Ví dụ: mô hình này có thể tạo các mục có cấu trúc cho công thức nấu ăn, trong đó luôn có tên công thức, danh sách nguyên liệu và các bước. Sau đó, bạn có thể phân tích cú pháp và hiển thị thông tin này dễ dàng hơn trong giao diện người dùng của ứng dụng.

  • Hạn chế cách mô hình có thể phản hồi trong các tác vụ phân loại.
    Ví dụ: bạn có thể yêu cầu mô hình chú thích văn bản bằng một bộ nhãn cụ thể (ví dụ: một bộ enum cụ thể như positivenegative), thay vì các nhãn mà mô hình tạo ra (có thể có mức độ biến đổi như good, positive, negative hoặc bad).

Trang này mô tả cách tạo đầu ra có cấu trúc (chẳng hạn như JSON và enum) trong trải nghiệm kết hợp cho các ứng dụng Android.

Chuyển đến đầu ra JSON Chuyển đến đầu ra enum

Cấu hình cho đầu ra có cấu trúc

Tính năng tạo đầu ra có cấu trúc (chẳng hạn như JSON và enum) được hỗ trợ cho cả suy luận trên thiết bị và suy luận được lưu trữ trên đám mây.

Để tạo đầu ra có cấu trúc, hãy truyền giản đồ của bạn trực tiếp đến generateObject(). Các yêu cầu về giản đồ phụ thuộc vào chế độ suy luận mà bạn đã định cấu hình:

  • Đối với suy luận trên thiết bị và suy luận kết hợp (ONLY_ON_DEVICE, PREFER_ON_DEVICEPREFER_IN_CLOUD):

    • Bạn cần sử dụng chú giải @Generable trên một data class Kotlin bằng trình xử lý KSP; các chú giải enum class trực tiếp và giản đồ thủ công không được hỗ trợ.
    • Khi quá trình suy luận chạy trên thiết bị, SDK sẽ tự động dịch lược đồ thành các quy tắc ràng buộc cho mô hình trên thiết bị (bằng cách sử dụng API Lời nhắc của Bộ công cụ học máy).
    • Nếu yêu cầu kết hợp quay lại suy luận trên đám mây, SDK sẽ tự động đặt responseMimeType thành application/json và chuyển giản đồ đến mô hình Gemini được lưu trữ trên đám mây.
  • Đối với suy luận chỉ trên đám mây (ONLY_IN_CLOUD):

    • Hỗ trợ cả chú thích @Generable (nên dùng) và giản đồ thủ công (được tạo bằng các phương thức trợ giúp JsonSchema).
    • SDK tự động đặt responseMimeType thành application/json và truyền giản đồ đến mô hình Gemini được lưu trữ trên đám mây.

Trước khi bắt đầu

Nhấp vào nhà cung cấp Gemini API để xem nội dung và mã dành riêng cho nhà cung cấp trên trang này.

Trước khi tạo đầu ra có cấu trúc, hãy đảm bảo rằng bạn đã hoàn tất quá trình thiết lập sau:

  1. Hoàn thành hướng dẫn bắt đầu xây dựng trải nghiệm kết hợp. Hướng dẫn này bao gồm các bước thiết lập dự án Firebase, tải mô hình xuống thiết bị và định cấu hình App Check.

  2. Định cấu hình trình bổ trợ Kotlin Symbol Processing (KSP) và thêm phần phụ thuộc Firebase AI KSP vào ứng dụng của bạn.

    Trong tệp Gradle mô-đun (cấp ứng dụng) (chẳng hạn như <project>/<app-module>/build.gradle.kts), hãy thêm trình bổ trợ KSP, trình bổ trợ Kotlin Serialization và các phần phụ thuộc bắt buộc:

    plugins {
       // ... other plugins
       id("com.google.gms.google-services")
       id("com.google.devtools.ksp") version "LATEST_VERSION"
       id("org.jetbrains.kotlin.plugin.serialization") version "LATEST_VERSION"
    }
    
    dependencies {
       // ... other androidx dependencies
    
       // Add the dependencies for the Firebase AI Logic and App Check libraries.
       implementation("com.google.firebase:firebase-ai:17.17.0")
       implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta05")
       implementation("com.google.firebase:firebase-appcheck-debug:19.4.1")
    
       // Add the Firebase AI KSP processor for schema generation.
       ksp("com.google.firebase:firebase-ai-ksp-processor:16.0.2")
    
       // (Optional) Add kotlinx.serialization JSON library for object decoding.
       implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:LATEST_VERSION")
    }


Chuyển đến đầu ra JSON Chuyển đến đầu ra enum

Đầu ra JSON

Các ví dụ sau đây điều chỉnh ví dụ chung về đầu ra JSON để phù hợp với suy luận kết hợp (ví dụ: PREFER_ON_DEVICE).

Trong trường hợp của những ví dụ này, mô hình sẽ tạo một danh sách hồ sơ nhân vật cho một câu chuyện giả tưởng, với các thuộc tính có cấu trúc như tên, tuổi, loài và phụ kiện không bắt buộc.

Bạn có thể xác định lược đồ phản hồi bằng một trong hai phương pháp sau:

  • Chú thích KSP (@Generable@Guide)

    • Được hỗ trợ cho tất cả các chế độ suy luận và bắt buộc đối với suy luận trên thiết bị và suy luận kết hợp (cụ thể là ONLY_ON_DEVICE, PREFER_ON_DEVICEPREFER_IN_CLOUD).
    • Xác định các lớp dữ liệu Kotlin để tự động tạo giản đồ tại thời gian biên dịch và giải tuần tự các phản hồi trực tiếp thành các đối tượng được nhập mạnh bằng getObject().
  • Phương thức trình trợ giúp JsonSchema thủ công

    • Chỉ được hỗ trợ cho suy luận dựa trên đám mây (cụ thể là ONLY_IN_CLOUD).
    • Tạo JsonSchema theo cách thủ công trong mã mà không cần dùng trình xử lý KSP và đọc chuỗi JSON thô từ response.response.text.

Ví dụ 1: Sử dụng chú giải @Generable@Guide với KSP

Xác định một data class Kotlin được chú giải bằng @Serializable@Generable. Sử dụng chú thích @Guide trên các thuộc tính để cung cấp cho mô hình nội dung mô tả, giới hạn giá trị hoặc các ràng buộc về mục.

Phương pháp này được hỗ trợ cho tất cả các chế độ suy luận và bắt buộc đối với trải nghiệm trên thiết bị và kết hợp (cụ thể là ONLY_ON_DEVICE, PREFER_ON_DEVICEPREFER_IN_CLOUD).

Trước khi dùng thử mẫu này, hãy hoàn tất phần Trước khi bắt đầu của hướng dẫn này để thiết lập dự án và ứng dụng của bạn.
Trong phần đó, bạn cũng sẽ nhấp vào một nút cho nhà cung cấp Gemini API mà bạn đã chọn để xem nội dung dành riêng cho nhà cung cấp trên trang này.

Đối với Kotlin, các phương thức trong SDK này là hàm tạm ngưng và cần được gọi qua Phạm vi Coroutine.
import com.google.firebase.Firebase
import com.google.firebase.ai.type.GenerativeBackend
import com.google.firebase.ai.InferenceMode
import com.google.firebase.ai.OnDeviceConfig
import com.google.firebase.ai.annotations.Generable
import com.google.firebase.ai.annotations.Guide
import com.google.firebase.ai.ai
import kotlinx.serialization.Serializable

// Define data classes representing the schema, annotated with @Serializable and @Generable.
// You can provide descriptions on @Generable and @Guide to guide the model's output.
@Serializable
@Generable(description = "A character profile for a fantasy story")
data class Character(
    val name: String,
    val age: Int,
    val species: String,
    // Use @Guide to add property descriptions, value bounds (minimum/maximum), or formats.
    // Properties with default values or nullable types are treated as optional in the schema.
    @Guide(description = "An accessory the character wears or carries")
    val accessory: String? = null
) {
    // An empty companion object is required for KSP to generate the firebaseAISchema() extension.
    companion object
}

@Serializable
@Generable(description = "A list of character profiles")
data class CharacterList(
    // Use minItems or maxItems to specify collection size bounds for the model.
    @Guide(description = "List of characters", minItems = 1)
    val characters: List<Character>
) {
    // An empty companion object is required for KSP to generate the firebaseAISchema() extension.
    companion object
}

// Initialize the Gemini Developer API backend service.
// Create a GenerativeModel instance configured for hybrid inference (like PREFER_ON_DEVICE).
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "CLOUD_MODEL_NAME",
        onDeviceConfig = OnDeviceConfig(mode = InferenceMode.INFERENCE_MODE)
    )

// Obtain the schema generated by KSP via the firebaseAISchema() extension.
val schema = CharacterList.firebaseAISchema()
val prompt = "Create profiles for some characters for a fantasy story."

// Generate the structured object (the SDK applies the schema to on-device or cloud models).
val response = model.generateObject(schema, prompt)

// Access the strongly-typed deserialized object directly via getObject().
val characterList: CharacterList? = response.getObject()
characterList?.characters?.forEach { character ->
    println("Name: ${character.name}, Species: ${character.species}, Age: ${character.age}")
    println("Accessory: ${character.accessory ?: "None"}")
}

Ví dụ 2: Sử dụng các phương thức trợ giúp JsonSchema theo cách thủ công

Nếu ứng dụng của bạn chỉ sử dụng suy luận dựa trên đám mây (cụ thể là ONLY_IN_CLOUD), thì bạn có thể tự tạo JsonSchema bằng các phương thức trợ giúp do SDK Firebase AI Logic cung cấp.

Trước khi dùng thử mẫu này, hãy hoàn tất phần Trước khi bắt đầu của hướng dẫn này để thiết lập dự án và ứng dụng của bạn.
Trong phần đó, bạn cũng sẽ nhấp vào một nút cho nhà cung cấp Gemini API mà bạn đã chọn để xem nội dung dành riêng cho nhà cung cấp trên trang này.

Đối với Kotlin, các phương thức trong SDK này là hàm tạm ngưng và cần được gọi qua Phạm vi Coroutine.
import com.google.firebase.Firebase
import com.google.firebase.ai.type.GenerativeBackend
import com.google.firebase.ai.InferenceMode
import com.google.firebase.ai.OnDeviceConfig
import com.google.firebase.ai.ai
import com.google.firebase.ai.type.JsonSchema

// Define the schema manually using JsonSchema helper methods.
// Properties are required by default unless specified in optionalProperties.
val jsonSchema = JsonSchema.obj(
    properties = mapOf(
        "characters" to JsonSchema.array(
            items = JsonSchema.obj(
                properties = mapOf(
                    "name" to JsonSchema.string(),
                    "accessory" to JsonSchema.string(),
                    "age" to JsonSchema.integer(),
                    "species" to JsonSchema.string()
                ),
                optionalProperties = listOf("accessory")
            )
        )
    )
)

// Initialize the Gemini Developer API backend service.
// Manual schemas are only supported for cloud-based inference (specifically, ONLY_IN_CLOUD).
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "CLOUD_MODEL_NAME",
        onDeviceConfig = OnDeviceConfig(mode = InferenceMode.ONLY_IN_CLOUD)
    )

// Call generateObject() with the manual schema and prompt.
val response = model.generateObject(
    jsonSchema,
    "Create profiles for some characters for a fantasy story."
)

// Access the generated JSON string conforming to the schema from response.response.text.
println(response.response.text)

Đầu ra enum

Các ví dụ sau đây điều chỉnh ví dụ đầu ra enum chung để phù hợp với suy luận kết hợp (ví dụ: PREFER_ON_DEVICE).

Trong trường hợp của các ví dụ này, mô hình phân loại nội dung mô tả phim bằng cách chọn một thể loại duy nhất trong danh sách các lựa chọn được phép xác định trước (drama, comedy hoặc documentary).

Bạn có thể xác định lược đồ phản hồi bằng một trong hai phương pháp sau:

  • Chú thích KSP (@Generable)

    • Được hỗ trợ cho tất cả các chế độ suy luận và bắt buộc đối với suy luận trên thiết bị và suy luận kết hợp (cụ thể là ONLY_ON_DEVICE, PREFER_ON_DEVICEPREFER_IN_CLOUD).
    • Xác định một enum được bao bọc trong data class Kotlin để tự động tạo giản đồ và giải tuần tự các phản hồi trực tiếp thành các đối tượng được gõ mạnh bằng cách sử dụng getObject().
  • Phương thức trình trợ giúp JsonSchema thủ công

    • Chỉ được hỗ trợ cho suy luận dựa trên đám mây (cụ thể là ONLY_IN_CLOUD).
    • Tạo một enum JsonSchema theo cách thủ công bằng cách sử dụng JsonSchema.enumeration() mà không cần dùng trình xử lý KSP và đọc chuỗi đã chọn từ response.response.text.

Ví dụ 1: Sử dụng chú giải @Generable với KSP

Xác định một enum class đại diện cho các giá trị được phép và gói giá trị đó dưới dạng một thuộc tính bên trong data class Kotlin được chú thích bằng @Serializable@Generable.

Phương pháp này được hỗ trợ cho tất cả các chế độ suy luận và bắt buộc đối với trải nghiệm trên thiết bị và kết hợp (cụ thể là ONLY_ON_DEVICE, PREFER_ON_DEVICEPREFER_IN_CLOUD).

Trước khi dùng thử mẫu này, hãy hoàn tất phần Trước khi bắt đầu của hướng dẫn này để thiết lập dự án và ứng dụng của bạn.
Trong phần đó, bạn cũng sẽ nhấp vào một nút cho nhà cung cấp Gemini API mà bạn đã chọn để xem nội dung dành riêng cho nhà cung cấp trên trang này.

Đối với Kotlin, các phương thức trong SDK này là hàm tạm ngưng và cần được gọi qua Phạm vi Coroutine.
import com.google.firebase.Firebase
import com.google.firebase.ai.type.GenerativeBackend
import com.google.firebase.ai.InferenceMode
import com.google.firebase.ai.OnDeviceConfig
import com.google.firebase.ai.annotations.Generable
import com.google.firebase.ai.annotations.Guide
import com.google.firebase.ai.ai
import kotlinx.serialization.Serializable

// Define an enum class representing the allowed options.
@Serializable
enum class FilmGenre {
    DRAMA,
    COMEDY,
    DOCUMENTARY
}

// Wrap the enum in a data class annotated with @Serializable and @Generable.
// On-device inference requires an @Generable data class.
// Direct enum annotations are not supported on-device.
@Serializable
@Generable(description = "The classification result for the film")
data class FilmClassification(
    @Guide(description = "The genre of the film")
    val genre: FilmGenre
) {
    // An empty companion object is required for KSP to generate the firebaseAISchema() extension.
    companion object
}

// Initialize the Gemini Developer API backend service.
// Create a GenerativeModel instance configured for hybrid inference (like PREFER_ON_DEVICE).
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "CLOUD_MODEL_NAME",
        onDeviceConfig = OnDeviceConfig(mode = InferenceMode.INFERENCE_MODE)
    )

// Obtain the schema generated by KSP via the firebaseAISchema() extension.
val schema = FilmClassification.firebaseAISchema()
val prompt = """
    The film aims to educate and inform viewers about real-life subjects, events, or people.
    It offers a factual record of a particular topic by combining interviews, historical footage,
    and narration. The primary purpose of a film is to present information and provide insights
    into various aspects of reality.
    """

// Generate the structured object (the SDK applies the schema to on-device or cloud models).
val response = model.generateObject(schema, prompt)

// Access the strongly-typed deserialized object and enum value directly via getObject().
val classification: FilmClassification? = response.getObject()
val genre: FilmGenre? = classification?.genre
println("Selected genre: $genre")

Ví dụ 2: Sử dụng các phương thức trợ giúp JsonSchema theo cách thủ công

Nếu ứng dụng của bạn chỉ sử dụng suy luận dựa trên đám mây (cụ thể là ONLY_IN_CLOUD), thì bạn có thể tạo một enum JsonSchema theo cách thủ công bằng các phương thức trợ giúp do SDK Firebase AI Logic cung cấp.

Trước khi dùng thử mẫu này, hãy hoàn tất phần Trước khi bắt đầu của hướng dẫn này để thiết lập dự án và ứng dụng của bạn.
Trong phần đó, bạn cũng sẽ nhấp vào một nút cho nhà cung cấp Gemini API mà bạn đã chọn để xem nội dung dành riêng cho nhà cung cấp trên trang này.

Đối với Kotlin, các phương thức trong SDK này là hàm tạm ngưng và cần được gọi qua Phạm vi Coroutine.
import com.google.firebase.Firebase
import com.google.firebase.ai.type.GenerativeBackend
import com.google.firebase.ai.InferenceMode
import com.google.firebase.ai.OnDeviceConfig
import com.google.firebase.ai.ai
import com.google.firebase.ai.type.JsonSchema

// Define an enum schema with allowed string values and a description.
val enumSchema = JsonSchema.enumeration(
    values = listOf("drama", "comedy", "documentary"),
    description = "The genre of the film"
)

// Initialize the Gemini Developer API backend service.
// Manual schemas are only supported for cloud-based inference (specifically, ONLY_IN_CLOUD).
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "CLOUD_MODEL_NAME",
        onDeviceConfig = OnDeviceConfig(mode = InferenceMode.ONLY_IN_CLOUD)
    )

val prompt = """
    The film aims to educate and inform viewers about real-life subjects, events, or people.
    It offers a factual record of a particular topic by combining interviews, historical footage,
    and narration. The primary purpose of a film is to present information and provide insights
    into various aspects of reality.
    """

// Call generateObject() with the enum schema and prompt.
val response = model.generateObject(enumSchema, prompt)

// Access the selected enum value string from response.response.text.
println(response.response.text)


Gửi ý kiến phản hồi về trải nghiệm của bạn với Firebase AI Logic