3,583 papers
arXiv:2511.18335 73 23 нояб. 2025 г. FREE

Structured JSON Generation: получение точных структурированных ответов через схемы

КЛЮЧЕВАЯ СУТЬ
Парадокс: LLM генерирует идеально валидный JSON (ошибки парсинга < 0.5%), но это не гарантирует правильность содержания. Модель может безупречно заполнить схему {"sentiment": "positive", "entities": [...]} — и при этом ошибиться в половине извлечённых сущностей. Техника позволяет получать от LLM структурированные ответы с гарантией формата — для парсинга, интеграций, автоматической обработки. Фишка: JSON-схема в промпте работает как контракт — модель знает какие поля обязательны, какие типы данных, какая вложенность. Без схемы модель придумает свою структуру. Со схемой — строго по спецификации.
Адаптировать под запрос

TL;DR

Structured JSON Generation — техника явного указания JSON-схемы в промпте для получения структурированных ответов от LLM. Исследование OMNISTRUCT показало: современные модели умеют генерировать валидный JSON и следовать схемам почти безупречно (ошибки парсинга < 0.5%), но это не гарантирует качество контента. Модель может идеально соблюсти формат, но дать неправильный ответ.

Ключевой инсайт: соблюдение формата ≠ правильность ответа. LLM натренированы на JSON-данных и хорошо понимают структуру, но без явной схемы в промпте могут генерировать данные в неподходящем формате. GPT-4o показывает лучшие результаты на сложных задачах (планирование, рассуждения), малые модели хороши на простых (извлечение сущностей, связей).

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

🔬

Схема метода

Системный промпт:
→ Описание роли ("helpful assistant")
→ JSON-схема с обязательными полями
→ Правило: "только JSON, без лишнего текста"

Пользовательский промпт:
→ Описание задачи
→ Входные данные

Результат:
→ Валидный JSON, следующий схеме

Всё происходит в одном запросе.

🚀

Пример применения

Задача: Ты анализируешь отзывы о новом российском сервисе доставки. Нужно извлечь из отзыва: что хвалят, что ругают, общую оценку (позитив/негатив/нейтрал), и упомянутые конкурентов.

Промпт:

Системный промпт:
Ты — аналитик отзывов. Отвечай строго в JSON формате по схеме:

{
  "praise": ["список положительных аспектов"],
  "criticism": ["список негативных аспектов"],
  "sentiment": "positive/negative/neutral",
  "competitors_mentioned": ["список упомянутых конкурентов"]
}

Не добавляй ничего кроме JSON в ответ.

---

Пользовательский промпт:
Проанализируй отзыв:

"Попробовал новый Самокат Про — доставили за 15 минут, это быстрее чем Яндекс Лавка обычно везёт. 
Но приложение тормозит жутко, хуже чем у СберМаркета. Цены норм, ассортимент широкий."

Результат:

Модель вернёт структурированный JSON с четырьмя полями. В praise окажутся "быстрая доставка", "хорошие цены", "широкий ассортимент". В criticism — "тормозящее приложение". sentiment будет "positive" (больше хвалят). В competitors_mentioned появятся "Яндекс Лавка" и "СберМаркет". Формат гарантированно валидный, все обязательные поля заполнены.

🧠

Почему это работает

LLM обучались на огромных массивах JSON-данных — конфигах, API-ответах, структурированных логах. Модель знает синтаксис JSON на уровне паттернов. Когда видит схему с полями {"name": "string", "age": "number"}, она понимает: нужно заполнить эти поля правильными типами данных.

Но понимание структуры ≠ понимание задачи. Модель может идеально оформить ответ, но ошибиться в содержании. Например, правильно извлечь имена людей в поле "entities", но пропустить половину или перепутать типы. Схема задаёт формат контейнера, не гарантирует качество того, что в него попадёт.

Явная схема в промпте работает как контракт: "вот какие данные я жду, вот в какой структуре". Это убирает двусмысленность. Без схемы модель может вернуть список, словарь, текст — как ей удобнее. Со схемой — строго по спецификации.

Рычаги управления:

  • Обязательные vs опциональные поля — пометь в схеме "required": ["field1", "field2"], чтобы модель не пропускала ключевые данные
  • Ограничения значений — укажи "enum": ["positive", "negative", "neutral"] для фиксированного набора вариантов
  • Типы данных"type": "number" вместо "type": "string" заставит модель вернуть число
  • Вложенность — простые плоские структуры работают надёжнее, глубокая вложенность может сбить модель
  • Правило "только JSON" — без этого модель может добавить объяснения до или после JSON, сломав парсинг
