0Pricing
AI Prompt Engineering · Leçon

Confiance et incertitude en classification

Demandez au modèle d’évaluer son degré de confiance et de gérer les classifications ambiguës.

Confiance et incertitude en classification est une leçon AI Prompt Engineering gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Prompt Engineering, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Prompt Engineering comprend 4 leçons au total.

Le problème des modèles trop sûrs d’eux

Par défaut, les LLM répondent aux tâches de classification avec une certitude apparente, même lorsque l’entrée est réellement ambiguë. Un modèle auquel on demande de renvoyer positif, négatif ou neutre en choisira toujours un — sans jamais dire Je ne suis pas certain.

Dans les systèmes de production, traiter des classifications incertaines comme si elles étaient certaines entraîne des erreurs coûteuses : demandes d’assistance mal acheminées, recommandations erronées, rapports inexacts.

La quantification de l’incertitude dans les instructions de classification résout ce problème.

Scores de confiance de 1 à 10

Demander au modèle d’évaluer sa confiance sur une échelle numérique fournit un signal détaillé que les systèmes en aval peuvent comparer à des seuils :

import anthropic, json

client = anthropic.Anthropic(api_key='YOUR_API_KEY')

def classify_with_confidence(text):
    prompt = f'''
Classify the sentiment of the text below.
Return JSON:
{{
  "sentiment": "positive|negative|neutral",
  "confidence": 1-10,
  "reason": "brief explanation of confidence level"
}}

Confidence scale: 10=completely certain, 1=total guess, 5=genuinely ambiguous

Text: {text}
'''
    r = client.messages.create(
        model='claude-opus-4-5', max_tokens=100,
        messages=[{'role': 'user', 'content': prompt}]
    )
    return json.loads(r.content[0].text)

print(classify_with_confidence('I sort of liked it but the wait was too long.'))
print(classify_with_confidence('This product is absolutely outstanding!'))

La réponse UNCERTAIN

Demander au modèle de répondre explicitement UNCERTAIN lorsque sa confiance dans la classification est inférieure à un seuil produit une sortie à trois possibilités : positif, négatif ou UNCERTAIN :

def classify_or_uncertain(text, uncertainty_threshold=4):
    prompt = f'''
Classify the sentiment of the text: positive, negative, or neutral.

If the sentiment is genuinely ambiguous or you are not confident (confidence below {uncertainty_threshold}/10),
return UNCERTAIN instead of guessing.

Return JSON: {{"sentiment": "positive|negative|neutral|UNCERTAIN", "confidence": 1-10}}

Text: {text}
'''
    r = client.messages.create(
        model='claude-opus-4-5', max_tokens=80,
        messages=[{'role': 'user', 'content': prompt}]
    )
    result = json.loads(r.content[0].text)

    if result['sentiment'] == 'UNCERTAIN' or result['confidence'] < uncertainty_threshold:
        print(f'Routing to human review: confidence={result["confidence"]}')
    return result

print(classify_or_uncertain('It was fine, I guess. Not bad, not great.'))
print(classify_or_uncertain('Absolutely terrible product. Never buying again.'))

Probabilités classées des catégories

Au lieu d’imposer une seule catégorie, demandez au modèle de classer toutes les catégories possibles selon leur probabilité. Vous verrez ainsi à quel point les deux premières catégories sont proches :

def classify_ranked(text, categories):
    cats = ', '.join(categories)
    prompt = f'''
Classify this text into one of these categories: {cats}

Return ALL categories ranked by likelihood, highest first.
Return JSON: {{"ranked": [{{"category": str, "probability": 0.0-1.0}}]}}
Probabilities must sum to 1.0.

Text: {text}
'''
    r = client.messages.create(
        model='claude-opus-4-5', max_tokens=150,
        messages=[{'role': 'user', 'content': prompt}]
    )
    result = json.loads(r.content[0].text)
    return result['ranked']

cats = ['billing', 'technical', 'general', 'cancellation']
ranked = classify_ranked('I was charged twice and now my account is locked.', cats)
for item in ranked:
    print(f'{item["category"]}: {item["probability"]:.0%}')

Utiliser l’écart entre les probabilités pour détecter l’ambiguïté

