0Pricing
AI Prompt Engineering · Урок

Диагностика неожиданных результатов

Классифицируйте типы сбоев: неверный ответ, неверный формат, ответ не по теме или галлюцинация

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

Когда запросы дают сбой

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

Тип сбоя 1: неверный ответ

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

Примеры: даты, статистические данные, имена, код с логической ошибкой. Такой сбой сложнее всего автоматически обнаружить, потому что внешне результат выглядит правильным.

  • Причина: ограничение по дате обучающих данных, редкий факт или ошибка многошагового рассуждения
  • Обнаружение: сравнение с эталонными данными, проверка человеком или вызов LLM для проверки
# Example: wrong answer failure
prompt = 'What year was Python first released?'
response = 'Python was first released in 1994.'  # Wrong — it was 1991

# Ground truth check
GROUND_TRUTH = '1991'
correct = GROUND_TRUTH in response
print(f'Correct: {correct}')  # False

Тип сбоя 2: неверный формат

Сбой неверного формата происходит, когда модель правильно ответила на нужный вопрос и привела правильную информацию, но проигнорировала указание по форматированию.

Примеры: вернула обычный текст вместо запрошенного JSON, добавила разметку Markdown, когда требовался обычный текст, вернула список, когда запрашивалось одно значение.

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

response_text = 'Sure! Here is the result: {"name": "Alice", "age": 30}'

try:
    data = json.loads(response_text)
    print('Format OK:', data)
except json.JSONDecodeError as e:
    print(f'FORMAT FAILURE: {e}')
    # 'Sure! Here is the result:' prefix broke JSON parsing

Тип сбоя 3: ответ не по теме

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

Примеры: запрошена функция на Питоне, а получена функция на JavaScript; запрошен ответ в одну строку, а получено полноценное эссе; запрошено исправить ошибку, а вместо исправления получено её объяснение.

  • Причина: неоднозначная инструкция, противоречивый контекст, смещение задачи в длинном диалоге
# Off-topic example
prompt = 'Write a Python function that reverses a list.'
response = '''
In JavaScript, you can reverse an array like this:
const reversed = arr.reverse();
'''

# Detection: check that output contains the correct language keyword
def check_language(response, expected_lang='def '):
    if expected_lang not in response:
        print(f'OFF-TOPIC FAILURE: expected {expected_lang} in response')
        return False
    return True

check_language(response)  # False — no Python def

Тип сбоя 4: галлюцинация

Галлюцинация — самый опасный сбой: модель выдумывает несуществующие факты. Такие ответы выглядят правдоподобными и уверенными, поэтому их трудно заметить.

Примеры: вымышленные библиографические ссылки (название статьи звучит правдоподобно, но самой статьи не существует), выдуманные конечные точки программного интерфейса, фиктивные статистические данные, несуществующие люди.

  • Причина: модель заполняет пробелы в знаниях правдоподобным текстом, подобранным по шаблонам
  • Обнаружение: проверка фактов по авторитетным источникам, перекрёстная проверка ссылок, проверка вызовов программного интерфейса
# Hallucination detection via external verification
import requests

def verify_doi(doi):
    url = f'https://doi.org/{doi}'
    resp = requests.head(url, allow_redirects=True, timeout=5)
    return resp.status_code == 200

# Model claimed this paper exists:
fabricated_doi = '10.1234/fake.paper.2023.99999'
if not verify_doi(fabricated_doi):
    print('HALLUCINATION DETECTED: DOI does not exist')

Практическое применение классификации сбоев

Обнаружив сбой, сначала классифицируйте его и только потом пытайтесь исправить. Тип сбоя определяет стратегию исправления:

  • Неверный ответ: добавьте контекст, используйте поиск или перейдите на более способную модель
  • Неверный формат: усильте указание по форматированию, добавьте примеры результата, используйте структурированные результаты или вызов функций
  • Ответ не по теме: перепишите инструкцию точнее, упростите запрос
  • Галлюцинация: добавьте контекст с опорой на источники, попросите отвечать «Я не знаю», включите ссылки на источники

Структурированное журналирование сбоев

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

