3,583 papers
arXiv:2602.14743 79 16 фев. 2026 г. FREE

Стратегия промптинга важнее размера модели: как извлекать JSON из текста

КЛЮЧЕВАЯ СУТЬ
LLM ломают JSON при извлечении данных из текста. Попросишь вытащить информацию — получишь либо невалидный синтаксис (сломанные скобки, лишний текст), либо валидный JSON с неправильными значениями (пропущенные поля, искажённая информация). Маленькие модели особенно нестабильны: то работают, то падают на одинаковых задачах. Две стратегии решают проблему: P (схема + пример в промпте) и PJ+ (то же + передача схемы через API). Обе работают в обычном чате. Выбор зависит от приоритета: нужна точность данных (используй P) или гарантия валидной структуры (используй PJ+). На хороших моделях обе работают отлично, на слабых — придётся выбирать компромисс.
Адаптировать под запрос

TL;DR

Исследование показало, что правильная стратегия промптинга при извлечении структурированных данных из текста важнее параметров модели. Две стратегии показали лучшие результаты: P (явная инструкция со схемой и примером в промпте) и PJ+ (то же + передача схемы через API). Обе работают в обычном чате — достаточно дать модели JSON-схему и пример объекта.

LLM плохо справляются с извлечением структурированных данных "в лоб". Попросишь вытащить информацию в JSON — модель либо вернёт невалидный JSON (синтаксическая ошибка, лишний текст, сломанная структура), либо валидный но с неправильными данными (пропущенные поля, искажённые значения). Маленькие модели особенно нестабильны: то работают, то ломаются на одинаковых задачах.

P-стратегия даёт меньше семантических ошибок, но иногда ломается структурно (особенно на слабых моделях). PJ+-стратегия почти всегда возвращает валидный JSON, но чаще содержит неправильные значения. Выбор зависит от приоритета: нужна ли гарантия структуры (используй PJ+) или точность данных (используй P). На хороших моделях обе работают отлично, на слабых — приходится выбирать трейдофф.


📌

Две стратегии извлечения

P-стратегия (Prompt-only):

Инструкция в промпте: "Верни JSON по этой схеме"
+ JSON-схема с типами полей
+ Пример заполненного объекта
→ Модель видит явную структуру и образец

PJ+-стратегия (Prompt + JSON Schema):

То же что P
+ API-параметр format с JSON-схемой (где доступно)
→ Модель принудительно следует схеме

Обе стратегии работают в одном запросе к модели.


🚀

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

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

Задача: Вытащить данные о заказе из сообщения клиента в техподдержку Озона.

Промпт (P-стратегия):

Извлеки информацию из сообщения клиента и верни в формате JSON по 
этой схеме:

{
  "order_id": "строка",
  "item_name": "строка", 
  "quantity": число,
  "issue_type": "строка",
  "contact_phone": "строка"
}

Пример:
{
  "order_id": "OZ-12345678",
  "item_name": "Наушники Sony WH-1000XM5",
  "quantity": 2,
  "issue_type": "не пришёл товар",
  "contact_phone": "+79161234567"
}

Сообщение клиента:
"Здравствуйте! Заказ OZ-87654321, три пары кроссовок Adidas Ultraboost. 
Один товар пришёл не того размера, нужна замена. Связаться можно по 
номеру +79267778899."

Результат:

Модель вернёт JSON-объект со всеми полями: order_id, item_name (из описания "кроссовки Adidas Ultraboost"), quantity: 3, issue_type (классифицирует как "неправильный размер" или близко по смыслу), contact_phone.

С P-стратегией: высокая точность значений, но на слабых моделях может обернуть JSON в текст или сломать синтаксис.

С PJ+-стратегией (если модель поддерживает API-параметр): всегда валидный JSON, но может неточно извлечь item_name или issue_type.


🧠

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

Слабость LLM: Модели генерируют текст последовательно, без явного "планирования структуры". При запросе "верни JSON" они балансируют между формированием синтаксиса (фигурные скобки, кавычки, запятые) и извлечением смысла (найти в тексте order_id, понять что именно заказывали). Модель может сфокусироваться на одном в ущерб другому.

Сильная сторона LLM: Модели отлично копируют паттерны из примеров. Дашь схему с типами + заполненный пример → модель понимает и структуру, и формат значений. Это few-shot learning в действии: один пример кардинально улучшает качество.

