Kembali ke blog

AI untuk pemulaPanduan

Uji prompt Anda pada 20 kasus: penilaian exact match dalam Python

Bangun set tes 20 kasus, nilai prompt dengan exact match menggunakan skrip Python singkat, dan lihat apakah perubahan prompt benar-benar membantu.

Oleh CheapTokens TeamDiterbitkan 6 menit baca

Sampul: potongan kode yang membandingkan jawaban model dengan label yang diharapkan, berjudul Uji prompt Anda pada 20 kasus
Di halaman ini
  1. Bangun set tes: 20 pesan dan jawaban yang Anda harapkan
  2. Skrip: kirim setiap kasus, bandingkan, cetak yang meleset
  3. Ubah satu hal, jalankan lagi
  4. Set yang sama, model lain: apakah skornya bertahan?
  5. Di mana exact match berhenti berfungsi

Prompt Anda berhasil pada dua pesan yang Anda coba. Apakah itu berarti prompt tersebut berfungsi? Belum. Jalankan pada 20 pesan nyata dengan jawaban yang diketahui, hitung berapa banyak yang benar, dan baca yang meleset. Skrip Python singkat melakukan penghitungan, dan ketika Anda mengubah prompt, skrip yang sama memberi tahu apakah perubahan itu membantu alih-alih mengandalkan firasat.

Dokumentasi Anthropic tentang mendefinisikan kriteria keberhasilan dan membangun evaluasi (diperiksa 7 November 2026) mengatakannya dengan kata-kata mereka sendiri: buat tes spesifik untuk tugas Anda, sertakan kasus-kasus yang canggung, dan utamakan banyak pertanyaan yang dinilai otomatis daripada sedikit yang dinilai manual. Berikut adalah versi terkecil dari itu yang dapat Anda jalankan hari ini.

Empat langkah: 20 kasus dikirim ke model, jawaban dibandingkan dengan exact match, dan Anda mendapatkan skor akurasi plus yang meleset
Seluruh metode: kasus masuk, satu angka dan daftar yang meleset keluar

Bangun set tes: 20 pesan dan jawaban yang Anda harapkan#

Katakanlah Anda menyortir pesan pelanggan ke dalam tiga tumpukan: positif, negatif, atau campuran. Buka file bernama cases.csv dan tuliskan 20 pesan yang benar-benar mungkin Anda terima, masing-masing dengan label yang Anda akan berikan. Tulis label sebelum Anda menjalankan apa pun. Jika Anda menyalin jawaban model sebagai "benar", tes hanya bisa setuju dengan model.

csv
text,label
"Arrived a day early and works perfectly. Thank you!",positive
"The charger stopped working after two days.",negative
"Great screen, but the battery barely lasts until lunch.",mixed
"Support answered in five minutes and fixed it.",positive
"I waited three weeks and nobody replied.",negative
"Oh great, another update that deletes my settings.",negative
"Nice design. Pity about the price.",mixed
"Exactly what I ordered.",positive
"The box was crushed, but the headphones inside are fine and sound great.",mixed
"Refund took 10 days. Never again.",negative
"Love it!!",positive
"Cheaply made, but honestly it does the job for the price.",mixed
"Worst purchase of the year.",negative
"Five stars. Would buy again.",positive
"Fast delivery, wrong colour.",mixed
"It's fine. Not amazing, not terrible.",mixed
"Zero issues in six months of daily use.",positive
"The app crashes every time I open the camera.",negative
"Thanks for nothing.",negative
"Setup was a pain, but once it ran, it's been rock solid.",mixed

Lihat campurannya: 6 positif, 7 negatif, 7 campuran. Kalimat sarkastik ("Oh bagus, pembaruan lagi…", "Terima kasih untuk tidak apa-apa.") dan yang borderline ("Tidak apa-apa. Tidak luar biasa, tidak buruk.") sengaja ada di sana. Set yang hanya berisi pesan jelas akan mendapat skor 100% dan tidak mengajari Anda apa pun. Ambil yang nyata dari kotak masuk, tiket, atau ekspor obrolan Anda sendiri; kasus tepi adalah yang sudah Anda tahu menjengkelkan.

Mengapa 20? Itu ukuran awal, bukan angka dari dokumentasi (contoh mereka menggunakan 1.000 tweet). Dua puluh cukup kecil untuk ditulis tangan dalam setengah jam dan cukup besar sehingga satu jawaban yang beruntung tidak menentukan skor.

Skrip: kirim setiap kasus, bandingkan, cetak yang meleset#

