Офлайн-оценка ответов LLM: задача на Python

Реализуйте проверку ответов нескольких типов по заданным правилам. Формат данных и способы сравнения приведены в условии, поэтому результат можно проверить без запросов к модели.

Напишите код и проверьте решение. Продолжить тему можно в курсе LLMOps & Evaluation: из песочницы в продакшн.

Задача: офлайн-оценка ответов модели (текст/JSON/числа)

Нужно агрегировать метрики качества по датасету смешанных типов.

Формат ввода

Первая строка: два значения через пробел
N eps — количество примеров N (1..5000) и допуск для чисел eps (вещественное).

Далее N строк вида
TYPE|REF|PRED

где TYPE ∈ {TEXT, JSON, NUM}. Символ | используется только как разделитель (внутри REF/PRED он не встречается).

Правила оценки:

  • TEXT
    exact: PRED == REF после .strip() (регистрозависимо).
    contains: REF (в нижнем регистре) является подстрокой PRED (в нижнем регистре).

  • JSON
    json_valid: PRED — валидный JSON (json.loads успешно).
    json_exact: равенство структур json.loads(REF) и json.loads(PRED) (словарям порядок ключей не важен).

  • NUM
    num_within: если REF≠0: |PRED−REF|/|REF| ≤ eps, иначе |PRED| ≤ eps.
    Если PRED не число — False.

Формат вывода

Ровно одна минифицированная JSON-строка с полями в указанном порядке:

{"exact":<num>,"contains":<num>,"json_valid":<num>,"json_exact":<num>,"num_within":<num>,"macro":<num>}

Где каждое значение — доля от 0 до 1, округлённая до 6 знаков (округление математическое), с усечением лишних нулей (например, 0.666667, 0.5, 1.0, 0).
Если в датасете нет примеров соответствующего типа, для метрики вывести 0.
macro — доля «пройденных» примеров среди всех:

  • TEXT: exact OR contains

  • JSON: json_valid AND json_exact

  • NUM: num_within

РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи