تولید برونداد ساختاریافته برای تجربه‌های ترکیبی در برنامه‌های Android


مدل‌های Gemini به‌طور پیش‌فرض پاسخ‌ها را به‌صورت نوشتار بدون ساختار برمی‌گردانند. بااین‌حال، برخی‌از موارد استفاده به نوشتار ساختاریافته (مانند JSON یا enums) نیاز دارند. برای مثال، ممکن است از پاسخ برای کارهای پایین‌دستی دیگری استفاده کنید که به طرح‌واره داده‌های تثبیت‌شده نیاز دارند.

برای اطمینان از اینکه برونداد تولیدشده مدل همیشه از طرح‌واره خاصی پیروی می‌کند، می‌توانید طرح‌واره‌ای تعریف کنید که مانند طرحی برای پاسخ‌های مدل عمل می‌کند. سپس می‌توانید مستقیماً داده‌ها را از خروجی مدل با پس‌پردازش کمتر استخراج کنید.

در اینجا چند نمونه از موارد استفاده آورده شده است:

  • مطمئن شوید که پاسخ مدل JSON معتبر تولید می‌کند و با طرح‌واره ارائه‌شده شما مطابقت دارد.
    برای مثال، مدل می‌تواند ورودی‌های ساختاریافته‌ای برای دستورهای پخت تولید کند که همیشه شامل نام دستور پخت، فهرست مواد اولیه، و مراحل باشد. سپس می‌توانید این اطلاعات را راحت‌تر در میانای کاربر برنامه‌تان تجزیه و نمایش دهید.

  • محدود کردن نحوه پاسخ دادن مدل درطول تکالیف طبقه‌بندی.
    برای مثال، می‌توانید از مدل بخواهید نوشتار را با مجموعه خاصی از برچسب‌ها (مثلاً مجموعه خاصی از شمارش‌ها مانند positive و negative) حاشیه‌نویسی کند، نه برچسب‌هایی که مدل تولید می‌کند (که ممکن است درجاتی از تنوع مانند good، positive، negative، یا bad داشته باشند).

این صفحه نحوه تولید برونداد ساختاریافته (مانند JSON و شمارشی‌ها) در تجربه‌های ترکیبی برای برنامه‌های Android را شرح می‌دهد.

پرش به برونداد JSON پرش به برونداد enum

پیکربندی برای خروجی ساختاریافته

تولید خروجی ساختاریافته (مانند JSON و enum) هم برای استنتاج درون‌دستگاهی و هم برای استنتاج میزبانی‌شده در فضای ابری پشتیبانی می‌شود.

برای تولید برونداد ساختاریافته، طرح‌واره‌تان را مستقیماً به generateObject() ارسال کنید. الزامات طرح‌واره به حالت استنتاج پیکربندی‌شده شما بستگی دارد:

  • برای استنتاج ترکیبی و درون‌دستگاهی (ONLY_ON_DEVICE، PREFER_ON_DEVICE، و PREFER_IN_CLOUD):

    • Requires using the @Generable annotation on a Kotlin data class with the KSP processor; manual schemas and direct enum class annotations are not supported.
    • وقتی استنتاج در دستگاه اجرا می‌شود، کیت توسعه نرم‌افزار به‌طور خودکار طرح‌واره را به محدودیت‌هایی برای مدل درون‌دستگاهی ترجمه می‌کند (بااستفاده از ML Kit Prompt API).
    • اگر درخواست ترکیبی به استنتاج ابری برگردد، کیت توسعه نرم‌افزار به‌طور خودکار responseMimeType را روی application/json تنظیم می‌کند و طرح‌واره را به مدل Gemini میزبانی‌شده در ابر ارسال می‌کند.
  • برای استنتاج فقط ابری (ONLY_IN_CLOUD):

    • از هر دو حاشیه‌نویسی @Generable (توصیه‌شده) و طرح‌واره‌های دستی (ساخته‌شده بااستفاده از روش‌های کمکی JsonSchema) پشتیبانی می‌کند.
    • کیت توسعه نرم‌افزار به‌طور خودکار responseMimeType را روی application/json تنظیم می‌کند و طرح‌واره را به مدل Gemini میزبانی‌شده در فضای ابری ارسال می‌کند.

