3,583 papers
arXiv:2610.22158 81 15 окт. 2026 г. FREE

Implicit-промпт (PremiseSQL): мягкое предупреждение «в вопросе могут быть ошибки» заставляет модель не отвечать на кривой запрос

КЛЮЧЕВАЯ СУТЬ
Обнаружено: по умолчанию модели почти никогда не говорят «вопрос некорректен». Спросишь про колонку, которой нет в таблице, и модель подставит похожую. Выдаст рабочий SQL, который считает не то. Метод позволяет ловить кривые вопросы до того, как цифра попадёт в отчёт: модель отвечает «так нельзя» вместо красивого, но неверного результата. Фишка: одно слово «может» в предупреждении включает проверку вопроса. Модель перестаёт молча достраивать недостающее и пишет вердикт в поле is_valid. Доля пойманных ошибок растёт примерно вдвое.
Адаптировать под запрос
⚡

TL;DR

Implicit-промпт — это обычная инструкция к запросу, где модели говорят: «во входном вопросе могут быть ошибки, сначала оцени, можно ли на него отвечать». К ответу добавляется поле с вердиктом (is_valid) и объяснением. Без такой инструкции модель молча чинит вопрос сама и выдаёт уверенный ответ.

Главная находка: по умолчанию модели доверяют вопросу и почти никогда не говорят «это некорректно». Спросишь про колонку, которой нет в таблице, и модель подставит похожую и выдаст рабочий SQL, который считает не то. Мягкое предупреждение примерно вдвое увеличивает долю пойманных ошибок. Жёсткая формулировка «в вопросе точно есть ошибка» ломает другое: модель начинает отказываться и от нормальных вопросов, потому что слушается промпта, а не данных. Размер и свежесть модели этого не лечат.

Метод в одном шаге: предупреди модель, что ошибки возможны, дай схему и вопрос, потребуй JSON с sql, is_valid, reason. Нейтральная формулировка («может быть») работает, утверждающая («есть») вредит.

🔬

Схема метода

ОДИН ПРОМПТ:
  1. Предупреждение: «вопрос МОЖЕТ содержать ошибки, оцени валидность до ответа»
  2. Контекст: схема таблиц + вопрос
  3. Формат вывода: JSON {sql, is_valid, reason}
     - вопрос корректен → sql заполнен, is_valid = true
     - вопрос некорректен → sql = null, is_valid = false, reason = в чём ошибка

НЕ ДЕЛАТЬ: «В вопросе есть ошибка» (Explicit) → ложные отказы

Четыре типа ошибок в вопросах, которые исследователи проверяли: - E1 Выражение: неоднозначность, неясная цель. - E2 Противоречие: условия исключают друг друга или не сходятся со схемой. - E3 Пропуск: нет фильтра, нужной таблицы или колонки, понятие не сопоставляется со схемой. - E4 За пределами: SQL не может это выразить, или нужны внешние знания.

🚀

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

Задача: Вы руководитель аналитики в интернет-магазине электроники из Новосибирска. Продакт пишет в корпоративный бот: «Покажи среднюю маржу по заказам за март». В базе есть orders(id, customer_id, city, total, created_at) и order_items(order_id, product_id, qty, price). Колонки с себестоимостью нет, маржу посчитать нельзя. Обычный промпт выдаст SQL, где «маржа» тихо превратится в total или price. Цифра будет красивой и неверной.

Промпт:

Ты помогаешь аналитикам писать SQL (PostgreSQL).
Входной вопрос МОЖЕТ содержать ошибки: неоднозначность, противоречия,
отсутствующие в схеме данные или требования, которые SQL не может выполнить.
Сначала оцени, корректен ли вопрос и можно ли на него ответить по этой схеме.
Не додумывай недостающее.

Схема:
orders(id, customer_id, city, total, created_at)
order_items(order_id, product_id, qty, price)

Вопрос: Покажи среднюю маржу по заказам за март.

Верни JSON:
{
  "sql": "<запрос или null, если отвечать нельзя>",
  "is_valid": true/false,
  "reason": "<почему вопрос корректен или в чём именно ошибка>"
}

