Résolution de Problèmes Mathématiques
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.
Les mathématiques : terrain de prédilection du raisonnement
Les problèmes mathématiques sont le cas d’usage où le raisonnement apporte la plus grande valeur ajoutée. Un modèle sans raisonnement répond correctement à « 2 + 2 », mais échoue souvent sur les problèmes multi-étapes, les démonstrations et les énigmes logiques. Avec le raisonnement, le modèle décompose, vérifie et valide chaque étape — c’est exactement ce qui manque à une génération token par token.
Problèmes arithmétiques multi-étapes
Commençons par un cas où l’ordre des opérations décide du résultat. Une remise de 20 % puis un bon de 15 euros ne donnent pas le même montant qu’un bon appliqué avant la remise : un modèle pressé mélange les deux.
from mistralai import Mistral
client = Mistral(api_key="VOTRE_CLE_API")
probleme = """Un magasin propose une réduction de 20% sur tous les articles.
Un client achète 3 articles à 45 euros, 2 articles à 30 euros et 1 article à 75 euros.
Il a aussi un bon de réduction supplémentaire de 15 euros applicable après la remise.
Quel est le montant final à payer ? Détaillez chaque étape."""
response = client.chat.complete(
model="magistral-medium-latest",
messages=[{"role": "user", "content": probleme}]
)
# Le modèle raisonne étape par étape :
# 1. Calcul du prix total avant réduction
# 2. Application de la remise de 20%
# 3. Soustraction du bon de 15 euros
# 4. Vérification du résultat
Le raisonnement permet au modèle de ne pas sauter d’étapes et de vérifier la cohérence de ses calculs intermédiaires avant de livrer un montant.
Équations et systèmes d’équations
Les systèmes d’équations testent la même discipline sur un terrain plus formel. Ici le system prompt personnalisé accompagne un prompt_mode=None, puisqu’il impose sa propre exigence de détail :
systeme = """Résolvez le système d'équations suivant :
3x + 2y - z = 7
x - y + 2z = 3
2x + 3y + z = 12
Montrez chaque étape de la résolution."""
response = client.chat.complete(
model="magistral-medium-latest",
messages=[
{"role": "system", "content": "Vous êtes un professeur de mathématiques. Détaillez chaque opération."},
{"role": "user", "content": systeme}
],
prompt_mode=None
)
Le modèle commence par choisir une méthode — substitution, élimination ou matrices — applique les opérations une à une, puis substitue ses valeurs dans les équations d’origine pour vérifier qu’elles tiennent. Cette dernière étape, souvent négligée par un modèle sans réflexion, est celle qui rattrape les erreurs de signe.
Démonstrations et preuves
Les démonstrations mathématiques révèlent toute la puissance du raisonnement natif, à condition de fixer la charpente attendue. Imposer les quatre temps de la récurrence dans le system prompt évite au modèle de « conclure » à partir de deux cas particuliers :
demonstration = """Démontrez par récurrence que pour tout entier n >= 1 :
1^2 + 2^2 + 3^2 + ... + n^2 = n(n+1)(2n+1) / 6"""
response = client.chat.complete(
model="magistral-medium-latest",
messages=[
{"role": "system", "content": """Vous êtes un mathématicien rigoureux.
Structure de démonstration attendue :
1. Initialisation (cas de base)
2. Hypothèse de récurrence
3. Hérédité (passage de n à n+1)
4. Conclusion"""},
{"role": "user", "content": demonstration}
],
prompt_mode=None
)
Énigmes logiques
Les énigmes de contraintes sont particulièrement révélatrices, car aucune formule ne mène à la solution : il faut explorer, puis éliminer. Le classique des trois amis, trois métiers et trois couleurs de voiture en est le représentant le plus pur.
enigme = """Trois amis (Alice, Bob, Charlie) ont chacun un métier différent
(médecin, avocat, ingénieur) et une voiture de couleur différente (rouge, bleue, verte).
Indices :
1. Alice n'est pas médecin
2. Le propriétaire de la voiture rouge est avocat
3. Bob n'a pas la voiture verte
4. Charlie n'est pas avocat
5. L'ingénieur a la voiture bleue
Trouvez le métier et la couleur de voiture de chacun."""
response = client.chat.complete(
model="magistral-medium-latest",
messages=[{"role": "user", "content": enigme}]
)
Dans ses traces de réflexion, le modèle liste les possibilités pour chaque personne, applique les contraintes une par une, élimine les combinaisons impossibles, puis valide la solution retenue contre les cinq indices. C’est cette dernière passe de validation qui distingue une déduction d’une intuition heureuse.
Optimisation et probabilités
Le dénombrement pose une difficulté voisine : la réponse dépend d’un choix de modèle probabiliste que le modèle doit expliciter avant de calculer.
proba = """Une urne contient 5 boules rouges, 3 boules bleues et 2 boules vertes.
On tire 3 boules sans remise.
Quelle est la probabilité d'obtenir exactement 2 boules rouges et 1 boule bleue ?
Exprimez le résultat sous forme de fraction irréductible."""
response = client.chat.complete(
model="magistral-medium-latest",
messages=[{"role": "user", "content": proba}]
)
Pattern : validation automatique
Pour les résultats critiques, un seul appel ne suffit pas. Vous pouvez exploiter le raisonnement une seconde fois en soumettant la solution produite à un contrôle indépendant : le modèle aborde alors le problème avec la réponse sous les yeux, ce qui l’oblige à vérifier plutôt qu’à produire.
def solve_and_verify(client, problem):
"""Résout un problème et demande une vérification."""
# Étape 1 : résolution
solve_response = client.chat.complete(
model="magistral-medium-latest",
messages=[{"role": "user", "content": problem}]
)
answer = ""
for chunk in solve_response.choices[0].message.content:
if chunk.type == "text":
answer = chunk.text
# Étape 2 : vérification par un second appel
verify_response = client.chat.complete(
model="magistral-medium-latest",
messages=[
{"role": "user", "content": f"""Vérifiez cette solution au problème suivant :
PROBLÈME : {problem}
SOLUTION PROPOSÉE : {answer}
La solution est-elle correcte ? Si non, corrigez-la."""}
]
)
return {
"solution": answer,
"verification": verify_response.choices[0].message.content
}
Comparaison avec et sans raisonnement
Pour mesurer l’apport sur un cas concret, reprenez l’énigme des poules. La proportionnalité y est trompeuse et pousse un modèle sans réflexion vers la réponse « 12 », par simple analogie avec l’énoncé.
probleme_test = "Si 3 poules pondent 3 oeufs en 3 jours, combien d'oeufs pondent 12 poules en 12 jours ?"
# Sans raisonnement — risque d'erreur par analogie naïve (réponse "12")
response_none = client.chat.complete(
model="mistral-small-latest",
messages=[{"role": "user", "content": probleme_test}],
reasoning_effort="none"
)
# Avec raisonnement — décomposition correcte
response_high = client.chat.complete(
model="magistral-medium-latest",
messages=[{"role": "user", "content": probleme_test}]
)
# Raisonnement attendu : 1 poule = 1 oeuf / 3 jours
# 12 poules en 12 jours = 12 * (12/3) = 48 oeufs
Lancez les deux appels sur vos propres problèmes avant d’arbitrer : c’est la seule façon fiable de savoir si le surcoût du raisonnement se justifie dans votre domaine.
Points clés à retenir
- Le raisonnement excelle sur les problèmes mathématiques multi-étapes
- Utilisez un system prompt qui impose la structure de résolution (étapes, vérification)
- Les démonstrations par récurrence bénéficient énormément du raisonnement structuré
- Les énigmes logiques mettent en valeur l’exploration et l’élimination de possibilités
- Implémentez une double vérification pour les résultats critiques
- Comparez toujours les résultats avec et sans raisonnement pour valider l’apport