Как работают стратегии:

  • P-стратегия даёт модели явную схему и образец в контексте. Модель следует паттерну, но полагается на собственное понимание JSON-синтаксиса — поэтому иногда ломается структурно, зато внимательнее к значениям.

  • PJ+-стратегия добавляет внешнее ограничение через API (constrained decoding): модель не может сгенерировать невалидный JSON. Это 100% гарантирует структуру, но отвлекает внимание модели от точности значений — она тратит "мощность" на соблюдение схемы.

Трейдофф: Защита от структурных ошибок → больше семантических ошибок. Это как вести машину с GPS-навигатором: меньше заблудишься (валидный JSON), но можешь пропустить нужный поворот (неправильное значение).

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

  • Сложность схемы — добавь только критичные поля, уберёшь необязательные → модель сфокусируется на главном, меньше ошибок.
  • Детализация примера — дай пример с краевыми случаями (пустая строка, ноль, массив) → модель лучше обработает нетипичные данные.
  • Выбор стратегии — нужна стабильность структуры? PJ+. Нужна точность данных? P.

📋

Шаблон промпта (P-стратегия)

Извлеки информацию из текста и верни в формате JSON по этой схеме:

{схема_с_типами}

Пример заполненного объекта:
{пример_объекта}

Текст:
{исходный_текст}

Что подставлять:

  • {схема_с_типами} — JSON-объект с названиями полей и типами ("строка", число, массив) вместо значений
  • {пример_объекта} — полностью заполненный JSON с реалистичными данными, не из твоей задачи (чтобы модель не скопировала значения)
  • {исходный_текст} — текст, из которого нужно извлечь данные

📋

Шаблон промпта (PJ+-стратегия)

Извлеки информацию из текста и верни в формате JSON по этой схеме:

{json_schema_спецификация}

Пример заполненного объекта:
{пример_объекта}

Текст:
{исходный_текст}

Дополнительно: При вызове через API (OpenAI, Anthropic, локальные модели с поддержкой structured outputs) — передай {json_schema_спецификация} в параметр response_format или аналогичный.

Что подставлять:

  • {json_schema_спецификация} — полная JSON Schema (с "type", "properties", "required" и т.д.)
  • {пример_объекта} — заполненный JSON
  • {исходный_текст} — исходный текст

🚀 Быстрый старт — вставь в чат:

Вот две стратегии извлечения JSON из текста. Адаптируй под мою задачу: 
{опиши что извлекаешь и из какого текста}.

Создай JSON-схему с нужными полями, заполни пример, и дай мне готовый 
промпт для извлечения.

[вставить шаблон P-стратегии выше]

LLM спросит какие поля нужны, какие типы данных, примеры значений — потому что для создания схемы и примера нужно понимать структуру данных. Она возьмёт паттерн "схема + пример + инструкция" и адаптирует под твою задачу.


⚠️

Ограничения

⚠️ Глубоко вложенные структуры: Исследование не покрывает JSON с глубиной больше 4 уровней. Авторы пытались генерировать сложные тесты, но модели ломались даже на этапе создания примеров — упускали значения, путали вложенность.

⚠️ Интерпретация и вывод: Стратегии работают когда вся информация явно есть в тексте. Если нужно додумать, классифицировать неоднозначно или вывести скрытый смысл — точность падает. Метод извлекает, не интерпретирует.

⚠️ Разные модели — разные слабые места: Семейство Phi3 катастрофически ломалось на P-стратегии (много failed cases), другие модели справлялись. PJ+ выравнивает результат, но не панацея. На слабой модели придётся выбирать между структурой и точностью.


🔍

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

Команда создала LLMStructBench — бенчмарк из 995 тестов на 5 сценариях (заявки на отпуск, IT-тикеты, регистрация на конференцию, займ оборудования, продление проекта). Каждый тест — пара "текст + корректный JSON". Сценарии различаются по сложности структуры: от плоских 5 полей до вложенных 10 полей с массивами объектов.

Тесты генерировали синтетически с помощью GPT-4o: сначала создавали валидные JSON-объекты, потом превращали их в естественные тексты (email-стиль). После — полностью вручную проверили: выкинули кейсы где текст не соответствовал JSON, поправили системные несоответствия. Это гарантировало что каждый тест имеет однозначное правильное решение.

