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 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 (như JSON hoặc enum). Ví dụ: bạn có thể đang sử dụng câu trả lời cho các tác vụ khác ở hạ nguồn yêu cầu giản đồ dữ liệu đã thiết lập.

Để đảm bảo rằng kết quả đầ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 đồ, hoạt động như một bản thiết kế cho các câu trả lời của mô hình. Sau đó, bạn có thể trực tiếp trích xuất dữ liệu từ kết quả đầu ra của mô hình với ít bước xử lý hậu kỳ hơn.

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

  • Đả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 có thể tạo các mục có cấu trúc cho công thức nấu ăn luôn bao gồm tên công thức, danh sách thành phần và các bước. Sau đó, bạn có thể dễ dàng phân tích cú pháp và hiển thị thông tin này 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ú giải văn bản bằng một tập hợp nhãn cụ thể (ví dụ: một tập hợp enum cụ thể như positive và negative), 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 kết quả đầu ra có cấu trúc (như JSON và enum) trong trải nghiệm kết hợp cho ứng dụng Android.

Chuyển đến kết quả đầu ra JSON Chuyển đến kết quả đầu ra enum

Cấu hình cho kết quả đầu ra có cấu trúc

Việc tạo kết quả đầu ra có cấu trúc (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 kết quả đầu ra có cấu trúc, hãy truyền trực tiếp giản đồ của bạn đế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 kết hợp và trên thiết bị (ONLY_ON_DEVICE, PREFER_ON_DEVICE và PREFER_IN_CLOUD):

    • Yêu cầu sử dụng chú giải @Generable trên data class Kotlin với trình xử lý KSP; không hỗ trợ giản đồ thủ công và chú giải enum class trực tiếp.
    • Khi suy luận chạy trên thiết bị, SDK sẽ tự động dịch giản đồ thành các ràng buộc cho mô hình trên thiết bị (sử dụng ML Kit Prompt API).
    • Nếu yêu cầu kết hợp chuyển về suy luận trên đám mây, SDK sẽ 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.
  • Đối với suy luận chỉ trên đám mây (ONLY_IN_CLOUD):

    • Hỗ trợ cả chú giải @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 sẽ 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 định Gemini API để xem nội dung dành riêng cho nhà cung cấp và mã trên trang này.

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

  1. Hoàn tất hướng dẫn bắt đầu sử dụng để xây dựng trải nghiệm kết hợp, bao gồm việc thiết lập dự án Firebase, tải mô hình trên thiết bị xuống 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) (như <project>/<app-module>/build.gradle.kts), hãy thêm trình bổ trợ KSP, trình bổ trợ Tuần tự hoá Kotlin 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:18.0.0")
       implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta06")
       implementation("com.google.firebase:firebase-appcheck-debug:20.0.0")
    
       // Add the Firebase AI KSP processor for schema generation.
       ksp("com.google.firebase:firebase-ai-ksp-processor:17.0.0")
    
       // (Optional) Add kotlinx.serialization JSON library for object decoding.
       implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:LATEST_VERSION")
    }


Chuyển đến kết quả đầu ra JSON Chuyển đến kết quả đầu ra enum

Kết quả đầu ra JSON

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

Trong tình huống của các 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 giản đồ câu trả lời bằng một trong các phương pháp sau:

  • Chú giải KSP (@Generable và @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 kết hợp và trên thiết bị (cụ thể là ONLY_ON_DEVICE, PREFER_ON_DEVICE và PREFER_IN_CLOUD).
    • Xác định các lớp dữ liệu Kotlin để tự động tạo lược đồ tại thời gian biên dịch và giải tuần tự hoá câu trả lờ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ợ 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 sử 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 và @Guide với KSP

Xác định data class Kotlin được chú giải bằng @Serializable và @Generable. Sử dụng chú giải @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 ràng buộc mặt hàng.

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 kết hợp và trên thiết bị (cụ thể là ONLY_ON_DEVICE, PREFER_ON_DEVICE và PREFER_IN_CLOUD).

Trước khi 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.
Trong phần đó, bạn cũng sẽ nhấp vào một nút cho 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 từ 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 phương thức trợ giúp JsonSchema 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 JsonSchema bằng các phương thức trợ giúp do Firebase AI Logic SDK cung cấp.

Trước khi 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.
Trong phần đó, bạn cũng sẽ nhấp vào một nút cho 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 từ 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)

Kết quả đầu ra enum

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

Trong tình huống của các ví dụ này, mô hình sẽ 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 giản đồ câu trả lời bằng một trong các phương pháp sau:

  • Chú giải 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 kết hợp và trên thiết bị (cụ thể là ONLY_ON_DEVICE, PREFER_ON_DEVICE và PREFER_IN_CLOUD).
    • Xác định một enum được gói trong data class Kotlin để tự động tạo giản đồ và giải tuần tự hoá câu trả lờ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ợ 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 enum JsonSchema theo cách thủ công bằng JsonSchema.enumeration() mà không cần sử 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 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ú giải bằng @Serializable và @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 kết hợp và trên thiết bị (cụ thể là ONLY_ON_DEVICE, PREFER_ON_DEVICE và PREFER_IN_CLOUD).

Trước khi 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.
Trong phần đó, bạn cũng sẽ nhấp vào một nút cho 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 từ 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 phương thức trợ giúp JsonSchema 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 enum JsonSchema bằng các phương thức trợ giúp do Firebase AI Logic SDK cung cấp.

Trước khi 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.
Trong phần đó, bạn cũng sẽ nhấp vào một nút cho 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 từ 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