Rencananya memiliki empat langkah, dan kode mengikutinya baris demi baris.

Urutkan

Urutkan loop eval

  1. Muat 20 kasus dari CSV
  2. Kirim setiap pesan ke model dengan prompt Anda
  3. Bandingkan jawaban dengan label Anda
  4. Cetak akurasi dan kasus yang gagal

Loop hanya berfungsi ketika label ada sebelum panggilan model pertama, dan kegagalan muncul terakhir karena itulah yang Anda baca dan tindak lanjuti.

Instal SDK dengan pip install openai dan simpan kunci di variabel lingkungan bernama CHEAPTOKENS_API_KEY. API apa pun yang kompatibel dengan OpenAI bekerja dengan cara yang sama; di sini skrip mengarah ke CheapTokens dan GLM-5.3-Flash (detail penyiapan ada di dokumentasi).

python
import csv
import os
from openai import OpenAI

client = OpenAI(
    base_url='https://api.cheaptokens.dev/v1',
    api_key=os.environ['CHEAPTOKENS_API_KEY'],
)
MODEL = 'zai-org/GLM-5.3-Flash'

PROMPT = (
    'Classify the customer message as positive, negative or mixed. '
    'Answer with one word only.'
)


def ask(text):
    r = client.chat.completions.create(
        model=MODEL,
        temperature=0,
        max_tokens=100,
        messages=[
            {'role': 'system', 'content': PROMPT},
            {'role': 'user', 'content': text},
        ],
    )
    return r.choices[0].message.content or ''


with open('cases.csv', newline='', encoding='utf-8') as f:
    cases = list(csv.DictReader(f))

correct, failed = 0, []
for case in cases:
    got = ask(case['text'])
    ok = got.strip().strip('.').lower() == case['label']
    correct += ok
    if not ok:
        failed.append((case['text'], case['label'], got.strip()))

print(f'Accuracy: {correct}/{len(cases)} = {correct / len(cases):.0%}')
for text, want, got in failed:
    print(f'- {text!r}: expected {want}, got {got!r}')

Tiga detail perlu diperhatikan lebih cermat.

  • temperature=0 menjaga jawaban tetap stabil, sehingga perubahan skor berasal dari prompt Anda dan bukan dari keberuntungan.
  • max_tokens=100 jauh lebih besar dari yang dibutuhkan label satu kata. Jika jawaban pernah kembali kosong atau terpotong, periksa finish_reason; panduan finish_reason "length" menunjukkan apa yang harus dinaikkan.
  • Baris penilaian adalah resep dokumentasi, strip().lower() dibandingkan dengan jawaban yang benar, ditambah satu tambahan: baris itu juga menghapus titik di akhir, karena "Negative." dan "negative" adalah jawaban yang sama bagi Anda.

Apa yang Anda lihat saat dijalankan? Satu baris akurasi, lalu satu baris per yang meleset. Katakanlah proses pertama mencetak ini:

text
Accuracy: 14/20 = 70%
- 'Oh great, another update that deletes my settings.': expected negative, got 'positive'
- "It's fine. Not amazing, not terrible.": expected mixed, got 'positive'
…

(Angka di sini adalah asumsi untuk menunjukkan bentuk keluaran; milik Anda akan berbeda.) Sarkasme dan kata-kata borderline adalah jenis pesan yang cenderung dilewatkan oleh prompt pendek. Intinya adalah Anda tidak lagi menebak: Anda memiliki daftar.

Ubah satu hal, jalankan lagi#

Sekarang bagian yang berguna. Baca yang meleset, pilih penyebabnya, ubah prompt di satu tempat dan jalankan ulang. Satu perubahan pada satu waktu, jika tidak Anda tidak akan tahu edit mana yang menggerakkan skor.

Bandingkan

Prompt v1 → v2: tambahkan aturan dan dua contoh

v1

text
Classify the customer message as positive, negative or mixed.
Answer with one word only.

v2

text
Classify the customer message as positive, negative or mixed.
Sarcasm counts as negative. Praise plus a complaint is mixed.
Answer with one word only.

Message: Lovely colour, but it arrived with a scratch.
Answer: mixed

Message: Sure, thanks a lot. Now my order is lost.
Answer: negative

Dua contoh itu dibuat-buat, dan itu disengaja. Jangan pernah memasukkan pesan dari cases.csv ke dalam prompt sebagai contoh: model kemudian akan dinilai pada jawaban yang Anda berikan, dan skornya akan meningkat secara palsu. Ini adalah teknik few-shot; set tes adalah yang memberi tahu Anda apakah itu berhasil. Jika prompt v1 Anda masih kabur, cara menulis prompt yang baik adalah tempat untuk memulai sebelum Anda mengukur.

