AI Prompt Engineering · Lezione

Affidabilità e incertezza nella classificazione

Chieda al modello di valutare la propria affidabilità e gestire classificazioni ambigue

Lezione 4 di 413 passaggi

Affidabilità e incertezza nella classificazione è una lezione AI Prompt Engineering gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Prompt Engineering, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Prompt Engineering include 4 lezioni in totale.

Il problema dei modelli eccessivamente sicuri

Per impostazione predefinita, gli LLM rispondono alle attività di classificazione con apparente certezza anche quando l'input è effettivamente ambiguo. Un modello a cui viene chiesto di restituire positivo, negativo o neutro ne sceglierà sempre uno, senza mai dire non ne sono sicuro.

Nei sistemi di produzione, agire su classificazioni incerte come se fossero certe causa errori costosi: ticket di supporto instradati erroneamente, raccomandazioni sbagliate e report imprecisi.

La quantificazione dell'incertezza nei prompt di classificazione risolve questo problema.

Punteggi di confidenza da 1 a 10

Chiedere al modello di valutare la propria confidenza su una scala numerica fornisce un segnale granulare che i sistemi a valle possono usare per definire soglie:

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 risposta UNCERTAIN

Chiedere al modello di rispondere esplicitamente con UNCERTAIN quando la confidenza nella classificazione è inferiore a una soglia crea un output a tre possibilità: positivo, negativo o 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à delle categorie ordinate

Invece di obbligare il modello a scegliere una sola categoria, gli chieda di ordinare tutte le categorie possibili in base alla probabilità. In questo modo è possibile vedere quanto sono vicine le prime due categorie:

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%}')

Utilizzo della differenza tra le probabilità per rilevare l'ambiguità

La differenza tra le probabilità ordinate delle prime due categorie è un segnale affidabile di ambiguità. Un divario ridotto indica che il modello è incerto; un divario ampio indica sicurezza:

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)

Incertezza condizionale: in caso di dubbio, chiedere

Nelle applicazioni conversazionali, invece di restituire UNCERTAIN, il modello può chiedere un chiarimento:

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.'))

Calibrazione della confidenza: temperatura e coerenza

Eseguire più volte la stessa classificazione con temperature diverse rivela la reale incertezza del modello. Una varianza elevata indica un input davvero ambiguo:

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)

Instradamento basato sulla confidenza

Un sistema di instradamento per la produzione utilizza i livelli di confidenza per indirizzare le richieste a gestori diversi:

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))

Campi strutturati per l'incertezza

Uno schema completo per l'incertezza negli output di classificazione:

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.')

Monitoraggio dell'incertezza in produzione

Monitori i tassi di incertezza in produzione per rilevare il deterioramento del prompt o la deriva delle categorie:

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.')

Quando fidarsi di una confidenza elevata

Un'elevata confidenza del modello non significa sempre che la classificazione sia corretta. Ecco alcuni errori comuni anche in presenza di una confidenza elevata:

  • Pregiudizio sistematico: il modello assegna sistematicamente un'etichetta errata ad alta confidenza a uno specifico pattern
  • Deriva del dominio: il modello è sicuro, ma lo stile dell'input è molto diverso da quello sui cui è stato addestrato
  • Sycophancy: il modello calibra la confidenza in base a ciò che sembra positivo, non all'effettiva certezza

Valuti sempre la calibrazione della confidenza su un set di test etichettato, verificando non solo l'accuratezza, ma anche se le previsioni ad alta confidenza sono effettivamente più accurate di quelle a bassa confidenza.

Verifica rapida

Che cosa indica una differenza ridotta tra le probabilità ordinate delle prime due categorie in un risultato di classificazione?

Incertezza nella classificazione — Punti chiave

La quantificazione dell'incertezza trasforma la classificazione da una scatola nera in un sistema gestibile:

  • Chieda i punteggi di confidenza (da 1 a 10) per ogni classificazione: non consideri mai gli output ugualmente affidabili
  • Utilizzi la risposta UNCERTAIN per gli input realmente ambigui, invece di obbligare il modello a scegliere una categoria
  • Ordini tutte le categorie per probabilità: la differenza tra le prime due è il miglior segnale di ambiguità
  • Instradi le richieste alla revisione umana quando la confidenza è inferiore alla soglia; le elabori automaticamente quando è superiore
  • Per le app conversazionali, ponga domande di chiarimento invece di restituire UNCERTAIN
  • Monitori i tassi di incertezza in produzione: un aumento segnala il deterioramento del prompt o la deriva delle categorie
  • Valuti sempre la calibrazione della confidenza su dati etichettati, non solo l'accuratezza
Gratis per iniziare

Impara AI Prompt Engineering con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
53
Lezioni
199

Domande Frequenti

La lezione «Affidabilità e incertezza nella classificazione» è gratuita?

Sì — il testo completo di «Affidabilità e incertezza nella classificazione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Prompt Engineering, passa a CoddyKit PRO. Il corso AI Prompt Engineering include 4 lezioni in totale.

Cosa imparerò in «Affidabilità e incertezza nella classificazione»?

Chieda al modello di valutare la propria affidabilità e gestire classificazioni ambigue Eserciti AI Prompt Engineering con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare AI Prompt Engineering?

Non è richiesta alcuna esperienza precedente. AI Prompt Engineering su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Affidabilità e incertezza nella classificazione»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione AI Prompt Engineering?

Sì. Ogni lezione AI Prompt Engineering include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Prompt per l'estrazione di entità nominate
  2. Estrazione dei dati guidata dallo schema
  3. LLM come classificatore di testo
  4. Affidabilità e incertezza nella classificazione
← Torna a AI Prompt Engineering