Choisir le bon niveau de raisonnement
Sur cette page
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
| Situation | Réglage de départ | Pourquoi |
|---|---|---|
| Question factuelle, reformulation, extraction | Small 4, none | Rien à arbitrer : la réflexion n’ajouterait que latence et tokens |
| Calcul multi-étapes, debugging courant, comparaison simple | Small 4, high | Le raisonnement corrige les erreurs d’enchaînement, pour un coût modeste |
| Résumé ou reformulation sur Large 4 | Large 4, low | Large 4 n’accepte pas none ; low est son niveau le plus économe |
| Analyse multi-critères, plan de migration, bug subtil | Large 4, medium puis high | Mesurer d’abord le niveau intermédiaire, monter si la qualité l’exige |
| Décision critique (juridique, financière, médicale) | Large 4, high + vérification | Le 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
nonepour le simple, enhighpour le multi-étapes ; Large 4 pour les cas les plus durs - Chiffrez chaque réglage à partir de
usageet 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.