📋

Шаблон промпта

Системный промпт:
Ты — {роль}. Отвечай строго в JSON формате по схеме:

{
  "поле_1": "{тип и описание}",
  "поле_2": ["{если это список}"],
  "поле_3": {
    "вложенное_поле": "{для сложных структур}"
  }
}

Не добавляй ничего кроме JSON в ответ.

---

Пользовательский промпт:
{описание задачи}

{входные данные}

Как заполнять: - {роль} — кто модель: аналитик, помощник, эксперт - {поле_N} — конкретные поля для твоей задачи с понятными названиями - {тип и описание} — что должно быть в поле: "строка с именем", "число от 1 до 10", "список тегов" - {описание задачи} — что нужно сделать одним предложением - {входные данные} — текст/информация для обработки

Пример простой схемы для извлечения фактов:

{
  "facts": ["список извлечённых фактов"],
  "confidence": "high/medium/low"
}

Пример сложной схемы для анализа встречи:

{
  "participants": [{"name": "имя", "role": "должность"}],
  "decisions": ["список решений"],
  "next_steps": [{"task": "задача", "owner": "ответственный", "deadline": "срок"}]
}
⚠️

Ограничения

⚠️ Формат ≠ Качество: Модель может вернуть идеально структурированный JSON с неправильным содержанием. Схема гарантирует форму ответа, но не его правильность.

⚠️ Сложность задачи: На простых задачах (извлечение имён, дат, фактов) техника работает отлично. На сложных задачах требующих рассуждений (планирование, многошаговый анализ) структурированный формат может снижать качество — модель тратит "внимание" на соблюдение формата вместо глубокого анализа.

⚠️ Переусложнение схемы: Схемы с 20+ полями или глубокой вложенностью (объект в объекте в объекте) сбивают модель. Чем проще структура — тем надёжнее результат.

⚠️ Без схемы — хаос: Если просто написать "верни в JSON", модель придумает свою структуру. Схема обязательна для повторяемости результатов.

🔍

Как исследовали

Команда собрала бенчмарк OMNISTRUCT из 16 датасетов, покрывающих разные задачи: извлечение сущностей (NER), связей (RE), генерация таблиц, вызов функций, задачи с рассуждениями. Для каждой задачи создали JSON-схему и преобразовали правильные ответы в JSON-формат. Получился спектр от экстрактивных задач (найти информацию в тексте и переупаковать) до абстрактивных (порассуждать и структурировать результат).

Протестировали GPT-4o, Llama 3.1, Qwen 2.5, Phi-4 — от 7B до 32B параметров. Измеряли два аспекта: parsing errors (сколько раз JSON невалидный или не следует схеме) и content quality (правильность ответа по сути). Сравнили обычный промптинг с constrained decoding (Structured Outputs API от OpenAI), который гарантирует валидность через ограничение генерации на уровне токенов.

Результат удивил: parsing errors оказались редкостью (< 0.5% у всех моделей). Современные LLM настолько хорошо знают JSON, что почти не ошибаются в формате. GPT-4o вообще выдал 0% ошибок парсинга — constrained decoding ему не нужен. Но разрыв в качестве контента огромен: GPT-4o обгоняет малые модели на 10-20 пунктов на сложных задачах (планирование встреч, сложная генерация таблиц). На простых задачах (NER, RE) даже Llama 3.1-8B показывает приличные 60-70% F1.

Почему так? Логика такая: соблюдение формата — это поверхностный навык, выученный на примерах JSON в тренировочных данных. Правильность содержания — это глубокое понимание задачи. Малые модели научились первому, но им не хватает мощности для второго на сложных задачах.

Затем команда попробовала дистиллировать GPT-4o: синтезировали 20К примеров структурированных задач, дообучили Llama 3.1-8B. Результат: на NER/RE модель догнала GPT-4o (+7-15 пунктов к базе), на функциях подтянулась (+5 пунктов), но на рассуждениях и планировании всё равно отстаёт. Инсайт: малую модель можно научить хорошо структурировать экстрактивные задачи, но для абстрактивных нужна фундаментальная мощность большой модели.

