Забудьте про "мне кажется". Пора измерять
Вы запустили LLM-продукт. Клиенты вроде довольны. Но когда CEO спрашивает "Насколько мы стали лучше после последнего обновления?", вы начинаете рассказывать про субъективные ощущения и отдельные кейсы. Это выглядит непрофессионально. Хуже того - вы не можете принимать решения о развитии продукта на основе данных.
Проблема не в вас. Проблема в том, что оценка качества LLM-продуктов - это дикая смесь искусства и науки, где до недавнего времени преобладало первое. Но так больше не должно быть.
Самый опасный миф: "Мы используем GPT-4 для оценки качества ответов других моделей". Это как просить лисицу охранять курятник. GPT-4 имеет свои предубеждения, слепые зоны и, что самое главное, стоит денег за каждый вызов.
Три шага к объективности
Забудьте про сложные академические метрики типа BLEU или ROUGE. Они не работают для реальных продуктов. Вам нужна система, которая:
- Измеряет то, что важно для вашего бизнеса
- Работает быстро и дешево
- Дает воспроизводимые результаты
- Позволяет сравнивать разные версии продукта
1Создаем датасет: что размечать и как не сойти с ума
Первая ошибка - пытаться разметить все подряд. Вторая - размечать слишком мало. Третья - думать, что разметка это одноразовая акция.
Ваш датасет должен отражать реальное использование продукта. Если у вас чат-бот для поддержки клиентов, соберите реальные диалоги (анонимизированные). Если это код-генератор - реальные задачи разработчиков. Нет реальных данных? Сгенерируйте синтетические, но максимально приближенные к реальности.
| Что размечать | Сколько нужно | Кто размечает |
|---|---|---|
| Критические сценарии (деньги, безопасность) | 100% покрытие | Эксперты предметной области |
| Частые запросы (80% трафика) | 500-1000 примеров | Обученные асессоры |
| Экзотические кейсы | 100-200 примеров | Разработчики продукта |
Шум в разметке - это не баг, это фича. Люди не согласны между собой. Эксперты спорят. Это нормально. Ваша задача - не добиться 100% согласия, а измерить уровень несогласия и учесть его в метриках.
2Бинарные метки vs сравнения: выбираем оружие
Большинство команд начинают с бинарных меток: "хороший ответ" / "плохой ответ". Это интуитивно понятно. И это ошибка.
Бинарные метки работают только для очевидных случаев. Но большинство ответов LLM находятся в серой зоне: "технически правильный, но стилистически неудачный", "полный, но содержит лишнюю информацию", "точный, но плохо структурированный".
Сравнения решают эту проблему. Вместо "хорошо/плохо" вы спрашиваете: "Ответ A лучше ответа B?". Это:
- Более естественно для людей (мы сравниваем, а не присваиваем абсолютные оценки)
- Меньше зависит от настроения асессора
- Позволяет строить относительные рейтинги
Но есть нюанс. Сравнения требуют в 3-4 раза больше работы. Каждый пример нужно сравнивать с несколькими другими. И здесь на помощь приходит специальный промпт для сравнения LLM, который структурирует процесс оценки.
# Пример сравнения двух ответов
comparison_prompt = """
Запрос: {query}
Ответ A: {response_a}
Ответ B: {response_b}
Инструкция по оценке:
1. Правильность: содержит ли ответ фактические ошибки?
2. Полнота: отвечает ли на все части запроса?
3. Ясность: легко ли понять ответ?
Какой ответ лучше? Ответьте только "A", "B" или "РАВНЫ".
"""Не смешивайте бинарные метки и сравнения в одном датасете. Выберите один подход и придерживайтесь его. Смешение подходов даст несравнимые метрики и головную боль при анализе.
3Калибровка LLM-оценщиков: учим модель оценивать
Ручная разметка - это дорого и медленно. LLM-оценщики - это быстро и дешево. Но они часто ошибаются. Решение - калибровка.
Калибровка это не "настроим температуру и надеемся на лучшее". Это систематический процесс приведения оценок LLM к человеческим стандартам.
Вот как это работает на практике:
import numpy as np
from sklearn.calibration import CalibratedClassifierCV
from sklearn.linear_model import LogisticRegression
# У вас есть:
# X - эмбеддинги ответов (например, из sentence-transformers)
# y_human - человеческие оценки (0/1 или сравнения)
# y_llm - оценки LLM-оценщика
# 1. Собираем данные калибровки
calibration_data = []
for query, response, human_score, llm_score in dataset:
embedding = get_embedding(response) # 384 или 768 измерений
calibration_data.append({
'features': embedding,
'human': human_score,
'llm': llm_score
})
# 2. Обучаем калибровочную модель
X = np.array([d['features'] for d in calibration_data])
y_human = np.array([d['human'] for d in calibration_data])
y_llm = np.array([d['llm'] for d in calibration_data])
# Калибруем предсказания LLM под человеческие оценки
calibrator = CalibratedClassifierCV(LogisticRegression(), method='sigmoid')
calibrator.fit(X, y_human)
# 3. Используем калиброванный оценщик
def calibrated_score(response):
embedding = get_embedding(response)
return calibrator.predict_proba([embedding])[0][1]Этот подход решает несколько проблем сразу:
- LLM-оценщик может быть смещен в сторону определенных типов ответов
- Человеческие оценки имеют шум - калибровка его сглаживает
- Можно комбинировать несколько LLM-оценщиков
Важный момент: калибровочный набор должен быть репрезентативным для вашего продукта. Не калибруйте на общих данных, если у вас специфическая предметная область.
Методология оценки: от теории к практике
У вас есть разметка. У вас есть калиброванный оценщик. Что дальше? Собираем все в систему.
Первое правило: оценивайте не абсолютные значения, а изменения. Ваша метрика упала с 0.85 до 0.83 после обновления модели. Это катастрофа или статистическая погрешность?
Второе правило: используйте доверительные интервалы. LLM-продукты недетерминированы (даже с temperature=0 есть вариабельность). Прочитайте как тестировать недетерминированные LLM, чтобы не сойти с ума от флуктуаций.
Третье правило: разделяйте метрики по типам ошибок:
| Тип ошибки | Как измерять | Что делать |
|---|---|---|
| Фактические ошибки | Ручная проверка экспертами | Добавить в RAG систему, улучшить промпты |
| Стилистические проблемы | LLM-оценщик с калибровкой | Настроить system prompt, добавить few-shot примеры |
| Неполные ответы | Проверка покрытия ключевых точек | Увеличить max_tokens, улучшить структуру промпта |
| Галлюцинации | Сравнение с source документами | Внедрить логический детектор вместо очередного промпта |
Ошибки, которые все совершают (и как их избежать)
Ошибка 1: оценивать все подряд. Не нужно. Определите 3-5 ключевых сценариев, которые действительно важны для бизнеса. Оценивайте их.
Ошибка 2: использовать одну метрику. Качество LLM-продукта многомерно. Нужна как минимум тройка: точность, полнота, ясность.
Ошибка 3: забывать про latency и стоимость. Самый точный ответ, который стоит $10 и генерируется 30 секунд - это плохой ответ для большинства продуктов.
Ошибка 4: не учитывать контекст. Ответ может быть идеальным в вакууме, но бесполезным в контексте предыдущих сообщений. Особенно актуально для чатов.
Инструменты и автоматизация
Ручная оценка масштабируется плохо. Хорошая новость: есть инструменты.
Для быстрого старта подойдет LM Studio или llama.cpp для запуска локальных моделей-оценщиков. Дешево, приватно, можно кастомизировать.
Для production системы рассмотрите специализированные фреймворки: LangSmith от LangChain, Phoenix от Arize, или собственное решение на основе открытых моделей.
Ключевой момент автоматизации: пайплайн оценки должен быть частью CI/CD. Каждый PR с изменением промптов или моделей должен пройти через оценку на золотом датасете. Если метрики падают ниже порога - автоматическое отклонение.
# Пример конфигурации GitHub Actions для оценки LLM
name: LLM Quality Gate
on:
pull_request:
paths:
- 'prompts/**'
- 'models/**'
jobs:
evaluate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run evaluation
run: |
python evaluate.py \
--golden-dataset dataset/golden.json \
--prompt-file prompts/system.md \
--threshold 0.85
- name: Fail if below threshold
if: ${{ failure() }}
run: |
echo "Quality metrics below threshold. Check evaluation report."
exit 1Что делать, когда метрики врут
Бывает. Метрики показывают улучшение, но пользователи жалуются. Или наоборот - метрики падают, но отзывы положительные.
Первое: проверьте датасет. Не устарел ли он? Отражает ли текущее использование продукта?
Второе: проанализируйте расхождения. Где именно метрики расходятся с реальностью? Часто проблема в том, что вы измеряете не то, что важно пользователям.
Третье: добавьте качественные метрики. Проведите юзабилити-тестирование с 5-7 реальными пользователями. Их feedback часто ценнее тысяч автоматических оценок.
Четвертое: помните про опасность temperature=0. Модель может быть уверена в неправильном ответе. Уверенность != правильность.
Дальнейшие шаги
Система оценки качества - это не проект, а процесс. Раз в месяц пересматривайте:
- Актуальность датасета (добавляйте новые типы запросов)
- Эффективность LLM-оценщика (перекалибровывайте при смене модели)
- Пороговые значения (адаптируйте под бизнес-требования)
Начните с малого. Возьмите 100 самых частых запросов. Разметьте их вручную. Настройте простой LLM-оценщик. Запустите оценку текущей версии продукта. Это займет неделю, но даст больше инсайтов, чем месяцы субъективных обсуждений.
И последнее: не пытайтесь достичь совершенства. В оценке качества LLM-продуктов перфекционизм - враг прогресса. Лучшая система оценки - та, которую вы действительно используете, а не та, которая идеальна в теории.