تُعرَض ردود نماذج 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في Kotlindata classمع معالج KSP، ولا يمكن استخدام المخططات اليدوية والتعليقات التوضيحية المباشرةenum class. - عند تشغيل الاستنتاج على الجهاز، تترجم حزمة تطوير البرامج (SDK) المخطط تلقائيًا إلى قيود لنموذج الجهاز (باستخدام واجهة برمجة التطبيقات Prompt API في حزمة تعلّم الآلة).
- إذا تم الرجوع إلى الاستنتاج المستنِد إلى السحابة الإلكترونية في طلب مختلط، تضبط حزمة 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: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.
- تتوفّر هذه الميزة فقط للاستنتاج المستنِد إلى السحابة الإلكترونية (على وجه التحديد،
المثال 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
باستخدام الطرق المساعدة التي توفّرها حزمة تطوير البرامج (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 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"