Skip to content

Structured Outputs

Структурированные выводы преобразуют ответы модели из свободного текста в строго форматированный JSON. RouteAPI поддерживает два режима структурированного вывода: JSON mode (требует валидный JSON) и JSON Schema (гарантирует соответствие конкретной схеме).

1. Обзор структурированных выводов

Section titled “1. Обзор структурированных выводов”

Что такое структурированные выводы

Section titled “Что такое структурированные выводы”

Структурированные выводы — это механизм контроля формата ответа модели. В отличие от обычных диалогов, где модели свободно генерируют текст, структурированные выводы заставляют модель генерировать данные JSON в соответствии с определенным вами форматом. Это критически важно для сценариев, требующих программной обработки выходных данных модели (извлечение данных, генерация форм, парсинг ответов API).

RouteAPI предоставляет два режима структурированного вывода:

СравнениеJSON modeJSON Schema
ГарантияВывод является валидным JSONВывод соответствует указанной схеме
Параметрresponse_format: { type: "json_object" }response_format: { type: "json_schema", json_schema: {...} }
Определение схемыНе требуется, но формат должен быть описан в промптеТребуется полная JSON Schema
СтрогостьТолько гарантирует парсируемость, не структуруГарантирует точное соответствие полей, типов и обязательных элементов
Сценарии использованияПростые форматы, модель понимает структуру из промптаСложные вложенные структуры, необходима строгая валидация типов

Простое объяснение: JSON mode только гарантирует «может быть успешно распарсен JSON.parse», но не заботится о полях; JSON Schema гарантирует не только валидность, но и что структура, имена полей, типы и обязательные элементы соответствуют вашему определению.

Сценарии использования

Section titled “Сценарии использования”
СценарийОписаниеРекомендуемый режим
Извлечение данныхИзвлечение структурированной информации из неструктурированного текста (имя, адрес, дата)JSON Schema
Генерация формМодель генерирует начальные значения формы или объекты конфигурацииJSON Schema
Парсинг ответов APIВывод модели должен интегрироваться с API нижележащих системJSON Schema
Простые пары ключ-значениеНужно лишь несколько полей, структура проста и яснаJSON mode
Задачи классификацииВывод фиксированных enum значений (например, sentiment: positive/negative/neutral)JSON Schema + enum

JSON mode — это самый простой метод структурированного вывода: вы устанавливаете response_format.type в "json_object" в запросе, и модель будет выводить валидный JSON вместо простого текста.

{
"model": "gpt-5.5",
"messages": [
{
"role": "system",
"content": "You are a data extraction assistant. Extract name, age, and city fields from user input and return in JSON format."
},
{
"role": "user",
"content": "My name is Li Ming, I'm 28 years old, and I live in Shanghai."
}
],
"response_format": { "type": "json_object" }
}
  1. Необходимо описать формат JSON в промпте: Модель не знает, какие поля вам нужны; вы должны явно указать через системное сообщение или сообщение пользователя, какие поля выводить и их типы. В приведенном выше примере "Extract name, age, and city fields from user input and return in JSON format" — это описание формата.

  2. Не гарантирует соответствие схеме: Модель может вывести {"name": "Li Ming", "age": 28, "city": "Shanghai"}, или {"姓名": "Li Ming", "年龄": 28}, или даже {"person": {"name": "Li Ming"}}. Пока это валидный JSON, это приемлемо.

  3. Как использовать: Подходит для сценариев с простыми форматами, небольшим количеством полей и где модель может понять структуру из естественного языка. Если необходима строгая валидация имен полей или типов, используйте JSON Schema.

Запрос (curl):

Terminal window
curl https://api.routeapi.ai/v1/chat/completions \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.5",
"messages": [
{
"role": "system",
"content": "You are a data extraction assistant. Extract name, age, and city fields from user input and return in JSON format."
},
{
"role": "user",
"content": "My name is Li Ming, I am 28 years old, and I live in Shanghai."
}
],
"response_format": { "type": "json_object" }
}'

Ответ:

{
"id": "chatcmpl_xxx",
"object": "chat.completion",
"created": 1730000000,
"model": "gpt-5.5",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "{\"name\": \"Li Ming\", \"age\": 28, \"city\": \"Shanghai\"}"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 58,
"completion_tokens": 18,
"total_tokens": 76
}
}

Обратите внимание, что message.content — это JSON строка, вам нужно самостоятельно выполнить JSON.parse / json.loads.

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

