3,583 papers
arXiv:2510.07315 88 8 окт. 2025 г. FREE

VeriCode: верифицируемые инструкции для оценки кода от LLM

КЛЮЧЕВАЯ СУТЬ
Добавляешь 5 требований к стилю кода (длина строк, docstrings, pathlib вместо os.path) — функциональность падает на 6%, хотя требования НЕ касаются работоспособности. Даже топовые модели выполняют все 5 инструкций одновременно только в 47% случаев. VeriCode — таксономия из 30 автоматически проверяемых инструкций (стиль, логика, документация, обработка ошибок) позволяет измерять не только работоспособность кода, но и следование требованиям. Каждая инструкция проверяется через линтеры и AST-анализ — возвращает pass или fail. Исследователи дополнили классические бенчмарки BigCodeBench и LiveCodeBench этими инструкциями, создав Vibe Checker — среду для оценки обоих параметров.
Адаптировать под запрос

TL;DR

VeriCode — таксономия из 30 верифицируемых инструкций по коду (стиль, логика, документация, обработка ошибок, библиотеки). Каждая инструкция проверяется автоматически через линтеры и AST-анализ — вернёт pass или fail. Исследователи дополнили классические бенчмарки BigCodeBench и LiveCodeBench этими инструкциями, создав Vibe Checker — тестовую среду для оценки как функциональности, так и следования инструкциям.

LLM плохо справляются с несколькими инструкциями одновременно. При добавлении 5 нефункциональных инструкций (например, "макс 79 символов в строке" + "использовать pathlib вместо os.path" + "Google-style docstrings") функциональность падает в среднем на 6%, хотя инструкции не касались работоспособности кода. Даже топовые модели успешно выполняют все 5 инструкций только в 47% случаев на реальных задачах и в 41% на алгоритмических. Модели показывают position bias: инструкции в середине списка выполняются хуже, чем в начале или конце.

Метод работает в двух режимах: single-turn (все инструкции сразу в одном промпте) лучше сохраняет функциональность, но хуже следует инструкциям; multi-turn (инструкции добавляются постепенно) лучше выполняет требования, но чаще ломает работоспособность кода. Главный вывод: человеческие предпочтения в coding tasks коррелируют лучше всего со смесью функциональности и instruction following (оптимум 40-70% веса на IF), а не с одной только работоспособностью.

🔬

Схема метода

VeriCode включает 5 категорий инструкций:

Coding Style & Conventions (9):

  • Длина строк, отступы, именование переменных, порядок импортов

Logic & Code Patterns (9):

  • Количество ветвлений, глубина вложенности, сложность функций, использование определённых паттернов

Documentation & Commenting (6):

  • Стиль docstring (Google/NumPy/PEP 257), комментарии, описание параметров

Error Handling & Management (4):

  • Обработка исключений, канонические классы ошибок, специфичные except-блоки

Library & API Constraints (2):

  • Использование конкретных библиотек (pathlib вместо os.path), замена устаревших API

Каждая инструкция содержит:

  • Категорию
  • Описание на русском/английском для single/multi-turn
  • Настраиваемые параметры (например, line_length: 79 или 88)
  • Код верификатора (возвращает True/False)
🚀

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

Задача: Написать телеграм-бота для уведомлений о новых заказах из CRM. Нужен читаемый код для команды — будут доделывать джуны.

Промпт:

Создай телеграм-бота на Python для отправки уведомлений о новых заказах.

Требования к коду:
1. Максимум 88 символов в строке
2. Используй pathlib вместо os/os.path для работы с файлами
3. Документируй функции в Google-style docstrings
4. Используй специфичные исключения вместо общего Exception
5. Максимум 3 ветвления (if/elif/else) в каждой функции

Бот должен:
- Читать токен из .env файла
- Получать данные о заказах из JSON файла
- Отправлять форматированное сообщение в чат

Результат:

Модель выдаст код, который формально работает, но с вероятностью ~47% будет нарушать хотя бы одно из пяти требований. Чаще всего пострадает инструкция номер 3 (в середине списка) из-за position bias. При этом функциональность может деградировать на 6-9% — например, бот не обработает некоторые edge cases с файлами, которые обработал бы без дополнительных инструкций.

