Как это работает
Метрика была предложена для машинного перевода в 2002 году [1]. Значение лежит от 0 до 1 (иногда его пишут в процентах). Без сглаживания оценка обнуляется, если нет ни одной общей 4-граммы, поэтому на коротких текстах нужно сглаживание (smoothing).
Значение зависит от токенизации, сглаживания и числа эталонов, поэтому сравнивать цифры из разных источников нельзя, а замеры нужно делать одним и тем же кодом.
BLEU = BP × exp( (1/N) × Σ log p_n ), n = 1…N BP — штраф за краткость, p_n — точность по n-граммам
Пример
1import re
2from nltk.translate.bleu_score import SmoothingFunction, sentence_bleu
3
4def tokenize(text):
5 return re.findall(r"\w+", text.lower()) # учитывает кириллицу
6
7reference = "Вернуть товар можно в течение 14 дней."
8candidate = "Товар можно вернуть в течение 14 дней."
9score = sentence_bleu(
10 [tokenize(reference)], tokenize(candidate),
11 smoothing_function=SmoothingFunction().method1,
12)Как применять в тестировании ИИ
Применяйте BLEU там, где формулировка должна быть близка к эталону: перевод, строго ограниченные форматы. Для чат-ботов и RAG используйте метрики смысла и LLM-судью.
Типичные ошибки
- Использовать BLEU для свободных ответов: он ставит низкий балл верному перифразу.
- Считать, что высокий BLEU означает верный факт: замена «14 дней» на «30 дней» почти не меняет оценку.
- Сравнивать значения из разных статей и библиотек без учёта токенизации.
Частые вопросы
Чем BLEU отличается от ROUGE?
BLEU измеряет precision (какая доля слов ответа есть в эталоне), а ROUGE — recall (какая доля эталона нашлась в ответе). BLEU создавали для перевода, ROUGE для суммаризации. Обе не понимают смысл.
Подходит ли BLEU для оценки чат-ботов?
Как правило, нет: у чат-бота много правильных формулировок, и точный перифраз получает низкий балл. Лучше использовать метрики смысла, LLM-судью и проверки фактичности.
Источники
- Bleu: a Method for Automatic Evaluation of Machine Translation — Papineni K., Roukos S., Ward T., Zhu W.-J., ACL 2002