import json
from datetime import datetime

def log_failure(prompt, response, failure_type, details=''):
    entry = {
        'timestamp': datetime.utcnow().isoformat(),
        'failure_type': failure_type,  # wrong_answer | wrong_format | off_topic | hallucination
        'prompt_hash': hash(prompt),
        'response_snippet': response[:200],
        'details': details
    }
    with open('prompt_failures.jsonl', 'a') as f:
        f.write(json.dumps(entry) + '\n')

log_failure(
    prompt=my_prompt,
    response=bad_response,
    failure_type='wrong_format',
    details='JSON prefix text broke parsing'
)

Автоматическая классификация сбоев

Для масштабного тестирования используйте вызов LLM-классификатора, чтобы автоматически присваивать каждому ответу тип сбоя. Это позволяет пакетно оценивать сотни тестовых случаев.

def classify_failure(prompt, expected, actual):
    classification_prompt = (
        f'You are a QA evaluator for LLM outputs.\n'
        f'Prompt: {prompt}\n'
        f'Expected behavior: {expected}\n'
        f'Actual output: {actual}\n\n'
        'Classify the failure as one of: CORRECT, WRONG_ANSWER, WRONG_FORMAT, OFF_TOPIC, HALLUCINATION.\n'
        'Reply with only the label.'
    )
    resp = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': classification_prompt}]
    )
    return resp.choices[0].message.content.strip()

Матрица серьёзности

Не все сбои имеют одинаковое влияние. Матрица серьёзности помогает расставлять приоритеты исправлений:

  • Галлюцинация в медицинском или юридическом контексте: критическая — исправьте немедленно
  • Неверный формат во внутреннем инструменте: высокая — нарушает последующий разбор данных
  • Неверный ответ в редком пограничном случае: средняя — отслеживайте частоту
  • Ответ не по теме на неоднозначные входные данные: низкая — допустимо при редком возникновении

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

Создание панели мониторинга сбоев

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

import json
from collections import Counter

def failure_report(log_path='prompt_failures.jsonl'):
    entries = []
    with open(log_path) as f:
        for line in f:
            entries.append(json.loads(line))

    counts = Counter(e['failure_type'] for e in entries)
    total = len(entries)

    print(f'Total failures: {total}')
    for ftype, count in counts.most_common():
        pct = 100 * count / total
        print(f'  {ftype}: {count} ({pct:.1f}%)')

failure_report()

Проактивное предотвращение сбоев

Проактивные стратегии снижения каждого типа сбоев до их возникновения:

  • Неверный ответ: предоставляйте в запросе справочный текст (RAG); просите модель указывать источник
  • Неверный формат: используйте режим JSON или вызов функций; приводите в запросе пример формата
  • Ответ не по теме: формулируйте задачу в первом предложении; избегайте длинных вступлений, размывающих намерение
  • Галлюцинация: указывайте: «Используйте только приведённую ниже информацию»; добавляйте: «Если не уверены, скажите: „Я не знаю“»

Проверка знаний

Какой тип сбоя возникает, когда модель выдумывает несуществующие факты, например фиктивную библиографическую ссылку или несуществующую конечную точку программного интерфейса?

Повторение: диагностика неожиданных результатов

Четыре типа сбоев LLM и их основные признаки:

  • Неверный ответ: правильный формат, правильная тема, неверное содержание — сверяйте факты с эталонными данными
  • Неверный формат: правильное содержание, проигнорировано указание по формату — это выявляет проверка схемы
  • Ответ не по теме: правильный формат, но дан ответ на другой вопрос — проверяйте соответствие языка и задачи
  • Галлюцинация: выдуманные факты — проверяйте по внешним источникам

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

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

Урок «Диагностика неожиданных результатов» бесплатный?

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

Чему я научусь в уроке «Диагностика неожиданных результатов»?

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

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

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

Сколько времени занимает урок «Диагностика неожиданных результатов»?

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

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

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

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

  1. Диагностика неожиданных результатов
  2. Анализ первопричин запросов
  3. Системный подход к отладке
  4. Стратегии журналирования и документирования
← Назад к AI Prompt Engineering