Результат: Модель с большой вероятностью, но не гарантированно, вернёт sql: null, is_valid: false и объяснение, что в схеме нет себестоимости. Без предупреждения такая же модель чаще всего выдала бы SQL с подменой маржи на выручку. Если вопрос корректен («средний чек по заказам за март»), должен прийти нормальный SQL с is_valid: true. Но часть моделей на таком мягком предупреждении начинает перестраховываться, поэтому проверьте на своих корректных запросах.

🧠

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

Слабость. Модель обучена быть полезной и отвечать. Вопрос для неё условие задачи, а не объект проверки. Поэтому она молча достраивает недостающее: сопоставляет «человека» с «актёром», «маржу» с «выручкой». SQL при этом синтаксически корректен, и ошибку не видно.

Сильная сторона. Если попросить оценить вопрос явно, модель это умеет. Знание о том, что колонки нет, у неё есть, просто оно не включается само. Её собственный вердикт к тому же управляет поведением: когда is_valid = false, SQL почти всегда не пишется, и наоборот.

Как метод это использует. Предупреждение «может быть ошибка» включает проверку, а поле is_valid с reason заставляет написать вывод до или вместе с ответом. Слово «может» важно. Оно оставляет модели возможность сказать «всё в порядке». Утверждение «ошибка есть» убирает эту возможность. Модель принимает его как факт и ищет ошибку там, где её нет.

Рычаги управления: - Сила формулировки. «Может содержать ошибки» даёт баланс. «Содержит ошибки» повышает отлов, но ломает нормальные запросы. Отсутствие предупреждения даёт почти нулевой отлов. - Поле reason. Оставь его: по нему видно, увидела модель реальную проблему или придралась. - Значение при отказе. Вместо null можно просить «уточняющий вопрос пользователю». Это часть сценария из Figure 1 статьи. - Список типов ошибок. Чем конкретнее перечень в предупреждении, тем больше подсказок, но тем выше риск перестраховки. Проверяй на своих корректных вопросах.

📋

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

Ты — {роль_и_задача}.
Входной запрос МОЖЕТ содержать ошибки. Сначала оцени, корректен ли он
и можно ли на него ответить с учётом контекста ниже.
Не додумывай недостающее.

Контекст:
{контекст_или_схема}

Запрос: {запрос}

Верни JSON:
{
  "sql": "<результат или null, если отвечать нельзя>",
  "is_valid": true/false,
  "reason": "<почему запрос корректен или в чём именно ошибка>"
}

Что подставлять: {роль_и_задача} — например, «аналитик, пишущий SQL». {контекст_или_схема} — описание таблиц или правил. {запрос} — вопрос пользователя. Ключ sql можно переименовать в answer, если задача не про SQL, но идея проверена только на SQL.

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

Вот шаблон промпта, который заставляет модель проверять корректность вопроса
перед ответом. Адаптируй под мою задачу: [твоя задача].
Задавай вопросы, чтобы заполнить поля.

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

LLM спросит, какие у тебя данные или контекст и что считать «ответить нельзя». Это нужно, чтобы предупреждение было привязано к твоему контексту, а модель знала, с чем сверять запрос.

⚠️

Ограничения

⚠️ Цена за мягкое предупреждение: даже нейтральная формулировка заставляет часть моделей отказываться от нормальных вопросов. У одной из моделей почти половина корректных запросов осталась без ответа. Проверяй на своих правильных вопросах, а не только на сломанных.

⚠️ Жёсткая формулировка вредит: фраза «в вопросе есть ошибка» поднимает отлов почти до максимума, но модель начинает отклонять и корректные запросы. Одна из моделей отказывалась практически от всех нормальных вопросов. Высокие цифры отлова тут обманчивы: это послушание, а не проверка.

⚠️ Масштаб не спасает: новые и крупные модели лучше только частично, а лучшая модель без предупреждения ловит меньше половины ошибок. В одном сравнении меньшая модель отловила больше большой. Нужно тестировать на своей модели.

⚠️ Ошибка вердикта тянет ошибку ответа: модель почти всегда действует по собственному is_valid. Если вердикт неверный, неверным будет и действие. Поле reason не гарантирует, что вердикт правильный.

⚠️ Один домен: всё проверено на Text-to-SQL, ошибки искусственно созданы другой LLM. Перенос на другие задачи логичен, но авторами не проверялся. Определить тип ошибки модели тоже труднее, чем просто заметить, что она есть.

