Aller au contenu principal
Leçon 6 sur 12 · Modération et Sécurité IA avec Mistral

Les 11 catégories de modération

Leçon 6 sur 12 Mis à jour le 3 novembre 2026 Développeur
Sur cette page
  1. Comprendre les catégories de risque
  2. Les catégories « dures » vs « molles »
  3. Analyser les scores en Python
  4. Catégories multiples : un texte peut déclencher plusieurs alertes
  5. Points clés à retenir

Corrigé le 3 novembre 2026. Le tableau des catégories contenait trois clés qui n’existent pas (hate, violence, unpredictable) et omettait dangerous. Les onze clés ci-dessous sont celles de mistral-moderation-2603, d’après la documentation et les types du SDK mistralai 3.7.0 ; les descriptions suivent celles de Mistral. Les valeurs de sortie présentées comme mesurées étaient inventées : elles sont maintenant données pour ce qu’elles sont, des illustrations. Sources : Moderation & Guardrailing · Mistral Moderation 2411 (ancien modèle).

Comprendre les catégories de risque

Le modèle Mistral Moderation analyse le contenu selon 11 catégories distinctes. Chaque catégorie couvre un type de risque spécifique et retourne un score indépendant entre 0.0 et 1.0. Comprendre précisément ce que chaque catégorie détecte est essentiel pour configurer vos seuils de manière pertinente : sans cette lecture, vous fixez des chiffres au hasard et vous vous étonnez ensuite des blocages.

Le tableau ci-dessous donne, pour chacune, la clé exacte à utiliser dans vos configurations, ce qu’elle couvre et les cas qu’elle attrape en pratique.

CatégorieClé APICe que Mistral y range
Contenu sexuelsexualActivités sexuelles, nudité ou services sexuels décrits ou promus explicitement ; le contenu éducatif ou médical non explicite est en général exempté
Haine et discriminationhate_and_discriminationPréjugés, hostilité ou appels à la discrimination fondés sur des caractéristiques protégées, y compris le harcèlement
Violence et menacesviolence_and_threatsViolence physique décrite, glorifiée, incitée ou menacée, et instructions pour la commettre
Contenu dangereuxdangerousComportements extrêmement dangereux, à fort risque de dommage physique
Activités criminellescriminalActivités illégales décrites ou promues
AutomutilationselfharmAutomutilation, suicide, troubles alimentaires : méthodes, glorification, intentions, défis dangereux
SantéhealthDemande ou fourniture de conseils médicaux détaillés ou personnalisés
FinancefinancialDemande ou fourniture de conseils financiers détaillés ou personnalisés
JuridiquelawDemande ou fourniture de conseils juridiques détaillés ou personnalisés
Données personnellespiiDemande, partage ou tentative d’obtenir des données identifiantes : nom complet, adresse, téléphone, numéro de sécurité sociale, coordonnées bancaires
JailbreakjailbreakingTentatives de contourner les règles du modèle par manipulation du prompt, jeu de rôle ou autre technique

Les catégories dangerous, criminal et jailbreaking sont arrivées avec mistral-moderation-2603 : l’ancien modèle, mistral-moderation-2411, déprécié le 31 mars 2026, réunissait les deux premières sous une seule clé, dangerous_and_criminal_content, et ne détectait pas le jailbreak. Certains exemples de réponse de la documentation montrent encore cet ancien découpage : lisez les clés que l’API vous renvoie plutôt que de les supposer.

Les catégories « dures » vs « molles »

En pratique, ces 11 catégories se répartissent en deux groupes selon leur criticité, et cette distinction gouverne toute votre stratégie de seuils.

Les catégories dures — sexual, hate_and_discrimination, violence_and_threats, dangerous, criminal et selfharm — représentent des risques graves où un faux négatif, c’est-à-dire du contenu dangereux non détecté, peut avoir des conséquences sérieuses. Le contenu sexuel emporte un risque légal et une obligation de protection des mineurs ; la haine expose à un risque réputationnel majeur autant qu’à une exposition juridique ; la violence touche à l’incitation et aux menaces ; le dangereux et le criminel couvrent les comportements à haut risque et les activités illégales ; l’auto-mutilation met en jeu la vie de l’utilisateur. Sur ces six catégories, des seuils bas de 0.1 à 0.2 se justifient quel que soit votre produit, et vous acceptez délibérément quelques faux positifs.