L’écart entre les probabilités classées des deux premières catégories constitue un indicateur fiable d’ambiguïté. Un faible écart signifie que le modèle est incertain ; un écart important signifie qu’il est sûr de lui :

def classify_with_ambiguity_detection(text, categories, ambiguity_threshold=0.15):
    ranked = classify_ranked(text, categories)

    top1_prob = ranked[0]['probability']
    top2_prob = ranked[1]['probability'] if len(ranked) > 1 else 0
    spread = top1_prob - top2_prob

    is_ambiguous = spread < ambiguity_threshold

    return {
        'primary': ranked[0]['category'],
        'secondary': ranked[1]['category'] if len(ranked) > 1 else None,
        'confidence_spread': round(spread, 3),
        'is_ambiguous': is_ambiguous,
        'action': 'human_review' if is_ambiguous else 'auto_classify'
    }

result = classify_with_ambiguity_detection(
    'My upgrade did not apply and I think I was still charged.', ['billing', 'technical', 'general', 'cancellation']
)
print(result)

Incertitude conditionnelle : en cas de doute, poser une question

Dans les applications conversationnelles, au lieu de renvoyer UNCERTAIN, le modèle peut demander une clarification :

SYSTEM_CLARIFY = '''
You are a support ticket classifier.
If the customer message is clear, classify it and respond with JSON:
{"action": "classify", "category": str, "confidence": 1-10}

If the message is ambiguous or you are not sure which category applies, respond with:
{"action": "clarify", "question": "A single clarifying question to ask the customer"}

Categories: billing, technical, account, cancellation

Only ask for clarification when genuinely needed. Prefer classification when possible.
'''

def classify_or_ask(message):
    r = client.messages.create(
        model='claude-opus-4-5', max_tokens=100,
        system=SYSTEM_CLARIFY,
        messages=[{'role': 'user', 'content': message}]
    )
    return json.loads(r.content[0].text)

print(classify_or_ask('It is not working anymore.'))
print(classify_or_ask('Cancel my subscription immediately.'))

Étalonner la confiance : température et cohérence

Exécuter plusieurs fois la même classification à des températures différentes révèle l’incertitude réelle du modèle. Une variance élevée indique une entrée véritablement ambiguë :

from collections import Counter

def calibrated_classify(text, n_samples=5):
    results = []
    for _ in range(n_samples):
        r = client.messages.create(
            model='claude-opus-4-5', max_tokens=50,
            messages=[{'role': 'user', 'content': f'Classify as positive/negative/neutral. Return JSON: {{"sentiment": str}}\n\n{text}'}]
        )
        results.append(json.loads(r.content[0].text)['sentiment'])

    counts = Counter(results)
    dominant = counts.most_common(1)[0]
    agreement_rate = dominant[1] / n_samples

    return {
        'classification': dominant[0],
        'agreement_rate': agreement_rate,
        'is_uncertain': agreement_rate < 0.7,
        'all_results': dict(counts)
    }

result = calibrated_classify('The product is okay, nothing special.')
print(result)

Routage selon le niveau de confiance

Un système de routage en production utilise les niveaux de confiance pour acheminer les entrées vers différents gestionnaires :

def route_by_confidence(text, classify_fn, auto_threshold=8, human_threshold=4):
    result = classify_fn(text)
    confidence = result.get('confidence', 5)
    category = result.get('category') or result.get('sentiment', 'unknown')

    if confidence >= auto_threshold:
        return {'route': 'auto_process', 'category': category, 'confidence': confidence}
    elif confidence >= human_threshold:
        return {'route': 'auto_process_with_flag', 'category': category, 'confidence': confidence,
                'flag': 'Low confidence — monitor output'}
    else:
        return {'route': 'human_review', 'category': category, 'confidence': confidence,
                'flag': 'Very low confidence — human classification required'}

print(route_by_confidence('Hate this product.', classify_with_confidence))
print(route_by_confidence('It is kind of okay but also not really.', classify_with_confidence))

Champs d’incertitude structurés

Schéma complet d’incertitude pour les sorties de classification :

UNCERTAINTY_SCHEMA = '''
Return JSON:
{
  "primary_category": "string",
  "confidence": 1-10,
  "uncertainty_type": "none | ambiguous_input | insufficient_context | boundary_case | none",
  "alternative_categories": ["string"] or [],
  "uncertainty_explanation": "string or null",
  "recommended_action": "auto_classify | human_review | request_more_info"
}

Uncertainty types:
- ambiguous_input: The text could clearly mean multiple things
- insufficient_context: Need more information to classify correctly
- boundary_case: The text sits on the border between two categories
- none: Clear classification, no uncertainty
'''