{
"model": "gpt-5.5",
"messages": [
{
"role": "user",
"content": "My name is Li Ming, I'm 28 years old, and I live in Shanghai."
}
],
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "person_extraction",
"strict": true,
"schema": {
"type": "object",
"properties": {
"name": { "type": "string", "description": "Name" },
"age": { "type": "integer", "description": "Age" },
"city": { "type": "string", "description": "City" }
},
"required": ["name", "age", "city"],
"additionalProperties": false
}
}
}
}
ПолеТипОбязательноОписание
typestringДаФиксировано как "json_schema"
json_schema.namestringДаИмя схемы для идентификации, буквы, цифры, подчеркивания, дефисы
json_schema.strictbooleanНетВключить ли строгий режим, по умолчанию false
json_schema.schemaobjectДаСтандартное определение JSON Schema

Строгий режим vs Нестрогий режим

Section titled “Строгий режим vs Нестрогий режим”
РежимstrictПоведение
Строгий режимtrueМодель должна генерировать точно в соответствии со схемой, имена полей, типы, обязательные элементы, additionalProperties строго соблюдаются
Нестрогий режимfalseМодель пытается соответствовать схеме, но не гарантирует полную согласованность, может пропустить поля или добавить дополнительные

Рекомендация: Используйте strict: true в продакшене; это основная ценность режима JSON Schema. Поведение нестрогого режима аналогично JSON mode + описание в промпте, смысл ограничен.

Спецификация определения схемы

Section titled “Спецификация определения схемы”

Поле schema следует стандартной спецификации JSON Schema (Draft 2020-12), общие поля:

ПолеОписание
typeТип данных: "object", "array", "string", "number", "integer", "boolean", "null"
propertiesОпределения полей для объектов (используется когда type = "object")
requiredМассив имен обязательных полей
additionalPropertiesРазрешать ли неопределенные дополнительные поля (рекомендуется false в строгом режиме)
itemsСхема элементов массива (используется когда type = "array")
enumСписок enum значений, ограничивает диапазон значений
descriptionОписание поля, помогает модели понять семантику

4. Руководство по определению схемы

Section titled “4. Руководство по определению схемы”
{
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "integer" },
"score": { "type": "number" },
"is_active": { "type": "boolean" },
"notes": { "type": ["string", "null"] }
}
}

Описания типов:

  • "string": Строка
  • "integer": Целое число
  • "number": Число (включая целые и десятичные)
  • "boolean": Булево значение
  • "null": Null значение
  • ["string", "null"]: Разрешает строку или null (необязательное поле)
{
"type": "object",
"properties": {
"user": {
"type": "object",
"properties": {
"name": { "type": "string" },
"email": { "type": "string" }
},
"required": ["name"]
},
"tags": {
"type": "array",
"items": { "type": "string" }
},
"scores": {
"type": "array",
"items": { "type": "number" }
}
}
}
{
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "integer" },
"city": { "type": "string" }
},
"required": ["name", "age"]
}

Массив required перечисляет поля, которые должны существовать. В приведенном выше примере name и age обязательны, city необязателен.

{
"type": "object",
"properties": {
"sentiment": {
"type": "string",
"enum": ["positive", "negative", "neutral"],
"description": "Sentiment classification result"
},
"priority": {
"type": "integer",
"enum": [1, 2, 3],
"description": "Priority: 1-low, 2-medium, 3-high"
}
},
"required": ["sentiment"]
}

enum ограничивает поле только значениями из списка; модель не будет генерировать другие значения.

{
"type": "object",
"properties": {
"user": {
"type": "object",
"properties": {
"name": { "type": "string" },
"address": {
"type": "object",
"properties": {
"city": { "type": "string" },
"street": { "type": "string" }
},
"required": ["city"]
}
},
"required": ["name", "address"]
}
},
"required": ["user"]
}

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

{
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "Date, format YYYY-MM-DD"
},
"amount": {
"type": "number",
"description": "Amount in CNY"
}
}
}

description не обязательно, но настоятельно рекомендуется. Это помогает модели понять семантику поля, диапазон значений и соглашения о формате, значительно улучшая точность генерации.

Извлечение информации о пользователе

Section titled “Извлечение информации о пользователе”

Извлечение информации о пользователе из неструктурированного текста:

{
"name": "user_info_extraction",
"strict": true,
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "User name"
},
"age": {
"type": "integer",
"description": "Age"
},
"email": {
"type": ["string", "null"],
"description": "Email address, null if not in text"
},
"phone": {
"type": ["string", "null"],
"description": "Phone number, null if not in text"
},
"city": {
"type": "string",
"description": "City"
}
},
"required": ["name", "age", "city"],
"additionalProperties": false
}
}

