Как создавать структурированные выходные данные для гибридных функций в веб-приложениях

По умолчанию модели Gemini возвращают ответы в виде неструктурированного текста. Однако в некоторых случаях требуется структурированный текст (например, JSON или перечисления). Например, вы можете использовать ответ для других последующих задач, требующих установленной схемы данных.

Чтобы выходные данные модели всегда соответствовали определенной схеме, вы можете задать схему, которая будет работать как шаблон для ответов модели. Затем вы можете напрямую извлечь данные из выходных данных модели с меньшей постобработкой.

Вот несколько примеров, как это можно сделать:

  • Убедитесь, что ответ модели генерирует действительный JSON и соответствует предоставленной вами схеме.
    Например, модель может генерировать структурированные записи для рецептов, которые всегда включают название рецепта, список ингредиентов и шаги. После этого вы сможете легко анализировать и отображать эту информацию в интерфейсе приложения.

  • Ограничьте варианты ответов модели при выполнении задач классификации.
    Например, вы можете попросить модель аннотировать текст с помощью определенного набора ярлыков (например, определенного набора перечислений, таких как positive и negative), а не ярлыков, которые создает модель (которые могут иметь некоторую степень вариативности, например good, positive, negative или bad).

На этой странице описывается, как генерировать структурированные выходные данные (например, JSON и перечисления) в гибридных средах для веб-приложений.

Перейти к выводу в формате JSON Перейти к выводу в формате enum

Конфигурация структурированных выходных данных

Генерирование структурированных выходных данных (например, JSON и перечислений) поддерживается для инференса с использованием как облачных, так и локальных моделей.

  • Гибридные режимы инференса. Настройте и inCloudParams, и onDeviceParams, чтобы модель возвращала структурированные выходные данные независимо от того, где выполняется инференс – в облаке или на устройстве.

    • Для моделей на устройстве. Укажите responseConstraint в onDeviceParams, используя схему, созданную с помощью вспомогательных методов Schema, или простую схему JSON.

    • Для моделей в облаке. Укажите responseMimeType (application/json для JSON или text/x.enum для перечислений) и responseSchema в inCloudParams.

  • Негибридные режимы инференса. Используйте только подходящую конфигурацию, описанную выше.

Подготовка

Нажмите на название своего поставщика Gemini API, чтобы посмотреть контент и код, относящиеся к нему.

Убедитесь, что вы выполнили все действия, описанные в руководстве по началу работы с гибридными приложениями.


Перейти к выводу в формате JSON Перейти к выводу в формате enum

Вывод в формате JSON

В примерах ниже общий пример вывода в формате JSON адаптирован для гибридного инференса (например, PREFER_ON_DEVICE).

В сценарии для этих примеров модель генерирует список профилей персонажей для фэнтезийной истории со структурированными атрибутами, такими как имя, возраст, вид и дополнительные аксессуары.

Определить схемы ответов можно двумя способами:

  • Вспомогательные методы Firebase Schema (рекомендуется). Используйте вспомогательные методы (например, Schema.object() и Schema.enumString()), чтобы создавать краткие и компактные схемы прямо в коде без лишних шаблонов.

  • Простая схема JSON. Используйте стандартный объект схемы JSON, если у вас уже есть определения схем, вы используете схемы на разных платформах или в разных бэкенд-службах или импортируете схемы из файлов JSON.

Пример 1. Использование вспомогательных методов Firebase Schema

В этом примере для определения схемы объекта используются вспомогательные методы Schema (такие как Schema.object, Schema.array, Schema.string и Schema.number), предоставляемые SDK Firebase AI Logic.

Прежде чем использовать этот пример, выполните инструкции из раздела Подготовка этого руководства, чтобы настроить проект и приложение.
В этом разделе также нужно нажать кнопку для выбранного поставщика Gemini API, чтобы на этой странице показывался контент, относящийся к нему.

import { initializeApp } from "firebase/app";
import {
  getAI,
  getGenerativeModel,
  GoogleAIBackend,
  InferenceMode,
  Schema
} from "firebase/ai";

