Kejuruteraan Arahan AI · Pelajaran

Pendekatan Penyahpepijatan Sistematik

Carian binari pada bahagian gesaan: buang separuh, uji, kemudian kecilkan skop masalah.

Pelajaran 3 daripada 413 langkah

Pendekatan Penyahpepijatan Sistematik ialah pelajaran Kejuruteraan Arahan AI percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Kejuruteraan Arahan AI, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Kejuruteraan Arahan AI merangkumi sejumlah 4 pelajaran.

Pemikiran Penyahpepijatan

Penyahpepijatan gesaan mencerminkan penyahpepijatan perisian: jangan ubah beberapa perkara serentak, jangan membuat tekaan secara rawak, dan jangan gunakan pembaikan yang tidak dapat anda jelaskan. Pendekatan sistematik menggunakan logik carian binari — mengecilkan ruang masalah sebanyak separuh dengan setiap ujian — untuk mencari kes kegagalan minimum dengan cekap.

Langkah 1: Hasilkan Semula Kegagalan

Sebelum menyahpepijat, hasilkan semula kegagalan dengan boleh dipercayai. Kegagalan yang tidak dapat anda hasilkan semula secara konsisten tidak boleh dinyahpepijat secara sistematik.

Jalankan gesaan 5 kali pada masukan yang sama. Jika gagal setiap kali: kegagalan deterministik — mudah dinyahpepijat. Jika gagal kadangkala: kegagalan probabilistik — tetapkan temperature=0 terlebih dahulu untuk menghapuskan kerawakan, kemudian uji semula.

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: Cipta Gesaan Minimum yang Boleh Dihasilkan Semula

Gesaan minimum yang boleh dihasilkan semula (MRP) ialah gesaan paling pendek yang masih mencetuskan kegagalan. Membuang bahagian yang tidak berkaitan mengasingkan bahagian bermasalah dan menjadikan kegagalan itu tidak dapat dinafikan.

Mulakan dengan gesaan penuh anda dan buang separuh kandungan. Uji. Jika masih gagal: bahagian bermasalah berada dalam separuh yang anda kekalkan. Ulangi proses. Ini ialah carian binari pada gesaan.

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_lines

Ujian Pembuangan

Bentuk carian binari yang lebih mudah: buang bahagian individu secara sistematik dan lihat sama ada pembuangan itu membaiki masalah. Ini berfungsi apabila gesaan mempunyai bahagian yang dihadkan dengan jelas (arahan 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 Bahagian Gesaan

Pengujian A/B untuk gesaan bermaksud mencipta dua versi satu bahagian dan membandingkan keluarannya pada masukan yang sama. Berbeza dengan ujian pembuangan, ujian A/B menilai pilihan kata alternatif, bukannya kehadiran atau ketiadaan.

# 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 Perbezaan

Pengujian perbezaan membandingkan dua gesaan yang hampir serupa untuk mencari perubahan yang menyebabkan regresi. Ini berguna apabila 'ia berfungsi minggu lepas' tetapi kini tidak berfungsi.

Bandingkan perbezaan gesaan lama dengan gesaan baharu, kenal pasti bahagian yang berubah, kemudian uji setiap bahagian yang berubah secara berasingan.

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 individually

Menguji Masukan berbanding Menguji Gesaan

Dua dimensi untuk diuji: gesaan dan masukan. Gesaan mungkin berfungsi pada masukan mudah tetapi gagal pada masukan kompleks. Langkah penyahpepijatan yang berguna: jika gesaan gagal pada masukan kompleks, cuba versi masukan yang lebih mudah untuk mengesahkan bahawa gesaan itu sendiri kukuh.

# 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 down

Corak Gesaan Minimum yang Boleh Dihasilkan Semula

MRP bagi sesi penyahpepijatan gesaan mengikut struktur ini:

  1. Peranan satu ayat (jika perlu)
  2. Arahan tugas satu ayat
  3. Arahan format
  4. Masukan minimum yang menghasilkan semula kegagalan

Jika gesaan 4 baris ini masih gagal, masalahnya terletak pada model atau format. Tambahkan semula kerumitan satu bahagian pada satu masa sehingga kegagalan muncul semula — bahagian itulah puncanya.

# 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}

Menjejak Sesi Penyahpepijatan

Dokumentasikan setiap ujian semasa sesi penyahpepijatan. Tanpa nota, anda mungkin mengulangi ujian yang sama atau terlupa hipotesis yang telah disingkirkan.

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)

