Aller au contenu principal

Le Paramètre reasoning_effort

Mis à jour le 29 juillet 2026

⚠️ Modèle déprécié (mise à jour du 28 juillet 2026) : les modèles Magistral sont dépréciés par Mistral, avec des retraits échelonnés jusqu’à mi-2026. Le raisonnement est désormais intégré aux modèles généralistes (Mistral Small 4, Medium 3.5). Les concepts de ce cours restent instructifs, mais ne construisez plus de nouveau projet sur Magistral — consultez le cours « Mistral en 2026 » pour la migration.

Contrôler la profondeur de réflexion

Le raisonnement ajustable repose sur un principe simple : vous décidez combien le modèle doit réfléchir avant de répondre. Le paramètre reasoning_effort est votre levier de contrôle principal. Disponible sur mistral-small-latest, il fait basculer le modèle entre un mode rapide, sans réflexion visible, et un mode approfondi, avec traces de raisonnement complètes.

Les deux modes de reasoning_effort

Avec reasoning_effort = "high", le modèle génère un chunk de réflexion complet avant de formuler sa réponse. Il explore le problème en profondeur, envisage plusieurs angles, consomme davantage de tokens — et donc de temps et de budget — mais produit des réponses significativement meilleures sur les tâches complexes.

Avec reasoning_effort = "none", la logique s’inverse : la réflexion est minimale voire absente, le chunk de réflexion est purement exclu de la réponse, et le modèle répond rapidement avec une consommation réduite. C’est le réglage naturel des tâches simples et directes.

Implémentation en Python

Le paramètre se passe directement dans l’appel, au même niveau que le modèle et les messages :

from mistralai import Mistral

client = Mistral(api_key="VOTRE_CLE_API")

# Mode HIGH : raisonnement approfondi
response_high = client.chat.complete(
    model="mistral-small-latest",
    messages=[
        {"role": "user", "content": "Résous ce problème : x^3 - 6x^2 + 11x - 6 = 0"}
    ],
    reasoning_effort="high"
)

# Mode NONE : réponse directe sans réflexion
response_none = client.chat.complete(
    model="mistral-small-latest",
    messages=[
        {"role": "user", "content": "Quelle est la capitale de la France ?"}
    ],
    reasoning_effort="none"
)

La différence se lit dans la sortie. En mode "high", la réponse contient deux éléments qu’il faut distinguer à la lecture :

for chunk in response_high.choices[0].message.content:
    if chunk.type == "thinking":
        print("RÉFLEXION:", chunk.text[:200], "...")
    elif chunk.type == "text":
        print("RÉPONSE:", chunk.text)

Avec reasoning_effort="none", la réponse ne contient que l’élément texte, sans trace de réflexion : la boucle ci-dessus n’entrera jamais dans la première branche.

Guide de choix du mode

Le choix dépend entièrement de la nature de la tâche. Réservez "high" aux problèmes mathématiques multi-étapes, au debugging de code complexe, à l’analyse comparative de solutions, à la planification stratégique, aux questions de logique et aux énigmes, ainsi qu’à l’évaluation de risques ou de compromis. Le point commun de ces situations : il existe plusieurs chemins possibles, et se tromper de chemin coûte cher.

Basculez sur "none" pour les questions factuelles simples, la traduction et la reformulation, la génération de texte créatif, le remplissage de formulaires, les réponses conversationnelles basiques et l’extraction d’informations directes. Ici le modèle n’a rien à arbitrer : il restitue ou transforme, et une phase de réflexion n’ajoute que de la latence.

Gestion des coûts

Le mode "high" consomme significativement plus de tokens. Sur une application à fort volume, la facture peut doubler sans que la qualité perçue par l’utilisateur bouge d’un iota — parce que la moitié des requêtes ne demandaient aucune réflexion. Une parade efficace consiste à détecter la complexité à partir de l’intention exprimée dans la question :

def smart_query(client, question, complexity="auto"):
    """Choisit automatiquement le niveau de raisonnement."""

    # Mots-clés indicateurs de complexité
    complex_keywords = [
        "calcule", "démontre", "compare", "analyse",
        "optimise", "debug", "pourquoi", "explique le raisonnement"
    ]

    if complexity == "auto":
        is_complex = any(kw in question.lower() for kw in complex_keywords)
        effort = "high" if is_complex else "none"
    else:
        effort = complexity

    return client.chat.complete(
        model="mistral-small-latest",
        messages=[{"role": "user", "content": question}],
        reasoning_effort=effort
    )

L’heuristique reste grossière, mais elle suffit à réserver le raisonnement aux requêtes qui en tirent une réelle valeur ajoutée, tout en laissant à l’appelant la possibilité de forcer un mode via l’argument complexity.

Limitations à connaître

Quatre points méritent votre attention avant de bâtir dessus. Le paramètre n’accepte que deux valeurs, "high" ou "none" : il n’existe aucun niveau intermédiaire, et espérer un réglage « moyen » vous conduira à une erreur d’API. Le mode "high" n’est par ailleurs pas une garantie de réponse parfaite : il augmente la probabilité d’un raisonnement correct, il ne l’assure pas. Le surcoût en tokens, lui, se situe entre 2x et 10x selon la complexité du problème, ce qui interdit de l’activer par défaut « au cas où ». Enfin, seul mistral-small-latest supporte ce paramètre ; les modèles Magistral reposent sur une approche différente que nous verrons à la leçon 5.

Points clés à retenir

  • reasoning_effort="high" active le raisonnement approfondi avec traces de réflexion
  • reasoning_effort="none" désactive les traces pour une réponse rapide et économique
  • Le paramètre est exclusif à mistral-small-latest
  • Adaptez le mode à la complexité de la tâche pour optimiser le rapport qualité/coût
  • Il n’existe que deux niveaux : pas de granularité intermédiaire