Theo mặc định, các mô hình Gemini sẽ trả về phản hồ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 phản hồi cho các tác vụ hạ nguồn khác yêu cầu một giản đồ dữ liệu đã thiết lập.
Để đảm bảo rằng kết quả do mô hình tạo ra 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 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ừ kết quả của mô hình mà không cần xử lý hậu kỳ nhiều.
Sau đây là một số trường hợp sử dụng mẫu:
Đảm bảo rằng phản hồi của mô hình tạo ra JSON hợp lệ và tuân thủ giản đồ 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 nguyên liệu và các bước thực hiện. 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 nhiệm 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 nhóm nhãn cụ thể (ví dụ: một nhóm enum cụ thể nhưpositivevànegative), thay vì các nhãn do mô hình tạo ra (có thể có mức độ biến thiên nhưgood,positive,negativehoặcbad).
Trang này mô tả cách tạo đầ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ả JSON Chuyển đến kết quả enum
Cấu hình cho đầu ra có cấu trúc
Tính năng tạo dữ liệu đầ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 trên đám mây.
Để tạo kết quả có cấu trúc, hãy truyền trực tiếp giản đồ của bạn đến generateObject().
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_DEVICEvàPREFER_IN_CLOUD):- Yêu cầu sử dụng chú thích
@Generabletrêndata classKotlin bằng trình xử lý KSP; không hỗ trợ giản đồ thủ công và chú thíchenum classtrực tiếp. - Khi quá trình suy luận chạy trên thiết bị, SDK sẽ tự động dịch giản đồ 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 câu lệnh của Bộ công cụ học máy).
- Nếu một yêu cầu kết hợp quay lại suy luận trên đám mây, thì 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ú thích
Đố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 phương thức trợ giúpJsonSchema). - SDK 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ú thích
Trước khi bắt đầu
|
Nhấp vào nhà cung cấp Gemini API của bạn để 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 kết quả 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 cả 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 của 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ợ 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:18.1.0") implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta07") 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ả JSON Chuyển đến kết quả enum
Kết quả JSON
Các ví dụ sau đây điều chỉnh
ví dụ chung về kết quả 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 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 đồ phản hồi bằng một trong hai cách sau:
Chú thích KSP (
@Generablevà@Guide)- Được hỗ trợ cho tất 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_DEVICEvàPREFER_IN_CLOUD). - Xác định các lớp dữ liệu Kotlin để tự động tạo giản đồ tại thời điểm biên dịch và giải tuần tự hoá các phản hồi trực tiếp thành các đối tượng có kiểu dữ liệu mạnh bằng cách sử dụng
getObject().
- Được hỗ trợ cho tất 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à
Phương thức trợ giúp
JsonSchemathủ công- Chỉ hỗ trợ cho hoạt động 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, rồi đọc chuỗi JSON thô từresponse.response.text.
- Chỉ hỗ trợ cho hoạt động suy luận dựa trên đám mây (cụ thể là
Ví dụ 1: Sử dụng chú thích @Generable và @Guide với KSP
Xác định một data class Kotlin được chú thích bằng @Serializable và @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 quy tắc ràng buộc về mục.
Phương pháp này được hỗ trợ cho tất 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_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 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. |
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 thủ công
Nếu ứng dụng của bạn chỉ sử dụng tính nă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 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 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. |
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ả enum
Các ví dụ sau đây điều chỉnh
ví dụ về kết quả 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 những 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 (drama, comedy hoặc documentary).
Bạn có thể xác định giản đồ phản hồi bằng một trong các phương pháp sau:
-
- Được hỗ trợ cho tất 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_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ác phản hồi trực tiếp thành đối tượng được nhập mạnh bằnggetObject().
- Được hỗ trợ cho tất 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à
Phương thức trợ giúp
JsonSchemathủ công- Chỉ hỗ trợ cho hoạt động 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, đồng thời đọc chuỗi đã chọn từresponse.response.text.
- Chỉ hỗ trợ cho hoạt động suy luận dựa trên đám mây (cụ thể là
Ví dụ 1: Sử dụng chú thích @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 một data class Kotlin được chú thích bằng @Serializable và @Generable.
Phương pháp này được hỗ trợ cho tất 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_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 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. |
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 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 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 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. |
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