AI Prompt Engineering · Урок

Анализ первопричин запросов

Определяйте, вызвана ли проблема контекстом, инструкцией, форматом или возможностями модели

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

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

Почему важен анализ первопричин

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

Анализ первопричин (RCA) — это систематический процесс выявления конкретной причины сбоя запроса, позволяющий устранить саму проблему.

Четыре категории первопричин

Каждый сбой запроса сводится к одной из четырёх первопричин:

  1. Проблема контекста: модели не хватает информации, необходимой для правильного ответа
  2. Неоднозначность инструкции: инструкция допускает несколько обоснованных толкований, и модель выбрала неправильное
  3. Конфликт форматов: две части запроса содержат противоречивые указания по форматированию
  4. Ограничение возможностей модели: задача требует рассуждений или знаний, выходящих за пределы того, с чем эта модель может надёжно справиться

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

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

Проверка: добавьте недостающую информацию непосредственно в запрос и посмотрите, улучшится ли ответ. Если да, исправление заключается в добавлении контекста, например с помощью поиска RAG.

# Failing prompt — no context
prompt_v1 = 'What is the current price of our Pro plan?'

# Context problem test: inject the information
prompt_v2 = '''
Our pricing (as of today):
- Free: $0/month
- Pro: $19/month
- Enterprise: $99/month

Question: What is the current price of our Pro plan?
'''
# If v2 succeeds and v1 fails -> root cause is context problem

Первопричина 2: неоднозначность инструкции

Неоднозначность инструкции возникает, когда запрос можно обоснованно истолковать несколькими способами, а модель выбирает неправильное толкование.

Пример: «Кратко изложите» — означает ли «кратко» одно предложение, один абзац или три пункта? Модель угадывает. Проверка: замените неоднозначную фразу точной спецификацией и проверьте, исчез ли сбой.

# Ambiguous
prompt_ambiguous = 'Summarize the following article briefly.'

# Precise — ambiguity removed
prompt_precise = (
    'Summarize the following article in exactly 2 sentences. '
    'Do not exceed 50 words. Output only the summary, nothing else.'
)

# Test: if precise version succeeds, root cause was ambiguity
# Fix: replace vague qualifiers with exact specifications

Первопричина 3: конфликт форматов

Конфликт форматов возникает, когда две части запроса содержат противоречивые указания. Модель должна выбрать одно из них и проигнорировать другое — обычно она выбирает более позднее или более заметное указание.

Пример: системный запрос говорит «отвечайте обычным текстом», а сообщение пользователя — «используйте Markdown». Модель может непоследовательно следовать любому из этих указаний.

# Format conflict example
system_prompt = 'You are a helpful assistant. Always respond in plain text without any formatting.'

user_message = 'List the top 5 benefits of exercise. Use markdown bullet points.'

# The model faces a conflict: plain text vs markdown.
# Detection: if output format is inconsistent across runs, look for conflicting instructions.

# Fix: ensure all format instructions agree. Move format to system prompt only.
system_prompt_fixed = (
    'You are a helpful assistant. '
    'Always respond using markdown bullet points for lists.'
)

Первопричина 4: ограничение возможностей модели

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

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

# Capability limit test: try the same task on different models
models = ['gpt-4o-mini', 'gpt-4o', 'gpt-4o-2024-11-20']
results = {}

for model in models:
    resp = client.chat.completions.create(
        model=model,
        messages=[{'role': 'user', 'content': complex_reasoning_prompt}]
    )
    results[model] = evaluate(resp.choices[0].message.content)

# If accuracy improves with more capable models -> capability limit
for model, score in results.items():
    print(f'{model}: {score:.0%} accuracy')

Метод изоляции

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

  1. Запустите запрос, который приводит к сбою, и классифицируйте тип сбоя (неверный ответ, формат и т. д.)
  2. Добавьте информацию → если проблема устранена: проблема контекста
  3. Уточните инструкции → если проблема устранена: неоднозначность
  4. Проверьте наличие противоречий → если проблема устранена: конфликт формата
  5. Обновите модель → если проблема устранена: ограничение возможностей

Требоваться должно только одно исправление. Если требуются несколько исправлений, существовало несколько первопричин.

def rca_test(base_prompt, test_input, expected_output):
    results = {}

    # Test 1: base (failing) prompt
    results['base'] = run_and_evaluate(base_prompt, test_input, expected_output)

    # Test 2: add context
    results['with_context'] = run_and_evaluate(
        base_prompt + '\nContext: ' + get_context(test_input),
        test_input, expected_output
    )

    # Test 3: clarify instructions
    results['clarified'] = run_and_evaluate(
        clarify(base_prompt), test_input, expected_output
    )

    for name, passed in results.items():
        print(f'{name}: {"PASS" if passed else "FAIL"}')

