3,583 papers
arXiv:2606.25605 71 24 июня 2026 г. FREE

Constraint Tax (Tool Suppression): конкурирующие требования в промпте убивают одно из них

КЛЮЧЕВАЯ СУТЬ
Обнаружено: когда просишь модель "глубоко проанализируй И верни строго в JSON" — формат побеждает. Не потому что модель ленива. В открытых моделях (Llama, Qwen) JSON-схема компилируется в маску токенов и физически блокирует часть цепочек рассуждений — некоторые слова просто вне допустимого словаря на этом шаге. Двухпроходный подход разрывает конкуренцию целей: сначала задача без ограничений, потом форматирование отдельным запросом — и получаешь и глубину анализа, и нужную структуру. Без компромисса.
Адаптировать под запрос

TL;DR

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

Главная находка: модель не выдаёт ошибку, не предупреждает — она просто молча пропускает действие и генерирует формально правильный, но пустой ответ. В чате это выглядит иначе, но принцип тот же: когда ты одновременно требуешь «глубоко проанализируй» + «строго следуй этому шаблону» + «не выходи за рамки формата» — что-то из этого теряется. Конкурирующие цели → жертва одной из них.

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


🔬

Схема метода

ПРОХОД 1 — действие: Задай задачу без требований к формату → 
           модель рассуждает, собирает, анализирует свободно

ПРОХОД 2 — форматирование: Передай результат + требование к формату → 
           модель оформляет готовый материал в нужную структуру

Оба шага — отдельные запросы в чате. Не смешивай их в один.


🚀

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

Задача: Илья — продакт в стартапе, готовит отчёт для инвесторов. Нужно проанализировать конкурентов (Mindbox, Retail Rocket, Carrot Quest) и оформить в таблицу с колонками: позиционирование, целевой клиент, слабое место.

Промпт — Проход 1 (действие):

Проанализируй трёх конкурентов в нише CDP и маркетинговой автоматизации 
для e-commerce в России: Mindbox, Retail Rocket, Carrot Quest.

По каждому разбери:
— В чём их реальное позиционирование (не с сайта, а по сути)
— Кто их типичный клиент
— Что они не умеют или где проседают

Пиши свободно, без формата. Просто разбери по делу.

Промпт — Проход 2 (форматирование):

Вот анализ конкурентов: [вставляешь ответ из Прохода 1]

Оформи это строго в таблицу Markdown с тремя колонками: 
"Компания" | "Позиционирование" | "Целевой клиент" | "Слабое место"

Ничего не добавляй от себя — только структурируй готовый материал.

Результат: В первом проходе модель выдаст развёрнутый живой анализ — именно тот, что нужен инвесторам. Во втором — аккуратно упакует его в таблицу, не теряя смысл и не добавляя пустых фраз. Если объединить оба требования в одном запросе — таблица получится, но анализ будет поверхностным: модель будет «думать о формате», пока должна думать о конкурентах.


🧠

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

Слабость LLM — у модели нет бесконечных «вычислительных мощностей» для одного запроса. Когда ты задаёшь жёсткие требования к формату одновременно с требованием глубоко думать, модель распределяет внимание между двумя целями. Формат обычно «побеждает» — он проще верифицируется прямо в процессе генерации.

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

Как Two-Pass это обходит: в первом проходе модель работает без формальных ограничений — как будто пишет черновик. Рассуждение, сбор аргументов, принятие решений происходят свободно. Во втором проходе задача простая: взять готовый материал и «упаковать». Это несравнимо легче, чем думать и форматировать одновременно. Разделение целей → каждая цель достигается полностью.

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

  • Насколько свободным должен быть Проход 1 — добавь «не сдерживай рассуждения», «выписывай всё что приходит в голову» → больше материала для форматирования
  • Насколько строгим должен быть Проход 2 — чем точнее опишешь схему (число колонок, названия, порядок), тем чище результат
  • Количество проходов — для сложных задач можно добавить Проход 1.5: «проверь свой анализ, чего не хватает?» — перед финальным форматированием

📋

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

Проход 1 — действие:

{Задача}: {контекст и объект анализа/работы}

Разбери это подробно и свободно. Не думай о формате ответа — 
просто выдай всё что знаешь по делу. Пиши как черновик.

Проход 2 — форматирование:

Вот материал: {вставить ответ из Прохода 1}

Оформи строго в формат: {описание формата — таблица / список / JSON / 
структура документа / шаблон}

Используй только готовый материал выше. Ничего не выдумывай.

Плейсхолдеры: - {Задача} — что нужно сделать: «Проанализируй», «Оцени», «Составь план» - {контекст} — предмет работы: компании, текст, ситуация, данные - {описание формата} — точная структура вывода: число колонок, названия секций, JSON-поля


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

Вот двухшаговый шаблон Two-Pass для сложных задач. 
Адаптируй под мою задачу: {твоя задача}. 
Задавай вопросы, чтобы заполнить поля.

[вставить шаблон выше]

LLM спросит: что именно анализировать, в какой формат выводить — потому что оба параметра критичны для разделения задач на правильные шаги.


