Repositori ini berisi kode dan data resmi untuk makalah "Pembuatan Kode Bahasa Alami ke Tingkat Kelas dengan Penalaran Augmented Alat Iteratif atas Repositori", yang akan dipresentasikan pada Konferensi Internasional 2024 tentang Lokakarya Pembelajaran Mesin tentang Penelitian Pembelajaran Mesin Berpusat Data ( Lokakarya DMLR di ICML'24).
Pekerjaan kami memperkenalkan:
Judul alternatif yang digunakan untuk tujuan anonimitas: Pembuatan Kode Tingkat Kelas dari Bahasa Alami Menggunakan Penalaran Berulang dan Ditingkatkan Alat melalui Repositori
LLM telah menunjukkan potensi yang signifikan dalam tugas pembuatan kode, mencapai hasil yang menjanjikan pada tingkat fungsi atau pernyataan di berbagai tolok ukur. Namun, kompleksitas yang terkait dengan pembuatan artefak kode seperti kelas, khususnya dalam konteks repositori perangkat lunak dunia nyata, masih belum tereksplorasi. Penelitian sebelumnya memperlakukan pembuatan tingkat kelas sebagai tugas yang terisolasi, mengabaikan ketergantungan & interaksi rumit yang menjadi ciri lingkungan perangkat lunak dunia nyata.
Untuk mengatasi kesenjangan ini, kami memperkenalkan RepoClassBench, sebuah tolok ukur komprehensif yang dirancang untuk mengevaluasi LLM secara ketat dalam menghasilkan kode tingkat kelas yang kompleks dalam repositori dunia nyata. RepoClassBench menyertakan tugas "Pembuatan Bahasa Alami ke Kelas" di seluruh Java, Python & C# dari sejumlah repositori pilihan. Kami memastikan bahwa setiap kelas dalam kumpulan data kami tidak hanya memiliki ketergantungan lintas file dalam repositori tetapi juga menyertakan kasus pengujian yang sesuai untuk memverifikasi fungsinya. Kami menemukan bahwa model saat ini kesulitan menghadapi tantangan realistis yang ditimbulkan oleh tolok ukur kami, terutama karena terbatasnya paparan terhadap konteks repositori yang relevan.
Untuk mengatasi kekurangan ini, kami memperkenalkan Retrieve-Repotools-Reflect (RRR), sebuah pendekatan baru yang melengkapi LLM dengan alat analisis statis untuk menavigasi & mempertimbangkan konteks tingkat repositori secara berulang dalam kerangka kerja berbasis agen. Eksperimen kami menunjukkan bahwa RRR secara signifikan mengungguli baseline yang ada di RepoClassBench, menunjukkan efektivitasnya di seluruh bahasa pemrograman & dalam berbagai pengaturan. Temuan kami menekankan kebutuhan penting akan tolok ukur pembuatan kode untuk menggabungkan ketergantungan tingkat repo agar lebih akurat mencerminkan kompleksitas pengembangan perangkat lunak.
Pekerjaan kami menunjukkan manfaat memanfaatkan alat khusus untuk meningkatkan pemahaman LLM tentang konteks repositori.
data
: Berisi konten himpunan data RepoClassBench dan metadata untuk menginisialisasi pipeline harness evaluasi. Lebih detailnya di sini.repoclassbench
: Berisi kode untuk menginisialisasi lingkungan repositori untuk Java, C# dan Python; untuk mengambil sepotong kode kelas dan mengukur kebenarannya sehubungan dengan kasus uji di repositori. Lebih detailnya di sini.repotools
: Berisi implementasi alat analisis statis yang digunakan oleh kerangka agen dalam pekerjaan kita untuk mempertimbangkan repositori.rrr
: Kode untuk agen RRR yang berinteraksi dengan rangkaian evaluasi untuk menyelesaikan tugas benchmarkproject_utils
: Fungsi utilitas umum yang digunakan di seluruh proyek Bahasa | Jumlah Tugas |
---|---|
Jawa | 130 |
ular piton | 97 |
C# | 60 |
Data benchmark terletak di data/input
, dengan file terpisah untuk Python, Java, dan C#. Setiap file berisi atribut berikut untuk setiap tugas:
task_id
: Pengidentifikasi unik untuk setiap tugas di benchmark.class_name
: Nama kelas yang sedang diuji.file_name
: Jalur ke file yang berisi implementasi kebenaran dasar kelas dalam repositori.detailed_description
: Deskripsi kelas yang terperinci, digunakan oleh agen/LLM untuk menghasilkan kode.sketchy_description
: Deskripsi kelas yang kurang mendetail, memberikan perintah alternatif untuk pembuatan kode.repo_metadata
: Informasi tentang repositori yang berisi kelas, antara lain:repo_name
commit_id
evaluation_metadata
: Data untuk menilai kebenaran kode yang dihasilkan:ground_truth_class_body
: Implementasi yang benar dari kelas yang sedang diuji. Untuk memulai proyek ini, ikuti langkah-langkah berikut:
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
Sebelum mengevaluasi alur/penyiapan Anda, verifikasi bahwa lingkungan dan repositori yang diperlukan dalam rangkaian evaluasi telah disiapkan dengan benar. Jika tidak, implementasi kebenaran dasar dari satu atau lebih tugas dalam tiga bahasa tersebut mungkin gagal. Jalankan tes berikut untuk memastikan pengaturan yang benar:
# 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
Jika Anda siap untuk melihat bagaimana pendekatan pembuatan kode Anda dibandingkan dengan tolok ukur kami, Anda akan menemukan kode contoh untuk membantu Anda memulai di direktori repoclassbench/tests
. Ikuti panduan langkah demi langkah ini untuk menguji kode Anda pada tugas tertentu:
Mulailah dengan membuat objek Dataset
untuk bahasa pemrograman yang Anda gunakan. Misalnya, jika Anda menguji kode Python, Anda akan menulis:
from repoclassbench . dataset import Dataset
# Initialize the dataset for Python with detailed specifications
dataset = Dataset ( language = "python" , specification = "detailed" , delete_relatives = False )
Selanjutnya, pilih tugas dari kumpulan data untuk menguji kode Anda. Anda dapat melakukan ini dengan mengambil objek task
menggunakan pengidentifikasi uniknya ( 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 )
Ambil alat evaluasi untuk tugas tersebut. Ini akan memberi Anda objek TaskData
, yang mencakup evaluator, deskripsi kelas yang perlu Anda buat, dan lokasi penyimpanan kode yang relevan.
# 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
Terakhir, saatnya melihat kinerja kode yang Anda buat. Gunakan evaluator untuk menguji kode Anda dan mencetak hasilnya.
# '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 )
Ingatlah untuk mengganti code_test
dengan kode aktual yang dihasilkan oleh pendekatan Anda. Evaluator akan menjalankan kode Anda terhadap kasus pengujian dan memberikan umpan balik tentang berapa banyak pengujian yang lulus, berapa banyak yang gagal, apakah kode berhasil dikompilasi, dan kesalahan apa pun yang ditemui.
Harap pertimbangkan untuk mengutip makalah berikut saat menggunakan kode dan tolok ukur kami.
@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}
}
Proyek ini menyambut baik kontribusi dan saran. Sebagian besar kontribusi mengharuskan Anda menyetujui Perjanjian Lisensi Kontributor (CLA) yang menyatakan bahwa Anda berhak, dan memang benar, memberi kami hak untuk menggunakan kontribusi Anda. Untuk detailnya, kunjungi https://cla.opensource.microsoft.com.
Saat Anda mengirimkan permintaan tarik, bot CLA akan secara otomatis menentukan apakah Anda perlu memberikan CLA dan menghiasi PR dengan tepat (misalnya, pemeriksaan status, komentar). Cukup ikuti instruksi yang diberikan oleh bot. Anda hanya perlu melakukan ini sekali di seluruh repo menggunakan CLA kami.
Proyek ini telah mengadopsi Kode Etik Sumber Terbuka Microsoft. Untuk informasi lebih lanjut lihat FAQ Pedoman Perilaku atau hubungi [email protected] jika ada pertanyaan atau komentar tambahan.
Proyek ini mungkin berisi merek dagang atau logo untuk proyek, produk, atau layanan. Penggunaan resmi atas merek dagang atau logo Microsoft tunduk dan harus mengikuti Pedoman Merek Dagang & Merek Microsoft. Penggunaan merek dagang atau logo Microsoft dalam versi modifikasi proyek ini tidak boleh menimbulkan kebingungan atau menyiratkan sponsor Microsoft. Segala penggunaan merek dagang atau logo pihak ketiga tunduk pada kebijakan pihak ketiga tersebut.