По умолчанию модели Gemini возвращают ответы в виде неструктурированного текста. Однако в некоторых случаях требуется структурированный текст (например, JSON или перечисления). Например, вы можете использовать ответ для других задач, требующих установленной схемы данных.
Чтобы сгенерированный моделью контент всегда соответствовал определенной схеме, вы можете задать схему, которая будет служить чертежом для ответов модели. После этого вы сможете извлекать данные из выходных данных модели с меньшим объемом постобработки.
Вот несколько примеров, как это можно сделать:
Убедитесь, что ответ модели представляет собой действительный JSON и соответствует предоставленной вами схеме.
Например, модель может создавать структурированные записи рецептов, которые всегда включают название, список ингредиентов и этапы приготовления. Это упростит анализ и отображение информации в интерфейсе приложения.Ограничить ответы модели при выполнении задач классификации.
Например, вы можете настроить модель так, чтобы она добавляла к тексту определенный набор ярлыков (например, определенный набор перечислений, таких какpositiveиnegative), а не ярлыки, которые создает модель (они могут быть разными, напримерgood,positive,negativeилиbad).
На этой странице рассказывается, как создавать структурированные выходные данные (например, в формате JSON и перечислений) в гибридных интерфейсах для приложений Android.
Перейти к выводу в формате JSON Перейти к выводу в формате перечисления
Настройки для структурированных выходных данных
Создание структурированного вывода (например, в формате JSON или перечислений) поддерживается как для локального, так и для облачного вывода.
Чтобы сгенерировать структурированный вывод, передайте схему непосредственно в функцию
generateObject().
Требования к схеме зависят от настроенного режима вывода:
Для гибридного и локального вывода (
ONLY_ON_DEVICE,PREFER_ON_DEVICEиPREFER_IN_CLOUD):- Требуется использовать аннотацию
@Generableв Kotlindata classс процессором KSP. Схемы, созданные вручную, и прямые аннотацииenum classне поддерживаются. - Когда вывод выполняется на устройстве, SDK автоматически преобразует схему в ограничения для модели на устройстве (с помощью ML Kit 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.0.0") implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta06") 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 Перейти к выводу в формате перечисления
Вывод в формате 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
Определите функцию 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 с помощью вспомогательных методов, предоставляемых Firebase AI Logic SDK.
|
Прежде чем использовать этот пример, выполните инструкции из раздела Подготовка к работе, чтобы настроить проект и приложение. В этом разделе также есть кнопка для выбранного вами поставщика 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).
Вы можете задать схемы ответов одним из следующих способов:
-
- Поддерживается всеми режимами вывода и обязательно для вывода на устройстве и гибридного вывода (в частности,
ONLY_ON_DEVICE,PREFER_ON_DEVICEиPREFER_IN_CLOUD). - Определите перечисление, заключенное в аннотацию Kotlin
data class, чтобы автоматически создать схему и десериализовать ответы непосредственно в объекты со строгой типизацией с помощью аннотацииgetObject().
- Поддерживается всеми режимами вывода и обязательно для вывода на устройстве и гибридного вывода (в частности,
Вспомогательные методы для
JsonSchema- Поддерживается только для облачного вывода (в частности,
ONLY_IN_CLOUD). - Создайте перечисление
JsonSchemaвручную, используяJsonSchema.enumeration()без процессора KSP, и прочитайте выбранную строку изresponse.response.text.
- Поддерживается только для облачного вывода (в частности,
Пример 1. Использование аннотаций @Generable с KSP
Определите enum class, представляющий допустимые значения, и оберните его как свойство внутри класса Kotlin data class с аннотациями @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