Если дать те же инструкции постепенно (сначала базовый бот, потом "добавь ограничение на длину строк", потом "добавь pathlib", и так далее), код лучше выполнит требования (~55% успеха вместо 47%), но функциональность пострадает сильнее (падение до 9% вместо 6%).

🧠

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

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

Position bias возникает из-за архитектуры трансформеров: attention mechanism уделяет больше внимания началу и концу контекста. Инструкции в середине списка «теряются» даже в коротких промптах (несколько сотен токенов). В single-turn проявляется primacy bias (лучше выполняется первая инструкция), в multi-turn — recency bias (лучше последняя).

Multi-turn vs Single-turn: В single-turn модель видит всю картину сразу и приоритизирует сохранение функциональности. В multi-turn каждая итерация фокусируется на локальной задаче (добавить новое требование), что повышает compliance с инструкциями, но чаще ломает то, что работало раньше — классический edit distance problem.

Корреляция с человеческими предпочтениями показывает: пользователи интуитивно оценивают код по обоим осям — и работоспособность, и стиль/паттерны. Для реальных задач (BigCodeBench) instruction following даже важнее функциональности (коэффициент 0.7 vs 0.3), для алгоритмических задач (LiveCodeBench) — наоборот.

📌

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

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

Порядок инструкций: Самые важные — в начало или конец, второстепенные — в середину. Если используешь multi-turn, критичные требования добавляй последними (recency bias).

Режим взаимодействия: Single-turn для production-кода где функциональность критична. Multi-turn для прототипов или когда стиль/паттерны важнее работоспособности.

Параметры инструкций: VeriCode поддерживает настройку параметров — можешь варьировать line_length (79/88/120), max_branches (2/3/4), docstring_convention (Google/NumPy/PEP257). Более строгие значения → выше шанс нарушения.

📋

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

📌

Для 1-2 инструкций (безопасная зона):

Напиши {описание задачи}.

Требования к коду:
1. {инструкция_1}
2. {инструкция_2}

Задача: {детали}
📌

Для 3+ инструкций (осторожно с функциональностью):

Вариант А — Single-turn (сохраняем функциональность):

Напиши {описание задачи}.

Требования к коду (важные в начале):
1. {критичная_инструкция_1}
2. {второстепенная_инструкция}
3. {второстепенная_инструкция}
4. {критичная_инструкция_2}

Задача: {детали}

Вариант Б — Multi-turn (максимизируем выполнение инструкций):

// Раунд 1:
Напиши {описание задачи}.
Задача: {детали}

// Раунд 2:
Добавь требование: {инструкция_1}

// Раунд 3:
Добавь требование: {инструкция_2}

// И так далее, критичные требования — последними

Конкретные инструкции из VeriCode (примеры):

Стиль:

  • Все строки не длиннее {79/88/120} символов
  • Используй Google/NumPy/PEP257 стиль docstrings
  • Сортируй импорты: стандартная библиотека → сторонние → локальные

Логика:

  • Максимум {2/3/4} ветвлений (if/elif/else) в каждой функции
  • Глубина вложенности не больше {2/3} уровней
  • Cyclomatic complexity ≤ {5/10/15}

Библиотеки:

  • Используй pathlib вместо os.path/os/glob/open
  • Замени все aliased исключения (IOError, WindowsError) на каноничный OSError

Обработка ошибок:

  • Используй специфичные except вместо общего Exception
  • Не используй bare except (кроме SystemExit/KeyboardInterrupt)
⚠️

Ограничения

⚠️ Функциональная регрессия: Добавление 5 нефункциональных инструкций снижает функциональность в среднем на 6% для реальных задач и до 10% для алгоритмических. Чем больше инструкций — тем выше риск.

⚠️ Низкий success rate: Даже топовые модели выполняют все 5 инструкций одновременно только в 40-47% случаев. При 3+ инструкциях большинство моделей падают ниже 50%.

