Aller au contenu principal
Leçon 12 sur 12 · Raisonnement IA avec Mistral — reasoning_effort, Small 4 et Large 4

Choisir le bon niveau de raisonnement

Leçon 12 sur 12 Mis à jour le 2 novembre 2026 Développeur
Sur cette page
  1. Deux curseurs au lieu d’un choix de gamme
  2. Le tableau de décision
  3. Chiffrer avant de généraliser
  4. Une architecture de routage
  5. Bonnes pratiques de production
  6. Synthèse du cours
  7. Points clés à retenir
  8. Testez vos connaissances

Leçon réécrite le 2 novembre 2026. Elle opposait le raisonnement « ajustable » de Mistral Small au raisonnement « natif » de Magistral, retiré depuis le 31 juillet 2026. Le choix se fait désormais entre modèles généralistes et niveaux de reasoning_effort. Sources : Reasoning · fiches Small 4 et Large 4.

Deux curseurs au lieu d’un choix de gamme

Choisir un modèle de raisonnement chez Mistral, c’était hier choisir entre deux gammes. C’est aujourd’hui régler deux curseurs : le modèle (Small 4 pour l’essentiel, Large 4 pour les cas les plus durs) et le niveau de réflexion (none ou high sur Small 4 ; low, medium ou high sur Large 4). Une même application peut, et souvent doit, utiliser plusieurs combinaisons.

Le tableau de décision

SituationRéglage de départPourquoi
Question factuelle, reformulation, extractionSmall 4, noneRien à arbitrer : la réflexion n’ajouterait que latence et tokens
Calcul multi-étapes, debugging courant, comparaison simpleSmall 4, highLe raisonnement corrige les erreurs d’enchaînement, pour un coût modeste
Résumé ou reformulation sur Large 4Large 4, lowLarge 4 n’accepte pas none ; low est son niveau le plus économe
Analyse multi-critères, plan de migration, bug subtilLarge 4, medium puis highMesurer d’abord le niveau intermédiaire, monter si la qualité l’exige
Décision critique (juridique, financière, médicale)Large 4, high + vérificationLe raisonnement réduit les erreurs sans les supprimer : une seconde passe ou une revue humaine reste nécessaire

Ce tableau donne des points de départ, pas des vérités : vos évaluations tranchent. Et rappelez-vous que Large 4 est en Public Preview au 2 novembre 2026.

Chiffrer avant de généraliser

Les tarifs affichés (par million de tokens, relevés le 2 novembre 2026) permettent d’estimer le coût d’un réglage à partir du champ usage des réponses :

TARIFS = {  # dollars par million de tokens : (entrée, sortie)
    "mistral-small-2603": (0.15, 0.60),
    "mistral-large-4-0": (0.70, 2.10),
    "mistral-medium-3-5": (1.50, 7.50),   # déprécié, retrait le 30 avril 2027
}

def cout(response, model):
    """Coût d'une réponse, réflexion comprise (hors remise de cache)."""
    entree, sortie = TARIFS[model]
    u = response.usage
    return (u.prompt_tokens * entree + u.completion_tokens * sortie) / 1_000_000

Additionnez ce coût par type de requête sur quelques jours de trafic réel : c’est le chiffre qui dira si un réglage high généralisé est soutenable.

Une architecture de routage

Dans une application réelle, la majorité des requêtes sont simples. Payer de la réflexion sur celles-ci n’améliore rien. Le routeur suivant demande d’abord à Small 4, sans raisonnement, d’estimer la complexité de la question, puis envoie celle-ci vers le bon réglage :

import os
from mistralai.client import Mistral

class RouteurRaisonnement:
    """Oriente chaque question vers un modèle et un niveau de raisonnement."""

    def __init__(self):
        self.client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

    def complexite(self, question):
        r = self.client.chat.complete(
            model="mistral-small-2603",
            messages=[{"role": "user", "content":
                f"Note la complexité de cette question de 0 à 10. Réponds uniquement par le nombre : {question}"}],
            reasoning_effort="none",
        )
        try:
            return min(max(int(str(r.choices[0].message.content).strip()), 0), 10)
        except ValueError:
            return 5  # valeur prudente si la réponse n'est pas un nombre

    def repondre(self, question, system_prompt=None):
        score = self.complexite(question)
        if score <= 3:
            model, niveau = "mistral-small-2603", "none"
        elif score <= 7:
            model, niveau = "mistral-small-2603", "high"
        else:
            model, niveau = "mistral-large-4-0", "high"
        messages = [{"role": "system", "content": system_prompt}] if system_prompt else []
        messages.append({"role": "user", "content": question})
        return self.client.chat.complete(model=model, messages=messages, reasoning_effort=niveau)