💡

Адаптации и экстраполяции

📌

🔧 Техника: Добавить поле "reasoning" → увидеть логику модели

Базовая схема возвращает только результат. Добавь поле для объяснений:

{
  "reasoning": "пошаговое объяснение как пришёл к ответу",
  "result": {
    "основные поля ответа"
  }
}

Модель заполнит reasoning своими рассуждениями, потом result. Это помогает проверить логику и отловить ошибки в выводах.

📌

🔧 Техника: Итеративное уточнение структуры

Если не уверен какая схема нужна — начни с простой, попроси модель предложить улучшения:

Вот моя задача: {задача}
Вот моя схема: {схема}

Проанализируй: какие поля я упустил? Какие лишние? 
Предложи улучшенную схему в том же JSON формате.

Модель вернёт доработанную схему — используй её в следующем запросе.

📌

🔧 Комбинация: Structured Output + Верификация

Сначала получи структурированный ответ, затем попроси модель проверить себя:

Запрос 1: [схема выше] → получаешь JSON Запрос 2:

Вот задача: {задача}
Вот ответ в JSON: {ответ из запроса 1}

Проверь: все ли поля заполнены правильно? 
Где могут быть ошибки? Верни улучшенную версию в том же формате.

Двойная проверка снижает ошибки контента, сохраняя структуру.

🔗

Ресурсы

OmniStruct: Universal Text-to-Structure Generation across Diverse Schemas

Авторы: James Y. Huang, Wenxuan Zhou, Nan Xu, Fei Wang, Qin Liu, Sheng Zhang, Hoifung Poon, Muhao Chen

University of Southern California, University of California Davis, Microsoft Research


📋 Дайджест исследования

Ключевая суть

Парадокс: LLM генерирует идеально валидный JSON (ошибки парсинга < 0.5%), но это не гарантирует правильность содержания. Модель может безупречно заполнить схему {"sentiment": "positive", "entities": [...]} — и при этом ошибиться в половине извлечённых сущностей. Техника позволяет получать от LLM структурированные ответы с гарантией формата — для парсинга, интеграций, автоматической обработки. Фишка: JSON-схема в промпте работает как контракт — модель знает какие поля обязательны, какие типы данных, какая вложенность. Без схемы модель придумает свою структуру. Со схемой — строго по спецификации.

Принцип работы

Не пиши "верни результат в JSON" и не надейся что модель сама угадает нужную структуру. Добавь в системный промпт явную JSON-схему с описанием полей. Укажи что обязательно, что опционально, какие типы данных. Пропиши правило: "только JSON в ответе, без объяснений до или после". Модель будет следовать схеме как инструкции. Простые плоские структуры (3-5 полей) работают надёжнее чем глубокая вложенность. Схема с 20+ полями сбивает модель — она теряется в требованиях.

Почему работает

