Качество данных перед индексацией
В RAG легко переоценить сам retrieval и недооценить подготовку данных. На практике плохой OCR, повторяющиеся блоки, сломанные таблицы и шумные HTML-страницы влияют на ответы сильнее, чем выбор красивого интерфейса чата.
PFRAG закрывает именно этот слой: он приводит документы к более чистому Markdown до того, как они попадут в LightRAG.
OCR и извлечение текста
Первый риск — потерять текст ещё на входе. PDF может быть сканом, презентация может содержать важный текст в слайдах, а изображение требует распознавания. В PFRAG для этого предусмотрен Primary processing:
- PDF, DOCX и PPTX проходят через извлечение текста и OCR-обработку;
- изображения конвертируются в PDF и распознаются;
- HTML разбирается через BeautifulSoup;
- TXT читается напрямую;
- для PDF есть режим с извлечением картинок и плейсхолдерами
[[IMG_###]].
Задача этого этапа — получить черновой Markdown, который можно открыть и проверить, а не сразу отправлять в индекс как есть.
Markdown extraction
Markdown удобен как промежуточный формат: его можно просмотреть, скачать, объединить, очистить и отправить дальше. Но сам факт наличия Markdown ещё не значит, что документ готов к RAG.
Проблемы, которые часто остаются после первичного извлечения:
- повторяющиеся header/footer из PDF;
- строки навигации и меню из HTML;
- таблицы, превращённые в нечитаемые фрагменты;
- разорванные абзацы;
- мусор от OCR;
- одинаковые юридические или служебные блоки на каждой странице.
Поэтому PFRAG разделяет raw_md и clean_md. Это помогает не терять исходник и при этом иметь отдельную версию для индексации.
LLM cleanup и именованные промпты
Final processing в PFRAG использует LLM для очистки и нормализации текста. В системе есть именованные промпты и настройки модели, которые хранятся в базе. Это важно: разные типы материалов требуют разных инструкций.
Например, для документа с таблицами нужно сохранить структуру, для PDF с картинками — не менять плейсхолдеры, а для HTML-страницы — убрать навигационный шум. Именованные промпты позволяют не держать эти правила в голове и повторять обработку одинаковым способом.
LLM cleanup не должен придумывать новые факты. Его роль в pipeline — аккуратно привести уже извлечённый материал к формату, который лучше подходит для дальнейшего поиска.
Dedup modes
Дедупликация влияет на retrieval напрямую. Если одинаковый блок встречается десятки раз, он может часто попадать в контекст ответа и вытеснять полезные фрагменты.
В PFRAG есть несколько режимов:
vector_and_line— основной режим, совмещает embeddings и построчную очистку;vector_only— ищет похожие чанки через cosine similarity и Jaccard;line_only— убирает повторяющиеся строки;template_only— удаляет строки, совпадающие с заданным шаблоном;full_dupl— удаляет файлы, помеченные как полные дубликаты.
Отчёты dedup показывают состояние до и после обработки: файлы, страницы, токены и удалённые фрагменты. Это полезно для контроля, чтобы очистка не превратилась в незаметную потерю важных данных.
Chunking и overlap
Chunking появляется в двух местах. В PFRAG параметры chunk size и overlap используются в дедупликации, а в RAG LightRAG дальше разбивает текст для индексации и извлечения сущностей.
Слишком крупные чанки дают лишний шум в контексте. Слишком маленькие могут потерять связь между определением, условием и примером. Поэтому качество Markdown до chunking важно: заголовки, таблицы и абзацы помогают разрезать текст более осмысленно.
Как качество данных влияет на retrieval
Хороший retrieval зависит не только от embeddings и graph traversal. Он зависит от того, что именно было положено в индекс.
Если в базе много дублей, retrieval чаще вернёт повторяющийся контекст. Если таблицы разрушены, ответ может потерять числовую или структурную часть. Если OCR ошибся в ключевых терминах, поиск просто не найдёт нужное место. Если LLM cleanup слишком агрессивен, можно потерять важные детали.
Поэтому PFRAG в этой архитектуре — не второстепенный загрузчик файлов, а слой контроля качества перед индексом. Он делает RAG-контур более предсказуемым, потому что на вход приходит не сырой хаос, а подготовленный Markdown с понятной историей обработки.