Bisakah AI Benar-Benar Menulis Kode? Cara Mengukur Kemampuan AI Model dalam Pemrograman
Metrik evaluasi memainkan peran penting dalam pertumbuhan suatu bidang karena menentukan standar untuk membedakan antara model yang baik dan buruk. Dalam bidang sintesis kode pemrograman, metrik evaluasi yang umum digunakan adalah BLEU atau akurasi sempurna (perfect accuracy), tetapi keduanya tidak cukup cocok untuk mengevaluasi kode. BLEU awalnya dirancang untuk mengevaluasi bahasa alami, mengabaikan fitur sintaksis dan semantik penting dari kode, dan akurasi sempurna terlalu ketat, sehingga meremehkan output yang berbeda dengan logika semantik yang sama.
Untuk mengatasi hal ini, Ren et al. [1] memperkenalkan metrik evaluasi otomatis baru, yang dijuluki CodeBLEU. Metrik ini menyerap kekuatan BLEU dalam pencocokan n-gram, dan lebih lanjut memasukkan informasi sintaksis kode melalui Abstract Syntax Trees (AST) dan semantik kode melalui Data-Flows.
Mengapa Bukan BLEU?
Meskipun BLEU [2] telah menjadi golden standard untuk menerjemahkan bahasa manusia, ia gagal menangkap sifat unik dari kode pemrograman:
- Keyword Terbatas vs Jutaan Kata: Berbeda dengan bahasa alami dengan kosakata yang luas, kode menggunakan set keywords yang terbatas. Kata kunci ini lebih penting daripada token lainnya dan harus mendapatkan bobot yang lebih tinggi dalam evaluasi.
- Struktur Pohon vs Struktur Sekuensial: Bahasa alami biasanya diproses secara sekuensial (dari kiri ke kanan), tetapi kode secara mendasar bersifat hierarkis, yang direpresentasikan oleh AST.
- Instruksi Unik vs Semantik Ambigu: Bahasa alami bergantung pada konteks dan ambigu. Kode, bagaimanapun, dirancang untuk menjadi deterministik, di mana ketergantungan variabel (data-flow) menentukan logikanya.
Formula CodeBLEU
CodeBLEU didefinisikan sebagai weighted combination dari empat skor berbeda:
Di mana:
- adalah hyperparameter yang jumlahnya sama dengan 1.
- adalah pencocokan n-gram tertimbang.
- adalah pencocokan AST sintaksis.
- adalah pencocokan data-flow semantik.
Contoh Kasus
Di seluruh artikel ini, kita akan menelusuri keempat komponen CodeBLEU menggunakan satu contoh yang konsisten. Perhatikan evaluasi fungsi square berikut:
Kode Referensi:
public static int square(int x) {
int y = x * x;
return y;
}Kode Kandidat:
public static int square(int x) {
int y = x * x;
return x;
}Satu-satunya perbedaan adalah pada return statement: kandidat mengembalikan input x alih-alih hasil perhitungan y. Ini adalah kesalahan semantik yang halus namun kritis, jenis kesalahan yang sulit dideteksi oleh BLEU standar.
Kita akan menghitung keempat skor langkah demi langkah:
- BLEU (overlap n-gram standar)
- BLEU_weight (n-gram dengan penguatan kata kunci)
- Match_ast (pencocokan subtree AST)
- Match_df (pencocokan grafik data-flow)
...dan kemudian menggabungkannya ke dalam skor CodeBLEU akhir.
1. Weighted N-Gram Match
BLEU orisinal membandingkan n-gram antara kandidat dan referensi serta menghitung rasio n-gram yang cocok. Namun, ia memperlakukan semua token secara setara. Dalam bahasa pemrograman, token tertentu (seperti kata kunci) lebih kritis untuk logika program daripada yang lain (seperti nama variabel).
CodeBLEU memperkenalkan Weighted N-Gram Match untuk menetapkan bobot yang berbeda pada token yang berbeda. Dalam makalah aslinya, kata kunci diberikan bobot 5 kali lebih tinggi daripada token lainnya.
Weighted n-gram precision dihitung sebagai:
Di mana menunjukkan bobot yang diberikan pada n-gram tersebut. Saat ini, hal ini diterapkan pada unigram ().
Contoh: Proses Pembobotan
Pertimbangkan contoh fungsi square kita. Kita membandingkan kandidat yang salah mengembalikan input alih-alih yang dihitung.
*Gambar 1: Pembobotan ulang token dalam CodeBLEU. Kata kunci seperti public diperkuat untuk menangkap kepentingan strukturalnya.*
Distribusi bobot yang dihasilkan memastikan bahwa ketidakcocokan kata kunci (misalnya, menukar int dengan float) menghukum skor lebih berat daripada ketidakcocokan pengenal (identifier).
Perhitungan: Weighted vs Standard N-Grams
Mari kita hitung skor untuk contoh kasus square kita.
Pertama, kita melakukan tokenisasi pada kode referensi dan kandidat. Keduanya berisi tepat 20 token.
1. Standard BLEU (Unigram overlap):
- Kandidat memiliki
xtambahan dan kehilangany. - 19 dari 20 token cocok (dengan clipping diterapkan).
- Skor BLEU =
2. Weighted BLEU ():
- Keywords (Weight 5.0): Ada 6 kata kunci (
public,static,int,int,int,return). . - Token Lainnya (Weight 1.0): Ada 14 token lainnya. .
- Total Bobot Referensi: .
- Bobot yang Cocok: Semua 6 kata kunci cocok dengan sempurna (+30.0). Dari 14 token lainnya, 13 cocok (+13.0). Total bobot yang cocok = 43.0.
- Skor =
Perhatikan bahwa sebenarnya lebih tinggi daripada BLEU standar di sini! Karena kesalahan tersebut melibatkan penukaran identifier (x untuk y), kata kunci dengan bobot tinggi berhasil cocok, sehingga mendorong skor tata bahasa naik. Ini membuktikan dengan sempurna mengapa kita juga harus memeriksa logika struktural dan semantik.
2. Syntactic AST Match
Bahasa pemrograman memiliki struktur pohon alami yang disebut Abstract Syntax Tree (AST). CodeBLEU menggunakan ini dengan mencocokkan subtree antara kandidat dan referensi.
Setiap node dalam AST mewakili sebuah construct (misalnya, MethodDeclaration, BinaryExpression). Daun (leaves), nama variabel dan fungsi, dihapus karena struktur sintaksis adalah yang paling penting di sini.
Skor pencocokan AST adalah:
Di mana:
- adalah jumlah total subtree dalam referensi.
- adalah jumlah subtree kandidat yang cocok.
Visualisasi: Perbandingan Struktural
Dalam kandidat kita, pernyataan return mengembalikan x alih-alih y. Namun, karena pencocokan AST berfokus pada struktur tata bahasa dan menghapus leaves nama variabel, "mengembalikan variabel lokal" menghasilkan subtree yang persis sama.
*Gambar 2: Karena nama node leaves dikecualikan, struktur AST untuk mengembalikan `x` atau `y` benar-benar identik. AST memastikan integritas struktural tetapi melewatkan aliran logis.*
Perhitungan: Skor AST Match
Untuk contoh kasus kita:
- Menghasilkan AST tree-sitter dan menghapus variable name leaves menghasilkan tepat 12 subtree.
- Karena logika struktural (Return Statement -> Identifier) identik antara kandidat dan referensi, ke-12 subtree tersebut terpetakan 1-ke-1 dengan sempurna.
- Skor =
Dengan BLEU pada 95.0 dan AST Match pada 100.0, kandidat terlihat hampir sempurna. Di sinilah semantic data-flow berperan untuk mendeteksi critical bug tersebut.
3. Semantic Data-flow Match
Meskipun AST menangkap struktur sintaksis, terkadang ia melewatkan logika semantik. CodeBLEU mengatasi hal ini dengan menggunakan Data-Flow Graphs untuk mengukur kesamaan semantik.
Dalam grafik data-flow, node mewakili variabel dan edge mewakili sumber nilai-nilainya. Misalnya, dalam fungsi square kita, variabel y bergantung pada x, dan nilai return harus bergantung pada y.
Langkah Perhitungan Data-Flow
- Ekstrak Grafik: Identifikasi node variabel dan hubungannya (dari mana setiap nilai berasal).
- Normalisasi: Abaikan nama variabel dan posisi. Semua variabel diganti namanya menjadi format yang seragam (
var_0,var_1, dst). - Perhitungan Akurasi:
Visualisasi: Kesenjangan Semantik
Kesalahan semantik kandidat terlihat jelas saat membandingkan grafik data-flow. Node return pada kandidat menunjuk kembali ke input x, melewati perhitungan dalam y.
*Gambar 3: Tangkapan semantic data-flow. Tautan yang hilang antara perhitungan (y) dan penggunaan akhirnya (return) mengungkap kesalahan logis yang mendalam.*
Perhitungan: Pencocokan Penentu
Mari kita evaluasi pencocokan semantik untuk contoh kasus kita:
Data-Flow Referensi:
- Nilai
yberasal darix RET(pernyataan return) berasal dariy
(Total sisi referensi = 2)
Data-Flow Kandidat:
- Nilai
yberasal darix RETberasal darix
Membandingkan sisi-sisi yang dinormalisasi:
- Sisi
y <- xcocok. - Referensi mengharapkan
RET <- y, tetapi kandidat memilikiRET <- x. Ini adalah ketidakcocokan!
Skor =
Perhitungan CodeBLEU Akhir
Sekarang kita menggabungkan semua komponen untuk mendapatkan skor akhir. Menggunakan bobot yang didistribusikan secara merata (), kita jumlahkan:
Kesimpulan: Skor BLEU berbasis teks murni melaporkan nilai 95.0 yang menipu. Dengan menangkap anomali data-flow, CodeBLEU sangat menghukum kesalahan logis tersebut, menurunkan skor evaluasi sebenarnya menjadi 85.67, yang secara sempurna mencerminkan penilaian manusia.
4. Hasil Eksperimen & Korelasi
Efektivitas CodeBLEU dievaluasi pada tiga tugas dunia nyata: Text-to-Code, Penerjemahan Kode, dan Penyempurnaan Kode. Para peneliti menghitung Koefisien Korelasi Pearson untuk memeriksa seberapa baik CodeBLEU cocok dengan penilaian manusia dibandingkan dengan metrik tradisional.
Peningkatan Kinerja Utama
CodeBLEU menunjukkan peningkatan signifikan dalam mencocokkan skor yang diberikan oleh programmer:
| Tugas | BLEU & Manusia | CodeBLEU & Manusia | Peningkatan |
|---|---|---|---|
| Text-to-code | 0.967 | 0.977 | +1.0% |
| Code translation | 0.940 | 0.970 | +3.0% |
| Code refinement | 0.923 | 0.979 | +5.6% |
Optimal Hyperparameter
Melalui studi ablasi, para penulis menemukan bahwa meningkatkan bobot pencocokan Syntactic AST dan Semantic Data-Flow menghasilkan korelasi manusia yang lebih baik. Konfigurasi yang direkomendasikan untuk sintesis kode umum adalah:
Ini memberikan total bobot 80% pada karakteristik struktural dan logis dari kode, alih-alih hanya tumpang tindih token n-gram.
Kesimpulan
CodeBLEU mewakili langkah maju yang besar dari pencocokan teks sederhana (BLEU) dan pemeriksaan logika kaku (Perfect Accuracy). Dengan menggabungkan weighted n-grams, pencocokan subtree AST, dan pemeriksaan ketergantungan data-flow, metrik ini memberikan penilaian yang lebih holistik dan selaras dengan manusia untuk mengevaluasi model sintesis kode.
Metrik ini dapat mempercepat pengembangan agen penghasil kode yang lebih andal dan logis secara matematis.