Этот репозиторий содержит официальный код и данные для статьи «Генерация кода от естественного языка на уровне класса с помощью итеративных рассуждений, дополненных инструментами над репозиторием», которая будет представлена на Международной конференции по машинному обучению 2024 года, посвященной исследованиям машинного обучения, ориентированным на данные ( Семинар DMLR на ICML'24).
Наша работа знакомит:
Альтернативное название, используемое в целях анонимности: Генерация кода на уровне класса на основе естественного языка с использованием итеративного, расширенного инструментами рассуждения над репозиторием.
LLM продемонстрировали значительный потенциал в задачах генерации кода, достигнув многообещающих результатов на уровне функций или операторов в различных тестах. Однако сложности, связанные с созданием артефактов кода, таких как классы, особенно в контексте реальных репозиториев программного обеспечения, остаются недостаточно изученными. Предыдущие исследования рассматривали генерацию на уровне классов как изолированную задачу, игнорируя сложные зависимости и взаимодействия, которые характеризуют реальные программные среды.
Чтобы устранить этот пробел, мы представляем RepoClassBench, комплексный тест, предназначенный для тщательной оценки LLM при создании сложного кода на уровне классов в реальных репозиториях. RepoClassBench включает задачи «Генерация классов из естественного языка» для Java, Python и C# из ряда репозиториев. Мы гарантируем, что каждый класс в нашем наборе данных не только имеет межфайловые зависимости внутри репозитория, но также включает соответствующие тестовые примеры для проверки его функциональности. Мы обнаружили, что текущие модели не справляются с реальными задачами, поставленными нашим тестом, в первую очередь из-за их ограниченного взаимодействия с соответствующими контекстами репозитория.
Чтобы устранить этот недостаток, мы представляем Retieve-Repotools-Reflect (RRR), новый подход, который снабжает LLM инструментами статического анализа для итеративной навигации и анализа контекста уровня репозитория в агентной среде. Наши эксперименты показывают, что RRR значительно превосходит существующие базовые показатели RepoClassBench, демонстрируя свою эффективность на разных языках программирования и в различных условиях. Наши результаты подчеркивают острую необходимость в тестах генерации кода, включающих зависимости на уровне репозитория, чтобы более точно отражать сложности разработки программного обеспечения.
Наша работа показывает преимущества использования специализированных инструментов для улучшения понимания LLM контекста репозитория.
data
: Содержит содержимое набора данных RepoClassBench и метаданные для инициализации конвейера оценочной программы. Более подробная информация здесь.repoclassbench
: содержит код для инициализации сред репозитория для Java, C# и Python; взять кусок кода класса и измерить его корректность по отношению к тестовым сценариям в репозитории. Более подробная информация здесь.repotools
: содержит реализацию инструментов статического анализа, используемых агентной платформой в нашей работе для анализа репозитория.rrr
: код для агента RRR, взаимодействующего с оценочной системой для решения эталонных задач.project_utils
: общие служебные функции, используемые в проекте. Язык | Количество задач |
---|---|
Ява | 130 |
Питон | 97 |
С# | 60 |
Данные теста производительности находятся в data/input
с отдельными файлами для Python, Java и C#. Каждый файл содержит следующие атрибуты для каждой задачи:
task_id
: уникальный идентификатор для каждой задачи в тесте.class_name
: Имя тестируемого класса.file_name
: путь к файлу, содержащему основную реализацию класса в репозитории.detailed_description
: Подробное описание класса, используемое агентом/LLM для генерации кода.sketchy_description
: Менее подробное описание класса, предоставляющее альтернативное приглашение для генерации кода.repo_metadata
: информация о репозитории, содержащем класс, включая:repo_name
commit_id
evaluation_metadata
: Данные для оценки корректности сгенерированного кода:ground_truth_class_body
: правильная реализация тестируемого класса. Чтобы начать работу над проектом, выполните следующие действия:
git clone https://github.com/microsoft/repoclassbench
cd repoclassbench
conda create --name repoclassbench_env python=3.11
conda activate repoclassbench_env
pip install -r requirements.txt
Прежде чем оценивать свой конвейер/настройку, убедитесь, что необходимые среды и репозитории в оценочном пакете настроены правильно. В противном случае реальная реализация одной или нескольких задач на трех языках может оказаться неудачной. Выполните следующие тесты, чтобы убедиться в правильной настройке:
# To ensure harness is setup for C#
pytest -x repoclassbench/tests/test_csharp.py
# To ensure harness is setup for Java
pytest -x repoclassbench/tests/test_java.py
# To ensure harness is setup for Python
pytest -x repoclassbench/tests/test_python.py
Если вы готовы увидеть, как ваш подход к генерации кода соотносится с нашим тестом, вы найдете пример кода, который поможет вам начать работу, в каталоге repoclassbench/tests
. Следуйте этому пошаговому руководству, чтобы протестировать свой код для конкретной задачи:
Начните с создания объекта Dataset
для языка программирования, с которым вы работаете. Например, если вы тестируете код Python, вы должны написать:
from repoclassbench . dataset import Dataset
# Initialize the dataset for Python with detailed specifications
dataset = Dataset ( language = "python" , specification = "detailed" , delete_relatives = False )
Затем выберите задачу из набора данных для тестирования вашего кода. Вы можете сделать это, получив объект task
, используя его уникальный идентификатор ( task_id
):
# Replace 'task_id' with the actual ID of the task you want to test
task = dataset . get_instance_and_setup_env ( task_id )
Получите инструменты оценки для задачи. Это даст вам объект TaskData
, который включает в себя оценщик, описание класса, который необходимо сгенерировать, и расположение соответствующего репозитория кода.
# Get the evaluator from the task object
evaluator = task . evaluator
# The path to the repository files and the class description are also available
repository_path = task . repo_dir
description_to_use = task . description
Наконец, пришло время посмотреть, как работает сгенерированный код. Используйте оценщик, чтобы протестировать свой код и распечатать результаты.
# 'code_test' should be replaced with the class code generated by your approach
evaluation_results = evaluator . evaluate ( code_test )
# Display the outcome of the evaluation
print ( "Number of passed testcases: " , evaluation_results . passed_tests )
print ( "Number of failed testcases: " , evaluation_results . failed_tests )
print ( "Did the code compile/pass linter checks: " , evaluation_results . compile_status )
print ( "Error feedback from the harness: " , evaluation_results . error_feedback )
Не забудьте заменить code_test
фактическим кодом, сгенерированным вашим подходом. Оценщик проверит ваш код в тестовых примерах и предоставит информацию о том, сколько тестов было пройдено, сколько неудачных, успешно ли скомпилирован код, а также о любых обнаруженных ошибках.
Пожалуйста, рассмотрите возможность цитирования следующей статьи при использовании нашего кода и тестового теста.
@inproceedings{deshpande2024classlevelcodegenerationnatural,
title={Natural Language to Class-level Code Generation by Iterative Tool-augmented Reasoning over Repository},
author={Ajinkya Deshpande and Anmol Agarwal and Shashank Shet and Arun Iyer and Aditya Kanade and Ramakrishna Bairi and Suresh Parthasarathy},
booktitle={ICML 2024 Workshop on Data-Centric Machine Learning Research},
year={2024},
url={https://openreview.net/forum?id=yqjr7ojVYa}
}
Этот проект приветствует вклад и предложения. Большинство вкладов требует от вас согласия с Лицензионным соглашением для авторов (CLA), в котором говорится, что вы имеете право и действительно предоставляете нам права на использование вашего вклада. Подробную информацию можно найти на странице https://cla.opensource.microsoft.com.
Когда вы отправляете запрос на включение, бот CLA автоматически определяет, нужно ли вам предоставить CLA, и соответствующим образом оформляет PR (например, проверку статуса, комментарий). Просто следуйте инструкциям бота. Вам нужно будет сделать это только один раз во всех репозиториях, используя наш CLA.
В этом проекте принят Кодекс поведения Microsoft с открытым исходным кодом. Для получения дополнительной информации см. часто задаваемые вопросы о Кодексе поведения или свяжитесь с нами по адресу [email protected], если у вас возникнут дополнительные вопросы или комментарии.
Этот проект может содержать товарные знаки или логотипы проектов, продуктов или услуг. Разрешенное использование товарных знаков и логотипов Microsoft регулируется и должно соответствовать Руководству Microsoft по товарным знакам и брендам. Использование товарных знаков или логотипов Microsoft в измененных версиях этого проекта не должно вызывать путаницу или подразумевать спонсорство Microsoft. Любое использование товарных знаков или логотипов третьих лиц регулируется политикой этих третьих сторон.