⚠️ Position bias: Инструкции в середине списка (позиции 2-3 из 5) выполняются на 5-10% хуже, чем в начале или конце. Эффект проявляется даже в коротких промптах.

⚠️ Multi-turn trade-off: Постепенное добавление инструкций повышает compliance на 3-8%, но усиливает функциональную регрессию на 3-5% относительно single-turn.

⚠️ Специфика задачи: Метод разработан для Python. Для других языков нужны собственные линтеры и верификаторы. Алгоритмические задачи страдают сильнее реальных (10% vs 6% регрессия).

🔍

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

Исследователи взяли 800+ правил из популярного Python-линтера Ruff, отфильтровали их в три этапа и получили 30 базовых инструкций. Сначала убрали дублирующиеся и слишком узкие правила, потом протестировали на Gemini 2.5 Flash: всё, что выполнялось в 90%+ случаев без потери функциональности — выкинули. Оставили только те, где даже топовые модели спотыкаются. Каждой инструкции написали детерминированный верификатор — либо на базе линтера, либо через AST-анализ.

Дальше дополнили два классических бенчмарка: BigCodeBench (1,140 реальных задач) и LiveCodeBench (1,055 алгоритмических). Для каждой задачи LLM-селектор (Claude 4 Opus) выбрал подмножество из 30 инструкций — только релевантные и не конфликтующие между собой. Получилось более 10,000 проверок на уровне отдельных инструкций.

Протестировали 31 модель из 10 семейств в двух режимах: single-turn (все инструкции сразу) и multi-turn (постепенно). Измеряли два метрика: pass@1 для функциональности и instruction-level/task-level success для выполнения требований. Задача считалась успешной только если ВСЕ инструкции выполнены — отсюда экспоненциальное падение с ростом числа требований.

Почему такие выводы: Multi-turn показал систематический паттерн — лучше IF, хуже функциональность. Это не случайность, а архитектурное свойство: в multi-turn модель на каждой итерации фокусируется на локальной задаче (добавить новое требование), не видя полной картины как в single-turn. Position bias воспроизвёлся на обоих бенчмарках с разными паттернами: U-shape на реальных задачах (lost-in-the-middle), линейный тренд на алгоритмических, но везде — середина хуже краёв.

Связь с human preference: Скоррелировали результаты с 800K+ голосов из LMArena coding subset. Пик корреляции — при смеси метрик (40-70% вес на IF), не на чистой функциональности или чистом IF. Причём для реальных задач IF важнее (оптимум 70%), для алгоритмических — функциональность (оптимум 30%). Это объясняет почему рейтинги Copilot Arena слабо коррелируют с классическими бенчмарками: они измеряют только половину того, что ценят пользователи.

🔗

Ресурсы

Vibe Checker: Aligning Code Evaluation with Human Preference

Ming Zhong, Xiang Zhou, Ting-Yun Chang и команда (Google DeepMind, UIUC, USC)

arXiv:2025.XXXXX (pre-print)

Таксономия VeriCode и верификаторы будут опубликованы в открытом доступе.

Ruff linter: https://docs.astral.sh/ruff/rules

BigCodeBench: https://openreview.net/forum?id=YrycTjllL0

LiveCodeBench: https://openreview.net/forum?id=chfJJYC3iL

LMArena coding leaderboard: https://lmarena.ai/leaderboard/text/coding


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

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

Добавляешь 5 требований к стилю кода (длина строк, docstrings, pathlib вместо os.path) — функциональность падает на 6%, хотя требования НЕ касаются работоспособности. Даже топовые модели выполняют все 5 инструкций одновременно только в 47% случаев. VeriCode — таксономия из 30 автоматически проверяемых инструкций (стиль, логика, документация, обработка ошибок) позволяет измерять не только работоспособность кода, но и следование требованиям. Каждая инструкция проверяется через линтеры и AST-анализ — возвращает pass или fail. Исследователи дополнили классические бенчмарки BigCodeBench и LiveCodeBench этими инструкциями, создав Vibe Checker — среду для оценки обоих параметров.

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

