0Pricing
AI Prompt Engineering · Lekcja

Pewność i niepewność w klasyfikacji

Proś model o ocenę pewności i obsługę niejednoznacznych klasyfikacji.

Pewność i niepewność w klasyfikacji to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Prompt Engineering, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.

Problem modeli z nadmierną pewnością siebie

Domyślnie LLM-y odpowiadają na zadania klasyfikacji z pozorną pewnością, nawet gdy dane wejściowe są rzeczywiście niejednoznaczne. Model poproszony o zwrócenie wartości pozytywny, negatywny lub neutralny zawsze wybierze jedną z nich — nigdy nie powie Nie mam pewności.

W systemach produkcyjnych traktowanie niepewnych klasyfikacji tak, jakby były pewne, prowadzi do kosztownych błędów: kierowania zgłoszeń do niewłaściwych miejsc, błędnych rekomendacji i niedokładnych raportów.

Kwantyfikacja niepewności w promptach do klasyfikacji rozwiązuje ten problem.

Poziomy pewności 1–10

Poproszenie modelu o ocenę swojej pewności w skali numerycznej zapewnia szczegółowy sygnał, który systemy korzystające z jego wyników mogą wykorzystać do ustalania progów:

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

Odpowiedź UNCERTAIN

Poinstruowanie modelu, aby jawnie odpowiadał UNCERTAIN, gdy jego pewność klasyfikacji spadnie poniżej określonego progu, tworzy wynik z trzema możliwościami: pozytywny, negatywny lub 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.'))

Prawdopodobieństwa kategorii w kolejności rankingowej

Zamiast wymuszać wybór jednej kategorii, należy poprosić model o uszeregowanie wszystkich możliwych kategorii według prawdopodobieństwa. Dzięki temu widać, jak zbliżone są do siebie dwie najwyżej ocenione kategorie:

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

Wykrywanie niejednoznaczności na podstawie różnicy prawdopodobieństw

Różnica między dwoma najwyżej sklasyfikowanymi prawdopodobieństwami jest wiarygodnym sygnałem niejednoznaczności. Mała różnica oznacza, że model nie ma pewności, a duża — że jest pewny:

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)

Warunkowa niepewność: w razie wątpliwości należy zapytać

W aplikacjach konwersacyjnych model może zamiast zwracać UNCERTAIN poprosić o doprecyzowanie:

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

Kalibracja pewności: temperatura i spójność

Wielokrotne uruchomienie tej samej klasyfikacji przy różnych wartościach temperatury ujawnia rzeczywistą niepewność modelu. Duża wariancja oznacza rzeczywiście niejednoznaczne dane wejściowe:

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)

Kierowanie na podstawie poziomu pewności

Produkcyjny system kierowania wykorzystuje poziomy pewności do przekazywania danych do różnych modułów obsługi:

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

Ustrukturyzowane pola niepewności

Kompleksowy schemat niepewności dla wyników klasyfikacji:

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

Śledzenie niepewności w środowisku produkcyjnym

Monitoruj wskaźniki niepewności w środowisku produkcyjnym, aby wykrywać pogorszenie promptu lub dryf kategorii:

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

Kiedy ufać wysokiej pewności

Wysoka pewność modelu nie zawsze oznacza poprawną klasyfikację. Typowe tryby błędów występujące nawet przy wysokiej pewności:

  • Systematyczne uprzedzenie: Model konsekwentnie oznacza określony wzorzec jako konkretną, błędną odpowiedź z wysokim poziomem pewności
  • Zmiana domeny: Model jest pewny, ale styl danych wejściowych znacznie różni się od danych, na których został wytrenowany
  • Potakiwanie użytkownikowi: Model dostosowuje poziom pewności do tego, co brzmi dobrze, a nie do rzeczywistej pewności

Zawsze należy oceniać kalibrację pewności na podstawie oznaczonego zbioru testowego — nie tylko dokładność, lecz także to, czy predykcje o wysokim poziomie pewności są rzeczywiście dokładniejsze niż predykcje o niskim poziomie pewności.

Szybki test

Co oznacza mała różnica między dwoma najwyżej sklasyfikowanymi prawdopodobieństwami kategorii w wyniku klasyfikacji?

Niepewność w klasyfikacji — najważniejsze wnioski

Kwantyfikacja niepewności przekształca klasyfikację z czarnej skrzynki w system, którym można zarządzać:

  • Dla każdej klasyfikacji należy prosić o poziom pewności (1–10) — nigdy nie należy traktować wszystkich wyników jako jednakowo wiarygodnych
  • W przypadku rzeczywiście niejednoznacznych danych wejściowych należy używać odpowiedzi UNCERTAIN zamiast wymuszać wybór kategorii
  • Należy uszeregować wszystkie kategorie według prawdopodobieństwa — różnica między dwiema najwyższymi wartościami jest najlepszym sygnałem niejednoznaczności
  • Gdy poziom pewności jest niższy od ustalonego progu, dane należy kierować do weryfikacji przez człowieka; powyżej progu można je przetwarzać automatycznie
  • W aplikacjach konwersacyjnych należy zadawać pytania doprecyzowujące zamiast zwracać UNCERTAIN
  • Należy monitorować wskaźniki niepewności w środowisku produkcyjnym — ich wzrost sygnalizuje pogorszenie promptu lub dryf kategorii
  • Zawsze należy oceniać kalibrację pewności na podstawie oznaczonych danych — nie tylko dokładność

Często zadawane pytania

Czy lekcja „Pewność i niepewność w klasyfikacji” jest bezpłatna?

Tak — pełny tekst „Pewność i niepewność w klasyfikacji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Prompt Engineering, przejdź na CoddyKit PRO. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.

Co nauczysz się w „Pewność i niepewność w klasyfikacji”?

Proś model o ocenę pewności i obsługę niejednoznacznych klasyfikacji. Ćwiczysz AI Prompt Engineering z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć AI Prompt Engineering?

Nie wymagamy żadnego doświadczenia. AI Prompt Engineering w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Pewność i niepewność w klasyfikacji”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji AI Prompt Engineering?

Tak. Każda lekcja AI Prompt Engineering zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Prompty do ekstrakcji nazwanych jednostek
  2. Ekstrakcja danych sterowana schematem
  3. LLM jako klasyfikator tekstu
  4. Pewność i niepewność w klasyfikacji
← Powrót do AI Prompt Engineering