Гайд · TNWS AI
Как измерить полноту поиска в Haystack через DocumentRecallEvaluator
Размеченные документы, SINGLE_HIT и MULTI_HIT, индивидуальные оценки и тест на потерю нужного фрагмента.
Применимость и задача
Поисковый запрос: «как измерить recall поиска Haystack DocumentRecallEvaluator». Материал сверён с официальной документацией Haystack 3.1 19 сентября 2026 года. Примеры рассчитаны на Python и пакет haystack-ai; для векторного примера дополнительно нужен пакет sentence-transformers-haystack. Демонстрационное InMemoryDocumentStore не рекомендовано разработчиком для production. Интерфейс командной строки ниже — Python API, а не названия пунктов графического меню.
DocumentRecallEvaluator получает два списка списков Document: ground_truth_documents и retrieved_documents, по одному внутреннему списку на вопрос. Результат содержит средний score и individual_scores. SINGLE_HIT засчитывает вопрос, если найден хотя бы один релевантный документ; MULTI_HIT требует полноту всего набора эталонных документов.
Нумерованный порядок работы
- Составьте набор вопросов с однозначной разметкой релевантных ID вручную до эксперимента.
- Сохраните полученную выдачу ретривера на том же корпусе и том же top_k.
- Передайте выровненные по вопросам вложенные списки Document в Evaluator.
- Выведите individual_scores и просмотрите ошибки, не ограничиваясь средним score.
- Сравните SINGLE_HIT и MULTI_HIT на вопросе, которому нужны два фрагмента одного правила.
Готовый шаблон
from haystack import Document
from haystack.components.evaluators import DocumentRecallEvaluator
from haystack.components.evaluators.document_recall import RecallMode
r = Document(id="R7", content="Возврат 14 дней")
e = Document(id="E1", content="Исключение для цифрового товара")
wrong = Document(id="D9", content="Доставка по будням")
evaluator = DocumentRecallEvaluator(mode=RecallMode.MULTI_HIT)
result = evaluator.run(
ground_truth_documents=[[r, e], [wrong]],
retrieved_documents=[[r], [wrong]])
print(result["individual_scores"], result["score"])
Пример предназначен для контролируемого теста на своих данных. Установите зависимости в отдельном окружении и зафиксируйте версии; при использовании локальной embedding-модели отдельно проверьте её доступность и разрешённость для вашего проекта. Код был проверен на синтаксис Python, но его вызовы Haystack в данном материале не выдаются за выполненный runtime-тест.
Вход и ожидаемый результат
Первому вопросу требуются R7 и E1, выдача находит лишь R7; второму вопросу нужен D9, и он найден. При MULTI_HIT первый вопрос не получает полной единицы, второй получает 1; итоговый score — среднее по вопросам. Не подменяйте этим измерением проверку самого ответа генератора.
Помимо положительного кейса записывайте отрицательный: отсутствие факта, чужой документ, пустой файл или несовместимая редакция правила в зависимости от задачи. Храните ожидаемые ID и смысл результата отдельно от вывода программы. Если пример не прошёл, выясните, на каком шаге данные впервые разошлись: загрузка, обработка, извлечение или построение ответа. Нельзя исправлять результат одной только формулировкой ответа, если нужный факт никогда не поступил в контекст.
Разбор ограничений и ошибок
Recall оценивает полноту выдачи по заранее размеченным эталонам, а не истинность генерации. Если вопрос «применяется ли срок к цифровому товару?» требует одновременно общего правила и исключения, SINGLE_HIT может показать идеальный балл уже при одном найденном документе, хотя ответ по нему опасно неполон. MULTI_HIT помогает увидеть потерю второго фрагмента. Важно размечать ID или содержание эталонов согласованно с используемым алгоритмом сопоставления: случайная смена ID или переразбиение документа ломают сопоставимость метрик. На каждом прогоне фиксируйте corpus version, параметры top_k, модель embedding и набор вопросов. Рост recall при увеличении top_k может одновременно увеличить количество нерелевантного текста в промпте; измеряйте также точность и качество финального ответа.
Проверочный сценарий на реальном корпусе
Разметьте не только лёгкие вопросы, где имя товара есть в тексте, но и отрицание, перефразировку, ошибку в коде и запрос без разрешённого источника. Для последнего recall не заменяет тест безопасности: документ чужого tenant не должен появиться даже если «релевантен» по смыслу. Разделите ошибки на индексирование, поиск и оценку: если правильного документа нет в store, менять ранжирование бессмысленно; если он там есть, изучите токенизацию и embedding; если ID не совпадают после миграции, проверьте разметку. Не выбирайте конфигурацию по десяти вопросам, которые одновременно использовались для её настройки; держите отложенный набор. Статистически содержательный вывод потребует большего числа разнообразных размеченных запросов, а маленький пример демонстрирует лишь механику метода.
Критерии приёмки
- Число внутренних списков соответствует числу вопросов.
- Первый вопрос с пропущенным E1 не получает полный MULTI_HIT.
- Средняя оценка интерпретируется вместе с индивидуальными.
Не принимайте демонстрационный вывод за статистику качества. Для рабочего приложения повторите эти проверки на обезличенном наборе документов, измерьте результат после изменения версии корпуса и запретите доступ к источникам вне полномочий пользователя. Корректный ответ HTTP вашего сервиса не означает корректный ответ RAG-системы; последнее устанавливается сопоставлением факта с разрешённым источником.
Типичные ошибки: чего не делать
- Не путать SINGLE_HIT с полнотой всех нужных источников.
- Не менять эталон после просмотра результата.
- Не считать recall оценкой достоверности генерации.
Если после обновления пакета поведение разошлось с примером, сначала проверьте официальную документацию именно установленной версии, а затем обновите тест и собственный код. Не пытайтесь обходить ограничения сервиса, подменять чужие документы или использовать промпт как замену серверной проверки доступа.
FAQ
Что значит SINGLE_HIT?
Достаточно одного релевантного документа.
Что значит MULTI_HIT?
Полная единица требует всех эталонных документов.
Где посмотреть ошибки?
В individual_scores по вопросам.
Официальные источники
Частые вопросы
Что значит SINGLE_HIT?
Достаточно одного релевантного документа.
Что значит MULTI_HIT?
Полная единица требует всех эталонных документов.
Где посмотреть ошибки?
В individual_scores по вопросам.
Читайте также
Как ограничить поиск документами одного клиента в Haystack
Фильтр meta.tenant в retriever, тест на утечку чужого документа и границы серверной авторизации.
Как настроить смысловой поиск в Haystack InMemoryEmbeddingRetriever
Индексируем документы и запрос одной embedding-моделью, проверяем размерность, top_k и качество на перефразировках.
Как избежать дублей документов в Haystack через DocumentWriter и DuplicatePolicy
Повторная индексация без случайных дублей: стабильные ID, режимы OVERWRITE, SKIP и FAIL и проверка числа записей.
Комментарии
Пока тихо. Скажите первое слово