LLM страдает от смещения по позиции (position bias) — инструкции в середине списка выполняются на 5-10% хуже, чем в начале или конце. Это работает даже в коротких промптах из нескольких сотен токенов. Два режима работы: Одним промптом (single-turn): все требования сразу → модель видит полную картину → приоритизирует функциональность → меньше регрессии (6%), но хуже следует инструкциям (47% успеха). Постепенно (multi-turn): добавляешь требования по одному → каждая итерация фокусируется на локальной задаче → лучше выполняет инструкции (55%), но чаще ломает то что работало (9% регрессии).

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

Модель автоматически балансирует между целями: работоспособность, читаемость, стиль, производительность. Добавляешь явные инструкции — модель перераспределяет «вычислительный бюджет» внимания. Часть ресурсов уходит на новые требования в ущерб базовой функциональности. Position bias из-за архитектуры трансформеров: attention mechanism уделяет больше внимания началу и концу контекста. Инструкции в середине «теряются». В одном промпте проявляется primacy bias (лучше выполняется первая инструкция), при постепенном добавлении — recency bias (лучше последняя). Исследование показало: человеческие предпочтения коррелируют со смесью функциональности и следования инструкциям (40-70% веса), а не только с работоспособностью. Для реальных задач стиль даже важнее функциональности.

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

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

Мини-рецепт

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

2. Выбери режим под задачу: Одним промптом — если функциональность важнее стиля (production-код, сложные алгоритмы). Постепенно — если стиль важнее или код простой (утилиты, скрипты для команды)

3. Расположи инструкции с учётом смещения: Самые важные — в начало или конец списка. Второстепенные — в середину. При постепенном добавлении критичные требования добавляй последними

4. Ограничь количество: 1-2 инструкции безопасно, 3-4 заметная регрессия, 5+ высокий риск. Для 5+ требований раздели на несколько промптов

5. Проверь автоматически: используй линтеры (flake8, pylint) и AST-анализ для верификации вместо ручной проверки

Примеры

[ПЛОХО] : Напиши телеграм-бота. Требования: максимум 88 символов в строке, pathlib вместо os.path, Google-style docstrings, специфичные исключения, максимум 3 ветвления в функции — 5 требований одной кучей, критичные (обработка ошибок) потеряются в середине
[ХОРОШО] : Напиши телеграм-бота. Требования к коду (по приоритету): 1. Используй специфичные исключения вместо общего Exception (КРИТИЧНО для отладки) 2. Максимум 88 символов в строке 3. Используй pathlib вместо os.path 4. Максимум 3 ветвления в каждой функции (КРИТИЧНО для читаемости) 5. Google-style docstrings — критичные инструкции в начале и конце, вторичные в середине. Или разбей на 2 промпта: сначала базовый бот с требованиями 1 и 4, потом рефакторинг под требования 2, 3, 5
Источник: Vibe Checker: Aligning Code Evaluation with Human Preference
ArXiv ID: 2510.07315 | Сгенерировано: 2026-01-11 23:27

Проблемы LLM

ПроблемаСутьКак обойти
Множественные требования ломают основную задачуДаёшь модели задачу плюс 3-5 дополнительных требований (стиль, формат, ограничения). Модель перераспределяет внимание: часть уходит на новые требования, качество основной задачи падает. Работает хуже хотя требования не касались функциональности. Проявляется в любых задачах где есть основная цель плюс несколько условийВариант 1: Ограничь до 1-2 требований в одном запросе. Вариант 2: Раздели на этапы — сначала основная задача, потом отдельным запросом "улучши стиль" с конкретными требованиями. Вариант 3: Если нужно 3+ требования, ставь критичные в начало и конец списка — там модель внимательнее
Инструкции в середине списка теряютсяДаёшь список из 5+ пунктов. Модель лучше выполняет первый и последний. Пункты 2-3-4 (середина) выполняются на 5-10% хуже. Архитектура внимания фокусируется на границах контекста даже в коротких промптах. Универсально для любых списков инструкцийСамые важные требования ставь в начало или конец списка. Второстепенные — в середину. Если добавляешь требования постепенно (несколько запросов), критичные давай последними — свежая информация весит больше