قبل از شروع

روی ارائه‌دهنده Gemini API کلیک کنید تا محتوا و کد مختص ارائه‌دهنده را در این صفحه ببینید.

قبل‌از تولید برونداد ساختاریافته، مطمئن شوید که راه‌اندازی زیر را تکمیل کرده‌اید:

  1. راهنمای شروع به کار برای ساختن تجربه‌های ترکیبی را تکمیل کنید. این راهنما شامل راه‌اندازی پروژه Firebase، بارگیری مدل درون‌دستگاهی، و پیکربندی App Check است.

  2. افزونه Kotlin Symbol Processing (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: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")
    }


پرش به برونداد JSON پرش به برونداد enum

خروجی JSON

نمونه‌های زیر نمونه خروجی JSON عمومی را برای تطبیق با استنتاج ترکیبی (برای مثال، PREFER_ON_DEVICE) سازگار می‌کنند.

در سناریو این مثال‌ها، مدل فهرستی از نمایه‌های شخصیت برای یک داستان فانتزی با مشخصه‌های ساختاریافته مانند نام، سن، گونه، و لوازم جانبی اختیاری تولید می‌کند.

می‌توانید طرح‌واره‌های پاسخ خود را بااستفاده از یکی از رویکردهای زیر تعریف کنید:

  • حاشیه‌نویسی‌های نکته کلیدی فروش (@Generable و @Guide)

    • برای همه حالت‌های استنتاج پشتیبانی می‌شود و برای استنتاج درون‌دستگاهی و ترکیبی (به‌طور خاص، ONLY_ON_DEVICE،‏ PREFER_ON_DEVICE، و PREFER_IN_CLOUD) الزامی است.
    • کلاس‌های داده Kotlin را برای تولید خودکار طرح‌واره‌ها در زمان ترجمه تعریف کنید و پاسخ‌ها را مستقیماً بااستفاده از getObject() به اشیای با نوع قوی تبدیل کنید.
  • روش‌های کمکی دستی JsonSchema

    • فقط برای استنتاج ابری (به‌طور خاص، ONLY_IN_CLOUD) پشتیبانی می‌شود.
    • یک JsonSchema را به‌صورت دستی در کد بدون استفاده از پردازنده KSP بسازید، و رشته JSON خام را از response.response.text بخوانید.

مثال ۱: استفاده از حاشیه‌نویسی‌های @Generable و @Guide با KSP

یک data class Kotlin را که با @Serializable و @Generable حاشیه‌نویسی شده است تعریف کنید. از حاشیه‌نویسی‌های @Guide در ویژگی‌ها استفاده کنید تا شرح، محدوده مقدار، یا محدودیت‌های مورد را به مدل ارائه دهید.

این رویکرد برای همه حالت‌های استنتاج پشتیبانی می‌شود و برای تجربه‌های ترکیبی و درون‌دستگاهی (به‌ویژه ONLY_ON_DEVICE، PREFER_ON_DEVICE، و PREFER_IN_CLOUD) الزامی است.

قبل‌از امتحان کردن این نمونه، بخش قبل‌از شروع این راهنما را تکمیل کنید تا پروژه و برنامه‌تان را راه‌اندازی کنید.
در آن بخش، همچنین روی دکمه‌ای برای ارائه‌دهنده انتخابی‌تان Gemini API کلیک خواهید کرد تا محتوای مختص ارائه‌دهنده را در این صفحه ببینید.

برای Kotlin، روش‌های موجود در این کیت توسعه نرم‌افزار توابع تعلیق هستند و باید از دامنه 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"}")
}

مثال ۲: استفاده از روش‌های کمکی JsonSchema دستی

اگر برنامه‌تان فقط از استنتاج مبتنی بر ابر (به‌طور خاص، ONLY_IN_CLOUD) استفاده می‌کند، می‌توانید به‌صورت دستی یک JsonSchema بااستفاده از روش‌های کمکی ارائه‌شده توسط Firebase AI Logic SDK بسازید.