Протестировали 22 open-source модели (от 0.6B до 70B параметров — Qwen, Phi, Gemma, Deepseek-R1, Llama) + GPT-4o как эталон. Каждую модель прогнали через 5 стратегий промптинга, различающихся по наличию явных инструкций, схемы, примера и API-параметров.

Измеряли двумя метриками:

  1. Micro-F1 — точность на уровне полей: правильность ключей (25% веса) и значений (75% веса). За точное совпадение — полный балл, за близкие значения (например "42" vs 42) — частичный, за type-ошибки — ноль.

  2. DOCmicro — доля полностью корректных документов. Один неправильный символ → весь тест не засчитан. Это отражает реальность: автоматизированные пайплайны часто требуют 100% валидный JSON с первой попытки.

Комбинированный Score = 50% Micro-F1 + 50% DOCmicro уравновешивает "почти правильно" и "идеально".

Главное открытие: На шкале результатов разброс между стратегиями промптинга оказался шире, чем между размерами моделей. Маленькая модель с PJ+-стратегией обгоняла большую модель с базовым промптом. Особенно ярко на семействе Phi3 (3.8B параметров): P-стратегия давала 130+ failed cases, PJ+-стратегия — ноль failed, но больше ошибок в значениях.

Не ожидали: Явное указание схемы в API-параметре (JSON Schema constrained decoding) увеличивает семантические ошибки. Модель тратит "внимание" на соблюдение структуры → меньше фокуса на корректности данных. Это объясняет почему P-стратегия (без API-принуждения) иногда точнее по значениям, хотя и менее стабильна структурно.

Инсайт для практики: Если работаешь с надёжной моделью (топовая open-source или GPT-4) — используй P-стратегию для максимальной точности данных. Если модель слабая или нужна 100% гарантия парсинга → PJ+. Это не "одна стратегия лучше", это выбор приоритета: защита от структурных сбоев vs защита от искажённых значений.


🔗

Ресурсы

LLMStructBench: Benchmarking Large Language Model Structured Data Extraction

Sönke Tenckhoff, Mario Koddenbrock, Erik Rodner

University of Applied Sciences Berlin


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

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

LLM ломают JSON при извлечении данных из текста. Попросишь вытащить информацию — получишь либо невалидный синтаксис (сломанные скобки, лишний текст), либо валидный JSON с неправильными значениями (пропущенные поля, искажённая информация). Маленькие модели особенно нестабильны: то работают, то падают на одинаковых задачах. Две стратегии решают проблему: P (схема + пример в промпте) и PJ+ (то же + передача схемы через API). Обе работают в обычном чате. Выбор зависит от приоритета: нужна точность данных (используй P) или гарантия валидной структуры (используй PJ+). На хороших моделях обе работают отлично, на слабых — придётся выбирать компромисс.

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

Не просто «верни JSON» → покажи схему с типами полей + дай заполненный пример объекта. Модель отлично копирует паттерны. Видит схему {"order_id": "строка", "quantity": число} + пример с реальными данными {"order_id": "OZ-123", "quantity": 2} → понимает и структуру, и формат значений. Это резко улучшает качество: один пример даёт больше, чем длинные инструкции. P-стратегия даёт модели паттерн в контексте — она следует образцу, фокусируется на значениях. PJ+-стратегия добавляет внешнее ограничение через API (модель не может сгенерировать невалидный JSON) — 100% гарантия структуры, но внимание модели уходит на соблюдение схемы вместо точности.

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

LLM генерирует текст последовательно, без планирования структуры заранее. При запросе «верни JSON» модель балансирует между формированием синтаксиса (фигурные скобки, кавычки, запятые) и извлечением смысла (найти в тексте order_id, понять что именно заказывали). Может сфокусироваться на одном в ущерб другому. P-стратегия: модель полагается на собственное понимание JSON-синтаксиса — иногда ломается структурно, зато внимательнее к значениям. PJ+-стратегия: API принудительно блокирует невалидный JSON (constrained decoding) — модель тратит «мощность» на соблюдение схемы, меньше остаётся на точность данных. Компромисс: защита от структурных ошибок → больше семантических ошибок. Это как ехать строго по разметке — не вылетишь с дороги (валидный JSON), но можешь пропустить нужный съезд (неправильное значение).

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

