Вернуться к списку задач

CodeLinterEval

Таксономии
Instruction Following
Code Perception
Style Guides
Review
Метрика
pass@k
Языки
Python

Описание задачи

Оценка генерации корректного кода на основе некорректного кода и списка ошибок/предупреждений от линтера. Датасет содержит 110 примеров.

Тестируемые навыки моделей: Instruction Following, Code Perception, Style Guides, Review, Editing

Авторы: Владимир Викулов, Антон Быков, Кирилл Пихтовников

Мотивация

Бенчмарк направлен на выявление способностей моделей для генерации и исправление кода на основе ошибок от линтера.

Датасет ориентирован на:

- Кодогенерирующие модели (например, Codex, CodeLlama, StarCoder, GPT-4), способные исправлять код на основе линтерных ошибок.

- Модели, специализирующиеся на рефакторинге и исправлении кода (например, DeepSeek-R1, CodeT5).

- Мультимодальные модели, если они умеют работать с кодом и текстовыми инструкциями.

Не подходит для:

- Моделей без понимания кода (например, чисто текстовые LLM без дообучения на code).

- Моделей, не поддерживающих Python.

- Моделей, тонко настроенных на решение задачи FIM(Fill-in-the-middle).

Результаты оценки могут быть полезны:

- Разработчикам инструментов для автоматического рефакторинга кода (например, IDE-плагины);

- Исследователям в области генерации и исправления кода;

- Инженерам, оценивающим качество code generation моделей.

Результаты бенчмарка покажут насколько хорошо модель справляется с исправлением кода по линтерным ошибкам, что означает, что модель может быть полезна для:

- автоматического исправления кода,

- улучшения качества кода в IDE,

- обучения новичков писать "чистый" код.

Если модель плохо справляется, значит, она либо не понимает линтерные ошибки, либо не умеет правильно применять исправления.

В бенчмарке оценивается:

1. Понимание линтерных ошибок – способность правильно интерпретировать сообщения типа E111, E231 и т.д.

2. Корректный рефакторинг кода – умение вносить исправления, сохраняя логику программы.

3. Следование стилю кода (PEP 8) – правильные отступы, пробелы, форматирование.

4. Контекстное понимание кода – модель не должна ломать логику при исправлении стиля.

Линтерные ошибки – частый случай в разработке, и автоматическое исправление экономит время.

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

Если модель исправляет код в соответствии с feedback и линтер не обнаруживает ошибок после проверки результатов генерации - значит результат корректен.

Если ошибки сохраняются или появляются новые - модель не решает поставленную задачу.

Метрикой является pass@k, определяемая на результатах успешности проверки линтером относительно общего объема датасета.

Описание датасета

Поля датасета

Каждый вопрос в датасете содержит следующие поля:

  • instruction [str] — Промпт-инструкция для модели, содержащая шаблон для вставки элементов вопрос;.
  • inputs — Вводные данные, формирующие задание для модели. Могут включать одну или несколько модальностей - видео, аудио, изображение, текст;
    • code [str] — Строка, содержащая код на Python с ошибками;
    • feedback [str] — Строка, содержащая описание ошибок от линтера;
  • outputs [str] — Одномерный массив строк размера n_samples, где n_samples - количество сэмплов, требуемое для подсчета метрики pass@k;
  • meta — Метаданные, относящиеся к тестовому примеру, но не используемые в вопросе (скрытые от тестируемой модели):
    • id [int] — Номер-идентификатор вопроса в датасете;
    • canonical_code [str] — каноническое решение задачи (код без ошибок/предупреждений линтера) задания.

Промпты

Для задачи были подготовлены 10 промптов, которые были равномерно распределены по вопросам по принципу "один вопрос – один промпт". Шаблоны в фигурных скобках в промпте заполняются из полей внутри поля inputs в каждом вопросе.

Пример промпта:

Перепиши код с учетом ошибок, полученных от линтера. Ошибки указывают на критические слабые места: потенциальные баги, уязвимости безопасности и нарушения принципов чистого кода. Исправь ВСЕ указанные ошибки без исключений, сохрани исходную логику программы, строго соблюдай PEP-8 для Python, не добавляй комментарии и объяснения. \nЗамечания линтера:\n{feedback}\n\nКод:\n{code}\nПриведите ответ в формате, соответствующем шаблону для ответа:\n```python\n<code> ```

Создание датасета

Для создания качественного датасета, где модель должна исправлять код на основе линтерных ошибок, необходимо:

1. В качестве исходного датасета было выбрано подмножество из датасета mbpp.

2. Для каждого примера кода был запущен линтер flake8 для выявления ошибок.

3. В итоговый датасет попали только те примеры, которые имели не менее 1 ошибки.

4. Для получения канонических решений код был вручную исправлен экспертами и повторно проверен линтером.

5. Результаты проверки линтером сохранены в виде строк с кодом ошибки и ее описанием от линтера и сохранены в поле feedback (например,

"E111 indentation is not a multiple of four, E231 missing whitespace after ','")

Метрики

Для агрегированной оценки ответов моделей используются следующие метрики:

pass@k: Метрика pass@k измеряет долю тестовых случаев, которые программа проходит, от общего количества тестовых случаев