Как это работает
Эти метрики пришли из датасетов вопросов и ответов, где правильный ответ — короткая фраза: имя, число, дата. Любое перефразирование обнуляет EM, поэтому для свободного текста они бесполезны.
В тестировании LLM их применяют для полей, где значение однозначно: идентификаторы, суммы, статусы, названия.
F1 = 2 × precision × recall / (precision + recall)
Пример
1from collections import Counter
2
3def token_f1(pred: str, ref: str) -> float:
4 p, r = pred.lower().split(), ref.lower().split()
5 common = sum((Counter(p) & Counter(r)).values())
6 if common == 0:
7 return 0.0
8 precision, recall = common / len(p), common / len(r)
9 return 2 * precision * recall / (precision + recall)Как применять в тестировании ИИ
Используйте для проверки конкретных значений в ответах и структурированных полях. Для смысла и фактичности развёрнутых ответов нужны другие метрики или LLM-судья.
Типичные ошибки
- Применять EM к развёрнутым ответам: любое перефразирование даст 0.
- Не нормализовать ответы (регистр, пробелы, знаки) и получать ложные провалы.
- Считать F1 признаком верного факта: неверная дата с теми же словами получит высокий балл.
Частые вопросы
Когда использовать Exact Match?
Для коротких фактологических ответов с однозначным значением: даты, числа, идентификаторы, названия. Для развёрнутых ответов и рассуждений он не подходит, потому что любое перефразирование даёт 0.
Чем token F1 отличается от Exact Match?
Exact Match принимает только полное совпадение после нормализации, а token F1 считает долю общих слов и даёт частичный балл. Поэтому F1 мягче и лучше отражает близость коротких ответов.