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
- Prompty do ekstrakcji nazwanych jednostek
- Ekstrakcja danych sterowana schematem
- LLM jako klasyfikator tekstu
- Pewność i niepewność w klasyfikacji