⚠️ Нет готового промпта: в доступном тексте приведено описание трёх режимов, а не полный текст промптов. Шаблон выше собран по этому описанию. Текст статьи также обрывается на разделе про типы ошибок.

🔍

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

Исследователи взяли два популярных набора вопросов для SQL, Spider и BIRD, и испортили 1 800 вопросов по таксономии из четырёх типов ошибок. Порча шла одной LLM, проверка другой LLM и затем людьми. К каждому испорченному вопросу оставили оригинал как контрольный. Это ключевая идея дизайна: иначе нельзя отличить настоящую проверку от привычки отказывать.

Дальше 16 современных моделей прогнали через три режима: обычный (Base), с мягким предупреждением (Implicit) и с утверждением «ошибка есть» (Explicit). Всего получилось около 173 тысяч ответов. Ответы оценивали две LLM-судьи, которые сошлись между собой и с людьми.

Результаты. В Base модели отлавливали около трети ошибок и почти всегда выдавали SQL. В Implicit отлов вырос примерно вдвое, а доля нормальных вопросов с ответом упала лишь с 99% до 90%. В Explicit отлов почти достиг максимума, но доля нормальных вопросов с ответом упала примерно до половины. Для каждой модели при переходе к Explicit отлов вырос, а ответы на корректные вопросы сократились.

Удивило то, что нет чёткого «чем новее и больше, тем лучше». И то, что вердикт is_valid почти полностью предсказывал, будет ли SQL, даже когда вердикт ошибочный. Практический вывод: формулировка предупреждения и проверка на «хороших» запросах важнее выбора модели.

💡

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

Это мои идеи, авторы их не проверяли.

🔧 Техника: добавить типы ошибок → подсказать, что искать

Проверь запрос на: (1) неоднозначность, (2) противоречия условий или со схемой, (3) отсутствующие данные или фильтры, (4) то, что нельзя вычислить по этим данным.

В статье у типов ошибок есть свои метрики, но перечень внутри промпта они не тестировали. Может повысить точность reason, но может усилить перестраховку. Обязательно проверь на корректных запросах.

Экстраполяция: правило в файле инструкций агента. Для агента, который отвечает на вопросы по данным (CLAUDE.md, системный промпт кастомного GPT):

Перед тем как писать запрос или отчёт, проверь: все ли поля, периоды и
метрики из вопроса есть в доступных данных. Если чего-то нет или вопрос
допускает несколько толкований, не подменяй понятия. Напиши, что именно
отсутствует или неясно, и задай один уточняющий вопрос. Если вопрос
корректен, отвечай сразу, без лишних сомнений.

Последняя фраза нужна, чтобы не получить эффект Explicit-режима, где модель отказывается от нормальных запросов.

🔗

Ресурсы

  • PremiseSQL: Evaluating Premise Critique and Abstention in Text-to-SQL Systems — Shuo Lin, Jinzhe Li, Chenlu Guo, Yanhan Li, Yuan Wu, Yi Chang.
  • Организации: Jilin University (School of AI; Engineering Research Center of Knowledge-Driven Human-Machine Intelligence; International Center of Future Science), Bilibili Inc., China Telecom AI Technology (Beijing).
  • Код и бенчмарк: https://github.com/vegeet/PremiseSQL
  • Исходные наборы: Spider 1.0, BIRD. Смежные работы: TriageSQL, TrustSQL, NL2SQL-BUGs, AbstentionBench.

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

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

Обнаружено: по умолчанию модели почти никогда не говорят «вопрос некорректен». Спросишь про колонку, которой нет в таблице, и модель подставит похожую. Выдаст рабочий SQL, который считает не то. Метод позволяет ловить кривые вопросы до того, как цифра попадёт в отчёт: модель отвечает «так нельзя» вместо красивого, но неверного результата. Фишка: одно слово «может» в предупреждении включает проверку вопроса. Модель перестаёт молча достраивать недостающее и пишет вердикт в поле is_valid. Доля пойманных ошибок растёт примерно вдвое.

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