قبل‌از امتحان کردن این نمونه، بخش قبل‌از شروع این راهنما را تکمیل کنید تا پروژه و برنامه‌تان را راه‌اندازی کنید.
در آن بخش، همچنین روی دکمه‌ای برای ارائه‌دهنده انتخابی‌تان Gemini API کلیک خواهید کرد تا محتوای مختص ارائه‌دهنده را در این صفحه ببینید.

برای Kotlin، روش‌های موجود در این کیت توسعه نرم‌افزار توابع تعلیق هستند و باید از محدوده 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)

برونداد شمارشی

مثال‌های زیر مثال خروجی enum عمومی را برای تطبیق با استنتاج ترکیبی (برای مثال، PREFER_ON_DEVICE) سازگار می‌کنند.

در سناریوی این مثال‌ها، مدل شرح فیلم را با انتخاب یک ژانر از فهرست ازپیش‌تعریف‌شده گزینه‌های مجاز (drama، comedy، یا documentary) طبقه‌بندی می‌کند.

می‌توانید طرح‌واره‌های پاسخ خود را بااستفاده از یکی از رویکردهای زیر تعریف کنید:

  • حاشیه‌نویسی‌های KSP‏ (@Generable)

    • برای همه حالت‌های استنتاج پشتیبانی می‌شود و برای استنتاج درون‌دستگاهی و ترکیبی (به‌طور خاص، ONLY_ON_DEVICE،‏ PREFER_ON_DEVICE، و PREFER_IN_CLOUD) الزامی است.
    • یک enum پیچیده‌شده در Kotlin data class تعریف کنید تا به‌طور خودکار طرح‌واره را تولید کند و پاسخ‌ها را مستقیماً بااستفاده از getObject() به اشیاء با نوع قوی تبدیل کند.
  • روش‌های کمکی دستی JsonSchema

    • فقط برای استنتاج ابری (به‌طور خاص، ONLY_IN_CLOUD) پشتیبانی می‌شود.
    • یک enum JsonSchema را به‌صورت دستی بااستفاده از JsonSchema.enumeration() بدون استفاده از پردازنده KSP بسازید و رشته انتخاب‌شده را از response.response.text بخوانید.

مثال ۱: استفاده از حاشیه‌نویسی‌های @Generable با KSP

یک enum class تعریف کنید که مقادیر مجاز را نشان دهد و آن را به‌عنوان یک ویژگی در یک data class Kotlin با حاشیه‌نویسی @Serializable و @Generable قرار دهید.

این رویکرد برای همه حالت‌های استنتاج پشتیبانی می‌شود و برای تجربه‌های درون‌دستگاهی و ترکیبی (به‌ویژه ONLY_ON_DEVICE، PREFER_ON_DEVICE، و PREFER_IN_CLOUD) الزامی است.

قبل‌از امتحان کردن این نمونه، بخش قبل‌از شروع این راهنما را تکمیل کنید تا پروژه و برنامه‌تان را راه‌اندازی کنید.
در آن بخش، همچنین روی دکمه‌ای برای ارائه‌دهنده انتخابی‌تان Gemini API کلیک خواهید کرد تا محتوای مختص ارائه‌دهنده را در این صفحه ببینید.

برای Kotlin، روش‌های موجود در این کیت توسعه نرم‌افزار توابع تعلیق هستند و باید از محدوده 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")

مثال ۲: استفاده از روش‌های کمکی JsonSchema دستی

اگر برنامه‌تان فقط از استنتاج مبتنی بر ابر (به‌طور خاص، ONLY_IN_CLOUD) استفاده می‌کند، می‌توانید به‌صورت دستی یک enum JsonSchema بااستفاده از روش‌های کمکی ارائه‌شده توسط Firebase AI Logic SDK بسازید.

قبل‌از امتحان کردن این نمونه، بخش قبل‌از شروع این راهنما را تکمیل کنید تا پروژه و برنامه‌تان را راه‌اندازی کنید.
در آن بخش، همچنین روی دکمه‌ای برای ارائه‌دهنده انتخابی‌تان Gemini API کلیک خواهید کرد تا محتوای مختص ارائه‌دهنده را در این صفحه ببینید.

برای Kotlin، روش‌های موجود در این کیت توسعه نرم‌افزار توابع تعلیق هستند و باید از محدوده 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)


درباره تجربه‌تان با Firebase AI Logic بازخورد ارائه دهید