Новая версия LLM лучше на тех же вопросах: как оценить разницу

Команда меняет промпт ассистента и получает 78% верных ответов вместо 74% на тестовом наборе. На экране разница выглядит как четыре процентных пункта. Но вопросы сложные и лёгкие перемешаны, а набор невелик. Перед выпуском важно понять, насколько устойчив прирост именно на тех же вопросах, а не сравнивать две независимые доли, будто версии работали на разных аудиториях.

Единица сравнения — вопрос

Для каждого question_id сохраните оценку старой и новой версии по одной и той же рубрике: 1 за успех, 0 за ошибку. Разность new - old равна +1, если исправили ошибку, -1, если сломали верный ответ, и 0, если исход не изменился. Среднее этих разностей — прирост доли успешных ответов. Важна и пара счётчиков: сколько вопросов улучшились и сколько ухудшились. Результат «+4 пункта» может скрывать, например, 12 исправлений и 8 регрессий, которые требуют просмотра.

Для неопределённости используйте парный bootstrap: много раз выбирайте вопросы с возвращением и каждый раз забирайте обе оценки выбранного вопроса вместе. Затем пересчитывайте среднюю разницу и берите, например, 2,5-й и 97,5-й процентили распределения. Если независимо перемешать старые и новые оценки, вы потеряете связь по вопросу и получите другой эксперимент. В SciPy параметр paired=True именно сохраняет общие индексы при ресемплинге нескольких массивов.

Минимальный расчёт без статистического пакета

from random import Random

old = [1, 0, 1, 0, 1, 0, 0, 1]
new = [1, 1, 1, 0, 0, 1, 0, 1]
delta = [b - a for a, b in zip(old, new)]
rng = Random(7)
samples = []
for _ in range(10000):
    samples.append(sum(rng.choice(delta) for _ in delta) / len(delta))
samples.sort()
print(sum(delta) / len(delta), samples[250], samples[9750])

В примере две исправленные ошибки и одна регрессия на восьми вопросах: оценка прироста 0,125. Интервал будет широким, поэтому восемь вопросов не доказывают улучшение. Для реального eval сначала зафиксируйте набор и рубрику, затем считайте интервал. Если одна задача породила много почти одинаковых вопросов, ресемплируйте исходные задачи или группы пользователей целиком; иначе дубли дадут ложную уверенность.

Этот код берёт процентильный интервал для наглядности. Для отчёта с маленьким набором, сильной асимметрией или очень редкими успехами выбор метода интервала и объёма выборки следует проверить отдельно; bootstrap не создаёт информацию из воздуха. Заранее задайте минимально полезный прирост, например два процентных пункта. Даже если весь интервал выше нуля, изменение меньше этой границы может не оправдать стоимость новой модели. И наоборот, широкий интервал говорит «нужны ещё вопросы», а не «версии одинаковы».

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

В платном курсе LLMOps & Evaluation: из песочницы в продакшн вы собираете тестовые наборы, вводите quality-гейты и готовите отчёты о качестве после релиза. Парное сравнение даёт такому отчёту конкретный смысл: видно и среднее изменение, и неопределённость, и список ухудшившихся вопросов. Откройте программу курса, чтобы встроить оценку в цикл выпуска.

Продолжить на практике

  • LLMOps & Evaluation: из песочницы в продакшн ↗

    Практический курс по LLMOps. Соберёте продакшн-контур для LLM: eval-фреймворк (LangSmith/Ragas/OpenAI Evals), quality-гейты в CI/CD, алёрты на дрейф, монитринг скорости и стоимости, управление промпт-версиями и безопасность. Плюс профессиональные блоки: synthetic data для тестов, LLM-based judges, отчётность для релиз-комитета и runbook’и инцидентов.