AI Prompt Engineering · Урок

Уверенность и неопределённость при классификации

Просите модель оценивать уверенность и обрабатывать неоднозначные результаты классификации

Урок 4 из 413 шагов

«Уверенность и неопределённость при классификации» — бесплатный урок AI Prompt Engineering на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Prompt Engineering, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Prompt Engineering содержит 4 уроков всего.

Проблема самоуверенных моделей

По умолчанию LLM отвечают на задачи классификации с кажущейся уверенностью, даже когда входные данные действительно неоднозначны. Модель, которой велено вернуть положительную, отрицательную или нейтральную категорию, всегда выберет одну из них — и никогда не скажет Я не уверен.

В рабочих системах действие на основе неопределённых результатов классификации так, будто они достоверны, приводит к дорогостоящим ошибкам: обращения в поддержку направляются не туда, выдаются неверные рекомендации и формируются неточные отчёты.

Квантификация неопределённости в промптах классификации решает эту проблему.

Оценки уверенности от 1 до 10

Если попросить модель оценить свою уверенность по числовой шкале, можно получить детализированный сигнал, который последующие системы смогут сравнивать с порогом:

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

Ответ UNCERTAIN

Указание модели явно отвечать UNCERTAIN, когда уверенность классификации ниже заданного порога, создаёт три варианта результата: положительный, отрицательный или 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.'))

Вероятности категорий в порядке убывания

Вместо того чтобы принуждать модель выбирать одну категорию, попросите её упорядочить все возможные категории по вероятности. Это показывает, насколько близки две категории, занимающие первые места:

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

Выявление неоднозначности по разбросу вероятностей

Разница между двумя наиболее вероятными категориями в упорядоченном списке — надёжный сигнал неоднозначности. Небольшой разрыв означает, что модель не уверена; большой разрыв означает уверенность:

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)

Условная неопределённость: при сомнении задавайте вопрос

В разговорных приложениях вместо возврата UNCERTAIN модель может запросить уточнение:

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

Калибровка уверенности: температура и согласованность

Многократный запуск одной и той же классификации при разных температурах показывает реальную неопределённость модели. Высокая дисперсия означает действительно неоднозначные входные данные:

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)

Маршрутизация по уровню уверенности

Система маршрутизации в рабочей среде использует уровни уверенности, чтобы направлять данные разным обработчикам:

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

Структурированные поля неопределённости

Полная схема неопределённости для результатов классификации:

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

Отслеживание неопределённости в рабочей среде

Отслеживайте долю неопределённых результатов в рабочей среде, чтобы обнаруживать ухудшение промпта или дрейф категорий:

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

Когда можно доверять высокой уверенности

Высокая уверенность модели не всегда означает правильную классификацию. Распространённые причины ошибок даже при высокой уверенности:

  • Систематическая предвзятость: модель постоянно помечает определённый шаблон как ошибочный ответ с высокой уверенностью
  • Сдвиг предметной области: модель уверена в себе, но стиль входных данных сильно отличается от того, на котором она обучалась
  • Поддакивание: модель подстраивает оценку уверенности под то, что звучит хорошо, а не под фактическую степень уверенности

Всегда оценивайте калибровку уверенности на размеченном наборе для тестирования — проверяйте не только точность, но и то, действительно ли прогнозы с высокой уверененностью точнее прогнозов с низкой уверенностью.

Быстрая проверка

Что означает небольшой разрыв между двумя наиболее вероятными категориями в результате классификации?

Неопределённость в классификации — основные выводы

Квантификация неопределённости превращает классификацию из чёрного ящика в управляемую систему:

  • Запрашивайте оценку уверенности от 1 до 10 при каждой классификации — никогда не считайте все результаты одинаково надёжными
  • Используйте ответ UNCERTAIN для действительно неоднозначных входных данных вместо принудительного выбора категории
  • Упорядочивайте все категории по вероятности — разница между двумя первыми является лучшим сигналом неоднозначности
  • Направляйте результаты на проверку человеком, если уверенность ниже порога; автоматически обрабатывайте их, если она выше порога
  • В разговорных приложениях задавайте уточняющие вопросы вместо возврата UNCERTAIN
  • Отслеживайте долю неопределённых результатов в рабочей среде — её рост указывает на ухудшение промпта или дрейф категорий
  • Всегда оценивайте калибровку уверенности на размеченных данных, а не только точность
Можно начать бесплатно

Изучай AI Prompt Engineering с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
53
Уроки
199

Часто задаваемые вопросы

Урок «Уверенность и неопределённость при классификации» бесплатный?

Да — полный текст урока «Уверенность и неопределённость при классификации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Prompt Engineering, подпишись на CoddyKit PRO. Курс AI Prompt Engineering содержит 4 уроков всего.

Чему я научусь в уроке «Уверенность и неопределённость при классификации»?

Просите модель оценивать уверенность и обрабатывать неоднозначные результаты классификации Ты практикуешь AI Prompt Engineering с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Prompt Engineering?

Предыдущий опыт не требуется. AI Prompt Engineering на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Уверенность и неопределённость при классификации»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Prompt Engineering?

Да. Каждый урок AI Prompt Engineering включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Запросы для извлечения именованных сущностей
  2. Извлечение данных по схеме
  3. LLM в роли классификатора текста
  4. Уверенность и неопределённость при классификации
← Назад к AI Prompt Engineering