مدلهای Gemini به طور پیشفرض پاسخها را به صورت متن بدون ساختار برمیگردانند. با این حال، برخی از موارد استفاده به متن ساختاریافته (مانند JSON یا enums) نیاز دارند. به عنوان مثال، ممکن است از این پاسخ برای سایر وظایف پاییندستی که به یک طرح داده مشخص نیاز دارند، استفاده کنید.
برای اطمینان از اینکه خروجی تولید شده مدل همیشه از یک طرحواره خاص پیروی میکند، میتوانید یک طرحواره تعریف کنید که مانند یک طرح اولیه برای پاسخهای مدل عمل میکند. سپس میتوانید مستقیماً دادهها را از خروجی مدل با پردازش کمتر پس از تولید استخراج کنید.
در اینجا چند مورد استفاده به عنوان مثال آورده شده است:
اطمینان حاصل کنید که پاسخ مدل، JSON معتبری تولید میکند و با طرحواره ارائه شده شما مطابقت دارد.
برای مثال، این مدل میتواند ورودیهای ساختاریافتهای برای دستور پختها ایجاد کند که همیشه شامل نام دستور پخت، لیست مواد تشکیلدهنده و مراحل پخت باشد. سپس میتوانید این اطلاعات را راحتتر تجزیه و در رابط کاربری برنامه خود نمایش دهید.نحوه پاسخگویی یک مدل در طول وظایف طبقهبندی را محدود کنید.
برای مثال، میتوانید کاری کنید که مدل، متن را با مجموعهای خاص از برچسبها (مثلاً مجموعهای خاص از enumها مانندpositiveوnegative) حاشیهنویسی کند، نه با برچسبهایی که مدل تولید میکند (که میتوانند درجهای از تغییرپذیری مانندgood،positive،negativeیاbadداشته باشند).
این صفحه نحوه تولید خروجی ساختاریافته (مانند JSON و enums) را در تجربیات ترکیبی شما برای برنامههای اندروید شرح میدهد.
پرش به خروجی JSON به خروجی شمارشی
پیکربندی برای خروجی ساختاریافته
تولید خروجی ساختاریافته (مانند JSON و enums) هم برای استنتاج روی دستگاه و هم برای استنتاج میزبانی ابری پشتیبانی میشود.
برای تولید خروجی ساختاریافته، طرحواره خود را مستقیماً به generateObject() ارسال کنید. الزامات طرحواره به حالت استنتاج پیکربندی شده شما بستگی دارد:
برای استنتاج روی دستگاه و ترکیبی (
ONLY_ON_DEVICE،PREFER_ON_DEVICEوPREFER_IN_CLOUD) :- نیاز به استفاده از حاشیهنویسی
@Generableروی یکdata classکاتلین با پردازنده KSP دارد؛ طرحوارههای دستی و حاشیهنویسیهای مستقیمenum classپشتیبانی نمیشوند. - وقتی استنتاج روی دستگاه اجرا میشود، SDK به طور خودکار طرحواره را به محدودیتهایی برای مدل روی دستگاه تبدیل میکند (با استفاده از API Prompt ML Kit).
- اگر یک درخواست ترکیبی به استنتاج ابری بازگردد، SDK به طور خودکار
responseMimeTypeرویapplication/jsonتنظیم میکند و طرحواره را به مدل Gemini میزبانی شده در ابر منتقل میکند.
- نیاز به استفاده از حاشیهنویسی
برای استنتاج فقط ابری (
ONLY_IN_CLOUD) :- از حاشیهنویسیهای
@Generable(توصیه میشود) و طرحوارههای دستی (ساخته شده با استفاده از متدهای کمکیJsonSchema) پشتیبانی میکند. - SDK به طور خودکار
responseMimeTypeرویapplication/jsonتنظیم میکند و طرحواره را به مدل Gemini میزبانی شده توسط ابر منتقل میکند.
- از حاشیهنویسیهای
قبل از اینکه شروع کنی
برای مشاهده محتوا و کد مخصوص ارائهدهنده در این صفحه، روی ارائهدهنده API Gemini خود کلیک کنید. |
قبل از تولید خروجی ساختاریافته، مطمئن شوید که تنظیمات زیر را انجام دادهاید:
راهنمای شروع به کار برای ساخت تجربیات ترکیبی را تکمیل کنید، که شامل راهاندازی پروژه Firebase، دانلود مدل روی دستگاه و پیکربندی App Check .
افزونه پردازش نماد کاتلین (KSP) را پیکربندی کنید و وابستگی Firebase AI KSP را به برنامه خود اضافه کنید.
در فایل Gradle ماژول (سطح برنامه) خود (مانند
<project>/<app-module>/build.gradle.kts)، افزونه KSP، افزونه Kotlin Serialization و وابستگیهای مورد نیاز را اضافه کنید: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") }
پرش به خروجی JSON به خروجی شمارشی
خروجی JSON
مثالهای زیر، نمونه خروجی عمومی JSON را برای تطبیق با استنتاج ترکیبی (برای مثال، PREFER_ON_DEVICE ) تطبیق میدهند.
در سناریوی مربوط به این مثالها، مدل فهرستی از پروفایلهای شخصیتها را برای یک داستان فانتزی، با ویژگیهای ساختاریافتهای مانند نام، سن، گونه و لوازم جانبی اختیاری تولید میکند.
شما میتوانید طرحوارههای پاسخ خود را با استفاده از هر یک از رویکردهای زیر تعریف کنید:
حاشیهنویسیهای KSP (
@Generableو@Guide)- برای همه حالتهای استنتاج پشتیبانی میشود و برای استنتاج روی دستگاه و ترکیبی (بهطور خاص،
ONLY_ON_DEVICE،PREFER_ON_DEVICEوPREFER_IN_CLOUD) مورد نیاز است . - کلاسهای داده کاتلین را طوری تعریف کنید که به طور خودکار در زمان کامپایل طرحواره تولید کنند و پاسخها را مستقیماً با استفاده از
getObject()به اشیاء با نوع داده قوی تبدیل کنند.
- برای همه حالتهای استنتاج پشتیبانی میشود و برای استنتاج روی دستگاه و ترکیبی (بهطور خاص،
- فقط برای استنتاج مبتنی بر ابر (به طور خاص،
ONLY_IN_CLOUD) پشتیبانی میشود. - بدون استفاده از پردازنده KSP، یک
JsonSchemaبه صورت دستی در کد بسازید و رشته خام JSON را ازresponse.response.textبخوانید.
- فقط برای استنتاج مبتنی بر ابر (به طور خاص،
مثال ۱: استفاده از حاشیهنویسیهای @Generable و @Guide با KSP
یک data class کاتلین تعریف کنید که با @Serializable و @Generable حاشیهنویسی شده باشد. از حاشیهنویسیهای @Guide روی ویژگیها استفاده کنید تا توضیحات، محدودههای مقدار یا محدودیتهای آیتم را به مدل ارائه دهید.
این رویکرد برای همه حالتهای استنتاج پشتیبانی میشود و برای تجربیات روی دستگاه و ترکیبی (بهطور خاص، ONLY_ON_DEVICE ، PREFER_ON_DEVICE و PREFER_IN_CLOUD ) مورد نیاز است.
| قبل از امتحان کردن این نمونه، بخش «قبل از شروع» این راهنما را برای راهاندازی پروژه و برنامه خود تکمیل کنید. در آن بخش، شما همچنین میتوانید روی دکمهای برای ارائهدهندهی API Gemini انتخابی خود کلیک کنید تا محتوای خاص ارائهدهنده را در این صفحه مشاهده کنید . |
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"}")
}
مثال ۲: استفاده از متدهای کمکی دستی JsonSchema
اگر برنامه شما فقط از استنتاج مبتنی بر ابر (به طور خاص، ONLY_IN_CLOUD ) استفاده میکند، میتوانید با استفاده از متدهای کمکی ارائه شده توسط Firebase AI Logic SDK، یک JsonSchema به صورت دستی بسازید.
| قبل از امتحان کردن این نمونه، بخش «قبل از شروع» این راهنما را برای راهاندازی پروژه و برنامه خود تکمیل کنید. در آن بخش، شما همچنین میتوانید روی دکمهای برای ارائهدهندهی API Gemini انتخابی خود کلیک کنید تا محتوای خاص ارائهدهنده را در این صفحه مشاهده کنید . |
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)
خروجی شمارشی
مثالهای زیر، نمونه خروجی عمومی enum را برای تطبیق با استنتاج ترکیبی (برای مثال، PREFER_ON_DEVICE ) تطبیق میدهند.
در سناریوی مربوط به این مثالها، مدل با انتخاب یک ژانر واحد از یک لیست از پیش تعریفشده از گزینههای مجاز ( drama ، comedy یا documentary )، توصیف یک فیلم را طبقهبندی میکند.
شما میتوانید طرحوارههای پاسخ خود را با استفاده از هر یک از رویکردهای زیر تعریف کنید:
حاشیهنویسیهای KSP (
@Generable)- برای همه حالتهای استنتاج پشتیبانی میشود و برای استنتاج روی دستگاه و ترکیبی (بهطور خاص،
ONLY_ON_DEVICE،PREFER_ON_DEVICEوPREFER_IN_CLOUD) مورد نیاز است . - یک enum تعریف کنید که در یک
data classکاتلین قرار گرفته باشد تا به طور خودکار طرحواره را تولید کند و پاسخها را مستقیماً با استفاده ازgetObject()به اشیاء با نوع قوی تبدیل کند.
- برای همه حالتهای استنتاج پشتیبانی میشود و برای استنتاج روی دستگاه و ترکیبی (بهطور خاص،
- فقط برای استنتاج مبتنی بر ابر (به طور خاص،
ONLY_IN_CLOUD) پشتیبانی میشود. - به صورت دستی یک
JsonSchemaشمارشی با استفاده ازJsonSchema.enumeration()و بدون استفاده از پردازنده KSP بسازید و رشته انتخاب شده را ازresponse.response.textبخوانید.
- فقط برای استنتاج مبتنی بر ابر (به طور خاص،
مثال ۱: استفاده از حاشیهنویسیهای @Generable با KSP
یک enum class تعریف کنید که نشاندهنده مقادیر مجاز باشد و آن را به عنوان یک ویژگی درون یک data class کاتلین که با @Serializable و @Generable حاشیهنویسی شده است، قرار دهید.
این رویکرد برای همه حالتهای استنتاج پشتیبانی میشود و برای تجربیات روی دستگاه و ترکیبی (بهطور خاص، ONLY_ON_DEVICE ، PREFER_ON_DEVICE و PREFER_IN_CLOUD ) مورد نیاز است.
| قبل از امتحان کردن این نمونه، بخش «قبل از شروع» این راهنما را برای راهاندازی پروژه و برنامه خود تکمیل کنید. در آن بخش، شما همچنین میتوانید روی دکمهای برای ارائهدهندهی API Gemini انتخابی خود کلیک کنید تا محتوای خاص ارائهدهنده را در این صفحه مشاهده کنید . |
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")
مثال ۲: استفاده از متدهای کمکی دستی JsonSchema
اگر برنامه شما فقط از استنتاج مبتنی بر ابر (به طور خاص، ONLY_IN_CLOUD ) استفاده میکند، میتوانید به صورت دستی یک enum JsonSchema با استفاده از متدهای کمکی ارائه شده توسط Firebase AI Logic SDK بسازید.
| قبل از امتحان کردن این نمونه، بخش «قبل از شروع» این راهنما را برای راهاندازی پروژه و برنامه خود تکمیل کنید. در آن بخش، شما همچنین میتوانید روی دکمهای برای ارائهدهندهی API Gemini انتخابی خود کلیک کنید تا محتوای خاص ارائهدهنده را در این صفحه مشاهده کنید . |
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)
درباره تجربه خود با Firebase AI Logic بازخورد دهید