Le Raisonnement Toujours Actif
Une caractéristique fondamentale de Magistral
Contrairement au raisonnement ajustable de mistral-small-latest (où vous choisissez d’activer ou non la réflexion), les modèles Magistral raisonnent systématiquement. Il n’existe aucun paramètre pour désactiver le raisonnement. C’est une décision de conception délibérée, et elle a des implications importantes pour vos applications.
Pourquoi le raisonnement est permanent
Les modèles Magistral ont été entraînés avec le raisonnement intégré à leur architecture. Chaque inférence passe par une phase de réflexion avant de produire la réponse finale. Ce n’est pas une option ajoutée en surface : c’est la manière dont le modèle “pense”.
Ce que cela signifie concrètement
from mistralai import Mistral
client = Mistral(api_key="VOTRE_CLE_API")
# Même pour une question simple, Magistral raisonne
response = client.chat.complete(
model="magistral-small-latest",
messages=[{"role": "user", "content": "Quelle est la capitale de la France ?"}]
)
# La réponse contient toujours un chunk thinking
for chunk in response.choices[0].message.content:
print(f"Type: {chunk.type}")
# Affichera : thinking puis text
Même pour une question triviale, Magistral génère des traces de réflexion. Le modèle vérifie la question, confirme la réponse, et la valide avant de la produire.
Implications sur les coûts
Le raisonnement permanent a un impact direct sur votre consommation de tokens :
Tokens supplémentaires systématiques
Chaque requête génère des tokens de raisonnement en plus des tokens de la réponse finale. Pour une question simple, le surcoût peut sembler disproportionné :
# Exemple de surcoût pour une question simple
# Question : "2 + 2 = ?" (5 tokens en entrée)
# Sans raisonnement : ~10 tokens de sortie
# Avec Magistral : ~50-100 tokens de sortie (raisonnement inclus)
Stratégies d’optimisation des coûts
def choose_model(question, complexity_score):
"""Choisit le modèle selon la complexité.
Pour les tâches simples, inutile d'utiliser Magistral.
Réservez-le aux problèmes qui bénéficient du raisonnement.
"""
if complexity_score < 3:
# Tâche simple : Small sans raisonnement
return {
"model": "mistral-small-latest",
"reasoning_effort": "none"
}
elif complexity_score < 7:
# Tâche modérée : Small avec raisonnement
return {
"model": "mistral-small-latest",
"reasoning_effort": "high"
}
else:
# Tâche complexe : Magistral
return {
"model": "magistral-medium-latest"
}
Implications sur la latence
Le raisonnement systématique augmente également le temps de réponse :
- Temps de génération : plus de tokens à générer = plus de temps
- Premier token : le modèle commence par la réflexion, le premier token “utile” (réponse finale) arrive plus tard
- Streaming : les premiers chunks reçus sont de type
thinking, pastext
Gestion du streaming avec latence
import time
response_stream = client.chat.stream(
model="magistral-medium-latest",
messages=[{"role": "user", "content": "Analysez cette architecture microservices..."}]
)
start = time.time()
first_answer_token = None
for event in response_stream:
delta = event.data.choices[0].delta
if hasattr(delta, "content") and delta.content:
for chunk in delta.content:
if chunk.type == "text" and first_answer_token is None:
first_answer_token = time.time() - start
print(f"\nPremier token de réponse après {first_answer_token:.1f}s")
if chunk.type == "text" and hasattr(chunk, "text"):
print(chunk.text, end="", flush=True)
Implications sur le design d’application
1. Ne pas utiliser Magistral comme modèle générique
Magistral excelle sur les tâches de raisonnement. L’utiliser pour de la simple génération de texte, de la traduction ou des réponses conversationnelles est un gaspillage de ressources.
# MAUVAISE utilisation de Magistral
response = client.chat.complete(
model="magistral-medium-latest",
messages=[{"role": "user", "content": "Traduis 'bonjour' en anglais."}]
)
# Fonctionne mais gaspille des tokens de raisonnement
# BONNE utilisation de Magistral
response = client.chat.complete(
model="magistral-medium-latest",
messages=[{"role": "user", "content": "Prouvez que pour tout n, n^3 - n est divisible par 6."}]
)
2. Toujours prévoir le parsing des chunks
Puisque le raisonnement est toujours présent, votre code doit toujours gérer les chunks thinking :
def extract_magistral_response(response):
"""Extrait la réponse d'un modèle Magistral.
Toujours prévoir le chunk thinking car il est systématique.
"""
answer = ""
reasoning = ""
for chunk in response.choices[0].message.content:
if chunk.type == "thinking":
if hasattr(chunk, "thinking"):
reasoning = " ".join(
part.text for part in chunk.thinking
if hasattr(part, "text")
)
elif chunk.type == "text":
answer = chunk.text
return {"answer": answer, "reasoning": reasoning}
3. Informer l’utilisateur
Si votre application expose Magistral à des utilisateurs finaux, communiquez sur le temps de réflexion :
def stream_with_indicator(client, messages):
"""Affiche un indicateur pendant la phase de réflexion."""
response_stream = client.chat.stream(
model="magistral-medium-latest",
messages=messages
)
is_thinking = True
for event in response_stream:
delta = event.data.choices[0].delta
if hasattr(delta, "content") and delta.content:
for chunk in delta.content:
if chunk.type == "text" and is_thinking:
is_thinking = False
print("\n--- Réflexion terminée ---\n")
if chunk.type == "thinking":
print(".", end="", flush=True)
elif chunk.type == "text" and hasattr(chunk, "text"):
print(chunk.text, end="", flush=True)
Ce qu’on ne peut pas faire
Pour être parfaitement clair, voici ce qui est impossible avec les modèles Magistral :
- Désactiver le raisonnement : il n’existe aucun paramètre
reasoning_effort="none"pour Magistral - Masquer les traces côté serveur : les tokens de raisonnement sont toujours générés (et facturés)
- Forcer une réponse sans réflexion : même avec un system prompt demandant de ne pas réfléchir, le modèle raisonne quand même
La seule manière d’éviter le raisonnement est d’utiliser un autre modèle (comme mistral-small-latest avec reasoning_effort="none").
Points clés à retenir
- Les modèles Magistral raisonnent toujours, sans possibilité de désactivation
- Cela implique un surcoût systématique en tokens et en latence
- Ne pas utiliser Magistral pour des tâches simples qui ne nécessitent pas de raisonnement
- Votre code doit toujours parser les chunks thinking
- Informez vos utilisateurs du temps de réflexion supplémentaire
- Pour les tâches simples, préférez
mistral-small-latestavecreasoning_effort="none"