3,583 papers
arXiv:2608.13742 76 13 авг. 2026 г. FREE

ISO-обогащение требований к коду: детальные спецификации качества побеждают однострочные пожелания

КЛЮЧЕВАЯ СУТЬ
Просишь LLM «напиши эффективный код» — и каждый раз получаешь разное: то с лишними проверками, то без них, то вообще не то, что имел в виду. Метод ISO-обогащения требований позволяет получать предсказуемый результат по нужному качеству кода — без угадывания и без разброса между попытками. Вместо одной мутной фразы даёшь модели три части: смысл качества для задачи, 2-4 конкретных правила и измеримые критерии проверки — модель перестаёт гадать, начинает выполнять список. Разброс между разными формулировками одной и той же задачи резко падает.
Адаптировать под запрос

TL;DR

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

Однострочные пожелания типа "напиши эффективный код" оставляют слишком много места для угадывания: модель каждый раз по-разному трактует, что значит "эффективно". Хуже — если настойчиво просить "правильно обрабатывать ошибки", модель начинает добавлять избыточные проверки и try/except, которые меняют поведение программы и могут сломать тесты, ожидающие точный результат.

Метод прост: вместо одной фразы про качество дай модели структуру из трёх частей — что это качество значит для задачи, конкретные правила (2-4 пункта), и измеримые критерии проверки, привязанные именно к этому качеству (а не к "прохождению тестов"). Причём формат — обычный текст или JSON — роли не играет. Важно содержание, не упаковка.


🔬

Схема метода

ШАГ 1: Назови качество, которое хочешь получить → фраза (например, "читаемость")
ШАГ 2: Опиши смысл — что это значит именно для этой задачи → 1-2 предложения
ШАГ 3: Перечисли конкретные правила (императивные требования) → список 2-4 пункта
ШАГ 4: Задай критерии приёмки — измеримые, привязанные к качеству, НЕ к "тесты прошли" → список

Все четыре шага — в одном промпте, вместе с самой задачей на код.


🚀

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

Задача: Владелец небольшого интернет-магазина просит Claude написать Python-скрипт для обработки файла с заказами (CSV), и хочет, чтобы через полгода в этом коде можно было легко разобраться и что-то поправить — сам он не программист, но код будет отдавать фрилансеру на доработку.

Промпт:

Напиши функцию на Python, которая читает файл orders.csv (колонки: 
дата, клиент, товар, сумма) и выводит сводку продаж по товарам за месяц.

Дополнительно — требование к качеству кода:

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

Правила:
- Разбей логику на отдельные функции с одной задачей каждая
- Не делай вложенность условий и циклов больше 2 уровней
- Используй понятные имена переменных, а не x, tmp, data1

Критерии приёмки:
- Каждая функция помещается на экран без скролла
- Нет повторяющихся блоков кода (copy-paste)
- У каждой функции есть короткий докстринг, что она делает

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


🧠

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

Одна фраза "сделай код качественным" — слишком расплывчата. Модель каждый раз по-своему решает, что это значит, и результат непредсказуем.

LLM хорошо следует конкретным, разбитым на пункты инструкциям — чёткие правила и измеримые критерии оставляют меньше места для угадывания.

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

Рычаги управления: - Название качества → замени на своё ("производительность", "безопасность", "простота использования") - Список правил → добавляй/убирай пункты под конкретную задачу - Критерии приёмки → делай их измеримыми: не "код должен быть хорошим", а "функция не длиннее 20 строк"

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


📋

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

{твоя задача на код}

Дополнительно — требование к качеству кода:

Качество: {название качества, например "читаемость" или "надёжность"}
Смысл: {что это значит для этой конкретной задачи, 1-2 предложения}

Правила:
- {правило 1}
- {правило 2}
- {правило 3}

Критерии приёмки:
- {как проверить, что качество достигнуто — конкретно и измеримо}

Подставь свою задачу в {твоя задача на код}, а качество и правила — под то, что важно именно тебе (скорость, читаемость, устойчивость к ошибкам ввода и т.д.).

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

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

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