Исключение и подтверждение

RCA включает два режима:

  • Исключение: отсеять причины, которые NOT отвечают за сбой (проверить каждую гипотезу и определить, какая из них NOT меняет выходные данные)
  • Подтверждение: выявить причину, устранение которой стабильно устраняет сбой на нескольких входных данных для проверки

Для подтверждения требуются как минимум 3 входных данных для проверки. Исправление, работающее на одних входных данных, но не на других, не устранило первопричину — возможно, оно устранило только симптом.

def confirm_root_cause(fix_fn, test_cases, threshold=0.9):
    '''fix_fn: a function that takes a prompt and returns a fixed prompt'''
    passed = 0
    for case in test_cases:
        fixed_prompt = fix_fn(case['prompt'])
        result = run_and_evaluate(fixed_prompt, case['input'], case['expected'])
        if result:
            passed += 1

    pass_rate = passed / len(test_cases)
    print(f'Fix pass rate: {pass_rate:.0%}')
    if pass_rate >= threshold:
        print('Root cause CONFIRMED — fix is reliable.')
    else:
        print('Root cause NOT confirmed — failure has multiple causes.')

Документирование первопричины

После выявления первопричины задокументируйте её в журнале изменений запроса. Включите:

  • Наблюдаемый тип сбоя
  • Категорию первопричины
  • Проверенную гипотезу
  • Доказательства (какая проверка прошла после исправления)
  • Конкретное изменение, внесённое в запрос

Это не позволит будущим разработчикам повторно исследовать тот же сбой и поможет выявлять закономерности в разных запросах.

rca_record = {
    'prompt_id': 'summarize_v3',
    'failure_type': 'wrong_format',
    'root_cause': 'format_conflict',
    'hypothesis': 'System prompt said plain text, user message asked for markdown',
    'evidence': 'Removing markdown instruction from user message resolved failure on 8/8 test cases',
    'fix_applied': 'Moved all format instructions to system prompt; removed format instructions from user template',
    'fix_date': '2024-11-15'
}

Распространённая ошибка: исправление не той причины

Самая распространённая ошибка при RCA — исправление симптома, а не причины. Пример:

  • Симптом: модель возвращает JSON с дополнительным текстовым префиксом
  • Неверное исправление: добавить последующую обработку, удаляющую текст из выходных данных
  • Фактическая первопричина: в запросе нет инструкции по формату + модель по умолчанию использует разговорный стиль
  • Правильное исправление: добавить явную инструкцию «Возвращайте только корректный JSON. Никакого другого текста.»

Уловки с последующей обработкой накапливают технический долг. Исправления первопричины долговечны.

RCA для периодических сбоев

Некоторые сбои происходят периодически: запрос работает в 80% случаев, но даёт сбой в 20%. Их сложнее диагностировать, поскольку однократный запуск запроса даёт корректный результат.

Подход: запустите запрос 10–20 раз на одних и тех же входных данных. Если доля сбоев ненулевая, у запроса есть вероятностная первопричина — обычно неоднозначность инструкции или высокая температура. Исправление: сделайте инструкцию более конкретной или уменьшите температуру.

def measure_failure_rate(prompt, test_input, expected, runs=20):
    failures = 0
    for _ in range(runs):
        resp = client.chat.completions.create(
            model='gpt-4o',
            messages=[{'role': 'user', 'content': prompt + '\n' + test_input}],
            temperature=0.7
        )
        if not evaluate(resp.choices[0].message.content, expected):
            failures += 1
    print(f'Failure rate: {failures}/{runs} = {failures/runs:.0%}')

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

Запрос просит вернуть ответ в формате JSON, но иногда возвращает JSON с разговорным префиксом вроде «Конечно! Вот JSON:». После добавления фразы «Возвращайте только корректный JSON. Никакого другого текста.» сбои прекращаются. Какова была первопричина?

Повторение: анализ первопричины

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

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

Используйте систематическую изоляцию для проверки каждой гипотезы. Подтверждайте исправление на нескольких случаях для проверки. Документируйте результаты. Следующий урок: систематическая отладка с помощью двоичного поиска.

Можно начать бесплатно

Изучай 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 структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Анализ первопричин запросов»?

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

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

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

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

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