Les catégories molles dépendent fortement du contexte de votre application, avec des seuils ajustables entre 0.3 et 0.8. Un chatbot médical légitime doit pouvoir parler de health, une application fintech a besoin des discussions couvertes par financial, un assistant juridique traite forcément du law, et certaines applications collectent des données relevant de pii en toute légalité. Un cas se lit différemment : jailbreaking ne dépend pas du sujet abordé mais de l’intention de manipuler le modèle, et reste critique pour toute application ouverte au public.

Analyser les scores en Python

La fonction suivante transforme un appel brut en verdict lisible : elle isole les catégories dépassant 0.3, identifie le score maximal et sa catégorie, et retourne un indicateur safe directement exploitable dans votre logique applicative.

from mistralai.client import Mistral
import os

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

def analyser_contenu(texte: str) -> dict:
    """Analyse un texte et retourne les catégories à risque."""
    response = client.classifiers.moderate(
        model="mistral-moderation-2603",
        inputs=[texte]
    )

    scores = response.results[0].category_scores or {}

    # Séparer les catégories à risque
    risques = {}
    for categorie, score in scores.items():
        if score > 0.3:
            risques[categorie] = round(score, 3)

    return {
        "texte": texte[:100],
        "risques": risques,
        "score_max": max(scores.values(), default=0.0),
        "categorie_max": max(scores, key=lambda c: scores[c], default=None),
        "safe": len(risques) == 0
    }

print(analyser_contenu("Bonjour, comment allez-vous ?"))
print(analyser_contenu("Quelle dose de paracétamol pour un enfant de 20 kg ?"))

category_scores est facultatif dans le SDK, d’où le or {}. Lancez les deux exemples sur votre compte : la salutation devrait rester très bas partout, la question de posologie monter sur health. Ce n’est pas un contenu « dangereux » au sens commun, c’est un contenu dont vous devez décider s’il relève de votre périmètre.

Catégories multiples : un texte peut déclencher plusieurs alertes

Un seul texte peut avoir des scores élevés dans plusieurs catégories simultanément — une demande d’aide à la fraude fiscale touchera criminal, financial et law d’un coup. Votre logique de décision doit prendre en compte cette multiplicité, et surtout hiérarchiser : la fonction ci-dessous trie les violations par ampleur du dépassement, ce qui vous indique quelle catégorie a réellement motivé le blocage.

def evaluer_risque_global(scores: dict, seuils: dict) -> dict:
    """Évalue le risque global en tenant compte de toutes les catégories."""
    violations = []

    for categorie, seuil in seuils.items():
        score = scores.get(categorie, 0)
        if score > seuil:
            violations.append({
                "categorie": categorie,
                "score": score,
                "seuil": seuil,
                "depassement": round(score - seuil, 3)
            })

    return {
        "bloque": len(violations) > 0,
        "violations": sorted(violations,
                            key=lambda v: v["depassement"],
                            reverse=True),
        "nombre_violations": len(violations)
    }

# Configuration par profil
seuils_strict = {
    "sexual": 0.1, "hate_and_discrimination": 0.1, "violence_and_threats": 0.15,
    "dangerous": 0.1, "criminal": 0.1, "selfharm": 0.1,
    "health": 0.3, "financial": 0.3, "law": 0.3,
    "pii": 0.15, "jailbreaking": 0.1,
}

Le profil seuils_strict reprend exactement la logique dure/molle exposée plus haut : seuils de 0.1 à 0.15 sur les six catégories critiques et sur le jailbreak, tolérance à 0.3 sur les domaines contextuels. Gardez cette structure comme point de départ et documentez chaque écart que vous y introduirez.

Points clés à retenir

  • mistral-moderation-2603 analyse le contenu selon 11 catégories aux clés fixées ; hate, violence ou unpredictable n’existent pas
  • Chaque catégorie retourne un score de 0.0 à 1.0
  • Les catégories « dures » (sexual, hate_and_discrimination, violence_and_threats, dangerous, criminal, selfharm) nécessitent des seuils bas
  • Les catégories « molles » (health, financial, law) s’ajustent selon votre contexte applicatif
  • Un texte peut déclencher plusieurs catégories simultanément
  • Utilisez les scores bruts (category_scores) plutôt que les booléens par défaut