AI Prompt Engineering · Урок

Оценка решения

Измерение качества и стоимости

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

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

Нельзя принять решение о том, что нельзя измерить

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

  • Качество и стоимость — это две оси; не сводите их преждевременно к одному числу
  • Набор для оценки должен быть отложенным и неизменным для каждого сравниваемого подхода
  • Побеждает подход, который даёт наилучшую точку на границе качества и стоимости с учётом Ваших ограничений

Сначала создайте фиксированный набор для оценки

Прежде чем что-либо сравнивать, создайте отложенный набор для оценки, на котором не обучается ни один подход. Он должен отражать реальное распределение данных: распространённые случаи, известные крайние случаи и специально составленные сложные входные данные примерно в производственных пропорциях.

Зафиксируйте этот набор. Каждый подход — только промпт, дообученный и гибридный — оценивается на одном и том же наборе. Если набор для оценки меняется между сравнениями, числа несопоставимы, а решение недействительно.

def split_eval(labeled, holdout_ratio=0.2, seed=42):
    import random
    rng = random.Random(seed)        # fixed seed = reproducible split
    data = labeled[:]
    rng.shuffle(data)
    cut = int(len(data) * (1 - holdout_ratio))
    train, frozen_eval = data[:cut], data[cut:]
    return train, frozen_eval        # eval never enters any training run

Выбирайте метрики, соответствующие задаче

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

  • Точное совпадение со схемой для структурированного вывода
  • Оценивание LLM в роли судьи по рубрике для открытого качества, с выборочной проверкой человеком
  • Метрики хвоста — худший случай и p95, а не только среднее
  • Доли безопасных ответов и отказов как обязательные пороги, оцениваемые отдельно от качества

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

Оценивайте каждого кандидата одинаково

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

def evaluate(candidate, frozen_eval, scorer):
    results = []
    for ex in frozen_eval:
        out = candidate.run(ex['input'])
        results.append(scorer(out, ex['label']))
    mean = sum(results) / len(results)
    p95 = sorted(results)[int(0.95 * len(results)) - 1]
    return {'mean': mean, 'p95_worst': p95}

# Identical frozen_eval + scorer for prompt / tuned / hybrid

Моделируйте полный вектор стоимости

Стоимость — это не одно число. Учитывайте каждый компонент, чтобы сравнение отражало реальность при Вашем объёме запросов:

  • Вычисление на один вызов: входные и выходные токены, умноженные на цену (длинные промпты дороже при каждом вызове)
  • Амортизированная стоимость обучения: стоимость дообучения, распределённая по ожидаемому числу запросов
  • Сопровождение: pipeline данных, запуски оценивания и повторное дообучение при изменениях базовой модели
  • Задержка: рассчитывается отдельно, если влияет на конверсию или удобство работы
def monthly_cost(calls, in_tok, out_tok, price_in, price_out,
                 train_cost=0.0, months_amortized=12):
    inference = calls * ((in_tok/1000)*price_in + (out_tok/1000)*price_out)
    amortized_train = train_cost / months_amortized
    return inference + amortized_train

# Long prompt-only: high in_tok, train_cost=0
# Tuned: low in_tok, train_cost>0 amortized over volume

Постройте границу качества и стоимости

Получив качество и ежемесячную стоимость каждого варианта, разместите их на границе. Вариант уступает другому, если у другого одновременно выше качество и ниже стоимость; удалите такие варианты.

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

def non_dominated(candidates):
    # candidate: {'name','quality','cost'} -- higher quality, lower cost better
    keep = []
    for c in candidates:
        dominated = any(o['quality'] >= c['quality'] and o['cost'] <= c['cost']
                        and o != c for o in candidates)
        if not dominated:
            keep.append(c)
    return keep

Статистическая значимость, а не случайный шум

Прирост на два пункта при оценивании 200 примеров может быть случайным шумом. Прежде чем объявлять победителя, проверьте, что разрыв в качестве статистически значим с учётом размера набора для оценки.

Используйте парное сравнение (одни и те же примеры пропускаются через оба варианта) и доверительный интервал для разности. Если интервал пересекает ноль, реального улучшения нет, а дополнительные затраты на дообучение неоправданны.

def paired_diff_ci(scores_a, scores_b):
    import statistics
    diffs = [a - b for a, b in zip(scores_a, scores_b)]
    mean = statistics.mean(diffs)
    sd = statistics.pstdev(diffs)
    se = sd / (len(diffs) ** 0.5)
    return (mean - 1.96*se, mean + 1.96*se)  # if it spans 0 -> not significant

Защититесь от утечки в набор для оценки

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

Удаляйте дубликаты на границе между обучением и оцениванием, проверяйте наличие почти одинаковых примеров и по возможности используйте разделённый по времени набор для оценки (отложенный по дате), чтобы дообученная модель не могла видеть его раньше. Утечка — самая частая причина того, что решение о дообучении не оправдывает себя в рабочей среде.

Контролируйте систему после выпуска

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

  • Выбирайте примеры из рабочего трафика и оценивайте их по той же рубрике
  • Настройте оповещения об ухудшении качества и росте стоимости одного вызова
  • Повторно проводите оценивание на зафиксированном наборе при каждом изменении версии базовой модели

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

Запись решения

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

Это делает выбор проверяемым и позволяет пересмотреть его. Когда меняется объём запросов или базовая модель, снова откройте запись и повторите сравнение, а не пытайтесь восстановить ход рассуждений по памяти.

Сквозная функция принятия решения

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

def decide(candidates, quality_bar, cost_ceiling):
    frontier = non_dominated(candidates)
    feasible = [c for c in frontier
                if c['quality'] >= quality_bar and c['cost'] <= cost_ceiling]
    if not feasible:
        return 'NO_CANDIDATE_MEETS_CONSTRAINTS'
    # cheapest option that clears the quality bar
    return min(feasible, key=lambda c: c['cost'])['name']

# Prefer prompt-only on ties: lower maintenance TCO

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

Дообученная модель набрала на 2 пункта больше, чем вариант с промптом, на наборе для оценки из 150 примеров, но парный доверительный интервал разности пересекает ноль. Кроме того, её ежемесячная стоимость выше. Как следует поступить?

Итоги

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

  • Зафиксируйте один набор для оценки и одинаково оценивайте на нём каждый вариант
  • Выбирайте метрики, соответствующие задаче, и следите за хвостом распределения, а не только за средним
  • Моделируйте полный вектор стоимости и распределяйте затраты на обучение по реальному объёму запросов
  • Требуйте статистической значимости; доверительный интервал, охватывающий ноль, означает отсутствие улучшения
  • Защищайтесь от утечки в набор для оценки — это главная причина ложных побед дообучения
  • Контролируйте систему после выпуска и записывайте решение, чтобы его можно было повторить
Можно начать бесплатно

Изучай 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. Гибридный подход: подсказки и лёгкая настройка
  4. Оценка решения
← Назад к AI Prompt Engineering