Aller au contenu principal

Choisir entre Ajustable et Natif

Le bon modèle pour le bon usage

Après avoir exploré les deux approches de raisonnement de Mistral AI, il est temps de synthétiser et de vous donner les clés pour choisir la bonne stratégie selon votre contexte. Cette leçon récapitule les différences et fournit un cadre de décision concret.

Récapitulatif des deux approches

Raisonnement Ajustable (mistral-small-latest)

  • Activation : paramètre reasoning_effort (“high” ou “none”)
  • Flexibilité : vous choisissez quand activer le raisonnement
  • Coût : maîtrisé car le raisonnement n’est consommé que quand nécessaire
  • Intégration : Chat Completions, Agents, Conversations

Raisonnement Natif (Magistral)

  • Activation : toujours actif, impossible à désactiver
  • Flexibilité : aucune, le raisonnement est systématique
  • Coût : plus élevé car chaque requête inclut des tokens de réflexion
  • Qualité : supérieure sur les tâches de raisonnement complexe

Tableau comparatif

Critère Small (Ajustable) Magistral (Natif)
Modèles mistral-small-latest magistral-small-latest, magistral-medium-latest
Contrôle Granulaire (on/off par requête) Aucun (toujours actif)
Coût moyen Variable (bas sans reasoning, modéré avec) Toujours élevé (reasoning systématique)
Latence Basse (none) à modérée (high) Toujours modérée à haute
Qualité raisonnement Bonne avec "high" Excellente (modèles dédiés)
System prompt Standard Structure 3 parties recommandée + prompt_mode
Format traces Chunk thinking avec text direct Chunk thinking avec sous-tableau thinking
Cas d'usage idéal Applications mixtes (simple + complexe) Tâches exclusivement complexes

Arbre de décision

Voici un guide pas-à-pas pour choisir :

1. Votre application mélange tâches simples et complexes ?

Si oui, utilisez mistral-small-latest avec un routage intelligent :

from mistralai import Mistral

client = Mistral(api_key="VOTRE_CLE_API")

def smart_router(question):
    """Route la question vers le bon mode."""
    complex_patterns = [
        "démontre", "prouve", "analyse", "compare",
        "debug", "optimise", "pourquoi", "risque",
        "architecture", "stratégie"
    ]

    needs_reasoning = any(p in question.lower() for p in complex_patterns)

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

2. Toutes vos tâches sont complexes ?

Si oui, utilisez directement Magistral :

# Application dédiée au raisonnement : Magistral d'office
response = client.chat.complete(
    model="magistral-medium-latest",
    messages=[
        {"role": "system", "content": "Votre system prompt spécialisé..."},
        {"role": "user", "content": question}
    ],
    prompt_mode=None
)

3. Vous avez un budget serré ?

Privilégiez Small avec raisonnement ajustable. Activez “high” uniquement quand la qualité le justifie.

4. La précision est critique (médical, juridique, financier) ?

Utilisez Magistral Medium pour maximiser la qualité du raisonnement sur chaque requête.

Architecture hybride

L’approche la plus efficace combine les deux :

class ReasoningRouter:
    """Router intelligent entre les modèles de raisonnement."""

    def __init__(self, api_key):
        self.client = Mistral(api_key=api_key)

    def classify_complexity(self, question):
        """Évalue la complexité d'une question (0-10)."""
        response = self.client.chat.complete(
            model="mistral-small-latest",
            messages=[{
                "role": "user",
                "content": f"Évaluez la complexité de cette question de 0 à 10 (répondez uniquement le chiffre) : {question}"
            }],
            reasoning_effort="none"
        )
        try:
            score = int(response.choices[0].message.content.strip())
            return min(max(score, 0), 10)
        except ValueError:
            return 5  # défaut modéré

    def query(self, question, system_prompt=None):
        """Route automatiquement vers le bon modèle."""
        complexity = self.classify_complexity(question)

        if complexity <= 3:
            # Simple : Small sans raisonnement
            return self.client.chat.complete(
                model="mistral-small-latest",
                messages=[{"role": "user", "content": question}],
                reasoning_effort="none"
            )
        elif complexity <= 6:
            # Modéré : Small avec raisonnement
            return self.client.chat.complete(
                model="mistral-small-latest",
                messages=[{"role": "user", "content": question}],
                reasoning_effort="high"
            )
        else:
            # Complexe : Magistral
            messages = []
            if system_prompt:
                messages.append({"role": "system", "content": system_prompt})
            messages.append({"role": "user", "content": question})

            return self.client.chat.complete(
                model="magistral-medium-latest",
                messages=messages,
                prompt_mode=None if system_prompt else "reasoning"
            )

Bonnes pratiques de production

1. Monitoring des coûts

def track_reasoning_cost(response, model):
    """Estime le coût de raisonnement."""
    usage = response.usage
    reasoning_tokens = usage.completion_tokens
    prompt_tokens = usage.prompt_tokens

    print(f"Modèle: {model}")
    print(f"Tokens entrée: {prompt_tokens}")
    print(f"Tokens sortie (raisonnement inclus): {reasoning_tokens}")

2. Versionnage en production

# TOUJOURS spécifier une version fixe en production
MODELS = {
    "fast": "mistral-small-latest",
    "reasoning": "mistral-small-latest",
    "deep": "magistral-medium-2509"  # version fixe
}

3. Fallback gracieux

def resilient_query(client, question, preferred_model="magistral-medium-latest"):
    """Requête avec fallback si le modèle principal échoue."""
    try:
        return client.chat.complete(
            model=preferred_model,
            messages=[{"role": "user", "content": question}]
        )
    except Exception:
        # Fallback vers Small avec raisonnement
        return client.chat.complete(
            model="mistral-small-latest",
            messages=[{"role": "user", "content": question}],
            reasoning_effort="high"
        )

Synthèse finale du cours

Au fil de ces 12 leçons, vous avez appris à :

  1. Comprendre le Test Time Computation et les thinking traces
  2. Contrôler le raisonnement ajustable avec reasoning_effort
  3. Parser les thinking chunks dans vos applications
  4. Intégrer le raisonnement dans les Agents et Conversations
  5. Maîtriser les modèles Magistral et leurs versions
  6. Optimiser le system prompt pour guider le raisonnement
  7. Configurer le prompt_mode selon vos besoins
  8. Anticiper les implications du raisonnement permanent
  9. Appliquer le raisonnement aux problèmes mathématiques
  10. Exploiter le raisonnement pour le code et le debugging
  11. Structurer vos analyses et prises de décision
  12. Choisir la bonne approche selon votre contexte

Le raisonnement est un outil puissant, mais comme tout outil, son efficacité dépend de la manière dont vous l’utilisez. Choisissez le bon modèle, structurez vos prompts, et mesurez l’impact sur vos coûts et performances.

Points clés à retenir

  • Small ajustable : flexibilité et maîtrise des coûts, idéal pour les applications mixtes
  • Magistral natif : qualité maximale, idéal pour les tâches exclusivement complexes
  • L’architecture hybride avec routage intelligent est souvent la meilleure approche
  • Toujours monitorer les coûts et utiliser des versions fixes en production
  • Le raisonnement est un investissement : il coûte plus cher mais améliore significativement la qualité sur les tâches qui le nécessitent