Генерация списка продуктов

Section titled “Генерация списка продуктов”

Модель генерирует массив продуктов:

{
"name": "product_list",
"strict": true,
"schema": {
"type": "object",
"properties": {
"products": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Product name"
},
"price": {
"type": "number",
"description": "Price in CNY"
},
"category": {
"type": "string",
"enum": ["electronics", "clothing", "food", "other"],
"description": "Product category"
},
"in_stock": {
"type": "boolean",
"description": "Whether in stock"
}
},
"required": ["name", "price", "category", "in_stock"],
"additionalProperties": false
}
},
"total_count": {
"type": "integer",
"description": "Total product count"
}
},
"required": ["products", "total_count"],
"additionalProperties": false
}
}

Сложный вложенный объект

Section titled “Сложный вложенный объект”

Извлечение информации о заказе с многоуровневой вложенностью:

{
"name": "order_extraction",
"strict": true,
"schema": {
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "Order ID"
},
"customer": {
"type": "object",
"properties": {
"name": { "type": "string" },
"phone": { "type": "string" },
"address": {
"type": "object",
"properties": {
"province": { "type": "string" },
"city": { "type": "string" },
"street": { "type": "string" }
},
"required": ["province", "city", "street"],
"additionalProperties": false
}
},
"required": ["name", "phone", "address"],
"additionalProperties": false
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"product_name": { "type": "string" },
"quantity": { "type": "integer" },
"unit_price": { "type": "number" }
},
"required": ["product_name", "quantity", "unit_price"],
"additionalProperties": false
}
},
"total_amount": {
"type": "number",
"description": "Order total amount"
}
},
"required": ["order_id", "customer", "items", "total_amount"],
"additionalProperties": false
}
}

Модели, поддерживающие JSON mode

Section titled “Модели, поддерживающие JSON mode”

Большинство основных моделей, агрегированных RouteAPI, поддерживают JSON mode (response_format: { type: "json_object" }), включая:

  • Серия OpenAI GPT (gpt-4o, gpt-4-turbo, gpt-3.5-turbo, и т.д.)
  • Серия Claude (claude-3.5-sonnet, claude-3-opus, claude-3-haiku, и т.д.)
  • Серия Gemini (gemini-2.0-flash, gemini-1.5-pro, и т.д.)
  • Другие модели, поддерживающие формат OpenAI

Модели, поддерживающие JSON Schema

Section titled “Модели, поддерживающие JSON Schema”

JSON Schema (response_format: { type: "json_schema" }) требует более высоких возможностей модели; в настоящее время поддерживаемые модели:

  • OpenAI: серия gpt-4o, серия gpt-4-turbo (версия 2024-08-06 и позже)
  • Claude: серия claude-3.5-sonnet, серия claude-3-opus
  • Gemini: gemini-2.0-flash-exp, серия gemini-1.5-pro
  • Другие: некоторые модели нового поколения

Как подтвердить: Запросите возможности модели через Models API перед вызовом, проверьте поле supports_response_format.

Сравнение возможностей моделей

Section titled “Сравнение возможностей моделей”
ВозможностьJSON modeJSON SchemaПримечания
Диапазон поддержки моделейШирокий (почти все основные модели)Ограниченный (модели нового поколения)JSON mode имеет более высокую поддержку
Сложность схемыN/AРекомендуется не более 3 уровней вложенностиЧрезмерная глубина влияет на качество генерации
Максимальное количество полейN/AРекомендуется не более 50 полей верхнего уровняСлишком много полей влияет на производительность
Строгая гарантияТолько гарантирует валидный JSONГарантирует соответствие схеме100% соответствие в строгом режиме
ПроизводительностьБыстраяОтносительно медленнееВалидация схемы имеет дополнительные издержки
Потребление токеновНизкоеНемного вышеОпределение схемы занимает токены промпта

Ограничения и примечания

Section titled “Ограничения и примечания”
  1. Ограничение размера схемы: Рекомендуется, чтобы одно определение схемы не превышало 10KB; слишком большие схемы могут быть обрезаны или отклонены.

  2. Ограничение глубины вложенности: Рекомендуется, чтобы уровни вложенности не превышали 3-4 слоя; чрезмерная вложенность снижает качество генерации модели и скорость.

  3. Влияние на производительность: Время ответа режима JSON Schema обычно на 10%-30% медленнее, чем обычные запросы, потому что модель должна валидировать структуру в реальном времени во время генерации.

  4. Неподдерживаемые возможности схемы: Некоторые расширенные возможности JSON Schema (такие как $ref, allOf, anyOf, oneOf, regex) могут не поддерживаться всеми моделями.

  5. Потоковый вывод: Режим JSON Schema поддерживает потоковый вывод (stream: true), но content возвращается фрагментами; полный JSON необходимо конкатенировать перед парсингом.

