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


مدل‌های 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 خود کلیک کنید.

پلتفرم عامل

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

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

  2. افزونه پردازش نماد کاتلین (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() به اشیاء با نوع داده قوی تبدیل کنند.
  • متدهای کمکی دستی JsonSchema

    • فقط برای استنتاج مبتنی بر ابر (به طور خاص، 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 انتخابی خود کلیک کنید تا محتوای خاص ارائه‌دهنده را در این صفحه مشاهده کنید .

برای کاتلین، متدهای موجود در این SDK توابع suspend هستند و باید از یک scope کوروتین فراخوانی شوند.
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 انتخابی خود کلیک کنید تا محتوای خاص ارائه‌دهنده را در این صفحه مشاهده کنید .

برای کاتلین، متدهای موجود در این SDK توابع suspend هستند و باید از یک scope کوروتین فراخوانی شوند.
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() به اشیاء با نوع قوی تبدیل کند.
  • متدهای کمکی دستی JsonSchema

    • فقط برای استنتاج مبتنی بر ابر (به طور خاص، 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 انتخابی خود کلیک کنید تا محتوای خاص ارائه‌دهنده را در این صفحه مشاهده کنید .

برای کاتلین، متدهای موجود در این SDK توابع suspend هستند و باید از یک scope کوروتین فراخوانی شوند.
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 انتخابی خود کلیک کنید تا محتوای خاص ارائه‌دهنده را در این صفحه مشاهده کنید .

برای کاتلین، متدهای موجود در این SDK توابع suspend هستند و باید از یک scope کوروتین فراخوانی شوند.
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 بازخورد دهید