Описание задачи
Оценка корректности написанного кода для языков 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
: Метрика вычисляет долю точно совпавших с ответом предсказаний модели среди всех обработанных вопросов.