LLM спросит, какое именно качество тебе важно (скорость? читаемость? надёжность?) и что оно значит для твоей задачи — потому что без этого правила и критерии будет невозможно написать конкретно.


⚠️

Ограничения

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

⚠️ Обработка ошибок может навредить: подробное требование "правильно обрабатывай ошибки" иногда заставляет модель добавлять избыточные защитные проверки, которые меняют ожидаемое поведение программы.

⚠️ Формат не важен: не трать время, превращая требования в JSON или таблицы — обычный подробный текст работает так же хорошо, как структурированный формат.

⚠️ Проверено на небольших самодостаточных задачах (алгоритмические функции вроде "напиши функцию сортировки"). Для больших реальных проектов с множеством файлов эффект не проверялся.


🔍

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

Исследователи взяли модель gpt-5.4 и попросили её решить 164 стандартные программистские задачки (HumanEval) четырьмя способами формулировки требований к качеству: обычная одна строка ("избегай code smell"), подробный текст на основе стандарта ISO/IEC 25010, и тот же самый контент, но упакованный в JSON. Для каждого варианта прогнали 10 разных формулировок запроса, чтобы проверить, насколько сильно результат зависит от того, как именно сформулирован промпт.

Сравнивали по двум осям: правильно ли решена задача (по тестам) и насколько чистый получился код (по показаниям статического анализатора — сколько "грязных" паттернов и нечитаемых конструкций).

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


🔗

Ресурсы

Pereira, J. P. M., Garcia, V. C. — Does ISO-Grounded NFR Specification Improve LLM Code Generation? (SBCARS 2026, Universidade Federal de Pernambuco, Brazil). Опирается на методологию RobuNFR и стандарт ISO/IEC 25010:2023.


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

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

Просишь LLM «напиши эффективный код» — и каждый раз получаешь разное: то с лишними проверками, то без них, то вообще не то, что имел в виду. Метод ISO-обогащения требований позволяет получать предсказуемый результат по нужному качеству кода — без угадывания и без разброса между попытками. Вместо одной мутной фразы даёшь модели три части: смысл качества для задачи, 2-4 конкретных правила и измеримые критерии проверки — модель перестаёт гадать, начинает выполнять список. Разброс между разными формулировками одной и той же задачи резко падает.

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

Разбей мутное пожелание на три части — смысл, правила, критерии — и оставь модели минимум места для интерпретации. Формат не важен: обычный текст работает так же, как JSON — значение имеет только содержание, а не упаковка. Один рычаг — три ручки: меняешь название качества, список правил и критерии под конкретную задачу, а структуру не трогаешь.

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

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

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

Генерация кода → для отдельных функций и модулей, где важна конкретная характеристика кода (читаемость, поддерживаемость, скорость), особенно когда код отдаётся другому человеку на доработку. Не подходит как замена тестам на правильность результата, и не проверялся на больших многофайловых проектах.

Мини-рецепт

1. Назови качество: конкретное слово — читаемость, скорость, устойчивость к ошибкам ввода
2. Опиши смысл: 1-2 предложения — что это качество значит именно для твоей задачи
3. Дай правила: 2-4 конкретных императивных требования, не общие пожелания
4. Задай критерии приёмки: измеримые, привязанные к качеству, НЕ к «тесты прошли»
5. Осторожно с ошибками: если важен точный результат — не дави на «обрабатывай все ошибки», модель начнёт ловить исключения там, где не просили

Примеры

[ПЛОХО] : Напиши функцию для обработки CSV, сделай код чистым и эффективным
[ХОРОШО] : Напиши функцию для orders.csv. Качество: поддерживаемость. Смысл: код должен понять фрилансер с первого взгляда. Правила: функции с одной задачей каждая, вложенность не больше 2 уровней, понятные имена переменных. Критерии приёмки: каждая функция без скролла, нет повторов кода, докстринг у каждой функции
Источник: Does ISO-Grounded NFR Specification Improve LLM Code Generation? A Comparison of Rich and Structured Interventions against a Natural-Language Baseline
ArXiv ID: 2608.13742 | Сгенерировано: 2026-08-17 05:22

