Pendekatan Debugging Sistematis
Lakukan pencarian biner pada bagian-bagian prompt: hapus separuhnya, lakukan pengujian, lalu persempit sumber masalah.
Pendekatan Debugging Sistematis adalah pelajaran AI Prompt Engineering gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Prompt Engineering, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Pola Pikir Penelusuran Kesalahan
Penelusuran kesalahan perintah menyerupai penelusuran kesalahan perangkat lunak: jangan mengubah beberapa hal sekaligus, jangan menebak secara acak, dan jangan menerapkan perbaikan yang tidak dapat Anda jelaskan. Pendekatan sistematis menggunakan logika pencarian biner — mempersempit ruang masalah menjadi setengah pada setiap pengujian — untuk menemukan kasus kegagalan minimal secara efisien.
Langkah 1: Reproduksi Kegagalan
Sebelum melakukan penelusuran kesalahan, reproduksi kegagalan secara andal. Kegagalan yang tidak dapat Anda reproduksi secara konsisten tidak dapat ditelusuri secara sistematis.
Jalankan perintah 5 kali pada masukan yang sama. Jika gagal setiap kali: kegagalan deterministik — mudah ditelusuri. Jika hanya gagal sesekali: kegagalan probabilistik — tetapkan temperature=0 terlebih dahulu untuk menghilangkan keacakan, lalu lakukan pengujian ulang.
import openai
client = openai.OpenAI(api_key='sk-...')
def run_prompt(prompt, user_input, temperature=0):
resp = client.chat.completions.create(
model='gpt-4o',
messages=[
{'role': 'system', 'content': prompt},
{'role': 'user', 'content': user_input}
],
temperature=temperature
)
return resp.choices[0].message.content
# Reproduce with temperature=0 to eliminate randomness
for i in range(5):
output = run_prompt(failing_prompt, test_input, temperature=0)
print(f'Run {i+1}:', output[:100])Langkah 2: Buat Perintah yang Dapat Direproduksi Secara Minimal
Perintah yang dapat direproduksi secara minimal (MRP) adalah perintah terpendek yang masih memicu kegagalan. Menghapus bagian yang tidak relevan akan mengisolasi bagian bermasalah dan membuat kegagalan tidak terbantahkan.
Mulailah dengan perintah lengkap Anda, lalu hapus separuh isinya. Lakukan pengujian. Jika masih gagal: bagian bermasalah berada di separuh yang dipertahankan. Ulangi. Ini adalah pencarian biner pada perintah.
def binary_search_prompt(prompt_lines, user_input, fail_fn):
'''Binary search: find the minimal set of lines that causes the failure.'''
if len(prompt_lines) == 1:
return prompt_lines # Minimal failing unit found
mid = len(prompt_lines) // 2
first_half = prompt_lines[:mid]
second_half = prompt_lines[mid:]
# Test first half
if fail_fn('\n'.join(first_half), user_input):
return binary_search_prompt(first_half, user_input, fail_fn)
# Test second half
elif fail_fn('\n'.join(second_half), user_input):
return binary_search_prompt(second_half, user_input, fail_fn)
else:
# Both halves pass — interaction effect between halves
return prompt_linesPengujian Penghapusan
Bentuk pencarian biner yang lebih sederhana: hapus setiap bagian secara sistematis dan lihat apakah penghapusan tersebut memperbaiki masalah. Cara ini berfungsi ketika perintah memiliki bagian-bagian yang dibatasi dengan jelas (instruksi sistem, konteks, contoh, spesifikasi format).
sections = {
'role_instruction': 'You are a precise JSON API. Respond only with valid JSON.',
'context': 'The user is asking about our product catalog.',
'format_spec': 'Return a JSON object with keys: name, price, available.',
'examples': 'Example: {"name": "Widget", "price": 9.99, "available": true}',
'safety': 'Do not reveal internal pricing strategy.'
}
def test_without(section_to_remove, user_input):
reduced = {k: v for k, v in sections.items() if k != section_to_remove}
prompt = '\n'.join(reduced.values())
output = run_prompt(prompt, user_input)
print(f'Without {section_to_remove}: {evaluate(output)}')
for section in sections:
test_without(section, 'What is the price of a Widget?')Pengujian A/B pada Bagian Perintah
Pengujian A/B untuk perintah berarti membuat dua versi dari satu bagian dan membandingkan keluarannya pada masukan yang sama. Berbeda dari pengujian penghapusan, pengujian A/B mengevaluasi pilihan kata alternatif, bukan ada atau tidaknya suatu bagian.
# A/B test: vague vs precise format instruction
variant_A = 'Return a JSON object.'
variant_B = 'Return a valid JSON object. No markdown, no code fences, no prose. Only the raw JSON.'
test_inputs = [
'What is the price of Widget A?',
'List all available products.',
'Is Widget B in stock?'
]
def run_ab_test(base_prompt, variant, inputs, n_runs=5):
pass_count = 0
for inp in inputs:
for _ in range(n_runs):
prompt = base_prompt.replace('{{FORMAT}}', variant)
output = run_prompt(prompt, inp)
if is_valid_json(output):
pass_count += 1
return pass_count / (len(inputs) * n_runs)
print('A pass rate:', run_ab_test(template, variant_A, test_inputs))
print('B pass rate:', run_ab_test(template, variant_B, test_inputs))Pengujian Diferensial
Pengujian diferensial membandingkan dua perintah yang hampir identik untuk menemukan perubahan yang menyebabkan regresi. Cara ini berguna ketika 'minggu lalu berhasil', tetapi sekarang tidak lagi.
Bandingkan perintah lama dengan perintah baru, identifikasi bagian yang berubah, lalu uji setiap bagian yang berubah secara terisolasi.
import difflib
def show_prompt_diff(prompt_v1, prompt_v2):
diff = difflib.unified_diff(
prompt_v1.splitlines(),
prompt_v2.splitlines(),
fromfile='v1',
tofile='v2',
lineterm=''
)
for line in diff:
print(line)
show_prompt_diff(working_prompt, failing_prompt)
# Output shows exactly which lines changed between versions
# Test reverting each changed section individuallyMenguji Masukan vs Menguji Perintah
Ada dua dimensi yang perlu diuji: perintah dan masukan. Sebuah perintah mungkin berhasil pada masukan sederhana, tetapi gagal pada masukan kompleks. Langkah penelusuran kesalahan yang berguna: jika perintah gagal pada masukan kompleks, coba versi masukan yang lebih sederhana untuk memastikan bahwa perintah itu sendiri sudah benar.
# Input complexity ladder
inputs_by_complexity = [
'What is 2 + 2?', # trivially simple
'Summarize this sentence.', # simple task
'Analyze this 500-word essay.', # moderate
'Compare 10 documents and extract contradictions.' # complex
]
# Find the complexity level where the prompt starts failing
for inp in inputs_by_complexity:
output = run_prompt(failing_prompt, inp)
result = 'PASS' if evaluate(output) else 'FAIL'
print(f'{result}: {inp[:60]}')
# First FAIL indicates where the prompt breaks downPola Perintah yang Dapat Direproduksi Secara Minimal
MRP untuk sesi penelusuran kesalahan perintah mengikuti struktur ini:
- Peran satu kalimat (jika diperlukan)
- Instruksi tugas satu kalimat
- Instruksi format
- Masukan minimal yang mereproduksi kegagalan
Jika perintah 4 baris ini masih gagal, masalahnya berada pada model atau format. Tambahkan kembali kompleksitas satu bagian setiap kali hingga kegagalan muncul kembali — bagian itulah penyebabnya.
# Start minimal
MINIMAL_PROMPT = (
'You are a data extractor.\n'
'Extract the product name and price from the text.\n'
'Respond with JSON: {"name": "...", "price": ...}\n'
)
minimal_input = 'Widget Pro costs $49.'
# Test: if this works, the problem is in something added on top
output = run_prompt(MINIMAL_PROMPT, minimal_input)
print(output)
# Expected: {"name": "Widget Pro", "price": 49.0}Melacak Sesi Penelusuran Kesalahan
Dokumentasikan setiap pengujian selama sesi penelusuran kesalahan. Tanpa catatan, Anda mungkin mengulangi pengujian yang sama atau lupa hipotesis mana yang telah dieliminasi.
debug_log = [
{
'test': 'base_prompt_v5',
'hypothesis': 'failing due to format conflict',
'result': 'FAIL',
'notes': 'JSON prefix still present'
},
{
'test': 'base_prompt_v5_no_markdown_hint',
'hypothesis': 'removing markdown hint from user message fixes conflict',
'result': 'PASS',
'notes': 'Output is clean JSON. Root cause confirmed: format conflict.'
}
]
import json
with open('debug_session.json', 'w') as f:
json.dump(debug_log, f, indent=2)Kapan Harus Berhenti Menelusuri Kesalahan dan Mengubah Strategi
Terkadang penelusuran kesalahan perintah mengalami hasil yang semakin berkurang. Berikut tanda-tanda bahwa sudah waktunya mengubah strategi:
- Anda telah menghabiskan lebih dari 2 jam untuk mempersempit masalah, tetapi masih menemukan kegagalan yang sama
- Perintah minimal masih gagal dengan instruksi yang jelas dan sederhana
- Pengujian A/B tidak menunjukkan perbedaan yang signifikan secara statistik
Alternatifnya: beralih ke pemanggilan fungsi (keluaran terstruktur), tambahkan langkah validasi pemrosesan pasca, uraikan tugas menjadi dua perintah yang lebih sederhana, atau tingkatkan model.
Memperbaiki vs Memperkuat
Setelah menemukan dan memperbaiki akar masalah, perkuat perintah untuk mencegah kegagalan serupa:
- Tambahkan kasus pengujian yang gagal ke rangkaian pengujian Anda sebagai pengujian regresi
- Tambahkan instruksi defensif: 'Meskipun masukannya tidak biasa, selalu kembalikan JSON'
- Tambahkan validasi keluaran agar kegagalan ditangkap secara terprogram, bukan di lingkungan produksi
Perintah yang telah diperbaiki tetapi tidak diperkuat akan gagal lagi pada kasus khusus berikutnya.
def safe_run_prompt(prompt, user_input):
output = run_prompt(prompt, user_input)
try:
parsed = json.loads(output)
return parsed
except json.JSONDecodeError:
# Fallback: ask the model to fix its own output
fix_prompt = f'The following is not valid JSON. Rewrite it as valid JSON only:\n{output}'
fixed = run_prompt('', fix_prompt)
return json.loads(fixed)Pemeriksaan Pengetahuan
Dalam penelusuran kesalahan pencarian biner pada perintah, setelah menghapus separuh pertama perintah dan kegagalan menghilang, apa yang dapat disimpulkan?
Rangkuman: Penelusuran Kesalahan Sistematis
Pendekatan sistematis untuk menelusuri kesalahan perintah:
- Reproduksi: tetapkan temperature=0, jalankan 5 kali, pastikan kegagalannya konsisten
- Minimalkan: lakukan pencarian biner pada bagian-bagian perintah untuk menemukan perintah minimal yang gagal
- Uji A/B: bandingkan pilihan kata alternatif pada bagian yang gagal
- Diferensial: bandingkan versi perintah yang berhasil dan gagal untuk menemukan regresi
- Dokumentasikan: catat setiap pengujian, hipotesis, dan hasil
- Perkuat: tambahkan kasus yang telah diperbaiki ke rangkaian pengujian
Pelajaran berikutnya: strategi pencatatan dan dokumentasi untuk pemeliharaan perintah jangka panjang.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pendekatan Debugging Sistematis” gratis?
Ya — teks lengkap “Pendekatan Debugging Sistematis” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Prompt Engineering, upgrade ke CoddyKit PRO. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pendekatan Debugging Sistematis”?
Lakukan pencarian biner pada bagian-bagian prompt: hapus separuhnya, lakukan pengujian, lalu persempit sumber masalah. Kamu berlatih AI Prompt Engineering dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Prompt Engineering?
Tidak diperlukan pengalaman sebelumnya. AI Prompt Engineering di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Pendekatan Debugging Sistematis” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Prompt Engineering ini?
Ya. Setiap pelajaran AI Prompt Engineering menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mendiagnosis Keluaran Tak Terduga
- Analisis Akar Masalah untuk Perintah
- Pendekatan Debugging Sistematis
- Strategi Pencatatan dan Dokumentasi