Модели Gemini по умолчанию возвращают ответы в виде неструктурированного текста. Однако в некоторых случаях требуется структурированный текст (например, JSON или перечисления). Например, вы можете использовать ответ для других задач, требующих установленной схемы данных.
Чтобы гарантировать, что выходные данные модели всегда соответствуют определенной схеме, можно определить схему , которая работает как шаблон для ответов модели. Затем можно напрямую извлекать данные из выходных данных модели с минимальной постобработкой.
Вот несколько примеров использования:
Убедитесь, что ответ модели генерирует корректный JSON и соответствует предоставленной вами схеме.
Например, модель может генерировать структурированные записи для рецептов, которые всегда включают название рецепта, список ингредиентов и этапы приготовления. Затем вы можете проще анализировать и отображать эту информацию в пользовательском интерфейсе вашего приложения.Ограничить возможности модели при выполнении задач классификации.
Например, модель может аннотировать текст определенным набором меток (например, определенным набором перечислений, таких какpositiveиnegative), а не метками, которые модель генерирует сама (которые могут иметь определенную степень вариативности, например,good,positive,negativeилиbad»).
На этой странице описано, как генерировать структурированный вывод (например, в формате JSON и перечисления) в гибридных приложениях для Android.
Перейти к выводу JSON Перейти к выводу перечисления
Настройка структурированного вывода
Поддерживается генерация структурированных выходных данных (например, в формате JSON и перечислений) как для вывода данных на устройстве, так и для вывода данных в облаке.
Для генерации структурированного вывода передайте вашу схему непосредственно в функцию generateObject() . Требования к схеме зависят от настроенного вами режима вывода:
Для вывода данных на устройстве и в гибридном режиме (
ONLY_ON_DEVICE,PREFER_ON_DEVICEиPREFER_IN_CLOUD) :- Для работы требуется использовать аннотацию
@Generableвdata classKotlin с процессором KSP; схемы, созданные вручную, и прямые аннотацииenum classне поддерживаются. - Когда вывод данных выполняется на устройстве, SDK автоматически преобразует схему в ограничения для модели на устройстве (используя API ML Kit Prompt).
- Если гибридный запрос переходит к использованию облачного механизма определения типа данных, SDK автоматически устанавливает
responseMimeTypeвapplication/jsonи передает схему в облачную модель Gemini .
- Для работы требуется использовать аннотацию
Для вывода данных только в облаке (
ONLY_IN_CLOUD) :- Поддерживает как аннотации
@Generable(рекомендуется), так и схемы, созданные вручную (с помощью вспомогательных методовJsonSchema). - SDK автоматически устанавливает
responseMimeTypeвapplication/jsonи передает схему в облачную модель Gemini .
- Поддерживает как аннотации
Прежде чем начать
Чтобы просмотреть контент и код, относящиеся к вашему поставщику API Gemini , нажмите на него. |
Перед созданием структурированного вывода убедитесь, что вы выполнили следующие настройки:
Пройдите руководство по началу работы с гибридными приложениями , которое охватывает настройку проекта 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 Перейти к выводу перечисления
вывод в формате JSON
В следующих примерах общий пример вывода в формате JSON адаптирован для учета гибридного вывода (например, PREFER_ON_DEVICE ).
В приведенных примерах модель генерирует список профилей персонажей для фэнтезийной истории со структурированными атрибутами, такими как имя, возраст, вид и дополнительные аксессуары.
Вы можете определить схемы ответов, используя один из следующих подходов:
Аннотации KSP (
@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
Определите data class Kotlin, аннотированный @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"}")
}
Пример 2: Использование вспомогательных методов JsonSchema применяемых вручную.
Если ваше приложение использует только облачный вывод (в частности, ONLY_IN_CLOUD ), то вы можете вручную создать 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 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 ).
Вы можете определить схемы ответов, используя один из следующих подходов:
- Поддерживается для всех режимов вывода и требуется для вывода на устройстве и гибридного вывода (в частности,
ONLY_ON_DEVICE,PREFER_ON_DEVICEиPREFER_IN_CLOUD). - Определите перечисление, обернутое в
data classKotlin, для автоматической генерации схемы и десериализации ответов непосредственно в строго типизированные объекты с помощью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 ).
| Прежде чем опробовать этот пример, выполните раздел «Перед началом работы » этого руководства, чтобы настроить свой проект и приложение. В этом разделе вам также нужно будет нажать кнопку для выбранного вами поставщика 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")
Пример 2: Использование вспомогательных методов JsonSchema применяемых вручную.
Если ваше приложение использует только облачный вывод (в частности, ONLY_IN_CLOUD ), то вы можете вручную создать перечисление 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.