⚠️

Ограничения

⚠️ Дополнительный шаг: метод требует двух запросов вместо одного. Для простых задач («напиши список из 5 пунктов») — избыточно.

⚠️ Зависит от качества Прохода 1: если первый ответ поверхностный — второй проход его не улучшит, только упакует пустоту. Инвестируй в качество первого запроса.

⚠️ Применимость к ChatGPT/Claude: оригинальное явление (полная блокировка tool calling) воспроизводится на открытых моделях в API-инфраструктуре. В стандартном чате ChatGPT/Claude деградация мягче — но принцип конкуренции целей работает и там.

⚠️ Не лечит слабые модели: Tool Suppression — это не баг слабых моделей, его воспроизвели на нескольких семействах. Но Two-Pass особенно помогает именно там, где модель «средняя» по качеству инструкций.


🔍

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

Всё началось с реального инцидента в продакшне: агентная система одной компании перестала вызывать внешние инструменты — но только когда был включён JSON Schema. Выключили схему — инструменты заработали. Включили обратно — перестали. Никаких других изменений.

Исследователи воспроизвели это на нескольких семействах открытых моделей (Qwen, Llama и других) через несколько конфигураций развёртывания. Измеряли Tool Invocation Rate (TIR) — долю запросов, где модель реально вызвала инструмент. Без JSON Schema: TIR близок к 100%. С JSON Schema: падает до нуля у ряда моделей.

Самое интересное — они залезли в стек вывода (inference stack) и нашли физическую причину: JSON Schema компилируется в маску токенов. Грамматика схемы буквально запрещает определённые токены на каждом шаге генерации — и теги вызова инструментов ( и подобные) оказываются в запрещённом списке. Модель не «решает не вызывать» инструмент — она физически не может сгенерировать нужный токен.

Это объяснило парадокс: модель понимает задачу, планирует инструменты — но на этапе исполнения тихо их пропускает. Авторы назвали это Constraint Priority Inversion — приоритет схемы инвертирует цепочку исполнения. Решение (Two-Pass) проверили на тех же моделях: TIR восстановился, соответствие схеме сохранилось.


💡

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

🔧 Техника: «Промежуточный черновик» для длинных аналитических задач

Добавь явную инструкцию в Проход 1 выдавать сырой поток мысли, а не отшлифованный текст:

«Пиши как будто диктуешь голосом — без редактирования, без структуры. Просто думай вслух по задаче.»

Это максимально освобождает первый проход от любого «форматного давления». Получишь самый богатый черновик для второго шага.


🔧 Техника: «Три-прохода» для комплексных документов

Проход 1 → свободный анализ

Проход 1.5 → «что важного я упустил(а)? добавь»

Проход 2 → финальное форматирование

Полезно для отчётов, питчей, технических документов — где пропущенный аргумент дорого стоит.


🔧 Техника: Применить к рецензии и критике

Constraint Tax работает не только с форматом, но и с ролью. Когда просишь «будь одновременно добрым и критичным» — модель усредняет. Разделяй:

Проход 1: «Критикуй жёстко, без дипломатии»

Проход 2: «Перепиши эту критику в конструктивный тон для клиента»


🔗

Ресурсы

Работа: Constraint Tax in Open-Weight LLMs: An Empirical Study of Tool Calling Suppression Under Structured Output Constraints

Авторы: Fangzheng Li, Aimin Zhang, Chen Lv

Организации: Focus AI Center, Focus Technology Co., Ltd.; Nanjing University of Science and Technology

Код и данные: https://github.com/Fzsama/Constrain-Tax-26-06.git

Связанные концепции: Constraint Tax (Ray, оригинальная концепция), Grammar-Constrained Decoding, xgrammar, Outlines, vLLM, SGLang


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

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

Обнаружено: когда просишь модель "глубоко проанализируй И верни строго в JSON" — формат побеждает. Не потому что модель ленива. В открытых моделях (Llama, Qwen) JSON-схема компилируется в маску токенов и физически блокирует часть цепочек рассуждений — некоторые слова просто вне допустимого словаря на этом шаге. Двухпроходный подход разрывает конкуренцию целей: сначала задача без ограничений, потом форматирование отдельным запросом — и получаешь и глубину анализа, и нужную структуру. Без компромисса.

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

Разделяй цели — не смешивай их в одном промпте. Первый запрос: выполни задачу свободно, без схем и форматов. Второй запрос: возьми готовый ответ и переупакуй в нужную структуру. Второй шаг — чисто механический: «ничего от себя, только переформатируй». Это как разделить работу повара и официанта. Повар думает о вкусе блюда — не о том, как красиво разложить по тарелке. Официант потом раскладывает. Оба делают своё дело хорошо. Вместе на одном шаге — оба делают его хуже.

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

