AI-promptteknik · Lektion

Systematisk felsökningsmetod

Binärsökning bland promptens avsnitt: ta bort hälften, testa och ringa in problemet.

Lektion 3 av 413 steg

Systematisk felsökningsmetod är en gratis lektion i AI-promptteknik på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för AI-promptteknik, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i AI-promptteknik innehåller totalt 4 lektioner.

Felsökningstänkandet

Felsökning av promptar liknar felsökning av programvara: ändra inte flera saker samtidigt, gissa inte slumpmässigt och driftsätt inte en åtgärd som du inte kan förklara. En systematisk metod använder binärsökningslogik – den halverar problemområdet med varje test – för att effektivt hitta det minsta fallet som fortfarande misslyckas.

Steg 1: Återskapa felet

Återskapa felet på ett tillförlitligt sätt innan felsökningen börjar. Ett fel som inte kan återskapas konsekvent kan inte felsökas systematiskt.

Kör prompten 5 gånger med samma indata. Om den misslyckas varje gång: deterministiskt fel – lätt att felsöka. Om den misslyckas ibland: probabilistiskt fel – ange temperature=0 först för att eliminera slumpmässighet och testa sedan igen.

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

Steg 2: Skapa en minimal reproducerbar prompt

En minimal reproducerbar prompt (MRP) är den kortaste prompt som fortfarande utlöser felet. Genom att ta bort irrelevanta delar isoleras det problematiska avsnittet och felet blir tydligt.

Börja med hela prompten och ta bort hälften av innehållet. Testa. Om felet kvarstår finns det problematiska avsnittet i den halva du behöll. Upprepa. Detta är binärsökning på prompten.

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

Borttagningstestet

En enklare variant av binärsökning: ta systematiskt bort enskilda avsnitt och se om problemet försvinner. Detta fungerar när prompten har tydligt avgränsade avsnitt (systeminstruktioner, kontext, exempel, formatspecifikation).

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-testning av promptavsnitt

A/B-testning av promptar innebär att skapa två versioner av ett enskilt avsnitt och jämföra deras utdata med samma indata. Till skillnad från borttagningstester utvärderar A/B-tester alternativa formuleringar i stället för närvaro eller frånvaro.

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

Differentialtestning

Differentialtestning jämför två nästan identiska promptar för att hitta vilken ändring som orsakade regressionen. Detta är användbart när ”det fungerade förra veckan” men inte fungerar nu.

Jämför den gamla prompten med den nya med diff, identifiera ändrade avsnitt och testa sedan varje ändrat avsnitt isolerat.

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

Testa indata kontra promptar

Det finns två dimensioner att testa: prompten och indatan. En prompt kan fungera med enkel indata men misslyckas med komplex indata. Ett användbart felsökningssteg är att, om prompten misslyckas med komplex indata, prova en enklare version av indatan för att bekräfta att själva prompten fungerar som den ska.

# 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

Mönstret för en minimal reproducerbar prompt

En MRP för en felsökningssession följer denna struktur:

  1. Roll i en mening (vid behov)
  2. Uppgiftsinstruktion i en mening
  3. Formatinstruktion
  4. Den minsta indata som återskapar felet

Om denna prompt på 4 rader fortfarande misslyckas finns problemet i modellen eller formatet. Lägg tillbaka komplexiteten, ett avsnitt i taget, tills felet återkommer – det avsnittet är boven.

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

Dokumentera felsökningssessionen

Dokumentera varje test under en felsökningssession. Utan anteckningar kan du upprepa samma tester eller glömma vilka hypoteser som har uteslutits.

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)

När du ska sluta felsöka och byta strategi

Ibland ger fortsatt felsökning av en prompt allt mindre utbyte. Tecken på att det är dags att byta strategi:

  • Du har ägnat mer än 2 timmar åt att avgränsa samma fel
  • Den minimala prompten misslyckas fortfarande med en tydlig, enkel instruktion
  • A/B-tester visar ingen statistiskt signifikant skillnad

Alternativ: byt till function calling (strukturerad utdata), lägg till ett valideringssteg för efterbehandling, dela upp uppgiften i två enklare promptar eller uppgradera modellen.

Åtgärda kontra härda

När du har hittat och åtgärdat grundorsaken ska du härda prompten för att förhindra liknande fel:

  • Lägg till testfallet som misslyckades i testsviten som ett regressionstest
  • Lägg till en defensiv instruktion: 'Även om indatan är ovanlig ska du alltid returnera JSON'
  • Lägg till validering av utdata så att felet fångas programmässigt, inte i produktion

En åtgärdad prompt som inte har härdats kommer att misslyckas igen vid nästa gränsfall.

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)

Kunskapskontroll

Vid felsökning med binärsökning på en prompt försvinner felet efter att den första halvan av prompten har tagits bort. Vad visar detta?

Sammanfattning: Systematisk felsökning

En systematisk metod för felsökning av promptar:

  • Återskapa: ange temperature=0, kör 5 gånger och bekräfta att felet är konsekvent
  • Minimera: använd binärsökning på promptavsnitt för att hitta den minsta prompten som misslyckas
  • A/B-testa: jämför alternativa formuleringar av det felande avsnittet
  • Differentialtesta: jämför fungerande och felande promptversioner med diff för att hitta regressionen
  • Dokumentera: logga varje test, hypotes och resultat
  • Härda: lägg till det åtgärdade fallet i testsviten

Nästa lektion: strategier för loggning och dokumentation av långsiktigt underhåll av promptar.

Gratis att börja

Lär dig AI-promptteknik med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
53
Lektioner
199

Vanliga frågor

Är lektionen ”Systematisk felsökningsmetod” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen AI-promptteknik, inklusive ”Systematisk felsökningsmetod”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i AI-promptteknik innehåller totalt 4 lektioner.

Vad lär jag mig i ”Systematisk felsökningsmetod”?

Binärsökning bland promptens avsnitt: ta bort hälften, testa och ringa in problemet. Ni övar på AI-promptteknik med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig AI-promptteknik?

Du behöver inga förkunskaper. Utbildningen i AI-promptteknik på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Systematisk felsökningsmetod”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här AI-promptteknik-lektionen?

Ja. Varje AI-promptteknik-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Diagnostisera oväntade resultat
  2. Grundorsaksanalys för prompts
  3. Systematisk felsökningsmetod
  4. Strategier för loggning och dokumentation
← Tillbaka till AI-promptteknik