AI-promptengineering · Les

Systematische aanpak voor debuggen

Binair zoeken in promptonderdelen: verwijder de helft, test en beperk zo het probleem.

Les 3 van 413 stappen

Systematische aanpak voor debuggen is een gratis AI-promptengineering-les op CoddyKit. Dit is les 3 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject AI-promptengineering. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus AI-promptengineering bevat in totaal 4 lessen.

De debugmentaliteit

Promptdebugging lijkt op softwaredebugging: verander niet meerdere dingen tegelijk, gok niet willekeurig en implementeer geen oplossing die je niet kunt uitleggen. Een systematische aanpak gebruikt de logica van binair zoeken — verklein de probleemruimte bij elke test met de helft — om efficiënt het minimale geval te vinden waarin de fout optreedt.

Stap 1: reproduceer de fout

Reproduceer de fout betrouwbaar voordat je gaat debuggen. Een fout die je niet consequent kunt reproduceren, kun je niet systematisch debuggen.

Voer de prompt 5 keer uit met dezelfde invoer. Als de prompt elke keer faalt: een deterministische fout, die eenvoudig te debuggen is. Als de prompt soms faalt: een probabilistische fout — stel eerst temperature=0 in om willekeur uit te schakelen en test daarna opnieuw.

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])

Stap 2: maak een minimaal reproduceerbare prompt

Een minimaal reproduceerbare prompt (MRP) is de kortste prompt die de fout nog steeds veroorzaakt. Door irrelevante delen te verwijderen, isoleer je het problematische gedeelte en maak je de fout onmiskenbaar.

Begin met je volledige prompt en verwijder de helft van de inhoud. Test. Als de prompt nog steeds faalt, staat het problematische gedeelte in de helft die je hebt behouden. Herhaal dit. Dit is binair zoeken in de prompt.

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

De verwijderingstest

Een eenvoudigere vorm van binair zoeken: verwijder systematisch afzonderlijke gedeelten en kijk of het verwijderen het probleem oplost. Dit werkt wanneer de prompt duidelijk afgebakende gedeelten heeft (systeeminstructies, context, voorbeelden, formatspecificatie).

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?')

A/B-testen van promptgedeelten

A/B-testen voor prompts betekent dat je twee versies van één gedeelte maakt en hun uitvoer met dezelfde invoer vergelijkt. In tegenstelling tot verwijderingstests beoordelen A/B-tests alternatieve formuleringen in plaats van aanwezigheid of afwezigheid.

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

Differentiële tests

Met differentiële tests vergelijk je twee vrijwel identieke prompts om te achterhalen welke wijziging de regressie heeft veroorzaakt. Dit is nuttig wanneer 'het vorige week nog werkte', maar nu niet meer.

Vergelijk de oude prompt met de nieuwe prompt, identificeer de gewijzigde gedeelten en test daarna elk gewijzigd gedeelte afzonderlijk.

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

Invoer testen versus prompts testen

Je kunt twee dimensies testen: de prompt en de invoer. Een prompt kan werken met eenvoudige invoer, maar falen met complexe invoer. Een nuttige debugstap: als de prompt faalt met complexe invoer, probeer dan een eenvoudigere versie van de invoer om te bevestigen dat de prompt zelf goed werkt.

# 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

Het patroon voor een minimaal reproduceerbare prompt

De MRP voor een promptdebugsessie volgt deze structuur:

  1. Een zin met de rol (indien nodig)
  2. Een zin met de taakinstructie
  3. Formaatinstructie
  4. De minimale invoer die de fout reproduceert

Als deze prompt van 4 regels nog steeds faalt, zit het probleem in het model of het formaat. Voeg telkens één gedeelte opnieuw toe totdat de fout terugkeert: dat gedeelte is de oorzaak.

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

De debugsessie bijhouden

Documenteer elke test tijdens een debugsessie. Zonder aantekeningen voer je misschien dezelfde tests opnieuw uit of vergeet je welke hypothesen zijn geëlimineerd.

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)

Wanneer je moet stoppen met debuggen en je strategie moet wijzigen

Soms levert het debuggen van een prompt steeds minder op. Signalen dat het tijd is om je strategie te wijzigen:

  • Je hebt meer dan 2 uur besteed aan het terugbrengen van dezelfde fout
  • De minimale prompt faalt nog steeds met een duidelijke, eenvoudige instructie
  • A/B-tests laten geen statistisch significant verschil zien

Alternatieven: stap over op functie-aanroepen (gestructureerde uitvoer), voeg een validatiestap voor nabewerking toe, splits de taak op in twee eenvoudigere prompts of upgrade het model.

Oplossen versus robuuster maken

Maak de prompt robuuster nadat je de hoofdoorzaak hebt gevonden en opgelost, zodat vergelijkbare fouten worden voorkomen:

  • Voeg het testgeval waarin de fout optrad aan je testsuite toe als regressietest
  • Voeg een defensieve instructie toe: 'Geef altijd JSON terug, ook als de invoer ongebruikelijk is'
  • Voeg uitvoervalidatie toe, zodat de fout programmatisch wordt opgevangen en niet in productie

Een opgeloste prompt die niet robuuster is gemaakt, faalt opnieuw bij het volgende randgeval.

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)

Kenniscontrole

Bij binair zoeken voor het debuggen van prompts verwijder je de eerste helft van de prompt, waarna de fout verdwijnt. Wat vertelt dit je?

Samenvatting: systematisch debuggen

Een systematische aanpak voor het debuggen van prompts:

  • Reproduceren: stel temperature=0 in, voer de prompt 5 keer uit en bevestig dat de fout consistent optreedt
  • Minimaliseren: gebruik binair zoeken in promptgedeelten om de minimale prompt te vinden waarin de fout optreedt
  • A/B-testen: vergelijk alternatieve formuleringen van het problematische gedeelte
  • Differentiële test: vergelijk werkende en falende promptversies om de regressie te vinden
  • Documenteren: leg elke test, hypothese en uitkomst vast
  • Robuuster maken: voeg het opgeloste geval aan je testsuite toe

Volgende les: strategieën voor logboekregistratie en documentatie voor langdurig promptonderhoud.

Gratis beginnen

Leer AI-promptengineering met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
53
Lessen
199

Veelgestelde vragen

Is de les “Systematische aanpak voor debuggen” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad AI-promptengineering, waaronder “Systematische aanpak voor debuggen”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus AI-promptengineering bevat in totaal 4 lessen.

Wat leer ik in “Systematische aanpak voor debuggen”?

Binair zoeken in promptonderdelen: verwijder de helft, test en beperk zo het probleem. Je oefent met AI-promptengineering door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met AI-promptengineering te beginnen?

Ervaring vooraf is niet nodig. AI-promptengineering op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “Systematische aanpak voor debuggen”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over AI-promptengineering?

Ja. Elke les over AI-promptengineering bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Onverwachte uitvoer diagnosticeren
  2. Root-causeanalyse voor prompts
  3. Systematische aanpak voor debuggen
  4. Strategieën voor logging en documentatie
← Terug naar AI-promptengineering