3,583 papers
arXiv:2608.07614 75 7 авг. 2026 г. FREE

IVR: почему код от AI проходит все ваши тесты, но всё равно делает не то, что вы хотели

КЛЮЧЕВАЯ СУТЬ
92-94% тестов пройдено — и в больше половине случаев код всё равно нарушает то, что вы держали в голове, но не написали. Разбор DevIntent показывает: причина не в качестве кода, а в разрыве между вашими словами и вашим замыслом. Фишка находки: модель не деградирует потихоньку — она либо угадывает скрытое требование целиком, либо теряет его полностью. Хуже всего дело с первым по важности невысказанным условием — оно теряется чаще остальных.
Адаптировать под запрос

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%, значит дело не в кривых тестах, а реально в поведении моделей.


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

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

92-94% тестов пройдено — и в больше половине случаев код всё равно нарушает то, что вы держали в голове, но не написали. Разбор DevIntent показывает: причина не в качестве кода, а в разрыве между вашими словами и вашим замыслом. Фишка находки: модель не деградирует потихоньку — она либо угадывает скрытое требование целиком, либо теряет его полностью. Хуже всего дело с первым по важности невысказанным условием — оно теряется чаще остальных.

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

Модель реагирует только на буквальный текст запроса. Всё что не проговорено — она достраивает сама, без вопросов и без предупреждений. Один недосказанный пункт — и модель молча выбирает свою версию, вместо того чтобы спросить у вас. Это как студент на экзамене: не знает точного ответа — не переспрашивает, а уверенно выдаёт похожий на правду.

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

Авторы прогнали 49 задач через два теста: явный (то что вы попросили) и скрытый (то что вы не сказали, но имели в виду). Явный тест проходят 92-94% решений. Скрытый — больше половины кода его проваливает, хотя выглядит полностью рабочим. Среднего варианта почти нет — это бинарный выбор: угадал или не угадал. И теряется чаще всего именно первое по счёту требование — порядок перечисления реально имеет значение.

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

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

Мини-рецепт

1. Перечисли требования по важности: самое критичное условие — первым в промпте, не в конце.
2. Проговори пограничные случаи: что делать с пустым списком, дубликатами, нулевыми значениями.
3. Задай формат вывода явно: порядок строк, тип данных, структура результата.
4. Попроси модель переспросить: добавь фразу Перед тем как писать код, задай мне вопросы про детали, которые я мог не уточнить.

Примеры

[ПЛОХО] : Напиши код, который убирает дубликаты заказов из списка.
[ХОРОШО] : Напиши код, который убирает дубликаты заказов. Дубликат — строки с одинаковым ID клиента и датой заказа. Если дубликаты есть, оставляй последнюю по времени запись. Порядок остальных строк не менять. Если список пустой — верни пустой список, не ошибку.
Источник: DevIntent: How Much Does LLM-Generated Code Violate Developer Intent?
ArXiv ID: 2608.07614 | Сгенерировано: 2026-08-11 05:47

Проблемы LLM

ПроблемаСутьКак обойти
Тесты проверяют слова, а не намерениеКод проходит почти все явные тесты. Но нарушает то, что вы держали в голове и не проговорили. Модель видит только текст запроса. Всё что вы не сказали, она достраивает сама — угадывает правильно или строит свою логику. Без предупреждения о том, какой вариант выбралаПроговаривай явно каждое условие, которое кажется само собой разумеющимся: критерий дубликата, порядок сортировки, обработку пустых значений, формат вывода. Самое критичное требование ставь первым

Методы

МетодСуть
Запрос предположений перед кодом — вскрывает скрытые требованияПеред тем как модель начнёт писать код, попроси её перечислить все предположения по неясным деталям и задать вопросы. Перед тем как писать код, перечисли предположения по неуточнённым деталям и уточни их у меня. Работает потому что вынуждает модель проговорить то, что иначе она достроит сама и не покажет вам. Применяй: любая задача с невысказанными деталями — обработка данных, крайние случаи, порядок вывода. Не работает: если сам не знаешь какой вариант правильный — модель не заменит твоё решение

Тезисы

ТезисКомментарий
Невысказанное требование выполняется всё или ничегоКогда условие не проговорено явно, модель не угадывает его частично. Она либо полностью попадает в задумку — по похожему паттерну из обучения, либо строит свою логику с нуля и теряет намерение целиком. Постепенной деградации почти нет, это бинарный исход. Применяй: не надейся что модель "частично поймёт" сложную неявную деталь. Формулируй её явно — иначе получишь либо полное совпадение, либо полный провал, без страховки посередине
📖 Простыми словами

DevIntent: How Much DoesLLM-Generated Code Violate Developer Intent?

arXiv: 2608.07614

Суть проблемы в том, что AI-кодеры — это не вдумчивые напарники, а исполнительные идиоты с феноменальной памятью. Когда ты просишь нейронку написать код, она не анализирует твои бизнес-цели, а просто предсказывает следующий токен. Если ты не прописал в промпте каждую мелочь — например, как именно сортировать список или что делать, если база данных вернет пустоту, — модель оказывается на развилке. Она либо угадывает твое намерение разработчика, опираясь на типичные примеры из интернета, либо лепит отсебятину, которая ломает логику процесса.

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

Исследование DevIntent четко показывает: здесь нет серой зоны или «почти правильного» кода. Работа с AI — это бинарная лотерея. Либо модель полностью соблюдает твой замысел, либо игнорирует его целиком. Например, ты просишь распарсить таблицу с заказами. Если ты не уточнил, что пустые строки нужно пропускать, AI может либо элегантно их отфильтровать, либо вывалить ошибку в самый неподходящий момент. Среднего не дано: модель не может быть «немножко внимательной» к деталям, которых нет в тексте.

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

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

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

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

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