이 저장소에는 2024년 데이터 중심 기계 학습 연구에 관한 기계 학습 워크숍에 관한 국제 컨퍼런스에서 발표될 "저장소에 대한 반복 도구 증강 추론을 통한 자연어에서 클래스 수준 코드 생성으로의 자연 언어" 논문의 공식 코드와 데이터가 포함되어 있습니다. ICML'24의 DMLR 워크숍).
우리의 작업은 다음을 소개합니다:
익명성 목적으로 사용되는 대체 제목: 리포지토리에 대한 반복적이고 도구 강화된 추론을 사용하여 자연어에서 클래스 수준 코드 생성
LLM은 코드 생성 작업에서 상당한 잠재력을 입증하여 다양한 벤치마크 전반에 걸쳐 함수 또는 명령문 수준에서 유망한 결과를 달성했습니다. 그러나 특히 실제 소프트웨어 리포지토리의 맥락에서 클래스와 같은 코드 아티팩트를 생성하는 것과 관련된 복잡성은 아직 충분히 탐구되지 않은 상태로 남아 있습니다. 이전 연구에서는 클래스 수준 생성을 격리된 작업으로 취급하고 실제 소프트웨어 환경을 특징짓는 복잡한 종속성과 상호 작용을 무시했습니다.
이러한 격차를 해소하기 위해 실제 리포지토리 내에서 복잡한 클래스 수준 코드를 생성할 때 LLM을 엄격하게 평가하도록 설계된 포괄적인 벤치마크인 RepoClassBench를 소개합니다. RepoClassBench에는 다양한 리포지토리에서 Java, Python 및 C# 전반에 걸쳐 "자연 언어에서 클래스 생성" 작업이 포함되어 있습니다. 우리는 데이터 세트의 각 클래스가 저장소 내에서 파일 간 종속성을 가질 뿐만 아니라 기능을 확인하기 위한 해당 테스트 사례도 포함하는지 확인합니다. 우리는 현재 모델이 관련 저장소 컨텍스트에 대한 노출이 제한되어 있기 때문에 벤치마크에서 제기된 현실적인 문제로 인해 어려움을 겪고 있음을 발견했습니다.
이러한 단점을 해결하기 위해 에이전트 기반 프레임워크에서 저장소 수준 컨텍스트를 반복적으로 탐색하고 추론할 수 있는 정적 분석 도구를 LLM에 장착하는 새로운 접근 방식인 RRR(Retrieve-Repotools-Reflect)을 소개합니다. 우리의 실험에서는 RRR이 RepoClassBench의 기존 기준보다 훨씬 뛰어난 성능을 보여 프로그래밍 언어와 다양한 설정에서 효율성을 보여줍니다. 우리의 연구 결과는 소프트웨어 개발의 복잡성을 보다 정확하게 반영하기 위해 리포지토리 수준 종속성을 통합하는 코드 생성 벤치마크의 중요한 필요성을 강조합니다.
우리의 작업은 전문 도구를 활용하여 LLM의 저장소 컨텍스트에 대한 이해를 향상시키는 이점을 보여줍니다.
data
: 평가 하니스 파이프라인을 초기화하기 위한 RepoClassBench 데이터세트 콘텐츠와 메타데이터가 포함되어 있습니다. 자세한 내용은 여기를 참조하세요.repoclassbench
: Java, C# 및 Python용 리포지토리 환경을 초기화하는 코드가 포함되어 있습니다. 클래스 코드 조각을 가져와 저장소의 테스트 케이스와 관련하여 정확성을 측정합니다. 자세한 내용은 여기를 참조하세요.repotools
: 저장소에 대해 추론하기 위해 작업에서 에이전트 프레임워크가 사용하는 정적 분석 도구의 구현이 포함되어 있습니다.rrr
: 벤치마크 작업을 해결하기 위해 평가 도구와 상호 작용하는 RRR 에이전트용 코드project_utils
: 프로젝트 전반에 걸쳐 사용되는 공통 유틸리티 함수 언어 | 작업 수 |
---|---|
자바 | 130 |
파이썬 | 97 |
기음# | 60 |
벤치마크 데이터는 Python, Java 및 C#에 대한 별도의 파일과 함께 data/input
에 있습니다. 각 파일에는 각 작업에 대한 다음 속성이 포함되어 있습니다.
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_id
)를 사용하여 task
객체를 가져와서 이를 수행할 수 있습니다.
# 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 오픈 소스 행동 강령을 채택했습니다. 자세한 내용은 행동 강령 FAQ를 참조하거나 추가 질문이나 의견이 있는 경우 [email protected]으로 문의하세요.
이 프로젝트에는 프로젝트, 제품 또는 서비스에 대한 상표나 로고가 포함될 수 있습니다. Microsoft 상표 또는 로고의 승인된 사용에는 Microsoft의 상표 및 브랜드 지침이 적용되며 이를 따라야 합니다. 이 프로젝트의 수정된 버전에 Microsoft 상표 또는 로고를 사용하면 혼동을 일으키거나 Microsoft 후원을 암시해서는 안 됩니다. 제3자 상표 또는 로고의 사용에는 해당 제3자의 정책이 적용됩니다.