Гайд · TNWS AI

Как измерить Recall@k поиска через InformationRetrievalEvaluator

5 мин—

Готовим queries, corpus и relevant_docs, проверяем golden IDs и сравниваем качество модели до смены индекса.

Задача и применимость

Поисковый запрос: «как измерить recall поиска InformationRetrievalEvaluator Sentence Transformers». Ниже одна практическая задача для Python с библиотекой Sentence Transformers 6.1.0, опубликованной 18 сентября 2026 года, и checkpoint sentence-transformers/all-MiniLM-L6-v2. Пример на английских предложениях выбран потому, что поддержка русского выбранной демонстрационной моделью не должна подразумеваться автоматически. Для реального русского корпуса подберите подтверждённую карточкой языков модель и повторите оценку. Внешний поиск, генерация LLM и принятие бизнес-решения остаются отдельными этапами.

Фактическая основа: InformationRetrievalEvaluator принимает словари queries и corpus, а также relevant_docs: для каждого ID вопроса множество релевантных ID документов. Он вычисляет MRR, Recall@k, NDCG и другие метрики; настройки precision_recall_at_k задают позиции k. При неправильной разметке полученная метрика будет числом без полезного смысла. Точный прогноз значений векторных оценок без запуска весов модели не обещается. Примеры кода ниже сверены с текущей официальной документацией и проверены на синтаксис Python; в этом окружении сами веса не загружались. При обновлении модели или зависимости сначала повторите контрольный пример.

Нумерованная инструкция

  1. Подготовьте перечень вопросов с постоянными IDs и отдельный корпус с IDs документов.
  2. Для каждого вопроса вручную отметьте все подходящие документы.
  3. Проверьте, что нет ссылок на отсутствующие corpus IDs.
  4. Создайте evaluator, задав k для сценария, и вызовите его с моделью.
  5. Сравните одинаковую разметку до и после изменения модели, записав результаты и p95 отдельно.

Подготовьте изолированное окружение и установите зафиксированный пакет: pip install "sentence-transformers==6.1.0". Библиотека потребует подходящих зависимостей и свободной памяти под выбранные веса; установка пакета не скачивает заранее любую модель. Перед тестом напечатайте установленную версию и зафиксируйте имя checkpoint. Не отправляйте в примеры клиентские имена, закрытые документы или ключи доступа.

Готовый шаблон

from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import InformationRetrievalEvaluator

queries = {"q1": "How long can I return an item?",
           "q2": "When is delivery available?"}
corpus = {"R7": "Returns are accepted within 14 days.",
          "D9": "Delivery is available on weekdays.",
          "P2": "Payment is possible by card."}
relevant = {"q1": {"R7"}, "q2": {"D9"}}
assert all(ids <= set(corpus) for ids in relevant.values())
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
evaluator = InformationRetrievalEvaluator(
    queries, corpus, relevant, precision_recall_at_k=[1, 2],
    mrr_at_k=[2], write_csv=False)
print(evaluator(model))

Запускайте первый раз на очень маленьком обезличенном наборе. Для каждой строки и документа сохраняйте стабильный ID: иначе невозможно выяснить, почему нейросеть выбрала конкретную запись. Если вывод отличается от ожидаемой формы, сначала проверьте состав входа, затем конфигурацию модели и только после этого настройки ранжирования. Не маскируйте ошибки ручной подстановкой заранее «правильного» ответа.

Конкретный вход и ожидаемый результат

Вход: q1 о сроке возврата с golden ID R7, q2 о доставке с golden ID D9, третий документ P2 — отрицательный. Ожидаемый выход — словарь метрик по выбранным k без обращения к LLM; обе golden-ссылки существуют. На столь маленьком наборе цифры иллюстрируют работу оценки, но не доказывают производственное качество.

Проверяйте структуру отдельно от смысла. Массив верного размера не означает хорошего поиска, а высокий score не удостоверяет факт в документе. Сохраните реальные выводы программы и сопоставьте их с заранее размеченными эталонными ID. При переносе на другой корпус обновите проверочные данные; простая замена входного предложения в коде не доказывает обобщения метода.

Разбор метода и ограничений

Частая ошибка — измерять качество по одному удачному вопросу и называть это recall. Нужна зафиксированная выборка, где релевантные документы размечены до эксперимента. Если одному вопросу подходят несколько редакций, явно решите, какая является допустимой; иначе система может «успешно» находить старую инструкцию. Recall@k показывает, попал ли релевантный документ в первые k, но не говорит, правильно ли генератор потом сформулирует ответ. MRR чувствительна к позиции первого подходящего документа. Измеряйте также долю вопросов без ответа и права доступа: выбранный общий документ не обязан быть виден конкретному пользователю. После перемены model ID, chunking или метрики прогоните один и тот же gold-набор.

Дополнительный сценарий проверки

Добавьте в тест перефразировку, отрицание, точный артикул, два разных срока и отсутствующий факт. Разметьте не только один идеальный документ, но все действительно допустимые варианты. Если на одном запросе релевантным считается архив R6, а в production он запрещён, оценка стимулирует опасное поведение. Укажите длину корпуса, список запросов и редакции документов в протоколе; без них сравнение цифр между релизами некорректно. Для небольшой выборки докладывайте целые ошибки наряду с процентами, например количество потерянных вопросов. При сравнении моделей разница в доли одного вопроса на двух элементах ничего не доказывает — увеличьте набор. Код демонстрирует API evaluator, но саму модель в текущем окружении не запускает.

Критерии принятия

  • Все relevant_docs ссылаются на существующие corpus IDs.
  • Один и тот же gold-набор используется до и после изменения.
  • Отдельно проверены запрет старой редакции и отсутствие ответа.

Если один пункт не проходит, настройка не готова для массового применения. При перезапуске сервиса повторно прогоните контрольный запрос и сверяйте ID, а не только наличие числовой оценки. Разделяйте ошибки получения embeddings, поиска кандидатов, фильтрации доступа и формирования финального ответа; хорошая метрика одного этапа не подтверждает работу остальных.

Типичные ошибки и что не делать

  • Не выдавать успешный q1 за общую оценку качества.
  • Не считать Recall@k проверкой текста ответа LLM.
  • Не включать запрещённые документы в релевантные эталоны.

Не обещайте точность и экономию ресурсов без измерений на своём оборудовании и корпусе. Не подменяйте документ нейросетевым выводом при объяснении решения пользователю. Помните о правах на доступ к исходным материалам: embedding не является анонимизацией приватного текста. При изменении модели, языка или способа подготовки данных повторите тесты до переключения рабочего трафика.

FAQ

Что хранится в relevant_docs?

Множество ID подходящих документов на каждый вопрос.

Чем Recall@k отличается от MRR?

Recall проверяет попадание в первые k, MRR учитывает позицию первого попадания.

Нужна ли LLM для оценки?

Нет.

Официальные источники

Частые вопросы

Что хранится в relevant_docs?

Множество ID подходящих документов на каждый вопрос.

Чем Recall@k отличается от MRR?

Recall проверяет попадание в первые k, MRR учитывает позицию первого попадания.

Нужна ли LLM для оценки?

Нет.

Читайте также

Комментарии

Пока тихо. Скажите первое слово