Aller au contenu principal

Raisonnement pour le Code et le Debugging

Le debugging : un problème de raisonnement

Trouver un bug dans du code est fondamentalement un exercice de raisonnement : vous devez comprendre l’intention, tracer l’exécution, identifier la divergence entre comportement attendu et réel, puis formuler une correction. C’est exactement le type de tâche où les modèles Magistral excellent.

Debugging classique

Voici comment utiliser Magistral pour diagnostiquer un bug :

from mistralai import Mistral

client = Mistral(api_key="VOTRE_CLE_API")

code_bugge = """
def merge_sorted_lists(list1, list2):
    result = []
    i = j = 0
    while i < len(list1) and j < len(list2):
        if list1[i] <= list2[j]:
            result.append(list1[i])
            i += 1
        else:
            result.append(list2[j])
            j += 1
    return result

# Test : merge_sorted_lists([1, 3, 5], [2, 4, 6])
# Résultat attendu : [1, 2, 3, 4, 5, 6]
# Résultat obtenu : [1, 2, 3, 4, 5]
"""

response = client.chat.complete(
    model="magistral-medium-latest",
    messages=[
        {"role": "system", "content": """Expert en debugging Python.
Méthode :
1. Tracez l'exécution mentalement
2. Identifiez où le comportement diverge
3. Expliquez la cause racine
4. Proposez la correction avec test"""},
        {"role": "user", "content": f"Ce code a un bug. Diagnostiquez et corrigez :\n\n{code_bugge}"}
    ],
    prompt_mode=None
)

Le modèle identifiera que la fonction ne traite pas les éléments restants après la boucle while (il manque l’ajout des queues list1[i:] et list2[j:]).

Analyse de code complexe

Le raisonnement est particulièrement utile pour comprendre du code complexe ou mal documenté :

code_complexe = """
def process(data):
    cache = {}
    def helper(n, memo=cache):
        if n in memo:
            return memo[n]
        if n < 2:
            memo[n] = n
            return n
        result = helper(n-1) + helper(n-2)
        memo[n] = result
        return result

    return [helper(x) for x in data if isinstance(x, int) and x >= 0]
"""

response = client.chat.complete(
    model="magistral-medium-latest",
    messages=[
        {"role": "user", "content": f"""Analysez ce code en profondeur :
1. Que fait-il exactement ?
2. Y a-t-il des problèmes potentiels ?
3. Comment l'améliorer ?

{code_complexe}"""}
    ]
)

Debugging d’erreurs spécifiques

Erreurs de type

erreur_type = """
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

Code :
def calculate_total(items):
    total = None
    for item in items:
        price = item.get('price')
        total = total + price
    return total
"""

response = client.chat.complete(
    model="magistral-medium-latest",
    messages=[
        {"role": "user", "content": f"Expliquez cette erreur et corrigez le code :\n\n{erreur_type}"}
    ]
)

Problèmes de performance

code_lent = """
def find_duplicates(lst):
    duplicates = []
    for i in range(len(lst)):
        for j in range(i + 1, len(lst)):
            if lst[i] == lst[j] and lst[i] not in duplicates:
                duplicates.append(lst[i])
    return duplicates

# Ce code est très lent sur de grandes listes (100 000+ éléments)
"""

response = client.chat.complete(
    model="magistral-medium-latest",
    messages=[
        {"role": "system", "content": "Analysez la complexité algorithmique et proposez une version optimisée."},
        {"role": "user", "content": f"Optimisez ce code :\n\n{code_lent}"}
    ]
)

Architecture et refactoring

Magistral peut également raisonner sur des choix architecturaux :

architecture = """Mon application Flask a cette structure :

app.py (2000 lignes) :
- Routes API (20 endpoints)
- Logique métier
- Accès base de données
- Validation des données
- Gestion des erreurs

Comment restructurer cette application ?"""

response = client.chat.complete(
    model="magistral-medium-latest",
    messages=[
        {"role": "system", "content": """Architecte logiciel senior.
Raisonnez sur les principes SOLID, la séparation des responsabilités,
et la maintenabilité à long terme."""},
        {"role": "user", "content": architecture}
    ],
    prompt_mode=None
)

Pattern : assistant de code review

Combinez le raisonnement avec une analyse systématique :

def code_review(client, code, language="python"):
    """Effectue une code review approfondie avec raisonnement."""

    review_prompt = f"""Effectuez une code review détaillée de ce code {language}.

Analysez systématiquement :
1. **Correctness** : Le code fait-il ce qu'il est censé faire ?
2. **Edge cases** : Les cas limites sont-ils gérés (None, vide, négatif) ?
3. **Performance** : Quelle est la complexité ? Est-elle optimale ?
4. **Lisibilité** : Le code est-il clair et bien nommé ?
5. **Sécurité** : Y a-t-il des failles (injection, XSS, etc.) ?

Pour chaque problème trouvé, indiquez :
- La ligne concernée
- La sévérité (critique / majeur / mineur)
- La correction recommandée

Code à reviewer :
```{language}
{code}
```"""

    response = client.chat.complete(
        model="magistral-medium-latest",
        messages=[{"role": "user", "content": review_prompt}]
    )

    return response.choices[0].message.content

Comparaison Small ajustable vs Magistral pour le code

Pour le debugging et l’analyse de code, les deux approches ont leurs mérites :

  • mistral-small-latest + reasoning_effort="high" : suffisant pour les bugs simples, les erreurs de syntaxe, et les optimisations évidentes. Moins coûteux en tokens
  • magistral-medium-latest : nécessaire pour les analyses architecturales, les bugs subtils (race conditions, memory leaks), et les code reviews complexes
# Bug simple : Small suffit
simple_bug = "pourquoi 'hello'.split('')[0] lève une erreur ?"
response = client.chat.complete(
    model="mistral-small-latest",
    messages=[{"role": "user", "content": simple_bug}],
    reasoning_effort="high"
)

# Bug complexe : Magistral recommandé
complex_bug = "Mon application Django a un memory leak en production qui n'apparaît pas en dev..."
response = client.chat.complete(
    model="magistral-medium-latest",
    messages=[{"role": "user", "content": complex_bug}]
)

Points clés à retenir

  • Le debugging est un exercice de raisonnement parfait pour Magistral
  • Guidez le modèle avec un system prompt structurant la méthode de diagnostic
  • Le raisonnement brille sur les bugs subtils, les analyses de performance et l’architecture
  • Pour les bugs simples, mistral-small-latest avec raisonnement ajustable suffit
  • Combinez raisonnement et code review systématique pour maximiser la qualité
  • Toujours demander un test de vérification avec la correction proposée