Tempel v2 ke PROMPT (tiga tanda kutip berfungsi untuk beberapa baris) dan jalankan skrip lagi. Katakanlah itu mencetak Accuracy: 17/20 = 85%. Tiga kasus lagi benar, jadi v2 terlihat lebih baik. Seberapa besar mempercayainya? Setiap kasus bernilai 5 poin dalam set 20 kasus, jadi 70% → 85% adalah tiga pesan. Itu petunjuk yang baik, bukan bukti. Jika skor turun, Anda telah mempelajari sesuatu yang sama berharganya dan menyelamatkan diri dari mengirim prompt yang lebih buruk.

Set yang sama, model lain: apakah skornya bertahan?#

File yang sama menjawab pertanyaan kedua: apakah Anda membayar untuk model yang lebih besar dari yang dibutuhkan tugas ini? Ubah satu baris dan jalankan lagi:

python
MODEL = 'deepseek-ai/DeepSeek-V4-Flash-0731'

Jika akurasi pada 20 kasus Anda cocok, Anda memiliki jawaban untuk tugas ini, dari data Anda sendiri bukan dari papan peringkat. Jika turun, lihat pesan mana yang rusak sebelum Anda memutuskan apa pun.

Berapa biaya semua ini? Asumsikan sekitar 150 token input per kasus (instruksi plus pesan) dan sekitar 5 token output untuk label satu kata. Itu 3.000 input dan 100 output token per proses 20 kasus, yang berarti $0.000064 pada GLM-5.3-Flash. Sepuluh kali menjalankan ulang set adalah 200 permintaan; tabel di bawah menunjukkan beban kerja itu untuk setiap model, dengan OpenRouter di sebelahnya. Pada beban kerja ini, dengan input dan output dihitung bersama, setiap model dalam tabel berbiaya kurang dari harga referensi OpenRouter.

Model Per permintaan 200 permintaan OpenRouter, 200 permintaan
GLM-5.3-Flash $0.0000032 $0.00064 $0.0011
DeepSeek-V4-Flash $0.0000028 $0.00055 $0.0022
MiniMax-M2.7 $0.0000083 $0.0017 $0.0198

150 token input dan 5 token output per permintaan. Harga per 1 juta token adalah harga saat ini dan berubah seiring tarif kami; kolom OpenRouter menunjukkan harga referensi untuk beban kerja yang sama.

Dua di antaranya digunakan dalam artikel ini: GLM-5.3-Flash memiliki konteks 390K dan hingga 8.192 token output per jawaban; DeepSeek-V4-Flash memiliki konteks 380K dan hingga 32.768 token output, satu harga pada jam berapa pun, dan saldo yang sama dengan model lainnya. Harga terkini ada di halaman harga, daftar lengkapnya ada di model.

Di mana exact match berhenti berfungsi#

Exact match berfungsi karena jawaban yang benar adalah satu kata dari daftar tetap. Untuk keluaran terbuka seperti ringkasan, penulisan ulang, atau penjelasan, tidak ada satu string pun untuk dibandingkan. Dokumentasi menjelaskan rute lain, penilaian oleh model, dan merekomendasikan menggunakan model yang berbeda sebagai penilai daripada yang menulis jawaban. Mulailah dengan exact match: di mana pun Anda dapat memaksakan jawaban pendek dan tetap, itu adalah tes termurah dan paling jelas yang dapat Anda jalankan. Aturan praktis dokumentasi adalah lebih banyak pertanyaan yang dinilai otomatis mengalahkan lebih sedikit yang dinilai manual.

Satu kebiasaan lagi: ketika v2 berhenti membaik, jangan terus memoles terhadap 20 pesan yang sama. Tambahkan 5–10 pesan baru, idealnya yang meleset nyata dari produksi, dan jalankan lagi.

Cek cepat

v2 mendapat skor 17/20 dan v1 mendapat skor 15/20 pada kasus yang sama. Apa kesimpulan paling aman?

Tampilkan jawaban

Jawaban: v2 terlihat lebih baik, tetapi dua kasus dari 20 adalah selisih kecil: tambahkan kasus baru dan jalankan ulang

Setiap kasus bernilai 5 poin, jadi selisih dua kasus adalah sinyal untuk melihat lebih dekat, bukan vonis. Kasus baru yang belum pernah dilihat v2 adalah pemeriksaan berikutnya.