0Pricing
AI Prompt Engineering · Aula

Confiança e incerteza na classificação

Peça ao modelo que atribua uma pontuação de confiança e lide com classificações ambíguas.

Confiança e incerteza na classificação é uma aula grátis de AI Prompt Engineering no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Prompt Engineering, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Prompt Engineering inclui 4 aulas no total.

O problema dos modelos excessivamente confiantes

Por padrão, os LLMs respondem a tarefas de classificação com aparente certeza, mesmo quando a entrada é genuinamente ambígua. Um modelo instruído a retornar positivo, negativo ou neutro sempre escolherá uma opção — nunca dirá não tenho certeza.

Em sistemas de produção, agir com base em classificações incertas como se fossem certas causa erros dispendiosos: chamados de suporte encaminhados incorretamente, recomendações erradas e relatórios imprecisos.

A quantificação da incerteza nas instruções de classificação resolve esse problema.

Pontuações de confiança de 1 a 10

Solicitar que o modelo avalie a própria confiança em uma escala numérica fornece um sinal detalhado que os sistemas subsequentes podem usar como limite:

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

A resposta UNCERTAIN

Instruir o modelo a responder explicitamente com UNCERTAIN quando a confiança na classificação estiver abaixo de um limite cria uma saída com três opções: positivo, negativo 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.'))

Probabilidades de categoria ordenadas

Em vez de forçar uma única categoria, peça ao modelo que ordene todas as categorias possíveis por probabilidade. Isso revela quão próximas estão as duas categorias mais prováveis:

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

Usando a diferença entre probabilidades para detectar ambiguidade

A diferença entre as duas probabilidades mais altas é um sinal confiável de ambiguidade. Uma diferença pequena significa que o modelo está incerto; uma diferença grande significa que está confiante:

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)

Incerteza condicional: se houver dúvida, pergunte

Em aplicações conversacionais, em vez de retornar UNCERTAIN, o modelo pode solicitar esclarecimentos:

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

Calibrando a confiança: temperatura e consistência

Executar a mesma classificação várias vezes, com temperaturas diferentes, revela a verdadeira incerteza do modelo. Alta variância = entrada genuinamente ambígua:

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)

Encaminhamento com base na confiança

Um sistema de encaminhamento em produção usa níveis de confiança para encaminhar as solicitações a diferentes manipuladores:

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 estruturados de incerteza

Um esquema abrangente de incerteza para saídas de classificação:

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

Monitorando a incerteza em produção

Monitore as taxas de incerteza em produção para detectar a degradação da instrução ou a deriva das categorias:

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 confiar em um alto nível de confiança

Uma confiança alta do modelo nem sempre significa que a classificação está correta. Modos comuns de falha, mesmo com confiança alta:

  • Viés sistemático: o modelo atribui consistentemente a um padrão específico um rótulo errado com alta confiança
  • Mudança de domínio: o modelo está confiante, mas o estilo da entrada é muito diferente daquele com que foi treinado
  • Subserviência: o modelo calibra a confiança de acordo com o que parece agradável, e não de acordo com a certeza real

Sempre avalie a calibração da confiança com base em um conjunto de testes rotulado — não apenas a precisão, mas também se as previsões com alta confiança são realmente mais precisas do que as previsões com baixa confiança.

Verificação rápida

O que indica uma diferença pequena entre as duas probabilidades de categoria mais altas e ordenadas em um resultado de classificação?

Incerteza na classificação — principais conclusões

A quantificação da incerteza transforma a classificação de uma caixa-preta em um sistema gerenciável:

  • Solicite pontuações de confiança (1 a 10) em cada classificação — nunca trate as saídas como igualmente confiáveis
  • Use a resposta UNCERTAIN para entradas genuinamente ambíguas, em vez de forçar a escolha de uma categoria
  • Ordene todas as categorias por probabilidade — a diferença entre as duas primeiras é o melhor sinal de ambiguidade
  • Encaminhe para análise humana quando a confiança estiver abaixo do limite; processe automaticamente quando estiver acima
  • Em aplicações conversacionais, faça perguntas de esclarecimento em vez de retornar UNCERTAIN
  • Monitore as taxas de incerteza em produção — o aumento dessas taxas indica degradação da instrução ou deriva das categorias
  • Sempre avalie a calibração da confiança com base em dados rotulados — não apenas a precisão

Perguntas Frequentes

A aula “Confiança e incerteza na classificação” é grátis?

Sim — o texto completo de “Confiança e incerteza na classificação” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Prompt Engineering, atualize para CoddyKit PRO. O curso de AI Prompt Engineering inclui 4 aulas no total.

O que vou aprender em “Confiança e incerteza na classificação”?

Peça ao modelo que atribua uma pontuação de confiança e lide com classificações ambíguas. Você pratica AI Prompt Engineering com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar AI Prompt Engineering?

Nenhuma experiência prévia é necessária. AI Prompt Engineering no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Confiança e incerteza na classificação”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de AI Prompt Engineering?

Sim. Cada aula de AI Prompt Engineering inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Solicitações para extração de entidades nomeadas
  2. Extração de dados orientada por esquema
  3. LLM como classificador de texto
  4. Confiança e incerteza na classificação
← Voltar para AI Prompt Engineering