// TODO(developer): Replace the following with your app's Firebase configuration.
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
  // ...
};

// Initialize FirebaseApp.
const firebaseApp = initializeApp(firebaseConfig);

// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

// Define a schema using the `Schema` helper methods.
// Optional properties are specified in optionalProperties.
const jsonSchema = Schema.object({
  properties: {
    characters: Schema.array({
      items: Schema.object({
        properties: {
          name: Schema.string(),
          age: Schema.number(),
          species: Schema.string(),
          accessory: Schema.string()
        },
        optionalProperties: ["accessory"]
      })
    })
  }
});

// Create a GenerativeModel instance configured to use a hybrid inference mode (like PREFER_ON_DEVICE).
const model = getGenerativeModel(ai, {
  mode: InferenceMode.INFERENCE_MODE,
  // For cloud-hosted models, specify MIME type and response schema.
  inCloudParams: {
    model: "CLOUD_MODEL_NAME",
    generationConfig: {
      responseMimeType: "application/json",
      responseSchema: jsonSchema
    }
  },
  // For on-device models, pass the schema as the response constraint.
  onDeviceParams: {
    promptOptions: {
      responseConstraint: jsonSchema
    }
  }
});

const prompt = "Create profiles for some characters for a fantasy story.";

// Generate the structured output.
const result = await model.generateContent(prompt);

// Access the generated JSON string conforming to the schema from response.text().
console.log(result.response.text());

// Parse the JSON string into a JavaScript object.
console.log(JSON.parse(result.response.text()));

Пример 2. Использование простой схемы JSON

В этом примере схема определяется только с помощью JSON.

Прежде чем использовать этот пример, выполните инструкции из раздела Подготовка этого руководства, чтобы настроить проект и приложение.
В этом разделе также нужно нажать кнопку для выбранного поставщика Gemini API, чтобы на этой странице показывался контент, относящийся к нему.

import { initializeApp } from "firebase/app";
import {
  getAI,
  getGenerativeModel,
  GoogleAIBackend,
  InferenceMode
} from "firebase/ai";

// TODO(developer): Replace the following with your app's Firebase configuration.
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
  // ...
};

// Initialize FirebaseApp.
const firebaseApp = initializeApp(firebaseConfig);

// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

// Define the schema as a plain JSON object.
// Properties are required by default unless omitted from the required array.
const jsonSchema = {
  type: "object",
  properties: {
    characters: {
      type: "array",
      items: {
        type: "object",
        properties: {
          name: {
            type: "string",
            nullable: false
          },
          age: {
            type: "number",
            nullable: false
          },
          species: {
            type: "string",
            nullable: false
          },
          accessory: {
            type: "string",
            nullable: true
          }
        },
        nullable: false,
        required: [
          "name",
          "age",
          "species"
        ]
      },
      nullable: false
    }
  },
  nullable: false,
  required: [
    "characters"
  ]
};

// Create a GenerativeModel instance configured to use a hybrid inference mode (like PREFER_ON_DEVICE).
const model = getGenerativeModel(ai, {
  mode: InferenceMode.INFERENCE_MODE,
  // For cloud-hosted models, specify MIME type and response schema.
  inCloudParams: {
    model: "CLOUD_MODEL_NAME",
    generationConfig: {
      responseMimeType: "application/json",
      responseSchema: jsonSchema
    }
  },
  // For on-device models, pass the schema as the response constraint.
  onDeviceParams: {
    promptOptions: {
      responseConstraint: jsonSchema
    }
  }
});

const prompt = "Create profiles for some characters for a fantasy story.";

// Generate the structured output.
const result = await model.generateContent(prompt);

// Access the generated JSON string conforming to the schema from response.text().
console.log(result.response.text());

// Parse the JSON string into a JavaScript object.
console.log(JSON.parse(result.response.text()));

Выходные данные перечисления

В примерах ниже общий пример вывода перечисления адаптирован для гибридного инференса (например, PREFER_ON_DEVICE).