LLM обучались на гигантских массивах JSON-данных — конфигах API, структурированных логах, базах данных. Модель знает синтаксис JSON на уровне паттернов, как ты знаешь что после { идёт "ключ": значение. Это впиталось на этапе обучения. Но понимание структуры ≠ понимание задачи. Модель видит схему {"name": "string", "age": "number"} и понимает: нужен текст и число. Но какой текст и какое число — это уже задача рассуждения. Отсюда парадокс: формат идеален, содержание может быть неправильным. Явная схема убирает двусмысленность. Без неё модель может вернуть список, словарь, текст с объяснениями — как ей удобнее. Схема = спецификация того что ты ждёшь на выходе.

Когда применять

Извлечение структурированных данных из текста → конкретно для парсинга отзывов, резюме, документов. Когда нужна гарантия формата для последующей автоматической обработки. Интеграции с API и базами данных → модель возвращает JSON который сразу уходит в базу или другой сервис. Схема гарантирует что парсинг не сломается. Анализ с фиксированной структурой ответа → например извлечение тональности + ключевых фактов + упоминаний конкурентов из одного отзыва. НЕ подходит для задач требующих глубоких рассуждений — планирование, многошаговый анализ, сложная логика. На таких задачах структурированный формат может снижать качество: модель тратит "внимание" на соблюдение схемы вместо размышлений.

Мини-рецепт

1. Добавь схему в системный промпт: Опиши JSON-структуру с конкретными полями, типами данных, обязательными элементами. Пример: {"facts": ["список фактов"], "confidence": "high/medium/low"}

2. Пропиши правило "только JSON": Добавь в конец системного промпта: "Не добавляй ничего кроме JSON в ответ". Без этого модель может написать объяснение до или после JSON — парсинг сломается.

3. Опиши задачу в пользовательском промпте: Что нужно сделать + входные данные. Модель заполнит схему на основе этих данных.

4. Для сложных задач упрости схему: Если схема с 10+ полями или глубокой вложенностью — раздели на несколько простых запросов. Простые структуры работают надёжнее.

Примеры

[ПЛОХО] : Проанализируй отзыв и верни результат в JSON: тональность, плюсы, минусы Модель придумает свою структуру — поля могут называться по-разному в каждом ответе. Парсинг сломается.
[ХОРОШО] : Системный промпт: Ты — аналитик отзывов. Отвечай строго в JSON: {"sentiment": "positive/negative/neutral", "praise": ["список плюсов"], "criticism": ["список минусов"]}. Только JSON, без лишнего текста. Пользовательский промпт: Проанализируй отзыв: "Самокат Про доставили за 15 минут — быстрее Яндекс Лавки. Но приложение тормозит жутко. Цены норм." Модель вернёт JSON с тремя полями, все обязательные заполнены, формат валидный для парсинга.
Источник: OmniStruct: Universal Text-to-Structure Generation across Diverse Schemas
ArXiv ID: 2511.18335 | Сгенерировано: 2026-01-12 18:54

Тезисы

ТезисКомментарий
Жёсткая структура ответа может снижать качество рассужденийКогда задаёшь строгую JSON-схему, модель тратит часть "внимания" на соблюдение формата. На простых задачах (извлечь имена, даты, факты) это не мешает — структура даже помогает. На сложных задачах требующих многошаговых рассуждений (планирование, анализ, выводы) жёсткий формат забирает ресурсы у самого рассуждения. Модель думает "как правильно заполнить поля" вместо "как решить задачу глубже". Применяй: Для извлечения данных используй строгую схему. Для задач требующих глубокого анализа сначала попроси подумать свободно, потом структурируй результат отдельным запросом. Или упрости схему до минимума
📖 Простыми словами

Суть тут в том, что маленькие нейронки типа Llama 8B обычно тупят, когда их просят выдать не просто текст, а четкий JSON. Они либо ломают синтаксис, либо пишут в поля всякую чушь. Исследователи доказали: чтобы сделать из «малыша» монстра структурированных данных уровня GPT-4o, не нужно собирать реальные датасеты годами. Нужно просто заставить ту же GPT-4o нагенерировать гору синтетического мусора — около 20 000 задач с хитрыми схемами — и скормить их маленькой модели. Это называется дистилляция знаний: мы переливаем мозги из дорогого гиганта в дешевую локальную модель.

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

В работе использовали метод синтеза задач: брали две рандомные инструкции и скрещивали их, чтобы получить третью, еще более извращенную. Главное правило — никакой воды. Из схем выкидывали всё лишнее: айдишники, таймстампы и поля типа «объясни свой ответ». Оставили только мясо: минимум 2 смысловых поля и четкие описания. В итоге получили OmniStruct-8B, которая в задачах извлечения сущностей (NER) и отношений (RE) просто разносит оригинал, на котором училась.

Хотя гоняли всё это на извлечении данных, принцип универсален. Если тебе нужно, чтобы модель стабильно работала в продакшене — будь то генерация таблиц, вызов функций или планирование встреч — забудь про попытки вылизать промпт. SEO в мире промптов не поможет, если модель слабая. Нужно брать и дообучать её на синтетике. Этот подход превращает «болталку» в жестко детерминированный инструмент, который не галлюцинирует, а просто заполняет ячейки.

Короче: если ты надеялся найти здесь «волшебный промпт», то облом. Это история про файнтюнинг и GPU. Метод работает идеально, но порог входа — полный провал для обычного пользователя. Тебе нужно уметь обучать модели и иметь доступ к железу. Но сам вывод монументальный: синтетические данные рулят. Хочешь крутую структуру от дешевой модели — дистиллируй знания из топовых нейронок, и будет тебе счастье в виде валидного JSON-а без переплат за API.

Сгенерировано: 21.12.2025 17:02 | ArXiv Data Collector

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с