Как это работает
В отличие от hit rate, MRR учитывает позицию: два поиска с одинаковым hit rate могут сильно различаться, если у одного нужный чанк всегда первый, а у другого пятый. Позиция важна, потому что модель лучше использует информацию в начале контекста.
MRR не учитывает, сколько нужных чанков найдено, поэтому её дополняют recall@k. Значение лежит от 0 до 1.
MRR = (1/|Q|) × Σ 1/rank_i, rank_i — позиция первого нужного результата (для ненайденного вклад 0)
Пример
1def test_mrr():
2 rr = []
3 for case in CASES:
4 pos = positions(case) # позиции нужных чанков, с 1
5 rr.append(1 / min(pos) if pos else 0)
6 assert sum(rr) / len(rr) >= 0.70Как применять в тестировании ИИ
Используйте MRR вместе с hit rate и recall: hit rate показывает, находится ли нужное, а MRR — насколько высоко. Падение MRR при стабильном hit rate указывает, что нужный чанк сместился ниже в выдаче.
Типичные ошибки
- Смотреть только MRR и не проверять recall для вопросов с несколькими нужными чанками.
- Не фиксировать k, по которому считают метрику, и сравнивать несопоставимые прогоны.
- Подгонять индекс под набор без закрытой части вопросов.
Частые вопросы
Как считается MRR?
Для каждого вопроса берут 1/позиция первого нужного результата (0, если нужного нет) и усредняют по всем вопросам. Например, позиции 1, 2 и 5 дают среднее (1 + 0,5 + 0,2) / 3 ≈ 0,57.
Чем MRR отличается от hit rate?
Hit rate только проверяет, попал ли нужный чанк в top-k. MRR дополнительно учитывает, на каком месте он стоит: чем выше, тем лучше значение.