print(UNCERTAINTY_SCHEMA)
print('Use this schema for any classification task requiring uncertainty quantification.')

Suivi de l’incertitude en production

Surveillez les taux d’incertitude en production afin de détecter la dégradation de l’instruction ou la dérive des catégories :

class ClassificationMonitor:
    def __init__(self, human_review_threshold=0.15):
        self.total = 0
        self.uncertain = 0
        self.threshold = human_review_threshold
        self.category_counts = {}

    def record(self, result):
        self.total += 1
        cat = result.get('category', 'unknown')
        self.category_counts[cat] = self.category_counts.get(cat, 0) + 1

        if result.get('confidence', 10) < 5 or result.get('sentiment') == 'UNCERTAIN':
            self.uncertain += 1

    def report(self):
        uncertain_rate = self.uncertain / self.total if self.total else 0
        alert = uncertain_rate > self.threshold
        return {
            'total': self.total,
            'uncertain_rate': round(uncertain_rate, 3),
            'alert': alert,
            'category_distribution': self.category_counts
        }

monitor = ClassificationMonitor()
print('Production monitoring system defined.')

Quand faire confiance à un niveau de confiance élevé

Un niveau de confiance élevé du modèle ne signifie pas toujours que la classification est correcte. Voici des modes d’échec courants, même avec un niveau de confiance élevé :

  • Biais systématique : le modèle attribue systématiquement à un schéma précis une réponse erronée avec un niveau de confiance élevé
  • Décalage de domaine : le modèle est sûr de lui, mais le style de l’entrée est très différent de celui des données sur lesquelles il a été entraîné
  • Complaisance : le modèle ajuste son niveau de confiance à ce qui semble convenir, et non à sa certitude réelle

Évaluez toujours l’étalonnage de la confiance à l’aide d’un ensemble d’évaluation annoté — pas seulement la précision, mais aussi le fait que les prédictions à forte confiance soient réellement plus précises que celles à faible confiance.

Vérification rapide

Qu’indique un faible écart entre les probabilités classées des deux premières catégories dans un résultat de classification ?

Incertitude dans la classification — Points clés

La quantification de l’incertitude transforme la classification, qui était une boîte noire, en un système maîtrisable :

  • Demandez des scores de confiance (de 1 à 10) pour chaque classification — ne considérez jamais les sorties comme étant toutes aussi fiables
  • Utilisez la réponse UNCERTAIN pour les entrées réellement ambiguës plutôt que de forcer le choix d’une catégorie
  • Classez toutes les catégories par probabilité — l’écart entre les deux premières est le meilleur indicateur d’ambiguïté
  • Acheminez les entrées vers une vérification humaine lorsque la confiance est inférieure au seuil ; traitez-les automatiquement lorsqu’elle est supérieure
  • Dans les applications conversationnelles, posez des questions de clarification plutôt que de renvoyer UNCERTAIN
  • Surveillez les taux d’incertitude en production — une hausse indique une dégradation de l’instruction ou une dérive des catégories
  • Évaluez toujours l’étalonnage de la confiance à l’aide de données annotées — pas seulement la précision

Questions Fréquemment Posées

La leçon « Confiance et incertitude en classification » est-elle gratuite ?

Oui — le texte complet de « Confiance et incertitude en classification » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Prompt Engineering, passe à CoddyKit PRO. Le cours AI Prompt Engineering comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Confiance et incertitude en classification » ?

Demandez au modèle d’évaluer son degré de confiance et de gérer les classifications ambiguës. Tu pratiques AI Prompt Engineering avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer AI Prompt Engineering ?

Aucune expérience préalable n'est requise. AI Prompt Engineering sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Confiance et incertitude en classification » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon AI Prompt Engineering ?

Oui. Chaque leçon AI Prompt Engineering inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Invites d’extraction d’entités nommées
  2. Extraction de données pilotée par un schéma
  3. LLM comme classificateur de texte
  4. Confiance et incertitude en classification
← Retour à AI Prompt Engineering