Как это работает
Метрика не различает, на каком месте стоит нужный чанк, главное, что он в top-k. Позицию учитывает MRR, а долю найденных нужных чанков при нескольких релевантных — recall@k.
Низкий hit rate указывает на проблемы поиска: неудачный чанкинг, слабые эмбеддинги, устаревший индекс. Список проваленных вопросов сразу показывает, каких формулировок и документов поиску не хватает.
hit rate@k = (число вопросов с нужным чанком в top-k) / (число вопросов)
Пример
1def positions(case, k=5):
2 ids = [c.id for c in retrieve(case["question"], k=k)]
3 return [ids.index(r) + 1 for r in case["relevant_ids"] if r in ids]
4
5def test_hit_rate():
6 hits = sum(1 for c in CASES if positions(c))
7 assert hits / len(CASES) >= 0.90Как применять в тестировании ИИ
Проверяйте поиск отдельно от генерации: hit rate не требует языковой модели. Порог подберите по данным (в примере 90%) и пересчитывайте после каждого изменения чанкинга, индекса или модели эмбеддингов.
Типичные ошибки
- Собирать набор для поиска из тех же документов, по которым настраивали поиск: метрика завышена.
- Не держать часть набора закрытой.
- Считать только hit rate и не смотреть на позицию нужного чанка (MRR).
Частые вопросы
Что показывает hit rate@k?
Долю вопросов, для которых нужный фрагмент попал в первые k результатов поиска. Это простая проверка того, нашёл ли поиск нужное, без учёта его позиции в выдаче.
Чем hit rate отличается от recall@k и MRR?
Hit rate засчитывает вопрос, если найден хотя бы один нужный чанк. Recall@k считает долю найденных нужных чанков, а MRR учитывает, насколько высоко в выдаче стоит первый из них.