7. Полные примеры приложений

Section titled “7. Полные примеры приложений”

Пример 1: Извлечение структурированной информации из неструктурированного текста

Section titled “Пример 1: Извлечение структурированной информации из неструктурированного текста”

Сценарий: Извлечение информации о клиенте и классификации проблемы из диалога службы поддержки.

curl:

Terminal window
curl https://api.routeapi.ai/v1/chat/completions \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [
{
"role": "user",
"content": "Customer Li Ming (phone 13800138000) reported that order ORD-2024-001 in Chaoyang District, Beijing has not been shipped and is quite urgent."
}
],
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "customer_inquiry",
"strict": true,
"schema": {
"type": "object",
"properties": {
"customer_name": { "type": "string", "description": "Customer name" },
"phone": { "type": ["string", "null"], "description": "Customer phone" },
"location": { "type": ["string", "null"], "description": "Customer location" },
"order_id": { "type": ["string", "null"], "description": "Order ID" },
"issue_category": {
"type": "string",
"enum": ["delivery", "quality", "refund", "other"],
"description": "Issue category: delivery-logistics, quality-quality, refund-refund, other-other"
},
"urgency": {
"type": "string",
"enum": ["low", "medium", "high"],
"description": "Urgency level"
}
},
"required": ["customer_name", "issue_category", "urgency"],
"additionalProperties": false
}
}
}
}'

Ответ:

{
"choices": [
{
"message": {
"role": "assistant",
"content": "{\"customer_name\":\"Li Ming\",\"phone\":\"13800138000\",\"location\":\"Chaoyang District, Beijing\",\"order_id\":\"ORD-2024-001\",\"issue_category\":\"delivery\",\"urgency\":\"high\"}"
},
"finish_reason": "stop"
}
]
}

Python:

import os
import json
from openai import OpenAI
client = OpenAI(
api_key=os.environ["ROUTEAPI_KEY"],
base_url="https://api.routeapi.ai/v1",
)
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": "Customer Li Ming (phone 13800138000) reported that order ORD-2024-001 in Chaoyang District, Beijing has not been shipped and is quite urgent.",
}
],
response_format={
"type": "json_schema",
"json_schema": {
"name": "customer_inquiry",
"strict": True,
"schema": {
"type": "object",
"properties": {
"customer_name": {"type": "string", "description": "Customer name"},
"phone": {"type": ["string", "null"], "description": "Customer phone"},
"location": {"type": ["string", "null"], "description": "Customer location"},
"order_id": {"type": ["string", "null"], "description": "Order ID"},
"issue_category": {
"type": "string",
"enum": ["delivery", "quality", "refund", "other"],
"description": "Issue category",
},
"urgency": {
"type": "string",
"enum": ["low", "medium", "high"],
"description": "Urgency level",
},
},
"required": ["customer_name", "issue_category", "urgency"],
"additionalProperties": False,
},
},
},
)
data = json.loads(response.choices[0].message.content)
print(f"Customer: {data['customer_name']}")
print(f"Issue type: {data['issue_category']}")
print(f"Urgency: {data['urgency']}")

Node.js:

import OpenAI from 'openai';
const client = new OpenAI({
apiKey: process.env.ROUTEAPI_KEY,
baseURL: 'https://api.routeapi.ai/v1',
});
const response = await client.chat.completions.create({
model: 'gpt-4o',
messages: [
{
role: 'user',
content: 'Customer Li Ming (phone 13800138000) reported that order ORD-2024-001 in Chaoyang District, Beijing has not been shipped and is quite urgent.',
},
],
response_format: {
type: 'json_schema',
json_schema: {
name: 'customer_inquiry',
strict: true,
schema: {
type: 'object',
properties: {
customer_name: { type: 'string', description: 'Customer name' },
phone: { type: ['string', 'null'], description: 'Customer phone' },
location: { type: ['string', 'null'], description: 'Customer location' },
order_id: { type: ['string', 'null'], description: 'Order ID' },
issue_category: {
type: 'string',
enum: ['delivery', 'quality', 'refund', 'other'],
description: 'Issue category',
},
urgency: {
type: 'string',
enum: ['low', 'medium', 'high'],
description: 'Urgency level',
},
},
required: ['customer_name', 'issue_category', 'urgency'],
additionalProperties: false,
},
},
},
});
const data = JSON.parse(response.choices[0].message.content);
console.log(`Customer: ${data.customer_name}`);
console.log(`Issue type: ${data.issue_category}`);
console.log(`Urgency: ${data.urgency}`);