Всё решает сила формулировки. Три варианта дают три разных поведения. Без предупреждения. Модель доверяет вопросу. Ловит меньше половины ошибок даже у лучшей модели. «Вопрос МОЖЕТ содержать ошибки». Модель проверяет и всё ещё может сказать «всё в порядке». Это золотая середина. «В вопросе ЕСТЬ ошибка». Ловит почти всё, но отказывается и от нормальных вопросов. «Может» оставляет модели право сказать «ошибки нет», а «есть» это право отбирает. Это как сигнализация: чуткая звонит по делу, а перекрученная орёт на каждую кошку. К ответу добавляется поле is_valid с коротким reason. Тогда проверка не прячется внутри модели, её видно.

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

Модель обучена быть полезной и отвечать. Вопрос для неё условие задачи, а не объект проверки. Поэтому она сопоставляет «маржу» с «выручкой», «человека» с «актёром». SQL выходит корректным по синтаксису, и ошибку не видно. Знание о том, что колонки нет, у модели есть. Оно просто не включается само. Явная просьба оценить вопрос превращает его из условия задачи в предмет проверки. Вердикт к тому же управляет действием. Когда is_valid = false, SQL почти всегда не пишется. И наоборот. Прикол в обратной стороне. Жёсткая фраза «ошибка есть» поднимает отлов почти до максимума. Но одна из моделей начинает отклонять почти все нормальные вопросы. Это послушание промпту, а не проверка данных. Размер и свежесть модели тут не лечат: меньшая модель в одном сравнении поймала больше большой.

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

Аналитика и работа с базами → чат-боты, где бизнес сам задаёт вопросы к данным, особенно когда в схеме нет нужных колонок или вопрос расплывчатый. Подходит и там, где неверная цифра дороже, чем «не могу ответить». НЕ подходит, если у вас почти все вопросы корректные и отказ обходится дорого. Мягкое предупреждение и так заставляет часть моделей перестраховываться. У одной модели почти половина нормальных запросов осталась без ответа. Идея проверена только на SQL. Перенос на другие задачи логичен, но авторы его не проверяли.

Мини-рецепт

1. Предупреди мягко: напиши «входной вопрос МОЖЕТ содержать ошибки». Не пиши «содержит» и «есть».
2. Запрети додумывать: добавь «не додумывай недостающее». Это останавливает подмену колонок.
3. Дай контекст: схема таблиц и сам вопрос. Без схемы модели не с чем сверять.
4. Потребуй JSON: поля sql, is_valid, reason. При отказе sql = null.
5. Читай reason: по нему видно, нашла модель реальную дыру или просто придралась.
6. Проверь на нормальных вопросах: прогони 20-30 правильных запросов. Если модель отказывает слишком часто, смягчи список типов ошибок в предупреждении.
7. Опционально: вместо null проси «уточняющий вопрос пользователю». Бот тогда не молчит, а переспрашивает.

Примеры

[ПЛОХО] : Покажи среднюю маржу по заказам за март (схема: orders и order_items, колонки себестоимости нет). Модель тихо подставит total или price и выдаст красивую, но неверную цифру.
[ХОРОШО] : Ты помогаешь аналитикам писать SQL (PostgreSQL). Входной вопрос МОЖЕТ содержать ошибки: неоднозначность, противоречия, отсутствующие в схеме данные или требования, которые SQL не может выполнить. Сначала оцени, корректен ли вопрос. Не додумывай недостающее. Схема: orders(id, customer_id, city, total, created_at), order_items(order_id, product_id, qty, price) Вопрос: Покажи среднюю маржу по заказам за март. Верни JSON: {"sql": "<запрос или null>", "is_valid": true/false, "reason": "<почему корректен или в чём ошибка>"} Ожидаемый результат: sql: null, is_valid: false, причина «в схеме нет себестоимости». Гарантии нет, это вероятный исход. Вопрос «средний чек по заказам за март» должен получить нормальный SQL и is_valid: true. [ПЛОХО]: В вопросе есть ошибка, найди её и не отвечай. Модель послушно начнёт отказываться и от здоровых вопросов.
Источник: PremiseSQL: Evaluating Premise Critique and Abstention in Text-to-SQL Systems
ArXiv ID: 2610.22158 | Сгенерировано: 2026-10-16 08:20

Проблемы LLM

