Approccio sistematico al debugging
Ricerca binaria nelle sezioni del prompt: rimuova metà, esegua un test e restringa il problema
Approccio sistematico al debugging è una lezione AI Prompt Engineering gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Prompt Engineering, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Prompt Engineering include 4 lezioni in totale.
La mentalità del debugging
Il debugging dei prompt rispecchia quello del software: non modifichi più elementi contemporaneamente, non proceda per tentativi casuali e non distribuisca una correzione che non è in grado di spiegare. Un approccio sistematico utilizza la logica della ricerca binaria — restringendo della metà lo spazio del problema a ogni test — per trovare in modo efficiente il caso minimo che genera l'errore.
Passaggio 1: riprodurre l'errore
Prima di eseguire il debugging, riproduca l'errore in modo affidabile. Un errore che non è possibile riprodurre con costanza non può essere analizzato sistematicamente.
Esegua il prompt 5 volte con lo stesso input. Se fallisce ogni volta: errore deterministico, facile da analizzare. Se fallisce solo a volte: errore probabilistico; imposti prima temperature=0 per eliminare la casualità, quindi esegua nuovamente il test.
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])Passaggio 2: creare un prompt minimo riproducibile
Un prompt minimo riproducibile (MRP) è il prompt più breve che attiva comunque l'errore. Rimuovere le parti irrilevanti isola la sezione problematica e rende l'errore innegabile.
Parta dal prompt completo e rimuova metà del contenuto. Esegua il test. Se l'errore persiste, la sezione problematica si trova nella metà conservata. Ripeta l'operazione. Questa è una ricerca binaria nel 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_linesIl test di rimozione
Una forma più semplice di ricerca binaria consiste nel rimuovere sistematicamente singole sezioni e verificare se la rimozione risolve il problema. Questo approccio funziona quando il prompt presenta sezioni chiaramente delimitate (istruzioni di sistema, contesto, esempi, specifica del formato).
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?')Test A/B delle sezioni del prompt
Il test A/B dei prompt consiste nel creare due versioni di una singola sezione e confrontarne gli output con gli stessi input. A differenza dei test di rimozione, i test A/B valutano formulazioni alternative anziché la presenza o l'assenza di una sezione.
# 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))Test differenziale
Il test differenziale confronta due prompt quasi identici per individuare quale modifica abbia causato la regressione. È utile quando «la scorsa settimana funzionava», ma ora non funziona più.
Confronti con diff il vecchio prompt con quello nuovo, identifichi le sezioni modificate, quindi testi ogni sezione modificata in isolamento.
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 individuallyTestare gli input e testare i prompt
È necessario testare due dimensioni: il prompt e l'input. Un prompt può funzionare con input semplici ma fallire con quelli complessi. Un approccio utile per il debugging consiste nel provare una versione più semplice dell'input quando il prompt fallisce con un input complesso, per verificare che il prompt sia corretto.
# 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 downLo schema del prompt minimo riproducibile
L'MRP per una sessione di debugging dei prompt segue questa struttura:
- Una frase che definisce il ruolo (se necessaria)
- Una frase con l'istruzione dell'attività
- Istruzione sul formato
- L'input minimo che riproduce l'errore
Se questo prompt di 4 righe continua a fallire, il problema è nel modello o nel formato. Aggiunga nuovamente la complessità, una sezione alla volta, finché l'errore non ricompare: quella sezione è la responsabile.
# 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}Monitorare la sessione di debugging
Documenti ogni test durante una sessione di debugging. Senza appunti, potrebbe ripetere gli stessi test o dimenticare quali ipotesi sono state escluse.
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)Quando smettere di eseguire il debugging e cambiare strategia
A volte il debugging di un prompt raggiunge un punto di rendimento decrescente. Ecco i segnali che indicano quando è il momento di cambiare strategia:
- Ha trascorso più di 2 ore a restringere il problema senza superare lo stesso errore
- Il prompt minimo continua a fallire nonostante un'istruzione chiara e semplice
- I test A/B non mostrano differenze statisticamente significative
Alternative: passare al function calling (output strutturati), aggiungere un passaggio di convalida post-elaborazione, scomporre l'attività in due prompt più semplici oppure utilizzare un modello più avanzato.
Correggere e rendere robusto
Dopo aver individuato e corretto la causa principale, renda robusto il prompt per prevenire errori simili:
- Aggiunga il caso di test che ha generato l'errore alla suite di test come test di regressione
- Aggiunga un'istruzione preventiva: «Anche se l'input è insolito, restituisca sempre JSON»
- Aggiunga la convalida dell'output, in modo che l'errore venga rilevato a livello programmatico e non in produzione
Un prompt corretto ma non reso robusto fallirà nuovamente al verificarsi del prossimo caso limite.
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)Verifica delle conoscenze
Nel debugging dei prompt mediante ricerca binaria, dopo aver rimosso la prima metà del prompt l'errore scompare. Che cosa indica questo risultato?
Riepilogo: debugging sistematico
Un approccio sistematico al debugging dei prompt:
- Riprodurre: impostare temperature=0, eseguire 5 volte e confermare che l'errore sia costante
- Ridurre: eseguire una ricerca binaria sulle sezioni del prompt per trovare il prompt minimo che genera l'errore
- Testare con A/B: confrontare formulazioni alternative della sezione che genera l'errore
- Confrontare le differenze: confrontare con diff le versioni funzionante e non funzionante del prompt per individuare la regressione
- Documentare: registrare ogni test, ipotesi e risultato
- Rendere robusto: aggiungere il caso corretto alla suite di test
Prossima lezione: strategie di logging e documentazione per la manutenzione dei prompt a lungo termine.
Domande Frequenti
La lezione «Approccio sistematico al debugging» è gratuita?
Sì — il testo completo di «Approccio sistematico al debugging» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Prompt Engineering, passa a CoddyKit PRO. Il corso AI Prompt Engineering include 4 lezioni in totale.
Cosa imparerò in «Approccio sistematico al debugging»?
Ricerca binaria nelle sezioni del prompt: rimuova metà, esegua un test e restringa il problema Eserciti AI Prompt Engineering con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare AI Prompt Engineering?
Non è richiesta alcuna esperienza precedente. AI Prompt Engineering su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Approccio sistematico al debugging»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione AI Prompt Engineering?
Sì. Ogni lezione AI Prompt Engineering include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Diagnosticare output imprevisti
- Analisi delle cause principali dei problemi nei prompt
- Approccio sistematico al debugging
- Strategie di logging e documentazione