Пример 2: Генерация данных формы

Section titled “Пример 2: Генерация данных формы”

Сценарий: Модель генерирует начальные значения формы на основе описания на естественном языке.

Python:

response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": "You are a form filling assistant. Generate form data based on user description.",
},
{
"role": "user",
"content": "Create a new employee onboarding form: Zhang Wei, male, born in 1995, bachelor's degree, software engineer position, monthly salary 15000.",
},
],
response_format={
"type": "json_schema",
"json_schema": {
"name": "employee_form",
"strict": True,
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"gender": {"type": "string", "enum": ["male", "female"]},
"birth_year": {"type": "integer"},
"education": {
"type": "string",
"enum": ["high_school", "bachelor", "master", "phd"],
},
"position": {"type": "string"},
"salary": {"type": "number", "description": "Monthly salary in CNY"},
},
"required": ["name", "gender", "birth_year", "education", "position", "salary"],
"additionalProperties": False,
},
},
},
)
form_data = json.loads(response.choices[0].message.content)
print(json.dumps(form_data, ensure_ascii=False, indent=2))

Вывод:

{
"name": "Zhang Wei",
"gender": "male",
"birth_year": 1995,
"education": "bachelor",
"position": "Software Engineer",
"salary": 15000
}

Пример 3: Парсинг ответа API

Section titled “Пример 3: Парсинг ответа API”

Сценарий: Модель извлекает ключевую информацию из неструктурированного ответа стороннего API.

Node.js:

const apiResponse = `
Order status: Shipped
Logistics company: SF Express
Tracking number: SF1234567890
Estimated delivery: January 20, 2024
Current location: Beijing Distribution Center
`;
const response = await client.chat.completions.create({
model: 'gpt-4o',
messages: [
{
role: 'user',
content: `Extract structured data from the following logistics information:\n${apiResponse}`,
},
],
response_format: {
type: 'json_schema',
json_schema: {
name: 'logistics_info',
strict: true,
schema: {
type: 'object',
properties: {
status: {
type: 'string',
enum: ['pending', 'shipped', 'in_transit', 'delivered'],
},
carrier: { type: 'string', description: 'Logistics company' },
tracking_number: { type: 'string', description: 'Tracking number' },
estimated_delivery: {
type: ['string', 'null'],
description: 'Estimated delivery date, format YYYY-MM-DD',
},
current_location: { type: ['string', 'null'], description: 'Current location' },
},
required: ['status', 'carrier', 'tracking_number'],
additionalProperties: false,
},
},
},
});
const data = JSON.parse(response.choices[0].message.content);
console.log(data);
// Output: { status: 'shipped', carrier: 'SF Express', tracking_number: 'SF1234567890', estimated_delivery: '2024-01-20', current_location: 'Beijing Distribution Center' }

Ошибка валидации схемы

Section titled “Ошибка валидации схемы”

Если ваше определение схемы имеет проблемы (синтаксические ошибки, неподдерживаемые возможности), запрос напрямую вернет ошибку 400:

{
"error": {
"message": "Invalid JSON schema: ...",
"type": "invalid_request_error",
"param": "response_format.json_schema.schema",
"code": "invalid_json_schema"
}
}

Решение:

  • Проверьте, соответствует ли синтаксис схемы спецификации JSON Schema
  • Удалите неподдерживаемые расширенные возможности (такие как $ref, allOf)
  • Упростите чрезмерно вложенные структуры

Модель не может сгенерировать вывод, соответствующий схеме

Section titled “Модель не может сгенерировать вывод, соответствующий схеме”

В редких случаях модель может быть не в состоянии сгенерировать контент, соответствующий схеме (например, ввод пользователя полностью конфликтует с требованиями схемы); в этом случае будет возвращена ошибка или произойдет откат к выводу простого текста. Пример ошибки:

{
"error": {
"message": "Failed to generate valid output matching the provided schema after maximum retries.",
"type": "model_error",
"code": "schema_generation_failed"
}
}

