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

CodeCorrectness

Таксономии
Instruction Following
Code Perception
Simulation
Error Classification
Метрика
EM
Языки
Python
Go
Java

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

Оценка корректности написанного кода для языков Python, Java, Go. Под корректностью кода подразумевается отсутствие любых ошибок, включая SyntaxError, RuntimeError и др., а также успешное прохождение тестов. Датасет содержит 1361 задачу.

Тестируемые навыки моделей: Instruction Following, Code Perception, Simulation, Error Classification

Авторы: Елена Бручес, Иван Бондаренко, Даниил Гребёнкин, Олег Седухин, Роман Дерунец, Георгий Мкртчян, Вадим Альперович, Николай Бушков, Станислав Моисеев

Мотивация

Предполагается, что в процессе обучения модель не только учится писать код и решать различные задачи, но также учится и анализировать код, например, является ли код корректным, содержит ли ошибки и т.д. Данный датасет был разработан для автоматической оценки этой способности моделей. Для модели, выполняющей оценку успешности кода, необходимо ограничить контекст. Чтобы понять, является ли код успешно выполнимым, мы собрали такие пары {focal_code - test_code}, которые не содержат импортов из других файлов проектов, а также в данных парах не используются assets (например, загрузка данных из файлов).

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

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

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

  • instruction [str] — Промпт-инструкция для модели, содержащая шаблон для вставки элементов вопроса;
  • inputs — Вводные данные, формирующие задание для модели. Могут включать одну или несколько модальностей - видео, аудио, изображение, текст;
    • focal_code [str] — Исходный код фокального файла;
    • test_code [str] — Исходный код тестового файла;
    • lang [str] — Язык программирования данного примера;
  • outputs [str] — Ответ модели, должен быть success или failed;
  • meta — Метаданные, относящиеся к тестовому примеру, но не используемые в вопросе (скрытые от тестируемой модели);
    • id [int] — Номер-идентификатор вопроса в датасете.

Промпты

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

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

Вот код из фокального файла на языке {lang}:

{focal_code}

Проверь, корректен ли тест для этого кода:

{test_code}

Дай короткий ответ: если тест пройдет без ошибок, скажи "success", иначе — "failed".

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

Создание датасета состояло из нескольких этапов:

1) Автоматический поиск, парсинг и обработка открытых репозиториев GitHub по критериям популярности (количество "звездочек"), актуальности (даты последних коммитов) и компилируемости (проверка на успешность сборки проекта и компиляции тестов/фокальных файлов);

2) Формирование сэмплов датасета из данных (тестовых и фокальных файлов) репозитория в следующем формате: код фокального файла | код тест-кейса;

3) Далее были сформированы 2 сабсета: original (исходные тест-кейсы), generated (сгенерированные LLM тест-кейсы);

4) Для данных, полученных в этих сабсетах, было выполнено тэгирование, где каждый тэг представлял собой какую-то характеристику тест-кейса или фокального файла (количество строк в тест-кейсе, количество строк в фокальном файле, синтаксическая корректность, наличие импортов определенных видов и т.п.);

5) Данные датасета были отфильтрованы по этим тэгам так, чтобы LLM могла решить задачу определения корректности тест-кейса по инпуту;

6) Из отфильтрованных данных была сформирована конечная версия датасета.

Метрики

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

Exact Match: Метрика вычисляет долю точно совпавших с ответом предсказаний модели среди всех обработанных вопросов.