0Pricing
AI Prompt Engineering · Lección

Confianza e incertidumbre en la clasificación

Pida al modelo que puntúe la confianza y gestione clasificaciones ambiguas.

Confianza e incertidumbre en la clasificación es una lección gratuita de AI Prompt Engineering en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Prompt Engineering, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Prompt Engineering incluye 4 lecciones en total.

El problema de los modelos con exceso de confianza

De forma predeterminada, los LLM responden a las tareas de clasificación con una certeza aparente incluso cuando la entrada es realmente ambigua. Un modelo al que se le indica que devuelva positivo, negativo o neutro siempre elegirá una opción y nunca dirá no estoy seguro.

En los sistemas de producción, actuar sobre clasificaciones inciertas como si fueran seguras provoca errores costosos: tickets de soporte mal dirigidos, recomendaciones incorrectas e informes inexactos.

La cuantificación de la incertidumbre en los prompts de clasificación resuelve este problema.

Puntuaciones de confianza del 1 al 10

Pedir al modelo que valore su confianza en una escala numérica proporciona una señal granular que los sistemas posteriores pueden usar para establecer umbrales:

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

Indicar al modelo que responda explícitamente con UNCERTAIN cuando su confianza en la clasificación esté por debajo de un umbral crea una salida de tres opciones: 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.'))

Probabilidades de categorías ordenadas

En lugar de forzar una sola categoría, pida al modelo que ordene todas las categorías posibles según su probabilidad. Esto muestra qué tan cercanas están las dos categorías principales:

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

Uso de la diferencia entre probabilidades para detectar ambigüedad

La diferencia entre las probabilidades ordenadas de las dos categorías principales es una señal fiable de ambigüedad. Una diferencia pequeña significa que el modelo no está seguro; una diferencia grande indica confianza:

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)

Incertidumbre condicional: si no está seguro, pregunte

En las aplicaciones conversacionales, en lugar de devolver UNCERTAIN, el modelo puede solicitar una aclaración:

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

Calibración de la confianza: temperatura y coherencia

Ejecutar varias veces la misma clasificación con distintas temperaturas revela la verdadera incertidumbre del modelo. Una varianza alta indica una entrada realmente ambigua:

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)

Enrutamiento basado en la confianza

Un sistema de enrutamiento de producción utiliza los niveles de confianza para dirigir las entradas a distintos procesadores:

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

Campos estructurados de incertidumbre

Un esquema completo de incertidumbre para las salidas de clasificación:

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

Seguimiento de la incertidumbre en producción

Supervise las tasas de incertidumbre en producción para detectar la degradación del prompt o el desplazamiento de categorías:

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

Cuándo confiar en un nivel de confianza alto

Una confianza alta del modelo no siempre significa que la clasificación sea correcta. Estos son algunos errores habituales incluso con una confianza alta:

  • Sesgo sistemático: el modelo etiqueta sistemáticamente un patrón específico con una respuesta incorrecta y una confianza alta
  • Desplazamiento de dominio: el modelo muestra confianza, pero el estilo de la entrada es muy diferente de aquello con lo que se entrenó
  • Complacencia: el modelo calibra la confianza según lo que suena bien, no según su certeza real

Evalúe siempre la calibración de la confianza con un conjunto de pruebas etiquetado, no solo la precisión, sino también si las predicciones con alta confianza son realmente más precisas que las de baja confianza.

Comprobación rápida

¿Qué indica una diferencia pequeña entre las probabilidades ordenadas de las dos categorías principales en un resultado de clasificación?

Incertidumbre en la clasificación: conclusiones clave

La cuantificación de la incertidumbre transforma la clasificación de una caja negra en un sistema gestionable:

  • Solicite puntuaciones de confianza (del 1 al 10) con cada clasificación; nunca trate todas las salidas como igual de fiables
  • Use la respuesta UNCERTAIN para las entradas realmente ambiguas en lugar de forzar la elección de una categoría
  • Ordene todas las categorías por probabilidad; la diferencia entre las dos principales es la mejor señal de ambigüedad
  • Dirija las entradas a revisión humana cuando la confianza esté por debajo del umbral y procéselas automáticamente cuando esté por encima
  • En las aplicaciones conversacionales, formule preguntas aclaratorias en lugar de devolver UNCERTAIN
  • Supervise las tasas de incertidumbre en producción; un aumento indica degradación del prompt o desplazamiento de categorías
  • Evalúe siempre la calibración de la confianza con datos etiquetados, no solo la precisión

Preguntas frecuentes

¿La lección «Confianza e incertidumbre en la clasificación» es gratis?

Sí — el texto completo de «Confianza e incertidumbre en la clasificación» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Prompt Engineering, actualiza a CoddyKit PRO. El curso de AI Prompt Engineering incluye 4 lecciones en total.

¿Qué aprenderé en «Confianza e incertidumbre en la clasificación»?

Pida al modelo que puntúe la confianza y gestione clasificaciones ambiguas. Practicas AI Prompt Engineering con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar AI Prompt Engineering?

No se requiere experiencia previa. AI Prompt Engineering en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Confianza e incertidumbre en la clasificación»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de AI Prompt Engineering?

Sí. Cada lección de AI Prompt Engineering incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Prompts para extraer entidades con nombre
  2. Extracción de datos basada en esquemas
  3. El LLM como clasificador de texto
  4. Confianza e incertidumbre en la clasificación
← Volver a AI Prompt Engineering