Code Evaluator adalah anggota deterministik dari family Evaluator AgentLoop. Alih-alih menggunakan model inference, Code Evaluator menyerahkan logika penilaian kepada potongan kode Python atau JavaScript yang Anda tulis dan menjalankannya record per record dalam sandbox. Evaluasi data yang sama berulang kali akan selalu menghasilkan hasil identik, tidak terpengaruh oleh suhu model, peningkatan versi, atau redaksi prompt.
Berbeda dengan evaluator Agent dan evaluator LLM yang bergantung pada model inference, evaluator Code tidak memiliki beban reasoning dan tidak mengonsumsi panggilan model. Ketika standar kualitas dapat diekspresikan dalam kode, evaluator Code umumnya lebih tepat digunakan dan sangat cocok untuk pemeriksaan pass-or-fail dalam jaring pengaman regresi.
Kasus penggunaan
Skenario umum untuk evaluator Code:
Validasi output terstruktur — Penggunaan paling umum. Wajibkan agen mengembalikan JSON valid yang berisi bidang-bidang tertentu, dan beri skor 0 jika ada bidang yang hilang.
Perbandingan jawaban numerik — Bandingkan jumlah, kuantitas, atau hasil perhitungan. Definisikan rentang toleransi dalam kode alih-alih meminta model menilai apakah suatu nilai cukup dekat.
Pemindaian denylist — Pindai output untuk mencari kata sensitif dan frasa terlarang.
Pemeriksaan panjang dan format output — Periksa panjang output, apakah output berisi tabel Markdown, atau apakah output diawali dengan awalan tertentu.
Verifikasi urutan pemanggilan tool — Verifikasi bahwa tool yang diperlukan dipanggil dalam urutan yang diharapkan.
Pemeriksaan kelengkapan sitasi — Verifikasi bahwa setiap nomor sitasi dalam jawaban dapat ditemukan di bagian teks yang diambil (retrieved passages).
Jika standar kualitas Anda bergantung pada penilaian subjektif atau semantik yang tidak dapat diekspresikan dalam kode, gunakan evaluator Agent atau evaluator LLM yang mengandalkan model inference.
Prasyarat
Code Evaluator saat ini tersedia di wilayah berikut:
| Nama Wilayah | ID Wilayah |
| China (Hangzhou) | cn-hangzhou |
| China (Shanghai) | cn-shanghai |
| China (Beijing) | cn-beijing |
| China (Shenzhen) | cn-shenzhen |
| China (Hong Kong) | cn-hongkong |
| Singapura | ap-southeast-1 |
Buat evaluator
Masuk ke Konsol AgentLoop.
Di panel navigasi sebelah kiri, klik Evaluation.
Di bilah navigasi tab di bagian atas halaman, klik tab Evaluator.
Di pojok kanan atas, klik Create Evaluator.
Pada formulir pembuatan, isi informasi dasar. Atur Evaluator Type menjadi Code. Nama tampilan, deskripsi, dan tag bersifat opsional. Tag memungkinkan Anda mengambil evaluator berdasarkan dimensi di daftar evaluator, sehingga berikan tag yang konsisten dan mudah difilter untuk evaluator Code Anda.
| Item konfigurasi | Wajib | Deskripsi |
| Nama evaluator | Ya | Pengidentifikasi unik global, digunakan untuk panggilan API dan pengindeksan sistem. Harus diawali huruf dan hanya boleh berisi huruf, angka, garis bawah, dan tanda hubung. Anda tidak dapat mengubahnya setelah dibuat. |
| Jenis evaluator | Ya | Pilih Code. |
| Nama tampilan | Tidak | Nama yang ramah pengguna yang ditampilkan kepada pengguna. Jika Anda biarkan kosong, nama evaluator akan ditampilkan. |
| Deskripsi | Tidak | Jelaskan konvensi penilaian evaluator ini agar tim Anda dapat menggunakannya kembali. |
| Tag | Tidak | Masukkan tag dan tekan Enter untuk menambahkannya. Anda dapat mengambil evaluator berdasarkan tag. |
Setelah mengisi formulir, klik Create Evaluator untuk mengirimkannya. Halaman edit terbuka dengan dua tab: Basic Information dan Evaluation Code. Di tab Basic Information, nama evaluator dan jenis evaluator bersifat read-only, sedangkan bidang lain tetap dapat diedit. Konfigurasi inti dilakukan di tab Evaluation Code.
Tulis kode evaluasi
Di pojok kanan atas tab Evaluation Code, alihkan antara Python dan JavaScript. Kedua bahasa saling eksklusif, dan nama file di editor berubah menjadi code.py atau code.js sesuai pilihan. Klik Reset to Template untuk memuat templat default resmi sebagai titik awal.
Kode evaluasi Anda berjalan dalam sandbox. Batasan berikut berlaku:
Dependencies — Implementasikan logika evaluasi hanya dengan pustaka standar bahasa pemrograman.
Determinisme — Pertahankan kode dalam bentuk fungsi murni: input yang sama menghasilkan output yang sama.
Isolasi — Kode tidak dapat mengakses layanan eksternal atau bergantung pada status lingkungan eksekusi.
Ini merupakan batasan praktis dari sandbox sekaligus prasyarat agar hasil evaluasi dapat direproduksi dan dipercaya.
Kontrak satu-satunya untuk kode Anda adalah sebagai berikut: definisikan fungsi bernama evaluate yang menerima bidang data sebagai parameter input dan mengembalikan objek yang berisi score dan explanation.
Templat default Python adalah sebagai berikut.
def evaluate(input, output, context=None):
# Evaluasi satu record dan kembalikan skor serta penjelasan.
return {
"score": 0,
"explanation": "Jelaskan mengapa skor ini diberikan",
}Templat default JavaScript adalah sebagai berikut.
function evaluate(input, output, context) {
// Evaluasi satu record dan kembalikan skor serta penjelasan.
return {
score: 0,
explanation: 'Jelaskan mengapa skor ini diberikan',
}
}
module.exports = evaluateBaris module.exports di akhir templat JavaScript wajib ada. Tanpa baris ini, platform tidak dapat memuat fungsi tersebut.
Kontrak nilai kembalian
Fungsi evaluate memproses satu item data per pemanggilan. Hasil yang dikembalikan harus berisi dua bidang berikut.
| Bidang | Type | Deskripsi |
score | Number | Skor untuk item data ini. Rentang nilainya ditentukan oleh kode Anda. |
explanation | String | Alasan pemberian skor. Muncul sebagai Evaluation Rationale pada hasil evaluasi. |
Saat memberikan skor dan menulis penjelasan, ikuti konvensi berikut:
Pertahankan konvensi penskoran tetap — Halaman hasil evaluasi menampilkan skor mentah, rentang skor, dan skor ternormalisasi secara bersamaan. Satu evaluator harus mengembalikan skor dalam rentang yang sama untuk seluruh data agar hasil tetap dapat dibandingkan antarversi. Gunakan 0 dan 1 untuk penilaian biner, serta skala persentase tetap dari 0 hingga 100 atau nilai kontinu dari 0 hingga 1 untuk penilaian bertingkat. Jangan mencampur keduanya. Jika tidak, perbandingan antarversi dan agregasi di Dasbor akan terdistorsi.
Buat penjelasan spesifik — Sebutkan alasan spesifik di balik setiap skor dan sertakan bukti utama di balik penilaian tersebut: nama bidang yang hilang, kata sensitif yang cocok, atau nilai aktual dibandingkan nilai yang diharapkan. Jangan kembalikan pesan samar seperti "tidak memenuhi persyaratan". Informasi ini menjadi petunjuk utama saat Anda memecahkan masalah kesalahan penilaian atau meninjau kembali hasil evaluasi di kemudian hari.
Aturan pemetaan variabel
Tabel Variable Mapping di bawah editor dihasilkan secara otomatis. Platform mengurai parameter input fungsi evaluate Anda, sehingga Anda tidak perlu mendeklarasikan apa pun secara manual. Aturannya:
Parameter tanpa nilai default menjadi variabel wajib.
Parameter dengan nilai default menjadi variabel opsional.
Pada templat Python, input dan output tidak memiliki nilai default, sehingga ditandai sebagai wajib. context memiliki nilai default None, sehingga ditandai sebagai opsional. Pada JavaScript, jika sintaks nilai default tidak digunakan, ketiga parameter dianggap wajib. Untuk membuat variabel opsional, tulis function evaluate(input, output, context = null).
Nama parameter tidak terbatas pada input, output, dan context. Anda dapat menentukan nama parameter sendiri. Objek yang dikembalikan harus selalu berisi bidang score dan explanation.
Variabel Anda muncul di Field Mapping saat Anda membuat tugas evaluasi, tempat Anda menentukan bidang data mana yang dibaca oleh setiap variabel. Anda juga dapat menambahkan deskripsi untuk setiap variabel di tabel Variable Mapping untuk menjelaskan konten yang diharapkan oleh variabel tersebut.
Setelah selesai, klik Save di pojok kanan atas.
Contoh kode
Validasi format
Wajibkan output agen berupa JSON valid yang berisi title dan items, dengan minimal satu item.
def evaluate(input, output, context=None):
import json
text = output if isinstance(output, str) else json.dumps(output, ensure_ascii=False)
try:
data = json.loads(text)
except Exception as e:
return {"score": 0, "explanation": "Output bukan JSON valid: %s" % e}
if not isinstance(data, dict):
return {"score": 0, "explanation": "Level teratas JSON output bukan objek"}
missing = [k for k in ("title", "items") if k not in data]
if missing:
return {"score": 0, "explanation": "Bidang wajib tidak ditemukan: %s" % ", ".join(missing)}
if not isinstance(data["items"], list) or len(data["items"]) == 0:
return {"score": 0, "explanation": "items bukan array, atau merupakan array kosong"}
return {"score": 1, "explanation": "JSON valid dan berisi title serta %d item" % len(data["items"])}Perbandingan toleransi numerik
Bandingkan jawaban numerik dari agen dengan ground truth, dengan memperbolehkan kesalahan relatif sebesar seperseribu. expected adalah variabel kustom yang Anda petakan ke kolom ground truth set data saat membuat tugas evaluasi.
def evaluate(output, expected, tolerance=0.001):
import re
def to_number(v):
if isinstance(v, (int, float)):
return float(v)
m = re.search(r"-?\d+(?:\.\d+)?", str(v).replace(",", ""))
return float(m.group()) if m else None
got, want = to_number(output), to_number(expected)
if want is None:
return {"score": 0, "explanation": "Tidak ditemukan angka di ground truth"}
if got is None:
return {"score": 0, "explanation": "Tidak ditemukan angka di output model"}
denominator = abs(want) if want != 0 else 1.0
diff = abs(got - want) / denominator
if diff <= tolerance:
return {"score": 1, "explanation": "Angka cocok: diharapkan %g, aktual %g" % (want, got)}
return {"score": 0, "explanation": "Deviasi melebihi batas: diharapkan %g, aktual %g, kesalahan relatif %.2f%%" % (want, got, diff * 100)}tolerance memiliki nilai default, sehingga ditandai sebagai opsional dalam pemetaan variabel. Jika Anda tidak memetakan variabel ini dalam tugas, kode akan menggunakan nilai default.
Verifikasi pemanggilan tool
Periksa apakah agen memanggil tool yang diperlukan. Contoh ini melakukan serialisasi konteks tool ke dalam string dan memeriksa apakah setiap nama tool yang diharapkan muncul dalam string tersebut. Karena ini merupakan pencocokan substring pada seluruh konteks, nama tool yang hanya muncul di parameter pemanggilan atau hasil pengembalian juga akan cocok. context biasanya dipetakan ke trace.tool_context dari data jejak.
def evaluate(output, context=None, required_tools="search,summarize"):
import json
expected = [t.strip() for t in str(required_tools).split(",") if t.strip()]
if not expected:
return {"score": 1, "explanation": "Tidak ada tool wajib yang dideklarasikan, sehingga record lolos secara default"}
raw = context if isinstance(context, str) else json.dumps(context or {}, ensure_ascii=False)
called = set()
for name in expected:
if name in raw:
called.add(name)
missing = [t for t in expected if t not in called]
hit_rate = len(called) / len(expected)
if not missing:
return {"score": 1, "explanation": "Semua tool wajib telah dipanggil: %s" % ", ".join(expected)}
return {
"score": round(hit_rate, 2),
"explanation": "Pemanggilan tool tidak ditemukan: %s (%d dari %d cocok)" % (", ".join(missing), len(called), len(expected)),
}Pemeriksaan kualitas berbasis deduksi
Contoh JavaScript yang menggunakan model pengurangan skala persentase. Memeriksa frasa terlarang, panjang output, dan persyaratan format dalam satu proses, serta mengembalikan skor gabungan dan detail pengurangan.
function evaluate(input, output, context = null) {
const text = typeof output === 'string' ? output : JSON.stringify(output)
const banned = ['guaranteed profit', 'guaranteed returns', 'one hundred percent', 'absolutely safe']
let score = 100
const reasons = []
const hits = banned.filter((w) => text.includes(w))
if (hits.length > 0) {
score -= 40 * hits.length
reasons.push(`Frasa terlarang ditemukan: ${hits.join(', ')}`)
}
if (text.trim().length < 20) {
score -= 30
reasons.push(`Respons terlalu pendek: hanya ${text.trim().length} karakter`)
}
if (!/risk disclaimer|for reference only/.test(text)) {
score -= 20
reasons.push('Disclaimer risiko tidak ditemukan')
}
score = Math.max(0, score)
return {
score,
explanation: reasons.length === 0 ? 'Lolos semua pemeriksaan kualitas' : reasons.join('; '),
}
}
module.exports = evaluateGunakan evaluator dalam tugas evaluasi
Setelah menyimpan evaluator, terapkan ke data nyata melalui tugas evaluasi. Di tab Evaluation Task modul Evaluation, klik Create Task. Alur ini terdiri dari dua langkah.
Langkah 1: Konfigurasi Data
Masukkan nama dan deskripsi tugas, lalu pilih sumber data. Sumber data yang didukung adalah jejak (traces), lintasan agen (agent trajectories), log, dan set data. Jika Anda memilih jejak, tentukan juga granularitas evaluasi: percakapan single-turn atau percakapan multi-putaran. Pilih apakah akan menyertakan input dan output dari giliran sebelumnya, serta persempit cakupan evaluasi menggunakan daftar drop-down Agent dan ekspresi filter data.
Langkah 2: Pilih Evaluator
Ini adalah langkah kritis. Area Preview Data di bagian atas halaman menampilkan semua bidang yang tersedia dari satu sampel nyata. Klik Switch Sample untuk memuat sampel lain dan memastikan bentuk data Anda. Di daftar evaluator di sebelah kiri, alihkan ke tab Custom dan pilih evaluator Code yang baru saja Anda buat. Area Field Mapping di sebelah kanan mencantumkan semua variabel evaluator tersebut. Pilih bidang data yang sesuai untuk setiap variabel.
Bidang yang tersedia untuk pemetaan bergantung pada sumber data. Untuk sumber data jejak, bidang berikut tersedia untuk pemetaan.
| Bidang | Konten |
trace.input | Kueri asli pengguna |
trace.output | Jawaban akhir agen |
trace.tool_context | Parameter pemanggilan tool, hasil pengembalian, dan konteks |
trace.agent_trajectory | Rantai eksekusi internal agen |
trace.rag_context | Konteks pengambilan RAG |
trace.rag_retrieval_queries | Pernyataan kueri yang digunakan untuk pengambilan RAG |
trace.rag_retrieval_documents | Bagian dokumen yang diambil oleh RAG |
trace.rag_llm_output | Output model dalam rantai RAG |
traceId | Pengidentifikasi unik jejak |
Setelah memetakan semua variabel wajib, kartu evaluator akan menampilkan tag Ready.
Jalankan uji pratinjau dan lihat hasilnya
Jalankan uji pratinjau sebelum menjalankan secara formal. Klik Run Test di bagian bawah halaman. Panel drawer terbuka di sebelah kanan dan menampilkan nilai bidang dari sampel saat ini. Klik Run Test di dalam drawer untuk menjalankan uji coba evaluator yang dipilih secara batch. Setelah eksekusi selesai, area Evaluation Results menampilkan status, skor, dan alasan evaluasi setiap evaluator. Langkah ini mengungkap sebagian besar masalah sebelum eksekusi formal menghabiskan kuota, seperti pemetaan bidang yang salah, kode yang melempar exception pada bentuk data nyata, atau skor yang tidak sesuai dengan konvensi yang Anda inginkan.
Setelah memastikan hasilnya, klik Create and Run untuk mengirimkan tugas. Halaman detail tugas memiliki tiga tab: Overview, Run Records, dan Evaluation Results.
Run Records — Menampilkan jumlah total, tingkat penyelesaian, jumlah berhasil dan gagal, durasi, serta skor rata-rata setiap eksekusi.
Evaluation Results — Menyediakan tampilan detail dan tampilan item data. Tampilan detail mencantumkan informasi berikut record per record: konten item data, skor, rentang skor, skor ternormalisasi, status, evaluator, durasi evaluasi, dan waktu pembuatan. Anda dapat memfilter hasil berdasarkan status, evaluator, rentang skor, dan jendela waktu.
Jika kode Anda melempar exception yang tidak tertangani pada suatu record, record tersebut akan muncul sebagai record kegagalan eksekusi alih-alih menerima skor. Filter hasil evaluasi berdasarkan status untuk menemukan record-record tersebut. Penyebab umumnya adalah pemetaan bidang yang salah dan bentuk data yang tidak ditangani oleh kode Anda.
Durasi eksekusi satu record evaluator Code biasanya sedikit lebih dari sepuluh detik. Record dalam satu tugas dieksekusi secara konkuren, sehingga tugas dengan sekitar 100 record membutuhkan waktu total sekitar satu menit.
Langkah berikutnya
Gunakan nama evaluator untuk mereferensikan evaluator ini dalam panggilan API.