
Любой, кто работал с языковыми моделями, сталкивался с ситуацией: промпт вроде бы логичный, но ответы то блестящие, то провальные. Субъективная оценка «нравится — не нравится» здесь не работает. Чтобы перестать гадать, нужны измеримые метрики и воспроизводимые процедуры тестирования.
В этой статье мы разберём, какие метрики реально работают для оценки качества промптов, как их считать и когда применять. Материал основан на документации OpenAI Evals, библиотеке Evaluate от Hugging Face, а также на опубликованных исследовательских подходах к оценке генеративных моделей.
Почему субъективная оценка промптов опасна
Когда разработчик оценивает промпт «на глаз», он невольно подстраивается под собственные ожидания. Исследование 2023 года, проведённое командой Anthropic, показало, что человеческая оценка согласованна лишь на 60–70% даже для простых задач классификации. Для генеративных задач разброс ещё выше.
Проблема усугубляется, когда промпт тестируют на одном-двух примерах. Модель может случайно угадать правильный ответ, а при смене контекста — провалиться. Без метрик вы не узнаете, улучшили вы промпт или сделали хуже.
Основные метрики для оценки качества промптов
Метрики делятся на три категории: метрики точности (для задач с известным правильным ответом), метрики качества генерации (для открытых задач) и метрики релевантности (для RAG-систем).
Метрики точности
Если у вас есть набор тестовых пар «вопрос — правильный ответ» (golden dataset), используйте классические метрики классификации:
Accuracy — доля правильных ответов. Простая и понятная метрика, но бесполезна при несбалансированных классах. Например, если 95% ответов в тесте — «да», промпт, всегда отвечающий «да», получит 95% accuracy.
Precision (точность) — доля правильно найденных релевантных ответов среди всех ответов модели. Показывает, насколько модель «не врёт».
Recall (полнота) — доля правильно найденных релевантных ответов среди всех релевантных ответов в тесте. Показывает, не пропускает ли модель важные случаи.
F1-score — гармоническое среднее precision и recall. Лучший одиночный показатель для сбалансированной оценки.
Пример кода на Python с использованием библиотеки scikit-learn:
python
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
Предположим, y_true — правильные ответы, y_pred — ответы модели
y_true = [‘да’, ‘нет’, ‘да’, ‘да’, ‘нет’]
y_pred = [‘да’, ‘да’, ‘да’, ‘нет’, ‘нет’]
print(f’Accuracy: {accuracy_score(y_true, y_pred):.2f}’)
print(f’Precision: {precision_score(y_true, y_pred, pos_label=»да»):.2f}’)
print(f’Recall: {recall_score(y_true, y_pred, pos_label=»да»):.2f}’)
print(f’F1: {f1_score(y_true, y_pred, pos_label=»да»):.2f}’)
Метрики качества генерации
Для задач, где нет единственного правильного ответа (суммаризация, перевод, генерация текста), используются метрики, сравнивающие ответ модели с эталонным.
BLEU (Bilingual Evaluation Understudy) — изначально создана для машинного перевода. Оценивает совпадение n-граммов (последовательностей из n слов) между ответом модели и эталоном. Значение от 0 до 100, где 100 — полное совпадение. Проблема: не учитывает синонимы и перефразирования. Хороший промпт для перевода может давать BLEU 40–60, плохой — ниже 20.
ROUGE (Recall-Oriented Understudy for Gisting Evaluation) — чаще используется для суммаризации. Оценивает полноту совпадения n-граммов, то есть сколько слов из эталона модель смогла воспроизвести. ROUGE-1 — совпадение униграмм, ROUGE-2 — биграмм, ROUGE-L — наибольшая общая подпоследовательность.
METEOR — улучшенная версия BLEU, учитывающая синонимы и лемматизацию. Более точна, но требует дополнительных языковых ресурсов (WordNet для английского).
Пример расчёта BLEU и ROUGE с библиотекой Evaluate от Hugging Face:
python
from evaluate import load
bleu = load(‘bleu’)
rouge = load(‘rouge’)
reference = [‘метод обработки данных включает три этапа’]
candidate = [‘обработка данных состоит из трёх этапов’]
bleu_result = bleu.compute(predictions=[candidate], references=[reference])
rouge_result = rouge.compute(predictions=[candidate], references=[reference])
print(f’BLEU: {bleu_result[«bleu»]:.2f}’)
print(f’ROUGE-1: {rouge_result[«rouge1»]:.2f}’)
print(f’ROUGE-L: {rouge_result[«rougeL»]:.2f}’)
Метрики релевантности для RAG
Для систем Retrieval-Augmented Generation (RAG) добавляются метрики, оценивающие качество извлечённых документов:
MRR (Mean Reciprocal Rank) — среднее обратное ранжирование первого релевантного документа. Показывает, насколько высоко в выдаче оказывается нужный документ.
NDCG (Normalized Discounted Cumulative Gain) — учитывает не только наличие релевантного документа, но и его позицию с учётом степени релевантности.
Context Relevance — доля ответа модели, которая подтверждается извлечёнными документами. Измеряется через LLM-as-a-judge или через семантическое сходство эмбеддингов.
Бенчмарки для тестирования промптов
Использование стандартизированных бенчмарков позволяет сравнивать промпты и модели на воспроизводимых данных.
OpenAI Evals — открытый фреймворк от OpenAI для оценки промптов и моделей. Содержит более 100 готовых тестов (MMLU, TruthfulQA, HellaSwag и другие). Позволяет запускать оценку локально и получать метрики в стандартизированном формате. Подходит для проверки промптов на знание фактов, логические рассуждения и безопасность.
EleutherAI LM Evaluation Harness — независимый инструмент, поддерживающий сотни моделей и бенчмарков. Интегрируется с Hugging Face и позволяет добавлять кастомные датасеты. Полезен, когда нужно проверить промпт на специфических данных.
BIG-bench (Beyond the Imitation Game) — набор из более чем 200 задач, охватывающих логику, математику, понимание текста и социальные рассуждения. Используется для комплексной оценки.
Практический подход: как построить тестирование промпта
Пошаговая процедура, которая работает в реальных проектах:
Шаг 1. Соберите golden dataset. Минимум 30–50 тестовых примеров для простых задач, 100–200 для генеративных. Каждый пример включает вход (промпт + контекст) и ожидаемый ответ.
Шаг 2. Определите метрики. Для задач с известным ответом — accuracy + F1. Для открытых задач — BLEU или ROUGE. Для RAG — MRR + context relevance.
Шаг 3. Напишите скрипт оценки. Используйте Evaluate от Hugging Face или OpenAI Evals. Запустите на baseline-промпте, затем на изменённом.
Шаг 4. Сравните результаты. Если метрики улучшились хотя бы на 5–10% — промпт действительно стал лучше. Если изменения в пределах шума (1–3%) — скорее всего, разница случайна.
Шаг 5. Проверьте на краевых случаях. Добавьте 5–10 примеров с нестандартным вводом: пустой запрос, очень короткий запрос, опечатки, незнакомые термины.
Ограничения метрик и как их обходить
Ни одна метрика не идеальна. BLEU не понимает смысла — два семантически идентичных предложения могут получить низкий балл из-за разной лексики. ROUGE игнорирует грамматику. Accuracy не замечает качественных различий.
Решение — комбинировать метрики. Исследование Google 2020 года показало, что комбинация BLEU + ROUGE + METEOR даёт корреляцию с человеческой оценкой на уровне 0.85–0.90, тогда как каждая метрика по отдельности — 0.70–0.80.
Дополнительно используйте LLM-as-a-judge — попросите сильную модель (GPT-4, Claude 3) оценить ответ по заданным критериям. Этот метод хорошо работает для оценки полезности, безопасности и стиля, но требует осторожности: модель-судья может иметь собственные систематические ошибки.
Что делать с результатами
Метрики нужны не для галочки, а для принятия решений. Если после изменения промпта accuracy выросла с 72% до 76% при F1 = 0.68 — промпт стал стабильнее, но всё ещё плохо обрабатывает определённые классы. Стоит проанализировать, какие именно примеры модель продолжает путать, и доработать инструкции в промпте.
Если BLEU упал с 45 до 38, но ответы стали более осмысленными (по оценке LLM-as-a-judge), возможно, метрика просто не отражает улучшение. В таком случае стоит пересмотреть эталонные ответы или добавить человеческую валидацию.
Практические проверки
Перед внедрением метрик в свой рабочий процесс: проверьте, есть ли у вас golden dataset хотя бы на 30 примеров. Установите библиотеку Evaluate и запустите расчёт BLEU на одном из ваших текущих промптов. Сравните результат с изменённой версией промпта — разница в 5–10% уже даёт направление для дальнейшей работы. Если разницы нет — измените промпт более существенно.
