Skip to content

Structured Outputs (Структурированный вывод)

Параметр response_format позволяет гарантировать, что модель вернет ответ строго в формате JSON, соответствующем заданной JSON Schema.

Это исключает необходимость очистки ответа от markdown-обёрток (таких как ```json) и предотвращает синтаксические ошибки при парсинге.


1. Базовый JSON Mode

Простой режим, заставляющий модель выдать валидный JSON-объект.

json
{
  "model": "gpt-4o-mini",
  "messages": [
    { "role": "system", "content": "Ты помощник, который отвечает исключительно в формате JSON." },
    { "role": "user", "content": "Перечисли 3 цвета радуги в виде массива colors." }
  ],
  "response_format": { "type": "json_object" }
}

Важное требование для JSON Mode

При использовании "type": "json_object" в системном или пользовательском промпте обязательно должно присутствовать слово JSON, иначе API вернет ошибку валидации.


2. Строгий вывод по схеме (JSON Schema)

Режим Structured Outputs (json_schema) гарантирует 100% соответствие ответа вашей схеме данных:

json
{
  "model": "gpt-4o",
  "messages": [
    { "role": "user", "content": "Сгенерируй профиль пользователя: Иван, 28 лет, программист." }
  ],
  "response_format": {
    "type": "json_schema",
    "json_schema": {
      "name": "user_profile",
      "strict": true,
      "schema": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "age": { "type": "integer" },
          "occupation": { "type": "string" },
          "skills": {
            "type": "array",
            "items": { "type": "string" }
          }
        },
        "required": ["name", "age", "occupation", "skills"],
        "additionalProperties": false
      }
    }
  }
}

Примеры использования

python
from typing import List
from pydantic import BaseModel
from openai import OpenAI

client = OpenAI(
    api_key="sk-or-ваш-ключ",
    base_url="https://api.rawrter.com/v1",
)

class ArticleSummary(BaseModel):
    title: str
    tags: List[str]
    word_count_estimate: int
    bullet_points: List[str]

completion = client.beta.chat.completions.parse(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "Сделай выжимку статьи."},
        {"role": "user", "content": "Искусственный интеллект активно меняет разработку ПО..."},
    ],
    response_format=ArticleSummary,
)

summary: ArticleSummary = completion.choices[0].message.parsed
print(f"Заголовок: {summary.title}")
print(f"Теги: {', '.join(summary.tags)}")
for point in summary.bullet_points:
    print(f"- {point}")
javascript
import OpenAI from "openai";
import { zodResponseFormat } from "openai/helpers/zod";
import { z } from "zod";

const client = new OpenAI({
  apiKey: "sk-or-ваш-ключ",
  baseURL: "https://api.rawrter.com/v1",
});

const EventInfo = z.object({
  eventName: z.string(),
  date: z.string(),
  participants: z.array(z.string()),
});

async function main() {
  const completion = await client.beta.chat.completions.parse({
    model: "gpt-4o-mini",
    messages: [
      { role: "user", content: "Конференция AI Conf пройдет 25 октября. Участвуют: Анна, Петр." }
    ],
    response_format: zodResponseFormat(EventInfo, "event_info"),
  });

  const event = completion.choices[0].message.parsed;
  console.log("Событие:", event?.eventName);
  console.log("Дата:", event?.date);
  console.log("Участники:", event?.participants);
}

main();