Гайд · TNWS AI
Как измерить Recall@k поиска через InformationRetrievalEvaluator
Готовим 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; в этом окружении сами веса не загружались. При обновлении модели или зависимости сначала повторите контрольный пример.
Нумерованная инструкция
- Подготовьте перечень вопросов с постоянными IDs и отдельный корпус с IDs документов.
- Для каждого вопроса вручную отметьте все подходящие документы.
- Проверьте, что нет ссылок на отсутствующие corpus IDs.
- Создайте evaluator, задав k для сценария, и вызовите его с моделью.
- Сравните одинаковую разметку до и после изменения модели, записав результаты и 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 для оценки?
Нет.
Читайте также
Как квантовать embeddings в int8 через SentenceTransformer.encode
Сравниваем тип и размер массива float32/int8, объясняем необходимость калибровки и измерения recall перед заменой хранилища.
Как найти релевантный фрагмент через semantic_search в Sentence Transformers
Кодируем вопрос и документы, связываем corpus_id с текстом, проверяем top_k и строим отказ при отсутствии подходящего источника.
Как найти смысловые дубли вопросов через paraphrase_mining
Ищем пары похожих вопросов, читаем позиции и score, исключаем отрицания и цифры ручной проверкой до объединения записей.
Комментарии
Пока тихо. Скажите первое слово