Загрузка документов в RAG: как принимать результат индексации
Задача загрузки завершилась зелёным статусом. Пользователь спрашивает о документе, который точно лежит в папке, и получает пустой ответ. В логах нет падения: загрузчик пропустил защищённый PDF и продолжил работу. Для RAG нужен отдельный результат приёмки корпуса, который сопоставляет каждый ожидаемый документ с тем, что действительно попало в индекс.
Сначала зафиксируйте, что ожидали загрузить
Перед обработкой сформируйте манифест: document_id, путь, контрольная сумма версии и размер. Он описывает конкретный срез источников. Список файлов, полученный после обработки, уже не подходит: пропущенные документы могут из него исчезнуть. Для облачного хранилища сохраняйте также идентификатор объекта и версию или время изменения.
Загрузчик должен вернуть статус для каждого объекта манифеста. Отдельно обозначьте успешную загрузку, допустимый пропуск и ошибку. Допустимый пропуск требует причины: например, файл относится к явно исключённому архивному разделу. Пустой распознанный текст не следует автоматически считать успехом.
Свяжите этапы одним ID документа
Извлечение текста, нарезка, построение эмбеддингов и запись в индекс могут выполняться разными заданиями. Во всех результатах сохраняйте document_id и версию. Тогда можно выяснить, что текст извлечён, но чанки не записались, вместо общего вывода «не работает поиск».
Для приёмки полезны число символов извлечённого текста, количество чанков и число подтверждённых записей. Не задавайте универсальный порог «минимум пять чанков»: короткая инструкция может занимать один абзац. Ожидаемый тип и объём документа важнее произвольного общего числа.
Сверьте манифест с результатами
Пример проверяет три состояния: документ принят, обработка закончилась ошибкой, результата вообще нет. Последнее состояние особенно полезно при потере сообщения между очередями. Статус задания в оркестраторе и полнота результата корпуса отвечают на разные вопросы.
manifest = {"guide", "policy", "form"}
results = {
"guide": {"status": "accepted", "chunks": 3},
"policy": {"status": "error", "reason": "encrypted_pdf"},
}
missing = sorted(manifest - results.keys())
failed = {k: v["reason"] for k, v in results.items() if v["status"] == "error"}
accepted = sorted(k for k, v in results.items() if v["status"] == "accepted")
assert missing == ["form"] and accepted == ["guide"]
print({"accepted": accepted, "failed": failed, "missing_results": missing})
Сделайте отчёт пригодным для исправления
Для каждого отклонённого документа покажите причину и следующий шаг. Защищённый PDF требует разрешённой текстовой копии, повреждённый файл — повторной выгрузки, ошибка OCR — проверки страниц. Сотрудник, который исправляет источник, не должен разбирать трассу воркера, чтобы понять задачу.
У принятого документа проверьте возможность найти его по точной контрольной фразе, а затем по нескольким типовым вопросам. Первая проверка помогает обнаружить потерю записи и неверную коллекцию, вторая — проблему полезности поиска. Один успешный поиск не подтверждает полноту всего корпуса.
Публикуйте новый срез базы только после разбора пропусков, значимых для пилотного процесса. Если часть документов сознательно исключена, список исключений становится частью приёмки и интерфейса поддержки. Пользователь должен понимать область знаний помощника.
При повторной обработке сохраняйте предыдущий отчёт. Сравнение двух манифестов покажет, какие источники исчезли, изменились или добавились. Так команда сможет объяснить изменение ответов и вовремя обнаружить, что новый загрузчик перестал читать целый формат. Этот журнал станет основой дальнейшего мониторинга знаний.
Продолжить проект на практике
Приёмка загрузки даёт подготовленный корпус. Дальше полезно научиться строить индекс и проверять, какие документы получает пользовательский вопрос. В платном курсе Vector DB & RAG Developer вы поработаете с векторными базами, фильтрами и метриками поиска, соберёте API и RAG-бота. Это позволит продолжить путь от отчёта загрузчика к проверяемым ответам.
Откройте программу курса и выберите следующий этап своего проекта.
По теме: Гибридный поиск для RAG: BM25, векторы и расчёт RRF.
Продолжить на практике
- Vector DB & RAG Developer ↗
Практический курс по векторным базам данных и семантическому поиску. Вы развернёте Qdrant, Weaviate и FAISS, научитесь индексировать миллионы эмбеддингов, строить k-NN-поиск с фильтрами, объединять его с BM-25 и создавать RAG-ботов, которые отвечают на вопросы на основе ваших данных.