Методы

МетодСуть
Single-turn vs Multi-turn для множественных требованийSingle-turn: Все требования в одном запросе. Модель видит полную картину, балансирует между целями, лучше сохраняет качество основной задачи. Но хуже выполняет все требования (особенно в середине списка). Multi-turn: Сначала основная задача, потом поэтапно добавляешь требования ("теперь добавь X", "теперь добавь Y"). Модель фокусируется на каждом локально, выполнение требований выше на 3-8%. Но чаще ломает то что работало — каждая правка вносит риск регрессии. Применяй: Single-turn когда функциональность критична (продакшн-код, точные расчёты). Multi-turn когда форма важнее содержания (шаблоны, стиль, презентации). Для 1-2 требований разницы почти нет

Тезисы

ТезисКомментарий
Дополнительные требования снижают качество основной задачиМодель балансирует между целями автоматически. Добавляешь явные требования (стиль, формат, ограничения) — часть "вычислительного бюджета" уходит туда. Основная задача выполняется хуже даже если требования её не касались. Эффект растёт с количеством: 1-2 требования безопасны, 3-4 заметная просадка, 5+ высокий риск. Применяй: Для сложных задач не добавляй больше 2 дополнительных требований. Остальное делай отдельным запросом на доработку
📖 Простыми словами

VeriCode: верифицируемые инструкции для оценки кода от LLM

arXiv: 2510.07315

Проблема в том, что современные нейронки пишут код, который работает, но выглядит как куча мусора. Ты просишь модель добавить обработку ошибок или не использовать тяжелые библиотеки, а она либо забивает на твои просьбы, либо выдает нерабочий кусок кода. Это происходит потому, что у модели есть ограниченный вычислительный бюджет: когда ты нагружаешь её требованиями к стилю, она начинает лажать в логике. Vibe Checker — это попытка наконец-то измерить этот баланс и понять, насколько модель адекватна в реальных условиях, а не в стерильном тесте.

Это как нанять строителя, который умеет класть кирпич, но постоянно забывает про чертежи и оставляет после себя горы мусора. Формально дом стоит, но жить в нем нельзя, а переделывать — дороже, чем строить заново. Раньше мы проверяли только «стоит ли дом», а теперь Vibe Checker замеряет, не забыл ли рабочий надеть каску, убрал ли он за собой и не использовал ли он синюю изоленту там, где нужен цемент. Если код работает, но нарушает пять твоих условий по стилю — это провал, а не решение.

Чтобы перестать гадать, исследователи выкатили VeriCode — это жесткий список из 30 правил, которые проверяются автоматически через линтеры и суровый анализ кода. Там всё по делу: от обработки ошибок и документации до запрета на конкретные библиотеки. Больше никаких субъективных оценок в духе "ну, вроде симпатично". Система выдает четкий pass или fail по каждой инструкции. Если ты просил код для джунов, а модель выплюнула нечитаемую магию в одну строку — она получает по шапке, даже если алгоритм верный.

Этот подход протестировали на суровых бенчмарках вроде BigCodeBench, и принцип здесь универсален. Неважно, пишешь ты телеграм-бота для CRM или сложную систему аналитики — правила игры одинаковые. Vibe Checker доказывает, что следование инструкциям — это отдельный навык, который часто идет вразрез с чистой производительностью. Теперь мы видим реальную картину: какие модели умеют слушать заказчика, а какие просто штампуют скрипты на коленке, игнорируя контекст и стандарты команды.

Короче, эра «просто работающего кода» закончилась, наступает эпоха управляемой генерации. Хватит радоваться тому, что нейронка выдала хоть что-то — нужно требовать соблюдения стандартов. Vibe Checker дает инструмент, чтобы ткнуть модель носом в её ошибки и заставить её писать код, который не придется переписывать всей командой. Кто научится балансировать между логикой и стилем, тот и выживет в этом зоопарке, остальные будут тонуть в техническом долге, созданном их же ИИ-помощниками.

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

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

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