L’appel de classification coûte peu : quelques dizaines de tokens sur le modèle le moins cher, sans réflexion. Ajustez les seuils après observation, en comparant la qualité et le coût de chaque branche.

Bonnes pratiques de production

Journalisez l’usage par branche. Pour chaque réponse, conservez le modèle, le niveau, usage.prompt_tokens, usage.completion_tokens et le coût calculé ci-dessus. Sans ces chiffres, impossible de savoir si le raisonnement paie.

Épinglez des identifiants datés. En production, mistral-small-2603 plutôt que mistral-small-latest : un alias peut basculer vers une nouvelle version sans que votre code change. Centralisez ces identifiants dans une configuration unique.

MODELES = {
    "rapide": ("mistral-small-2603", "none"),
    "raisonnement": ("mistral-small-2603", "high"),
    "approfondi": ("mistral-large-4-0", "high"),
}

Prévoyez un repli. Large 4 étant en Public Preview, un repli vers Small 4 en high protège votre service si l’appel échoue. Les erreurs HTTP du SDK héritent toutes de MistralError :

from mistralai.client import errors

def interroger_avec_repli(client, messages):
    try:
        return client.chat.complete(model="mistral-large-4-0", messages=messages, reasoning_effort="high")
    except errors.MistralError:
        return client.chat.complete(model="mistral-small-2603", messages=messages, reasoning_effort="high")

Surveillez les dépréciations. La page des modèles de Mistral liste les dates de dépréciation et de retrait. Medium 3.5 sera retiré le 30 avril 2027 : si vous l’utilisez, la date est déjà connue.

Synthèse du cours

Le raisonnement donne au modèle un espace de réflexion avant sa réponse ; chez Mistral, il se règle requête par requête avec reasoning_effort, dont les valeurs dépendent du modèle. La réponse arrive alors sous forme de fragments, réflexion puis réponse, qu’il faut savoir lire, y compris en streaming, et rejouer en entier dans les conversations multi-tours. Les agents et l’API Conversations portent le même réglage dans completion_args. Magistral est retiré : Small 4 et Large 4 prennent le relais, Medium 3.5 n’étant plus qu’une étape. Enfin, le raisonnement se justifie là où il y a des chemins à explorer et des erreurs à rattraper (mathématiques, code, décisions), et se mesure toujours : qualité, tokens, latence.

Points clés à retenir

  • Deux curseurs : le modèle (Small 4, Large 4) et le niveau de reasoning_effort
  • Small 4 en none pour le simple, en high pour le multi-étapes ; Large 4 pour les cas les plus durs
  • Chiffrez chaque réglage à partir de usage et des tarifs officiels avant de le généraliser
  • Un routeur réserve la réflexion aux requêtes qui en tirent profit
  • En production : identifiants datés, journalisation de l’usage, repli de Large 4 vers Small 4

Testez vos connaissances

Cinq questions pour valider l’essentiel du cours.

1. Quelles valeurs de reasoning_effort accepte Mistral Large 4, et laquelle refuse-t-il ?

Réponse : low, medium et high (la documentation recommande high comme point de départ). Il refuse none : le niveau autrefois appelé ainsi dans sa préversion se nomme désormais low.

2. Où se trouve le texte de la réflexion dans une réponse avec raisonnement ?

Réponse : Dans un ThinkChunk (type thinking) de la liste message.content. Son champ thinking est lui-même une liste de TextChunk, dont on lit le champ text. La réponse finale est dans un TextChunk de premier niveau.

3. Que faut-il remettre dans l'historique d'une conversation multi-tours en Chat Completions ?

Réponse : Le message complet de l’assistant, fragments de réflexion compris. Retirer la réflexion économise des tokens mais dégrade nettement la qualité des tours suivants.

4. Votre code appelle encore magistral-medium-latest : que faire ?

Réponse : Migrer sans attendre, car Magistral est retiré depuis le 31 juillet 2026. Visez Small 4 si la qualité suffit, sinon Large 4 avec reasoning_effort="high" ; Medium 3.5, remplaçant désigné, est lui-même déprécié jusqu’au 30 avril 2027. Retirez prompt_mode et le gabarit de réflexion des prompts système.

5. Comment régler reasoning_effort dans un agent Mistral ?

Réponse : Dans le champ completion_args de l’agent, par exemple completion_args={"reasoning_effort": "high"}. Avec l’API Conversations, le même champ s’utilise à chaque start ou append.