Проблемы LLM

ПроблемаСутьКак обойти
Общее пожелание по качеству кода даёт нестабильный результатПросишь "напиши эффективный код" или "обрабатывай ошибки правильно". Модель каждый раз по-своему решает, что значит "эффективно" или "правильно". Результат скачет от попытки к попытке. Проблема касается любого требования к коду: скорость, читаемость, безопасностьЗамени одну фразу на структуру: смысл качества для задачи, 2-4 конкретных правила, измеримые критерии приёмки. Всё — в одном промпте вместе с задачей на код
Просьба обрабатывать ошибки меняет поведение программыПросишь модель "правильно обрабатывать ошибки". Модель добавляет лишние try/except там, где не просили. Код перехватывает исключения и возвращает не тот результат. Тесты, ожидающие точное значение, ломаютсяНе проси про обработку ошибок слишком настойчиво, если важен точный результат работы кода. Указывай конкретно: какие ошибки обрабатывать и как — не "обрабатывай всё", а список случаев

Методы

МетодСуть
Структурированное требование к качеству кода — три части вместо одной фразыВместо "сделай код быстрым" дай: (1) название качества, (2) смысл — что оно значит именно для этой задачи, (3) 2-4 конкретных правила, (4) измеримые критерии приёмки, привязанные к этому качеству, а не к "тесты прошли". Всё в одном промпте с самой задачей. Работает потому что чёткие пункты не оставляют модели места для угадывания — она выполняет конкретный список условий вместо трактовки размытого слова. Применяй: для любых требований к качеству кода — скорость, читаемость, безопасность. Не поможет: если нужна гарантия правильности логики — для этого нужны отдельные тесты на реальных данных
📖 Простыми словами

Does ISO-Grounded NFR Specification ImproveLLMCode Generation? A Comparison of Rich and Structured Interventions against a Natural-LanguageBaseline

arXiv: 2608.13742

Суть в том, что когда ты просишь нейронку написать код и просто бросаешь фразу «сделай по красоте» или «чтобы работало быстро», ты играешь в рулетку. У LLM нет встроенного понимания «качества» — для неё это пустой звук. Исследование доказывает: чтобы код не превращался в мусор, нужно использовать ISO-ориентированные спецификации NFR (нефункциональных требований). Это когда ты не просто просишь «хороший код», а даёшь модели жёсткую структуру правил и критериев проверки. Только так можно заставить машину выдавать стабильный результат, а не гадать на кофейной гуще.

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

В работе сравнили обычный текст и структурированные интервенции. Выяснилось, что детальное описание правил и конкретные критерии того, как мы будем проверять код, работают в разы лучше. Если ты просишь скрипт для обработки CSV и добавляешь требования по сопровождаемости (чтобы фрилансер потом не проклял тебя), модель перестает лепить костыли. Она начинает использовать внятные имена переменных и логичную структуру, потому что ты явно прописал, что код должен быть понятен человеку со стороны. Разброс результатов падает, а предсказуемость растет.

Хотя тестировали это на коде, принцип универсален. Это работает везде, где есть риск получить «среднюю температуру по больнице». Будь то написание юридического договора, создание маркетинговой стратегии или технического задания — если ты не используешь ISO-подход к требованиям, ты получаешь случайный результат. SEO для кода больше не работает, теперь нужно проектирование смыслов. Любая сложная задача требует не просто промпта, а полноценной структуры, которая не дает модели уйти в творческий запой.

Короче: хватит надеяться на «ум» нейронки — она просто статистический попугай. Если хочешь, чтобы код не развалился через неделю, забудь про короткие хотелки и внедряй структурированные NFR. Либо ты тратишь время на описание критериев качества в запросе, либо потом тратишь в десять раз больше времени, пытаясь исправить ту херню, которую она нагенерировала. Четкая структура бьет креативность в 10 случаях из 10, когда речь идет о надежности.

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

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

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