Решение:

  • Проверьте, согласован ли промпт с требованиями схемы
  • Упростите схему, удалите слишком строгие ограничения
  • Явно укажите требования к выводу в промпте
  • Для необязательных полей используйте тип ["string", "null"] вместо просто "string"

Стратегия повторных попыток

Section titled “Стратегия повторных попыток”

Для эпизодических сбоев генерации вы можете реализовать автоматические повторные попытки:

import time
def call_with_retry(client, **kwargs):
max_retries = 3
for attempt in range(max_retries):
try:
response = client.chat.completions.create(**kwargs)
content = response.choices[0].message.content
data = json.loads(content) # Verify it can be parsed
return data
except (json.JSONDecodeError, Exception) as e:
if attempt == max_retries - 1:
raise
time.sleep(2 ** attempt) # Exponential backoff

Принципы проектирования схемы

Section titled “Принципы проектирования схемы”
  1. Начинайте просто: Сначала проверьте осуществимость с JSON mode, затем обновите до JSON Schema после подтверждения необходимости строгой валидации.

  2. Определите обязательные и необязательные: Поместите обязательные поля в массив required, используйте ["type", "null"] для необязательных полей или просто не помещайте их в required.

  3. Используйте enum для ограничения перечислений: Для полей с ограниченными значениями (статус, классификация, приоритет) явно перечислите их с enum; это может значительно снизить частоту ошибок.

  4. Добавьте description: Добавьте description к каждому полю, объясняя значение, формат, диапазон значений; модель генерирует более точно на основе этого.

  5. Установите additionalProperties: false: В строгом режиме добавление этого предотвращает вывод модели неопределенных дополнительных полей.

Избегайте слишком сложных схем

Section titled “Избегайте слишком сложных схем”
ПроблемаОписаниеРекомендация
Слишком глубокая вложенностьБолее 4 уровней вложенности снижает качество генерацииРазделите на несколько плоских объектов или извлекайте поэтапно с многоходовыми диалогами
Слишком много полейОдин объект превышает 50 полейГруппируйте по бизнес-логике, разделите на несколько подобъектов
Чрезмерные ограниченияВсе поля обязательны, нет гибкостиПомечайте как обязательные только ключевые поля, разрешайте null для других полей
Нет описанияМодель не понимает семантику поляДобавьте description к каждому полю, объясните ясно

Оптимизация производительности

Section titled “Оптимизация производительности”
  1. Уменьшите размер схемы: Определение схемы занимает токены промпта; чрезмерно большие схемы увеличивают задержку и стоимость.

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

  3. Выберите подходящую модель: Не все задачи нуждаются в самой сильной модели; простое структурированное извлечение может использовать gpt-3.5-turbo + JSON mode.

  4. Пакетная обработка: Если есть несколько похожих задач, спроектируйте схему массива, чтобы модель обрабатывала несколько элементов данных одновременно.

Соображения о стоимости

Section titled “Соображения о стоимости”
ФакторВлияниеРекомендация по оптимизации
Размер схемыОпределение схемы занимает токены промптаУпростите описание, удалите избыточные поля
Выбор моделиJSON Schema обычно требует более сильных моделейИспользуйте JSON mode + более слабую модель для простых задач
Длина ответаВывод JSON обычно длиннее текста (имена ключей, кавычки, скобки)Сократите имена полей, используйте enum вместо длинных строк
Количество повторных попытокПовторные попытки при сбое генерации удваивают выставление счетовОптимизируйте схему и промпт для снижения частоты сбоев

Практический совет: Для сценариев с высокочастотными вызовами сначала протестируйте с JSON mode; после подтверждения, что модель может стабильно выводить правильный формат, обновите до JSON Schema. JSON mode обычно имеет на 10%-20% более низкое потребление токенов и стоимость, чем JSON Schema.

Примечания по совместимости

Section titled “Примечания по совместимости”
  • Поддержка JSON mode и JSON Schema зависит от выбранной модели; пожалуйста, запросите поле supports_response_format через Models API для подтверждения.
  • response_format взаимоисключающий с tools (вызов инструментов): один и тот же запрос не может использовать одновременно структурированные выводы и вызов инструментов.
  • В потоковом выводе (stream: true) content возвращается фрагментами и должен быть полностью конкатенирован перед JSON.parse.
  • Явно переданные 0 или false необязательные параметры рассматриваются как явно установленные пользователем и не будут рассматриваться как пропуски по умолчанию.
  • Регистрируйте request ID, model ID, код статуса и использование токенов каждого запроса для устранения неполадок. Подробности структуры ошибок см. в Errors and Debugging.