У модели ограниченный «бюджет внимания» на запрос. Когда она одновременно думает над задачей и следит за структурой вывода — приоритет отдаётся тому, что проще проверить. Формат JSON проверяется парсером за миллисекунду. Глубина анализа — никак. Угадай, что победит. В открытых моделях это не метафора, а физический эффект: JSON-схема превращается в маску допустимых токенов, и модель просто не может сгенерировать слова нужные для рассуждения — они вне разрешённого списка на этом шаге. Разделение на два запроса снимает ограничение полностью: в первом шаге никакой маски нет.

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

Нужен глубокий анализ и структурированный вывод одновременно: разбор договоров и коммерческих предложений, аудит кода с отчётом в нужном формате, исследование рынка с выгрузкой в базу данных, оценка рисков с результатом для CRM. НЕ подходит для простых задач где важна скорость: если ответ короткий или формат вторичен — один промпт быстрее и проще. Для GPT-4o и Claude эффект менее выражен, но двухпроход всё равно даст лучше.

Мини-рецепт

1. Первый запрос — только задача: Дай роль эксперта, сформулируй задачу подробно, явно напиши «формат не важен — важна полнота и точность». Никакого JSON, никаких схем на этом шаге.
2. Второй запрос — только формат: Начни с «Возьми свой ответ выше и переупакуй в такую структуру:», дай нужную схему. Добавь «только из текста выше, ничего от себя» — иначе модель начнёт «улучшать» при переформатировании и дорисует то, чего не было.
3. Если задача сложная: Добавь промежуточный шаг — сначала сырые мысли, потом структурированный анализ, потом схема. Три запроса вместо двух — каждый шаг делает ровно одно.

Примеры

[ПЛОХО] : Проанализируй это коммерческое предложение, найди риски и скрытые условия. Верни строго в JSON: {"risks": [...], "recommendation": "..."} — получишь красивый JSON с поверхностным анализом, где самое интересное осталось за кадром.
[ХОРОШО] : Шаг 1: Ты опытный переговорщик по коммерческим контрактам. Разбери это КП подробно: какие условия невыгодны нам, что написано нечётко или допускает двоякое толкование, какие риски поднять на переговорах, чего вообще нет, но должно быть. Формат свободный — важна честность и полнота. [текст КП] Шаг 2: Возьми свой анализ выше и переупакуй строго в JSON: {"risks": [...], "hidden_conditions": [...], "negotiation_points": [...], "recommendation": "..."} — только из текста выше, ничего от себя.
Источник: Constraint Tax in Open-Weight LLMs: An Empirical Study of Tool Calling Suppression Under Structured Output Constraints
ArXiv ID: 2606.25605 | Сгенерировано: 2026-06-28 20:54

Проблемы LLM

ПроблемаСутьКак обойти
Строгий формат вывода вытесняет глубину ответаПросишь сразу: "проанализируй глубоко И верни в JSON". Модель получает две цели. Формат проверить просто — либо валидный JSON, либо нет. Глубину анализа проверить сложно. Модель выбирает то, что легче выполнить. Итог: структура идеальная, анализ поверхностный. Работает для любых задач, где нужны и мышление, и схема: код-ревью, юридический анализ, отчётыРаздели на два запроса. Первый — только задача, свободный формат. Второй — только переупаковка результата в нужную структуру

Методы

МетодСуть
Двухпроходный запрос — глубина + формат без потерьШаг 1. Даёшь задачу без каких-либо требований к формату. Только: "отвечай подробно и свободно". Модель думает без ограничений. Шаг 2. Берёшь ответ шага 1 и просишь переупаковать в нужную структуру: "Возьми ответ выше. Переупакуй строго в {JSON/таблицу/схему}. Только из текста выше — ничего не добавляй." Почему работает: У каждого запроса одна цель. В первом — думать. Во втором — форматировать. Нет конкуренции целей. Когда применять: нужна и глубина, и строгий формат. Когда избыточно: простой вопрос с коротким ответом, быстрые задачи без аналитики
📖 Простыми словами

Constraint Tax in Open-WeightLLMs: An Empirical Study ofToolCalling Suppression Under Structured Output Constraints

arXiv: 2606.25605

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

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

В цифрах и фактах это выглядит как подавление вызова инструментов. Если в обычном режиме модель справляется с задачей в 90% случаев, то при добавлении требования к структурированному выводу эффективность падает в разы. Она выдает тебе аккуратную таблицу или JSON, где вместо реальных данных из поиска или базы — пустота или галлюцинации. Формат становится для модели важнее, чем само действие, потому что соблюдение структуры проверяется ею буквально на каждом следующем токене, а логика вызова функции требует более глубокого планирования, на которое не хватает оперативной памяти.

Этот принцип универсален для любых агентных систем. Неважно, строишь ли ты бота для анализа конкурентов или автоматизируешь сборку отчетов — если ты заставляешь модель «думать и форматировать» одновременно, ты платишь тот самый налог на ограничения. Это касается всех популярных Open-Weight моделей, которые пытаются казаться умнее, чем они есть на самом деле. Чем жестче рамки на выходе, тем выше шанс, что под капотом ничего не произойдет, и вместо реальной работы ты получишь просто красивую имитацию.

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

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

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

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