Описание задачи
Генерация кода на C/C++ с учетом длинного контекста на уровне функций. Датасет содержит
задач.
208
Тестируемые навыки моделей: Instruction Following, Long Context Comprehension, Code Perception, Completion
Авторы: Айдар Валеев, Роман Гараев, Вадим Ломшаков, Ирина Пионтковская, Владимир Иванов, Израэль Адевуйи
Мотивация
YABLoCo — это бенчмарк для генерации кода с учетом длинного контекста, включающий тестовый набор из 208 функций, отобранных из четырёх крупных репозиториев, содержащих тысячи функций. Набор данных включает метаинформацию о функциях, контексты функций с различным уровнем зависимостей, строку документации, тела функций и графы вызовов для каждого репозитория. Цель бенчмарка – генерация тела функции в рамках больших репозиториев объёмом от 200K до 2,000K строк кода (LoC) на языках C и C++, которые ранее не охватывались аналогичными бенчмарками. Хотя бенчмарк в целом допускает использование произвольного поиска контекста по репозиториям, в предоставленной версии используется oracle контекст — функции, извлечённые из графа вызовов, от которых должна зависеть генерируемая функция. Имея на входе oracle context, строку документации и сигнатуру функции, модель генерирует соответствующее тело функции, которое затем тестируется с использованием тестов из репозитория. Модель должна понять код из предоставленного контекста и краткое описание из строки документации, чтобы сгенерировать тело метода, реализующее необходимую функциональность. Оценка производится по двум метрикам: pass@1, отражающей корректность реализованной функциональности, и exact match, высокое значение которой может указывать на переобучение.
Поля датасета
instruction
[str] — Промпт-инструкция для модели, содержащая шаблон для вставки элементов вопроса.inputs
— Вводные данные, формирующие задание для модели. Могут включать одну или несколько модальностей - видео, аудио, изображение, текст.language
[str] — Язык программирования для написания кода (C/C++).signature
[str] — Сигнатура функции.docstring
[str] — Докстринг комментарий к функции.context
[str] — Oracle контекст – функции, извлечённые из графа вызовов, которые вызывает оригинальный код.
outputs
[str] — Правильный ответ на вопрос.meta
— Метаданные, относящиеся к тестовому примеру, но не используемые в вопросе (скрытые от тестируемой модели).id
[int] — Номер-идентификатор вопроса в датасете.original_id
[str] — Идентификатор функции в графе вызовов.repository
[str] — Идентификатор функции в графе вызовов.fname
[str] — Имя функции.file
[str] — Исходный путь к файлу.calls_num
[int] — Количество вызовов целевой функции.dep_num
[int] — Число зависимостей, вызываемых в теле функции.same_file
[int] — Число зависимостей из того же файла, вызываемых в теле функции.same_package
[int] — Число зависимостей из того же пакета, вызываемых в теле функции.project
[int] — Число зависимостей на уровне проекта, вызываемых в теле функции.stdlib
[int] — Число зависимостей из стандартной библиотеки, вызываемых в теле функции.external_binaries
[int] — Число зависимостей из внешних бинарных файлов, вызываемых в теле функции.code_length
[int] — Длина эталонного кода.pos
[int] — Позиция кода в исходном файле.last_commit
[str] — Дата последнего коммита, связанного с телом функции.test_cov_hits
[int] — Количество попаданий по покрытию тестами.
Промпты
Для задачи были подготовлены 11 промптов, которые были равномерно распределены по вопросам по принципу "один вопрос – один промпт". Шаблоны в фигурных скобках в промпте заполняются из полей внутри поля inputs
в каждом вопросе.
Пример:
"Сгенерируйте функцию на языке {language}.
Описание: {docstring}
Контекст: {context}
Сигнатура: {signature}
Выведите только код функции, без объяснений и дополнительного текста.
Формат ответа:```{language} <code>```"
Создание датасета
Крупнейшими и наиболее популярными (по количеству звёзд) выбранными репозиториями GitHub стали: llvm-project, bullet3, openssl и redis. Ограниченное количество репозиториев объясняется высокими затратами на включение большего числа проектов — в частности, необходимостью сборки и компиляции, реализации Dockerfile-файлов, запуска тестов и расчёта покрытия тестами. Из каждого из выбранных репозиториев мы извлекли все функции вместе с их вызовами, датой последнего коммита, комментариями в формате docstring, длиной кода и комментариев, а также числом попаданий в тесты. Вызовы функций были отнесены к одной из следующих пяти категорий: 'none', 'stdlib', 'file', 'package', 'project'. В частности, 'stdlib' — для системных вызовов, 'file' и 'package' — для вызовов внутри одного файла и одного пакета соответственно, 'project' — для вызовов функций на уровне проекта. Если функция не имела зависимостей, она попадала в категорию 'none'. Мы отфильтровали функции с чрезмерно короткой или длинной реализацией, без тестового покрытия или комментариев. Затем были обнаружены и удалены почти дублирующие друг друга фрагменты кода. После этого оставшийся набор функций в каждой категории контекста был отсортирован по дате последнего коммита и числу тестовых попаданий — с приоритетом к более свежим и лучше покрытым тестами функциям. Функции из репозиториев отбирались автоматически, без учёта качества docstring-комментариев. Поэтому качество docstring было дополнительно оценено вручную. В дополнение к сбору и очистке данных мы сгенерировали граф вызовов для каждого репозитория. Граф содержал все функции с уникальными идентификаторами, их вызывающие и вызываемые функции, а также метаданные: длину, путь к файлу, позицию в файле, docstring, дату последнего изменения, количество попаданий в тесты и категорию.
Метрики
Для агрегированной оценки ответов моделей используются следующие метрики:
Pass@1
: Метрика Pass@1 вычисляет среднюю долю успешных случаев среди всех обработанных, где случай считается успешным (оценка 1), если первое сгенерированное решение проходит все модульные тесты, и неуспешным (оценка 0) в противном случае.
Exact Match
: Метрика Exact match вычисляет среднее по оценкам всех обработанных вопросов, где оценка имеет значение 1, если предсказанная строка точно совпадает с правильным ответом, и 0 в остальных случаях.