Извлечение данных из текстов с явной информацией → конкретно для обработки заявок, описаний товаров, сообщений в техподдержку, заказов. Работает когда вся информация есть в тексте. НЕ подходит для: задач требующих интерпретацию контекста, вывод недостающих данных, классификацию неоднозначных случаев. Метод извлекает, не додумывает. Также не справляется с глубоко вложенными структурами (больше 4 уровней) — модели ломаются даже на создании примеров.

Мини-рецепт

1. Создай схему: Только критичные поля, укажи типы («строка», число, массив). Уберёшь необязательные → модель сфокусируется на главном.
2. Заполни пример: Реалистичные данные, НЕ из твоей задачи (чтобы модель не скопировала значения). Добавь краевые случаи (пустая строка, ноль, массив).
3. Промпт: Извлеки информацию и верни JSON по схеме: {схема}. Пример: {пример}. Текст: {данные}
4. Выбери стратегию: Нужна точность данных? P. Нужна гарантия валидной структуры? PJ+ (если API модели поддерживает передачу схемы через параметр response_format).

Примеры

[ПЛОХО] : Вытащи из этого текста данные о заказе клиента и верни в формате JSON
[ХОРОШО] : Извлеки информацию из сообщения клиента и верни JSON по схеме: {"order_id": "строка", "item_name": "строка", "quantity": число, "issue_type": "строка"}. Пример: {"order_id": "OZ-12345", "item_name": "Наушники Sony WH-1000XM5", "quantity": 2, "issue_type": "не пришёл товар"}. Сообщение: "Заказ OZ-87654, три пары кроссовок Adidas. Один товар не того размера, нужна замена. Связаться по +79267778899."
Источник: LLMStructBench: Benchmarking Large Language Model Structured Data Extraction
ArXiv ID: 2602.14743 | Сгенерировано: 2026-02-17 06:31

Концепты не выделены.

📖 Простыми словами

LLMStructBench: BenchmarkingLargeLanguageModelStructured Data Extraction

arXiv: 2602.14743

Суть проблемы в том, что когда ты просишь нейронку вытащить данные из текста и упаковать их в аккуратный JSON, у неё буквально закипают мозги. Модель пытается усидеть на двух стульях: одновременно следить за сложным синтаксисом со всеми этими скобочками и кавычками и при этом не потерять смысл самого текста. В итоге она либо лажает в коде, либо путает данные. Исследование LLMStructBench подтвердило: извлечение структурированной информации — это не про «ум» модели, а про то, как ты её об этом попросил.

Это как заставить профессионального переводчика одновременно переводить твою речь и набивать её на печатной машинке, строго соблюдая разметку сложной таблицы. Вроде и язык знает, и печатать умеет, но из-за двойной нагрузки он обязательно где-нибудь опечатается или пропустит важное слово. Чтобы он не тупил, ему нужна четкая шпаргалка перед глазами, которая снимет часть когнитивной нагрузки.

Самое важное открытие: стратегия промптинга бьет параметры модели. Тебе не обязательно нужна самая дорогая и жирная нейронка, если ты используешь методы P или PJ+. Суть проста: нужно впихнуть в промпт не просто просьбу «сделай красиво», а явную JSON-схему и, что критично, конкретный пример готового объекта. Когда модель видит перед собой шаблон и образец, она перестает гадать и начинает просто копировать структуру, фокусируясь на главном — поиске нужных фактов в тексте.

Этот принцип универсален для любых задач, где на входе каша из слов, а на выходе нужен порядок: от обработки заявок и заказов до разбора резюме. Тестировали это на извлечении данных, но логика работает везде, где важна жесткая форма. Главное помнить, что это не магия: если в тексте информации нет или её нужно додумывать по контексту, модель всё равно может нафантазировать. Это инструмент для работы с фактами, а не для чтения между строк.

Короче, забудь про надежду на «интеллект» модели и начни давать ей структурные костыли. Правильный промпт со схемой и примером — это 80% успеха, и это работает даже в обычном чате без всяких сложных настроек API. Если твоя модель выдает кривой JSON или путает поля, значит, ты просто пожалел ей наглядного образца. Дай ей шаблон, и она перестанет вести себя как растерянный стажер на первой практике.

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

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

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