تعرض نماذج Gemini الردود كنص غير منظَّم تلقائيًا. ومع ذلك، تتطلّب بعض حالات الاستخدام نصًا منظَّمًا (مثل JSON أو التعدادات). على سبيل المثال، قد تستخدم الرد في مهام أخرى لاحقة تتطلّب مخطط بيانات محدّدًا.
لضمان التزام الناتج الذي ينشئه النموذج دائمًا بمخطط معيّن، يمكنك تحديد مخطط يعمل كنموذج أولي لردود النموذج. يمكنك بعد ذلك استخراج البيانات مباشرةً من ناتج النموذج مع الحاجة إلى إجراء معالجة لاحقة أقل.
في ما يلي بعض الأمثلة على حالات الاستخدام:
تأكَّد من أنّ ردّ النموذج ينتج ملف JSON صالحًا ويتوافق مع المخطط الذي قدّمته.
على سبيل المثال، يمكن للنموذج إنشاء إدخالات منظَّمة للوصفات تتضمّن دائمًا اسم الوصفة وقائمة المكوّنات والخطوات. يمكنك بعد ذلك تحليل هذه المعلومات وعرضها بسهولة أكبر في واجهة مستخدم تطبيقك.فرض قيود على طريقة ردّ النموذج أثناء مهام التصنيف:
على سبيل المثال، يمكنك أن يضيف النموذج تعليقات توضيحية إلى النص باستخدام مجموعة معيّنة من التصنيفات (مثل مجموعة معيّنة من القيم الثابتة، مثلpositiveوnegative)، بدلاً من التصنيفات التي ينتجها النموذج (والتي يمكن أن تتضمّن درجة من التباين، مثلgoodأوpositiveأوnegativeأوbad).
توضّح هذه الصفحة كيفية إنشاء نواتج منظَّمة (مثل JSON والقيم التعدادية) في تجاربك المختلطة لتطبيقات Android.
الانتقال إلى الردّ بتنسيق JSON الانتقال إلى الردّ بتنسيق enum
إعدادات الناتج المنظَّم
يتوفّر إنشاء مخرجات منظَّمة (مثل JSON والقيم الثابتة) لكل من الاستدلال على الجهاز والاستدلال المستضاف على السحابة الإلكترونية.
لإنشاء ناتج منظَّم، مرِّر المخطط مباشرةً إلى
generateObject().
تعتمد متطلبات المخطط على وضع الاستدلال الذي تم ضبطه:
بالنسبة إلى الاستدلال على الجهاز فقط والاستدلال المختلط (
ONLY_ON_DEVICEوPREFER_ON_DEVICEوPREFER_IN_CLOUD):- يتطلّب استخدام التعليق التوضيحي
@Generableعلىdata classفي Kotlin مع معالج KSP، ولا تتوفّر إمكانية استخدام المخططات اليدوية والتعليقات التوضيحية المباشرةenum class. - عند تنفيذ الاستنتاج على الجهاز، تترجم حزمة تطوير البرامج (SDK) المخطط تلقائيًا إلى قيود للنموذج على الجهاز (باستخدام واجهة برمجة التطبيقات ML Kit Prompt).
- إذا تم الرجوع إلى الاستدلال على السحابة الإلكترونية في طلب مختلط، تضبط حزمة SDK تلقائيًا قيمة
responseMimeTypeعلىapplication/jsonوتمرّر المخطط إلى نموذج Gemini المستضاف على السحابة الإلكترونية.
- يتطلّب استخدام التعليق التوضيحي
للاستدلال على السحابة الإلكترونية فقط (
ONLY_IN_CLOUD):- يتوافق مع تعليقات
@Generableالتوضيحية (ننصح بها) والمخططات اليدوية (التي تم إنشاؤها باستخدام طرق مساعدةJsonSchema). - تضبط حزمة تطوير البرامج (SDK) تلقائيًا قيمة
responseMimeTypeعلىapplication/json، وتمرِّر المخطط إلى نموذج Gemini المستضاف على السحابة الإلكترونية.
- يتوافق مع تعليقات
قبل البدء
|
انقر على مقدّم خدمة Gemini API لعرض المحتوى والرمز الخاصين بمقدّم الخدمة على هذه الصفحة. |
قبل إنشاء ناتج منظَّم، تأكَّد من إكمال عملية الإعداد التالية:
أكمِل دليل البدء في إنشاء تجارب مختلطة الذي يغطّي إعداد مشروع Firebase وتنزيل النموذج على الجهاز فقط وإعداد App Check.
اضبط المكوّن الإضافي 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: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 الانتقال إلى الردّ بتنسيق 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.
- تتوفّر فقط للاستدلال المستند إلى السحابة الإلكترونية (
المثال 1: استخدام التعليقَين التوضيحيَين @Generable و@Guide مع KSP
حدِّد دالة Kotlin data class مع إضافة التعليق التوضيحي @Serializable و@Generable إليها.
استخدِم تعليقات توضيحية @Guide على السمات لتزويد النموذج بأوصاف أو حدود قيم أو قيود عناصر.
هذا الأسلوب متاح لجميع أوضاع الاستدلال، وهو إلزامي للتجارب على الجهاز فقط والتجارب المختلطة (ONLY_ON_DEVICE وPREFER_ON_DEVICE وPREFER_IN_CLOUD على وجه التحديد).
|
قبل تجربة هذا النموذج، أكمل القسم
قبل البدء من هذا الدليل
لإعداد مشروعك وتطبيقك. في هذا القسم، ستنقر أيضًا على زر لمقدّم الخدمة الذي اخترته Gemini API حتى يظهر لك المحتوى الخاص بمقدّم الخدمة في هذه الصفحة. |
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"}")
}
المثال 2: استخدام طرق مساعدة JsonSchema يدوية
إذا كان تطبيقك يستخدم الاستدلال المستند إلى السحابة الإلكترونية فقط (ONLY_IN_CLOUD على وجه التحديد)، يمكنك إنشاء JsonSchema يدويًا باستخدام طرق مساعدة توفّرها حزمة تطوير البرامج (SDK) الخاصة بـ Firebase AI Logic.
|
قبل تجربة هذا النموذج، أكمل القسم
قبل البدء من هذا الدليل
لإعداد مشروعك وتطبيقك. في هذا القسم، ستنقر أيضًا على زر لمقدّم خدمة Gemini API الذي اخترته حتى يظهر لك محتوى خاص بمقدّم الخدمة في هذه الصفحة. |
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)
ناتج التعداد
تعدّل الأمثلة التالية مثال إخراج التعداد العام لاستيعاب الاستدلال المختلط (على سبيل المثال، PREFER_ON_DEVICE).
في سيناريو هذه الأمثلة، يصنّف النموذج وصف فيلم من خلال اختيار نوع واحد من قائمة محددة مسبقًا بالخيارات المسموح بها (drama أو comedy أو documentary).
يمكنك تحديد مخططات الاستجابة باستخدام إحدى الطريقتَين التاليتَين:
تعليقات KSP التوضيحية (
@Generable)- هذا الحقل مطلوب لجميع أوضاع الاستدلال، كما أنّه إلزامي للاستدلال على الجهاز فقط والاستدلال المختلط (تحديدًا،
ONLY_ON_DEVICEوPREFER_ON_DEVICEوPREFER_IN_CLOUD). - حدِّد تعدادًا متسلسلاً مضمّنًا في
data classمن Kotlin لإنشاء المخطط تلقائيًا وإلغاء تسلسل الردود مباشرةً إلى عناصر مكتوبة بدقة باستخدامgetObject().
- هذا الحقل مطلوب لجميع أوضاع الاستدلال، كما أنّه إلزامي للاستدلال على الجهاز فقط والاستدلال المختلط (تحديدًا،
طُرق المساعد
JsonSchemaاليدوية- تتوفّر فقط للاستدلال المستند إلى السحابة الإلكترونية (
ONLY_IN_CLOUDتحديدًا). - أنشئ تعدادًا
JsonSchemaيدويًا باستخدامJsonSchema.enumeration()بدون استخدام معالج KSP، واقرأ السلسلة المحدّدة منresponse.response.text.
- تتوفّر فقط للاستدلال المستند إلى السحابة الإلكترونية (
المثال 1: استخدام تعليقات توضيحية @Generable مع KSP
حدِّد enum class يمثّل القيم المسموح بها، ثم ضعها كسمة داخل فئة data class في Kotlin مع إضافة التعليق التوضيحي @Serializable و@Generable.
هذا الأسلوب متاح لجميع أوضاع الاستدلال، وهو إلزامي للتجارب على الجهاز فقط والتجارب المختلطة (ONLY_ON_DEVICE وPREFER_ON_DEVICE وPREFER_IN_CLOUD على وجه التحديد).
|
قبل تجربة هذا النموذج، أكمل القسم
قبل البدء من هذا الدليل
لإعداد مشروعك وتطبيقك. في هذا القسم، ستنقر أيضًا على زر لمقدّم خدمة Gemini API الذي اخترته حتى يظهر لك محتوى خاص بمقدّم الخدمة في هذه الصفحة. |
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")
المثال 2: استخدام طرق مساعدة JsonSchema يدوية
إذا كان تطبيقك يستخدم الاستدلال المستند إلى السحابة الإلكترونية فقط (ONLY_IN_CLOUD على وجه التحديد)، يمكنك إنشاء تعداد يدويًا
JsonSchema
باستخدام طرق المساعدة التي توفّرها حزمة تطوير البرامج Firebase AI Logic.
|
قبل تجربة هذا النموذج، أكمل القسم
قبل البدء من هذا الدليل
لإعداد مشروعك وتطبيقك. في هذا القسم، ستنقر أيضًا على زر لمقدّم الخدمة الذي اخترته Gemini API حتى يظهر لك المحتوى الخاص بمقدّم الخدمة في هذه الصفحة. |
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