Как парсить документы для RAG
Что проверяют
Понимаете ли вы, что качество RAG упирается прежде всего в извлечение текста и нарезку, а не в модель. Следом спрашивают, что вы делаете с таблицами и сканами и как проверяете, что парсинг не испортил поиск.
Как отвечать
Опишите конвейер по шагам:
- извлечение по формату: у PDF с текстовым слоем
pymupdfилиpdfplumber(последний хорош для таблиц), для DOCXpython-docx, для HTMLtrafilaturaили BeautifulSoup с вырезанием меню и футеров. Когда важна структура, берут парсеры с анализом макета страницы:unstructured, Docling, Marker; - сканы: сначала проверить, есть ли текстовый слой, иначе OCR через Tesseract или PaddleOCR. Для сложных макетов всё чаще берут мультимодальные модели;
- сохранение структуры: заголовки, списки и таблицы переводятся в Markdown. Таблица, развалившаяся в строку чисел, для поиска бесполезна: её оставляют целиком или режут по строкам, повторяя шапку;
- чистка: колонтитулы, номера страниц, переносы слов на границе строк;
- нарезка: по разделам и абзацам, с ограничением размера в токенах и небольшим перекрытием. Размер подбирают под модель эмбеддингов, универсального числа нет;
- метаданные: источник, страница, раздел, дата, права доступа. Они нужны для фильтрации, ссылок в ответе и переиндексации по хэшу файла.
Качество проверяйте на наборе реальных вопросов с известными правильными фрагментами: recall@k и MRR для поиска, а для ответа оценка того, опирается ли он на найденный контекст (например, через RAGAS).
Где спотыкаются
Советуют удалять стоп-слова и лемматизировать. Для плотных эмбеддингов это вредно: модель обучена на обычном тексте, а «не» и предлоги меняют смысл. Лемматизация уместна разве что для BM25 в гибридном поиске, а текст чанка, который увидит модель, не трогают.
Режут текст фиксированным числом символов без учёта структуры. Чанк начинается с середины таблицы, заголовок остаётся в соседнем, и поиск находит обрывок.
Предлагают мерить качество парсинга через BLEU или ROUGE. Эти метрики сравнивают сгенерированный текст с эталоном и ничего не говорят о том, нашёлся ли нужный фрагмент. Плюс берут устаревший PyPDF2, хотя его развитие перешло в pypdf.