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ưpositivevà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,negativehoặcbad).
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_DEVICEvàPREFER_IN_CLOUD):- Yêu cầu sử dụng chú giải
@Generabletrêndata classKotlin với trình xử lý KSP; không hỗ trợ giản đồ thủ công và chú giảienum classtrự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
responseMimeTypethànhapplication/jsonvà truyền giản đồ đến mô hình Gemini được lưu trữ trên đám mây.
- Yêu cầu sử dụng chú giải
Đố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úpJsonSchema). - SDK sẽ tự động đặt
responseMimeTypethànhapplication/jsonvà truyền giản đồ đến mô hình Gemini được lưu trữ trên đám mây.
- Hỗ trợ cả chú giải
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:
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.
Đị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 (
@Generablevà@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_DEVICEvà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().
- Đượ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à
Phương thức trợ giúp
JsonSchemathủ 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
JsonSchematheo 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.
- Chỉ được hỗ trợ cho suy luận dựa trên đám mây (cụ thể là
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. |
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. |
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:
-
- Đượ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_DEVICEvàPREFER_IN_CLOUD). - Xác định một enum được gói trong
data classKotlin để 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ằnggetObject().
- Đượ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à
Phương thức trợ giúp
JsonSchemathủ 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
JsonSchematheo cách thủ công bằngJsonSchema.enumeration()mà không cần sử dụng trình xử lý KSP và đọc chuỗi đã chọn từresponse.response.text.
- Chỉ được hỗ trợ cho suy luận dựa trên đám mây (cụ thể là
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. |
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. |
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