В этом сценарии модель классифицирует описание фильма, выбирая один жанр из предопределенного списка разрешенных вариантов (drama, comedy или documentary).

Определить схемы ответов можно двумя способами:

  • Вспомогательные методы Firebase Schema (рекомендуется). Используйте вспомогательные методы (например, Schema.object() и Schema.enumString()), чтобы создавать краткие и компактные схемы прямо в коде без лишних шаблонов.

  • Простая схема JSON. Используйте стандартный объект схемы JSON, если у вас уже есть определения схем, вы используете схемы на разных платформах или в разных бэкенд-службах или импортируете схемы из файлов JSON.

Пример 1. Использование вспомогательных методов Firebase Schema

В этом примере используется вспомогательный метод Schema.enumString, предоставляемый Firebase AI Logic SDK, чтобы определить допустимые значения перечисления.

Прежде чем использовать этот пример, выполните инструкции из раздела Подготовка этого руководства, чтобы настроить проект и приложение.
В этом разделе также нужно нажать кнопку для выбранного поставщика Gemini API, чтобы на этой странице показывался контент, относящийся к нему.

import { initializeApp } from "firebase/app";
import {
  getAI,
  getGenerativeModel,
  GoogleAIBackend,
  InferenceMode,
  Schema
} from "firebase/ai";

// TODO(developer): Replace the following with your app's Firebase configuration.
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
  // ...
};

// Initialize FirebaseApp.
const firebaseApp = initializeApp(firebaseConfig);

// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

// Define an enum schema using the `Schema` helper method with allowed string values.
const enumSchema = Schema.enumString({
  enum: ["drama", "comedy", "documentary"]
});

// Create a GenerativeModel instance configured to use a hybrid inference mode (like PREFER_ON_DEVICE).
const model = getGenerativeModel(ai, {
  mode: InferenceMode.INFERENCE_MODE,
  // For cloud-hosted models, specify MIME type and response schema.
  inCloudParams: {
    model: "CLOUD_MODEL_NAME",
    generationConfig: {
      responseMimeType: "text/x.enum",
      responseSchema: enumSchema
    }
  },
  // For on-device models, pass the enum schema as the response constraint.
  onDeviceParams: {
    promptOptions: {
      responseConstraint: enumSchema
    }
  }
});

const 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 enum output.
const result = await model.generateContent(prompt);

// Access the selected enum value string from response.text().
console.log(result.response.text());

Пример 2. Использование простой схемы JSON

В этом примере схема перечисления определяется только с помощью JSON.

Прежде чем использовать этот пример, выполните инструкции из раздела Подготовка этого руководства, чтобы настроить проект и приложение.
В этом разделе также нужно нажать кнопку для выбранного поставщика Gemini API, чтобы на этой странице показывался контент, относящийся к нему.

import { initializeApp } from "firebase/app";
import {
  getAI,
  getGenerativeModel,
  GoogleAIBackend,
  InferenceMode
} from "firebase/ai";

// TODO(developer): Replace the following with your app's Firebase configuration.
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
  // ...
};

// Initialize FirebaseApp.
const firebaseApp = initializeApp(firebaseConfig);

// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

// Define the enum schema as a plain JSON object.
const enumSchema = {
  type: "string",
  enum: ["drama", "comedy", "documentary"]
};

// Create a GenerativeModel instance configured to use a hybrid inference mode (like PREFER_ON_DEVICE).
const model = getGenerativeModel(ai, {
  mode: InferenceMode.INFERENCE_MODE,
  // For cloud-hosted models, specify MIME type and response schema.
  inCloudParams: {
    model: "CLOUD_MODEL_NAME",
    generationConfig: {
      responseMimeType: "text/x.enum",
      responseSchema: enumSchema
    }
  },
  // For on-device models, pass the enum schema as the response constraint.
  onDeviceParams: {
    promptOptions: {
      responseConstraint: enumSchema
    }
  }
});

const 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 enum output.
const result = await model.generateContent(prompt);

// Access the selected enum value string from response.text().
console.log(result.response.text());


Оставить отзыв о работе с Firebase AI Logic