Колонтитулы PDF засоряют выдачу RAG: как очистить источник
В RAG загрузили двадцать отчётов. Пользователь спрашивает, в каком разделе описана процедура согласования расходов. В top-10 подряд идут страницы разных файлов с фразой «Порядок согласования расходов» в верхнем колонтитуле, но нужный раздел остаётся за пределами выдачи. Текст на страницах разный, поэтому обычная проверка дубликатов документов ничего не показывает. Повторяется не документ, а элемент макета.
Как отличить колонтитул от содержания
Возьмите несколько найденных фрагментов и откройте их страницы в PDF. Отметьте, где стоит повторяющаяся строка: вверху или внизу каждой страницы, одинаковым шрифтом и на близкой высоте. Затем посмотрите результат извлечения текста до разбиения на чанки. Если строка добавляется к каждому куску, эмбеддинги и лексический поиск получают искусственно повторяющийся сигнал. Особенно заметно это у коротких чанков: один заголовок способен составить существенную часть их текста.
PyMuPDF может вернуть блоки через page.get_text("blocks"); первые четыре значения каждого блока — координаты его прямоугольника. Они позволяют отделить верхнюю и нижнюю полосу страницы от основного текста. Не стоит удалять всё, что попало в такую полосу: название раздела может оказаться настоящей частью содержания. Ищите повторяемость по страницам внутри документа и сравнивайте текст после нормализации пробелов и номера страницы. Название файла, юридический гриф и динамический номер страницы требуют разных правил очистки.
Пример правила
Допустим, у отчёта 40 страниц. Строка «Порядок согласования расходов» встречается в верхних 8% высоты на 38 страницах, а в основном тексте — лишь однажды как заголовок раздела. Для индексации удалите 38 повторений из верхней полосы, но сохраните заголовок раздела в его месте. Порог «38 из 40» здесь пример диагностического решения, не универсальная настройка. Лучше хранить список удалённых блоков с номером страницы и координатами: редактор сможет проверить, не отбросили ли вы содержательное примечание.
На пакет документов не стоит переносить одно и то же правило без проверки. У годового отчёта верхний колонтитул может повторяться на каждой странице, а у договора в той же зоне часто меняется номер приложения или название раздела. Постройте отчёт по каждому файлу: нормализованный текст блока, доля страниц с повтором, средняя вертикальная позиция, несколько примеров страниц. Удаление включайте только для сочетания повторяемости и устойчивого положения. Страницы с необычным макетом просматривайте отдельно.
Порядок обработки важен. Сначала извлеките блоки и определите их роль по координатам и повторяемости. Затем соберите очищенный текст страницы, сохраняя document_id, page_number и координаты оставленных блоков. После этого режьте по абзацам и стройте эмбеддинги. Если удалить колонтитулы уже после нарезки, старые векторы по-прежнему будут рассчитаны по тексту с колонтитулами; их придётся пересчитать.
Для проверки сравните до и после по набору вопросов с заранее известными страницами ответа. Посчитайте, сколько результатов в top-10 содержат лишь повторный колонтитул, и появился ли в выдаче нужный абзац. Не ограничивайтесь уменьшением доли «мусорных» фрагментов: агрессивная очистка может убрать полезные короткие подписи таблиц. Визуально просмотрите несколько страниц, на которых фильтр удалил больше всего блоков, и одну страницу с реальным заголовком раздела. Соседний материал про ошибки OCR в поиске помогает, если источник сканированный; колонтитулы часто встречаются и в цифровых PDF с безупречным текстовым слоем.
В платном курсе Vector DB & RAG Developer вы строите RAG на собственных документах, измеряете Recall@K и nDCG и оформляете API поиска. Эксперимент с очисткой PDF вписывается в этот путь: меняете только подготовку источника, переиндексируете и видите, изменилось ли качество выдачи. Откройте программу курса, чтобы довести поиск от сырых файлов до ответа с проверяемыми цитатами.
Продолжить на практике
- Vector DB & RAG Developer ↗
Практический курс по векторным базам данных и семантическому поиску. Вы развернёте Qdrant, Weaviate и FAISS, научитесь индексировать миллионы эмбеддингов, строить k-NN-поиск с фильтрами, объединять его с BM-25 и создавать RAG-ботов, которые отвечают на вопросы на основе ваших данных.
