TL;DR
Когда вы просите AI написать код и не указываете явно каждую деталь — сортировку, обработку пустых значений, порядок вывода — модель либо правильно угадывает, что вы имели в виду, либо полностью игнорирует это требование. Среднего варианта почти не бывает: это бинарный выбор, не постепенная деградация качества.
Исследователи нашли: код может проходить 92-94% ваших явных тестов — и при этом в больше чем половине случаев нарушать то, что вы держали в голове, но не написали словами. Причина простая: модель видит только буквальный текст запроса. Всё, что вы не проговорили, она достраивает сама — и делает это не случайно, а системно: если у задачи несколько невысказанных требований, первое из них (по порядку важности) теряется чаще остальных.
Метод исследования — не техника для промптинга, а диагностика: авторы взяли 49 задач по программированию, из чёткой формулировки каждой убрали неявные детали, а убранное превратили в "скрытые тесты". Модели давали только урезанный промпт и явный тест — а потом проверяли решение и по явному, и по скрытым тестам. Практический вывод для вас: высокий процент "прошёл тест" не значит "сделал то, что вы хотели" — и это касается не только кода, но любой задачи с невысказанными требованиями.
Схема метода (как это исследовали)
ШАГ 1: Берут чёткую формулировку задачи → убирают из неё неявные детали → получают "неоднозначный промпт"
ШАГ 2: Убранные детали превращают в "скрытые тесты" (проверяют то, что не было сказано явно)
ШАГ 3: Модель получает только неоднозначный промпт + явный тест → выдаёт код
ШАГ 4: Код прогоняют через явный и скрытые тесты → считают, сколько решений прошли явный, но провалили скрытый
Это не промпт-техника для копирования, а способ измерить проблему. Но из неё вытекает применимый принцип — см. ниже.
Пример применения
Задача: Вы просите AI написать код для парсинга Excel-таблицы с заказами клиентов — это то, чем сейчас реально занимаются тысячи непрограммистов через ChatGPT.
Промпт (как делают обычно, неявно):
Напиши код, который убирает дубликаты заказов из списка.
Что произойдёт по находке исследования: модель напишет рабочий код, который удаляет дубликаты — и он пройдёт простую проверку "дубликатов нет". Но останется невысказанным: в каком порядке оставлять записи (первую или последнюю по дате), что считать дубликатом (весь заказ или только ID клиента), нужно ли сохранять исходный порядок строк. По статистике исследования — модель либо угадает всё это правильно, либо не угадает ничего, и результат будет выглядеть "рабочим", пока вы не откроете файл и не увидите, что данные перепутаны.
Правильный промпт (проговариваем неявное явно):
Напиши код, который убирает дубликаты заказов из списка.
Дубликат — это две строки с одинаковым ID клиента и датой заказа.
Если дубликаты есть, оставляй последнюю по времени запись.
Порядок остальных строк в файле не менять.
Если список пустой — верни пустой список, не ошибку.
Результат: вы получите код, который делает именно то, что вы имели в виду, а не то, что модель угадала за вас.
Почему это работает
LLM не умеет читать мысли — она реагирует только на текст промпта. Если требование не написано, модель либо достраивает его правильно по контексту (потому что похожий паттерн часто встречался в обучении), либо строит свою логику, которая формально работает, но не совпадает с вашей задумкой.
Слабость здесь не в том, что модель "плохо кодит" — она хорошо проходит именно то, что от неё явно спросили. Проблема в разрыве между тем, что вы сказали, и тем, что вы имели в виду. Модель не спрашивает уточнений сама — по умолчанию она просто выбирает одну из интерпретаций и уверенно её реализует.
Рычаг управления: порядок, в котором вы перечисляете требования, важен. Находка показывает — первое пропущенное требование теряется чаще остальных. Значит, самое критичное условие лучше формулировать первым и явно, а не полагаться, что модель "и так поймёт".
Шаблон промпта (принцип, извлечённый из находки)
Напиши {что нужно сделать}.
Явные требования:
1. {самое важное условие — то, что критично для результата}
2. {второе по важности условие}
3. {как обрабатывать пустые/пограничные случаи}
4. {в каком порядке/формате должен быть вывод}
Перед тем как писать код, перечисли все предположения, которые ты делаешь по неуточнённым деталям, и уточни их у меня.
Плейсхолдеры: {что нужно сделать} — суть задачи, остальные строки — конкретные условия, которые вы обычно держите в голове, но не проговариваете.
🚀 Быстрый старт — вставь в чат:
Я хочу попросить тебя написать код (или текст, таблицу — любую задачу).
Прежде чем делать, задай мне вопросы про все детали, которые я мог не уточнить:
порядок, обработку пустых/крайних случаев, формат вывода.
Вот моя задача: {ваша задача}
LLM спросит про конкретные неоднозначности вашей задачи — потому что находка исследования показывает: без явного проговаривания модель либо угадает правильно, либо полностью проигнорирует то, что вы не сказали, и одинаково уверенно выдаст оба варианта как "готовое решение".
Ограничения
⚠️ Маленькая выборка: проверили всего 49 задач и 2 модели — статистика довольно шаткая, доверительные интервалы у моделей перекрываются.
⚠️ Только про алгоритмические задачи на Python: выводы про код для обработки данных, вёрстку или другие языки могут отличаться — их не проверяли.
⚠️ Субъективность "намерения": что считается "правильным" неявным требованием — решал один человек (авторы), это не абсолютный эталон, а одна разумная интерпретация задачи.
⚠️ Не даёт готового решения: статья описывает проблему и способ её измерить, но не предлагает проверенную технику, как её решать (уточняющие вопросы упомянуты в обзоре других работ, но не протестированы в этом исследовании).
Как исследовали
Исследователи взяли 49 задач из известного бенчмарка HumanEval+ — каждая задача изначально была сформулирована чётко и полно. Авторы вручную "обрезали" формулировку, убрав детали типа "сортировать по возрастанию" или "что делать с пустым вводом", и превратили убранное в отдельные скрытые тесты. Модели (Claude Sonnet 4.6 и GPT-4.1) видели только урезанную версию задачи и один явный тест — 5 решений на каждую задачу.
Дальше каждое решение прогнали через явный тест и через скрытые. Оказалось: обе модели проходят явный тест в 92-94% случаев, но нарушают хотя бы одно скрытое требование в 54,5% (Claude) и 63,5% (GPT-4.1) задач. Самое интересное — результаты по каждой задаче кучковались на полюсах: либо все 5 решений нарушали скрытое требование, либо ни одно. Промежуточных значений почти не было (95% и 91% случаев у двух моделей соответственно).
Это значит, что нарушение — не случайный шум генерации, а системная слепота модели к конкретной невысказанной детали. Авторы проверили честность своих скрытых тестов — прогнали эталонные (правильные) решения через них, все прошли на 100%, значит дело не в кривых тестах, а реально в поведении моделей.
