0Pricing
AI Prompt Engineering · Leçon

Approche systématique du débogage

Recherche dichotomique dans les sections du prompt : supprimez-en la moitié, effectuez un test, puis cernez le problème.

Approche systématique du débogage est une leçon AI Prompt Engineering gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Prompt Engineering, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Prompt Engineering comprend 4 leçons au total.

L’état d’esprit du débogage

Le débogage des invites ressemble au débogage logiciel : ne modifiez pas plusieurs éléments à la fois, ne faites pas de suppositions aléatoires et ne déployez pas une correction que vous ne pouvez pas expliquer. Une approche systématique utilise une logique de recherche binaire — réduisez de moitié l’espace du problème à chaque test — afin de trouver efficacement le cas minimal qui échoue.

Étape 1 : reproduire l’échec

Avant de déboguer, reproduisez l’échec de manière fiable. Un échec que vous ne pouvez pas reproduire systématiquement ne peut pas être débogué de manière systématique.

Exécutez l’invite 5 fois avec la même entrée. Si elle échoue à chaque fois : échec déterministe — facile à déboguer. Si elle échoue parfois : échec probabiliste — définissez d’abord temperature=0 pour éliminer le hasard, puis testez à nouveau.

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

Étape 2 : créer une invite minimale reproductible

Une invite minimale reproductible (MRP) est l’invite la plus courte qui déclenche encore l’échec. La suppression des parties non pertinentes isole la section problématique et rend l’échec incontestable.

Commencez par votre invite complète et supprimez la moitié du contenu. Testez. Si l’échec persiste : la section problématique se trouve dans la moitié conservée. Répétez. Il s’agit d’une recherche binaire appliquée à l’invite.

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

Le test de suppression

Une forme plus simple de recherche binaire : supprimez systématiquement des sections individuelles et vérifiez si leur suppression corrige le problème. Cette méthode fonctionne lorsque l’invite comporte des sections clairement délimitées (instructions système, contexte, exemples, spécification du 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?')

Tests A/B des sections de l’invite

Les tests A/B des invites consistent à créer deux versions d’une même section et à comparer leurs sorties avec les mêmes entrées. Contrairement aux tests de suppression, les tests A/B évaluent des formulations différentes plutôt que la présence ou l’absence de la section.

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

Tests différentiels

Les tests différentiels comparent deux invites presque identiques pour déterminer quelle modification a provoqué la régression. Cette méthode est utile lorsque « cela fonctionnait la semaine dernière », mais ne fonctionne plus.

Comparez l’ancienne invite à la nouvelle, repérez les sections modifiées, puis testez chaque section modifiée isolément.

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

Tester les entrées ou les invites

Deux axes à tester : l’invite et l’entrée. Une invite peut fonctionner avec des entrées simples, mais échouer avec des entrées complexes. Une approche utile de débogage : si l’invite échoue avec une entrée complexe, essayez une version plus simple de l’entrée pour confirmer que l’invite elle-même est correcte.

# 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

Structure de l’invite minimale reproductible

Le MRP d’une session de débogage d’invite suit cette structure :

  1. Rôle en une phrase (si nécessaire)
  2. Instruction de la tâche en une phrase
  3. Instruction de format
  4. L’entrée minimale qui reproduit l’échec

Si cette invite de 4 lignes échoue encore, le problème vient du modèle ou du format. Réintroduisez la complexité, une section à la fois, jusqu’à ce que l’échec réapparaisse : cette section est responsable du problème.

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

Suivre la session de débogage

Documentez chaque test pendant une session de débogage. Sans notes, vous risquez de répéter les mêmes tests ou d’oublier quelles hypothèses ont été éliminées.

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)

Quand arrêter le débogage et changer de stratégie

Le débogage d’une invite atteint parfois un stade où les gains diminuent. Voici les signes indiquant qu’il est temps de changer de stratégie :

  • Vous avez passé plus de 2 heures à circonscrire le même échec
  • L’invite minimale échoue encore malgré une instruction claire et simple
  • Les tests A/B ne montrent aucune différence statistiquement significative

Solutions de remplacement : passez à l’appel de fonctions (sorties structurées), ajoutez une étape de validation après traitement, décomposez la tâche en deux invites plus simples ou mettez le modèle à niveau.

Corriger ou renforcer

Après avoir trouvé et corrigé la cause fondamentale, renforcez l’invite pour éviter les échecs similaires :

  • Ajoutez le cas de test qui échouait à votre suite de tests en tant que test de régression
  • Ajoutez une instruction défensive : « Même si l’entrée est inhabituelle, renvoyez toujours un JSON »
  • Ajoutez une validation de la sortie afin que l’échec soit détecté par programmation, et non en production

Une invite corrigée mais non renforcée échouera de nouveau au prochain cas 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)

Vérification des connaissances

Dans le débogage d’une invite par recherche binaire, après avoir supprimé la première moitié de l’invite et constaté que l’échec disparaît, qu’est-ce que cela vous apprend ?

Récapitulatif : débogage systématique

Une approche systématique du débogage des invites :

  • Reproduire : réglez la température à 0, exécutez 5 fois et confirmez que l’échec est cohérent
  • Réduire : appliquez une recherche binaire aux sections de l’invite pour trouver l’invite minimale qui échoue
  • Tester en A/B : comparez les formulations différentes de la section qui échoue
  • Comparer : comparez les versions fonctionnelle et défaillante de l’invite pour trouver la régression
  • Documenter : consignez chaque test, chaque hypothèse et chaque résultat
  • Renforcer : ajoutez le cas corrigé à votre suite de tests

Prochaine leçon : stratégies de journalisation et de documentation pour la maintenance des invites à long terme.

Questions Fréquemment Posées

La leçon « Approche systématique du débogage » est-elle gratuite ?

Oui — le texte complet de « Approche systématique du débogage » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Prompt Engineering, passe à CoddyKit PRO. Le cours AI Prompt Engineering comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Approche systématique du débogage » ?

Recherche dichotomique dans les sections du prompt : supprimez-en la moitié, effectuez un test, puis cernez le problème. Tu pratiques AI Prompt Engineering avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer AI Prompt Engineering ?

Aucune expérience préalable n'est requise. AI Prompt Engineering sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Approche systématique du débogage » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon AI Prompt Engineering ?

Oui. Chaque leçon AI Prompt Engineering inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Diagnostiquer les sorties inattendues
  2. Analyse des causes profondes des problèmes d’invites
  3. Approche systématique du débogage
  4. Stratégies de journalisation et de documentation
← Retour à AI Prompt Engineering