Bila Hendak Berhenti Menyahpepijat dan Menukar Strategi

Kadangkala penyahpepijatan gesaan mencapai pulangan yang semakin berkurangan. Tanda-tanda bahawa sudah tiba masanya untuk menukar strategi:

  • Anda telah menghabiskan lebih daripada 2 jam untuk mengecilkan masalah kepada kegagalan yang sama
  • Gesaan minimum masih gagal dengan arahan yang jelas dan mudah
  • Ujian A/B tidak menunjukkan perbezaan yang signifikan secara statistik

Alternatif: beralih kepada panggilan fungsi (keluaran berstruktur), tambahkan langkah pengesahan pemprosesan pasca, pecahkan tugas kepada dua gesaan yang lebih mudah, atau tingkatkan model.

Membetulkan berbanding Memperkukuh

Selepas mencari dan membetulkan punca asal, perkukuh gesaan untuk mencegah kegagalan yang serupa:

  • Tambahkan kes ujian yang gagal ke dalam set ujian anda sebagai ujian regresi
  • Tambahkan arahan pertahanan: 'Walaupun masukan luar biasa, sentiasa kembalikan JSON'
  • Tambahkan pengesahan keluaran supaya kegagalan ditangkap secara programatik, bukan dalam persekitaran produksi

Gesaan yang telah dibetulkan tetapi tidak diperkukuh akan gagal semula pada kes pinggir seterusnya.

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)

Semakan Pengetahuan

Dalam penyahpepijatan carian binari gesaan, selepas membuang separuh pertama gesaan dan kegagalan hilang, apakah yang diberitahu oleh perkara ini kepada anda?

Imbas Kembali: Penyahpepijatan Sistematik

Pendekatan sistematik untuk menyahpepijat gesaan:

  • Hasilkan semula: tetapkan suhu=0, jalankan 5 kali, sahkan bahawa kegagalan itu konsisten
  • Minimumkan: lakukan carian binari pada bahagian gesaan untuk mencari gesaan minimum yang gagal
  • Uji A/B: bandingkan pilihan kata alternatif bagi bahagian yang gagal
  • Bandingkan perbezaan: bandingkan versi gesaan yang berfungsi dengan yang gagal untuk mencari regresi
  • Dokumentasikan: catat setiap ujian, hipotesis dan hasil
  • Perkukuh: tambahkan kes yang telah dibaiki ke dalam set ujian anda

Pelajaran seterusnya: strategi pengelogan dan dokumentasi untuk penyelenggaraan gesaan jangka panjang.

Percuma untuk bermula

Pelajari Kejuruteraan Arahan AI dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
53
Pelajaran
199

Soalan Lazim

Adakah pelajaran “Pendekatan Penyahpepijatan Sistematik” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Kejuruteraan Arahan AI, termasuk “Pendekatan Penyahpepijatan Sistematik”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Kejuruteraan Arahan AI merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pendekatan Penyahpepijatan Sistematik”?

Carian binari pada bahagian gesaan: buang separuh, uji, kemudian kecilkan skop masalah. Anda berlatih Kejuruteraan Arahan AI menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Kejuruteraan Arahan AI?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Kejuruteraan Arahan AI di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Pendekatan Penyahpepijatan Sistematik” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Kejuruteraan Arahan AI ini?

Ya. Setiap pelajaran Kejuruteraan Arahan AI menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mendiagnosis Keluaran Tidak Dijangka
  2. Analisis Punca Akar untuk Gesaan
  3. Pendekatan Penyahpepijatan Sistematik
  4. Strategi Pengelogan dan Dokumentasi
← Kembali ke Kejuruteraan Arahan AI