ПроблемаСутьКак обойти
Модель молча чинит кривой вопрос и отвечает уверенноВ запросе нет нужных данных, условия противоречат друг другу или цель неясна. Модель не говорит об этом. Она подставляет что-то похожее: «маржу» меняет на «выручку», несуществующую колонку на соседнюю. Ответ выглядит правильно, а считает не то. Ошибку не видно. Проблема есть везде, где пользователь может ошибиться: анализ данных, справочные боты, извлечение фактов. Новые и крупные модели лечат это лишь частично.Добавь в запрос мягкое предупреждение: «Вопрос МОЖЕТ содержать ошибки. Сначала оцени, можно ли на него ответить по этим данным. Не додумывай недостающее». Требуй отдельное поле с вердиктом (см. метод ниже).

Методы

МетодСуть
Мягкое предупреждение + поле с вердиктом — модель проверяет вопрос до ответаОдним запросом сделай три вещи. 1. Предупреди: «вопрос может содержать ошибки, сначала оцени, корректен ли он». 2. Дай контекст (схему, правила, документ) и сам вопрос. 3. Потребуй структурированный ответ: {"answer": ..., "is_valid": true/false, "reason": "..."}. Если вопрос некорректен, answer равен null, а в reason написано, в чём ошибка. Почему работает: модель по умолчанию считает вопрос условием задачи, а не объектом проверки. Знание о проблеме у неё есть, но само не включается. Предупреждение включает проверку. Поле reason заставляет сформулировать вывод до ответа. Когда применять: вопросы пишут люди, данные ограничены, цена тихой ошибки высока. Когда не нужно: запросы заведомо чистые, или ложный отказ обходится дороже ошибки. Обязательно: проверь метод на своих корректных вопросах. Часть моделей начинает перестраховываться и отказывается от нормальных запросов. Вместо null можно просить уточняющий вопрос пользователю.

Тезисы

ТезисКомментарий
Слово «может» в предупреждении работает лучше, чем «есть»Фраза «вопрос может содержать ошибки» оставляет модели выбор: сказать «всё в порядке». Фраза «в вопросе есть ошибка» этот выбор убирает. Модель принимает её как факт и ищет ошибку даже там, где её нет. Отлов кривых запросов растёт почти до максимума, но модель отказывается и от нормальных. Это послушание промпту, а не проверка данных. Мягкая формулировка примерно вдвое повышает отлов, но тоже даёт часть ложных отказов. Применяй: пиши «может», не «есть». Оценивай и пойманные ошибки, и ложные отказы на корректных запросах. Высокий отлов сам по себе ничего не доказывает.
📖 Простыми словами

PremiseSQL: Evaluating Premise Critique and Abstention in Text-to-SQL Systems

arXiv: 2610.22158

Большинство LLM страдают синдромом отличника: они натасканы быть полезными любой ценой. Если ты просишь базу данных посчитать несуществующую метрику, модель не скажет «чувак, у нас нет таких колонок». Она молча подменит понятия, натянет сову на глобус и сгенерирует синтаксически идеальный SQL-запрос с фальшивым результатом. Модель считает твой вопрос истиной в последней инстанции, даже когда ты несёшь полную дичь.

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

Лекарство здесь простое — implicit-промпт с принудительной критикой предпосылок (premise critique). Ты прямо вбиваешь в системную инструкцию: «не смей отвечать сразу, сначала проверь вопрос на адекватность». На выходе модель обязана выдать флаг is_valid и обоснование отказа, если данных не хватает. Вместо тихой починки кривого запроса система включает контролируемый отказ и прямо говорит, где косяк.

Исследование гоняли на генерации SQL, но принцип универсален для любых корпоративных ботов. Будь то RAG-пайплайн, аналитика в Telegram или умный поиск по документам: если не научить сетку говорить «я не знаю», она будет кормить тебя уверенными галлюцинациями. Право на отказ — единственный способ заставить модель перестать врать в глаза руководству.

Короче: хватит требовать от AI ответов на каждый чих — научи его критиковать пользователя. Добавь проверку ограничений до того, как модель полезет писать код или дёргать API. Один флаг проверки спасает от миллионов убытков. Либо ты разрешаешь ассистенту сказать «данных нет», либо продолжаешь строить стратегию компании на красивой, но абсолютной туфте.

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

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

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