OCR-помилки не просто псують текст — вони каскадно руйнують кожен наступний крок пайплайну: chunking, embeddings, retrieval.
Навіть 2% CER на 100-сторінковому документі — це ~1 000 спотворених символів, що потрапляють у векторну базу.
Семантично релевантний чанк може не потрапити в retrieval через єдине злиплі слово в ключовому реченні.
Постпроцесинг тексту після OCR дешевший і ефективніший, ніж намагатись виправити retrieval на пізніших етапах.
Якщо ваша RAG-система повертає нерелевантні результати або впевнено галюцинує — перше місце де шукати проблему не в моделі, не в chunking-параметрах і не у векторній базі. Шукайте в тексті, який ви туди завантажили.
OCR-помилка — це не локальний дефект. Це ін'єкція шуму на вхід пайплайну, яка мультиплікується на кожному наступному кроці. Спотворений токен → хибний кордон речення → некоректний чанк → зміщений вектор → пропущений retrieval → галюцинована відповідь. Кожен крок підсилює попередній.
Ця стаття — технічний розбір того, де саме і як це відбувається, з реальними прикладами артефактів і конкретними методами виправлення. Якщо вам потрібен загальний огляд того, що таке OCR і навіщо він потрібен у RAG — читайте попередню статтю серії: «OCR у сучасних AI-системах: від сканованих документів до RAG».
Pipeline обробки сканованого документа: від PDF до embeddings
Перш ніж розбирати де ламається — зафіксуємо повну карту пайплайну. Кожен крок нижче є потенційною точкою деградації якості.
Крок
Що відбувається
Що може зламатись від поганого OCR
1. Детектування типу PDF
Перевірка наявності текстового шару (PyMuPDF, pdfminer)
Гібридний PDF частково розпізнається як text-based; сканована частина пропускається
Зміщений вектор чанку → нижча схожість із коректним запитом → чанк не потрапляє в top-k
9. Генерація (LLM)
LLM формує відповідь на основі знайдених чанків
Мусор у контексті → галюцинації; відсутність чанку → відповідь "не знайдено" або вигадана
Ключовий висновок з цієї карти: помилка OCR (крок 3) не локалізується на кроці 3. Вона дрейфує по всьому пайплайну і на кроці 9 проявляється як проблема з якістю відповіді — далеко від першопричини.
Саме тому більшість команд шукає не там: тюнять chunking, міняють embedding-модель, налаштовують reranker — а проблема залишається, бо сидить у вхідних даних.
Типові артефакти OCR: що саме ламається і чому
Нижче — реальна таксономія артефактів, з якими ви зіткнетесь у типових корпоративних архівах. Для кожного — приклад того, як виглядає артефакт і що він ламає далі по пайплайну.
1. Злиплі слова (word merging)
Оригінал у документі
Результат OCR
термін дії договору — 12 місяців
терміндіїдоговору— 12місяців
загальна сума складає 47 500 грн
загальнасумаскладає47500грн
відповідно до статті 651 ЦКУ
відповіднодостатті651ЦКУ
Причина: нерівномірний контраст між символами і фоном, низький DPI, стиснення JPEG.
Що ламає: sentence splitter не знаходить кордони речень; tokenizer embedding-моделі отримує OOV-токен замість двох відомих слів; retrieval за запитом «термін дії» не знаходить чанк з «терміндіїдоговору».
2. Заміна символів (character substitution)
Оригінал
OCR-результат
Тип заміни
доза: 2,5 мг
доза: З,5мг
цифра «2» → кирилиця «З»
п. 4.1 договору
п. Ч.1 договору
цифра «4» → буква «Ч»
§ 14 Закону
S 14 Закону
знак параграфа → ASCII «S»
рахунок № 2024-08-15
рахунок Ne 2024-О8-15
«№» → «Ne», «0» → «О»
Причина: схожість форм символів при низькій роздільності або поганому контрасті. Особливо часто — при змішаних кирилично-латинських шрифтах.
Що ламає: числові значення стають текстом; пошук за точним значенням («доза 2,5 мг») не матчиться з артефактом; у медичних і юридичних документах це критична помилка.
3. Фантомні символи та рядки (hallucinated content)
Джерело
OCR-результат
Перевернута сторінка (180°)
аМЫМ "9a18 40 S¥3IAVT ONIHLY3HS N33ML3E
Штамп «КОПІЯ» поверх тексту
Фрагменти тексту зі вставками «КОПIЯ» всередині речень
Тіні від згину паперу
Зайві символи або рядки між абзацами
Пуста сторінка зі шумами сканера
Рядки з випадкових символів: .,;..|||. :
Причина: OCR намагається розпізнати будь-який піксельний патерн як символ. Перевернутий текст, шуми сканера, артефакти стиснення — все це конвертується в «текст».
Що ламає: мусор потрапляє у вектор як валідний контент; при retrieval LLM отримує нечитабельний контекст і або галюцинує, або каже «не знаю».
Артикул Назва Кількість Ціна A-001 Кабель 50 шт 120 грн A-002 Роз'єм 200 шт 15 грн
Причина: класичний OCR не розуміє просторові відносини між клітинками. Він читає текст лінійно: зверху вниз, зліва направо, ігноруючи структуру колонок.
Що ламає: при chunking вся таблиця потрапляє в один блок лінійного тексту без розмітки; запит «яка ціна кабелю» не матчиться з безструктурним рядком; чанк не передає семантичний зв'язок між артикулом, назвою і ціною.
5. Помилкові переноси та розриви рядків
Оригінал
OCR-результат
відповідальність за порушення умов договору
відповідаль- ність за пору- шення умов до- говору
Загальна сума без ПДВ складає 38 400,00 гривень
Загальна сума без ПДВ складає 38 400,00 гривень
Причина: OCR не завжди розрізняє перенос слова і кінець рядка в тексті з колонками або вузькими полями.
Що ламає: «відповідаль-» і «ність» стають окремими токенами; злиплий переносом дефіс створює OOV-токен; числове значення «38 400» розбивається на два рядки і парситься як «38» і «400,00» — різні токени без контексту суми.
Як OCR-помилки руйнують chunking-стратегію
Chunking — це розбивка тексту на фрагменти, які будуть векторизовані і збережені в індекс. Якість чанку визначає якість retrieval: якщо чанк семантично некоректний, навіть ідеальний embedding не врятує ситуацію.
Розглянемо три основні chunking-стратегії і як OCR-артефакти ламають кожну з них.
Стратегія 1: Fixed-size chunking (за кількістю токенів)
Найпростіша стратегія: розбивати текст на чанки по N токенів з overlap. Проблема: вона цілком залежить від коректної токенізації.
Сценарій
Чистий текст (очікуваний чанк)
З OCR-артефактом (реальний чанк)
Злиплі слова збільшують «токен»
«...відповідно до умов договору, сторона А зобов'язана...»
«...відповіднодоумовдоговору,сторонаАзобов'язана...» — один «токен», boundary зміщується
Мусор роздуває чанк
500 корисних токенів
500 токенів, з яких 80–120 — мусор (символи з шумів, артефакти переносів). Корисний контент стискується.
Розбитий перенос ламає слово
«відповідальність» — 1 токен
«відповідаль-» + «ність» — 2 різних токени, перший — OOV
Стратегія 2: Sentence-based chunking
Розбивка за реченнями (spaCy, nltk sentence splitter). Потребує коректних кінцівок речень: крапок, знаків питання, оклику з пробілом після.
Два речення зливаються в одне — чанк містить змішаний контекст
Крапка без пробілу після
Splitter ігнорує кінець речення
Кілька речень потрапляють в один чанк; semantic boundary зламана
Артефактна крапка всередині числа
«38.400» → splitter ріже речення посередині числа
Число розривається між чанками; контекст суми втрачається
Зайві символи в кінці рядка
«договору.||| » → splitter не розпізнає кінець
Речення не розбивається; chunk boundary зміщується на кілька речень вперед
Стратегія 3: Semantic / recursive chunking
Більш просунуті підходи (recursive character splitter, semantic chunking з embedding-similarity) теоретично мають бути стійкішими до поверхневих артефактів. На практиці — ні.
Semantic chunking визначає кордони за зміною семантики між сусідніми реченнями. Якщо речення спотворені OCR-артефактами, embedding кожного речення зміщується — і алгоритм «бачить» семантичний розрив там де його немає, або не бачить там де він є.
Результат: чанки ріжуться в «семантично правильних» місцях для спотвореного тексту — але не для оригінального змісту.
Практичний висновок по chunking
Жодна chunking-стратегія не компенсує системно забруднений вхідний текст. Постпроцесинг після OCR — обов'язковий крок перед будь-яким chunking. Без нього різниця між fixed-size і semantic chunking зникає: обидва будуть виробляти некоректні чанки, просто по-різному.
Вплив шуму на якість embedding-векторів
Embedding-модель перетворює текстовий чанк у числовий вектор у n-вимірному просторі. Семантично схожі тексти мають близькі вектори (висока cosine similarity). Semantic search шукає саме таку близькість.
OCR-шум впливає на вектор через два механізми:
Механізм 1: OOV-токени (out-of-vocabulary)
Якщо слово не зустрічалось у тренувальних даних моделі — вона кодує його «за формою»: розбиває на subword-токени, кожен з яких має слабкий або відсутній семантичний сигнал. Вектор чанку зміщується від правильної семантичної позиції.
Токен у тексті
Тип
Вплив на вектор чанку
«відповідальність»
In-vocabulary
Сильний семантичний сигнал; вектор у правильній зоні
«відповідаль-»
OOV (артефакт переносу)
Модель ділить на subwords; сигнал слабкий; вектор зміщується
«терміндіїдоговору»
OOV (злиплі слова)
Невідомий токен; вектор «тягне» чанк убік від семантики «термін дії договору»
«аМЫМ9a18S¥3»
OOV (мусор з перевернутої сторінки)
Жоден subword не несе сигналу; вектор сильно зміщується в «шумову» зону
Механізм 2: Dilution ефект (розбавлення сигналу)
Embedding-модель усереднює сигнал по всіх токенах чанку (спрощено). Якщо 15–20% токенів у чанку — мусор без семантичного навантаження, вектор «розбавляється»: він стає менш точним представником справжнього змісту.
Практичний приклад: чанк із 400 токенів, де 80 — артефакти (злиплі слова, символи шумів, помилкові переноси). Ефективний семантичний сигнал — не 100%, а ~80%. Cosine similarity з коректним запитом знизиться пропорційно.
Знизиться не до нуля — але може впасти нижче порогу top-k retrieval. Якщо ви шукаєте top-5 чанків, зміщений чанк може опинитись на позиції 6 або 7 — і ніколи не потрапити в контекст LLM.
Наочна ілюстрація: кейс юриста з AskYourDocs
Повертаємося до кейсу з попередньої статті серії, але розбираємо його на рівні векторів.
Клієнт — юрист зі спеціалізацією у будівельному праві — надіслав 21 сторінку зі сканованого архіву. Більшість сторінок відскановані під кутом 90°, 180° або 270°. Стандартний OCR без корекції орієнтації читав їх як:
Цей мусор потрапив у векторну базу як валідний текст. Що відбулось з векторами:
Документ / чанк
Стан тексту
Вектор
Cosine similarity із запитом «умови розірвання договору»
Чанк зі сторінки 3 (перевернута)
Мусор: «аМЫМ 9a18 S¥3IAVT...»
В «шумовій» зоні простору
~0.08 (нерелевантний)
Чанк зі сторінки 7 (нормальна)
Читабельний текст про умови договору
В правильній семантичній зоні
~0.74 (релевантний, потрапляє в top-5)
Чанк зі сторінки 12 (перевернута)
Мусор
В «шумовій» зоні
~0.06
З 21 сторінки нормально проіндексувалось 5–6. Решта існувала у векторній базі як статистичний шум — займала місце, але не давала корисного retrieval. При цьому система не повідомляла про проблему: вона повертала результати, просто з 5–6 сторінок замість 21.
Точність відповідей на тестових питаннях: 17%. Після впровадження Vision OCR з автокорекцією орієнтації: 50% — на тому самому проблемному документі.
Чому семантично релевантний чанк не потрапляє в retrieval
Навіть якщо чанк семантично правильний — він може не потрапити в результати retrieval через кілька механізмів, пов'язаних з OCR-шумом.
Сценарій 1: Ключове слово спотворене — пошук не матчить
Запит: «яка відповідальність за порушення строків»
Чанк у базі: «...відповідаль-ність за поруш-ення строків — штраф 0,1% за кожен день...»
Навіть якщо embedding-модель частково «розуміє» спотворені слова через subword-токени — cosine similarity між вектором запиту і вектором чанку буде нижчою за ідеальну. Якщо у вашому індексі є 50 інших чанків про «відповідальність» з чистим текстом — спотворений чанк опиниться нижче threshold і не потрапить у top-k.
Сценарій 2: Чанк «розбавлений» мусором до нерелевантності
Чанк A (чистий текст)
Чанк B (з OCR-шумом)
«Строк виконання зобов'язань — 30 календарних днів з моменту підписання акту»
«Строк виконання|||зобов'язань — ЗО ка-лендарних днів змо-менту підписання ак-ту..;;..»
Чанк B містить ту саму інформацію, але: «ЗО» замість «30» (кирилиця замість цифри), злиплий перенос «змо-менту», мусор «..;;..» в кінці. Його вектор відрізняється від вектора чанку A. Запит «строк виконання 30 днів» матчитиметься з A краще ніж з B — хоча обидва несуть однаковий зміст.
Сценарій 3: Правильний документ є, але не в top-k
Найнебезпечніший сценарій. Релевантний чанк існує в індексі — але через зміщений вектор він на позиції 8 або 12, а не в top-5. LLM отримує 5 менш релевантних чанків і або відповідає на основі часткової інформації, або галюцинує.
При цьому в логах все виглядає коректно: retrieval повернув k результатів, LLM згенерував відповідь. Ніякого сигналу про проблему немає — тільки неправильна відповідь.
Сценарій 4: False positive retrieval — мусор з високою similarity
Протилежна ситуація: мусорний чанк з перевернутої сторінки потрапляє в top-k через статистичний збіг токенів. LLM отримує нечитабельний контекст і або ігнорує його (добрий сценарій), або намагається побудувати відповідь на основі мусора (поганий сценарій).
Recall і Precision у RAG після поганого OCR: метрики та приклади
Для оцінки якості retrieval використовують дві базові метрики:
Recall@k — частка релевантних документів, які потрапили в top-k результатів. Якщо є 3 релевантних чанки і всі 3 в top-5 — Recall@5 = 1.0.
Precision@k — частка релевантних серед повернутих. Якщо у top-5 є 2 релевантних і 3 нерелевантних — Precision@5 = 0.4.
Як OCR-шум впливає на ці метрики
Стан OCR
Типовий Recall@5
Типовий Precision@5
Основна причина деградації
Чистий текст (text-based PDF)
0.80–0.92
0.65–0.80
Базовий рівень; деградація від складності запиту
Якісний OCR (300+ DPI, CER <1%)
0.72–0.85
0.60–0.75
Мінімальні OCR-артефакти; невеликий drift векторів
Середній OCR (150–300 DPI, CER 2–5%)
0.50–0.70
0.40–0.60
Систематичні злиплі слова і заміна символів; часті OOV
Поганий OCR (перевернуті, низький DPI)
0.15–0.40
0.15–0.35
Масовий мусор у векторах; false positives і false negatives
Змішаний архів (кейс юриста)
~0.17 (17% відповідей)
Непередбачувано
Більшість сторінок — перевернуті скани; 5–6 з 21 нормально проіндексовано
Приклад вимірювання: тест на реальних питаннях
Практичний спосіб виміряти вплив OCR на Recall — підготувати набір питань, відповіді на які ви знаєте точно, і перевірити чи потрапляють потрібні чанки в retrieval.
Питання
Очікуваний чанк
До постпроцесингу (top-5 містить?)
Після постпроцесингу (top-5 містить?)
Яка відповідальність за затримку платежу?
п. 8.3 договору
Ні (чанк на позиції 9)
Так (позиція 2)
Яка загальна вартість робіт?
п. 3.1 договору
Ні (число «З8400» не матчиться)
Так (після корекції «З8400» → «38400»)
Хто відповідає за технічний нагляд?
п. 5.2 договору
Так (текст чистий)
Так
Який строк гарантії на роботи?
п. 9.1 договору
Ні (сторінка перевернута, мусор)
Так (після Vision OCR)
20–30 таких питань на репрезентативній вибірці архіву дають набагато точнішу картину ніж будь-який синтетичний benchmark.
Практичні методи покращення: препроцесинг, постпроцесинг, вибір OCR-движка
Нижче — конкретні дії, які дають вимірюваний ефект. Розбито за рівнями впливу.
Рівень 1: Препроцесинг зображення (перед OCR)
Операція
Коли застосовувати
Вплив на CER
Інструменти
Автокорекція орієнтації
Завжди для сканованих PDF
Критичний — без цього перевернуті сторінки дають 0% точності
Tesseract OSD, PyMuPDF + heuristics, GPT-4o-mini
Deskewing (вирівнювання нахилу)
Якщо скани від ручного сканера
Знижує CER на 1–3% для нахилу >2°
OpenCV, Pillow, deskew library
Denoising (видалення шумів)
Старі або погано відскановані документи
Знижує кількість фантомних символів
OpenCV fastNlMeansDenoising, Pillow filter
Binarization (конвертація в ч/б)
Документи з нерівномірним фоном
Покращує контраст тексту; знижує CER на слабких сканах
Adaptive threshold (OpenCV), Sauvola метод
Підвищення DPI
Якщо оригінал <200 DPI
Збільшення до 300 DPI через upscaling знижує CER
Pillow resize + Lanczos, OpenCV
Детектування та обрізка полів
Якщо скани мають широкі порожні поля або рамки
Зменшує кількість фантомних символів від меж аркуша
OpenCV contour detection
Рівень 2: Постпроцесинг тексту (після OCR, перед chunking)
Це найбільш ефективний і недооцінений рівень. Постпроцесинг дешевший за перезапуск OCR і дає вимірюваний ефект на retrieval.
Операція
Що виправляє
Складність реалізації
Видалення рядків-мусору
Рядки без літер або зі >60% спецсимволів (артефакти шумів і переворотів)
Низька — regex або ratio-перевірка
Нормалізація пробілів
Подвійні пробіли, табуляції, нерозривні пробіли від OCR
Середня — потребує контекстного аналізу або словника
Виявлення і видалення дублікатів рядків
Колонтитули, нумерація сторінок що повторюється в кожному чанку
Низька — hash-порівняння рядків
Детектор якості тексту (garbage detector)
Автоматичне виявлення сторінок/чанків з >threshold мусору; маршрутизація на Vision OCR
Середня — ratio читабельних символів + мовна перевірка (langdetect)
LLM-корекція тексту
Відновлення слів, виправлення заміни символів, реструктуризація таблиць
Висока — коштує токени; доцільно лише для критичних документів
Garbage detector: практична реалізація
Детектор мусору — простий, але дуже ефективний компонент. Логіка:
Перевірка
Threshold (приблизний)
Дія
Частка алфавітних символів у тексті
< 0.40
Маршрутизація на Vision OCR або відхилення
Визначення мови (langdetect confidence)
< 0.70 або невідома мова
Маршрутизація на Vision OCR
Середня довжина слова
< 2 або > 20 символів
Підозра на злиплі слова або мусор; потребує перевірки
Кількість OOV-токенів (по словнику)
> 25% слів відсутні у словнику
Висока ймовірність артефактів; маршрутизація на Vision OCR
Рівень 3: Вибір OCR-движка
Движок
Оптимальний сценарій
Обмеження
Вартість
Tesseract 5+
Чисті скани, 300+ DPI, стандартний шрифт
Погано з таблицями і складними макетами; потребує якісного препроцесингу
Безкоштовно, self-hosted
PaddleOCR
Мультимовні документи, краща робота з макетом
Важчий у розгортанні; GPU бажаний для швидкості
Безкоштовно, self-hosted
olmOCR / olmOCR-2
Складні layout, академічні та технічні документи
Потребує GPU; нова модель — менше production-кейсів
Безкоштовно, self-hosted
GPT-4o-mini (Vision OCR)
Перевернуті скани, таблиці, мішаний текст, fallback для проблемних сторінок
Дорожче; cloud-only; затримка API
~$0.015–0.03 за сторінку
Azure Document Intelligence / Google Document AI
Великі обсяги з вбудованою структурною розміткою (таблиці, ключові поля)
Cloud-only; GDPR потребує DPA; вартість при масштабі
$1–2 за 1 000 сторінок (базово)
Docling (IBM)
Академічні та технічні PDF; вивід у Markdown зі збереженням структури
Активно розвивається; перевірте підтримку вашої мови
Безкоштовно, self-hosted
Стратегія вибору: дерево рішень
Умова
Рекомендація
GDPR / дані не можна відправляти у хмару
Tesseract або PaddleOCR як основа + olmOCR як fallback
Документи містять складні таблиці
Додати Vision OCR (GPT-4o-mini) або Docling для таблиць
Є перевернуті або погано відскановані сторінки
Обов'язкова корекція орієнтації + Vision OCR як fallback
Великий архів (100 000+ сторінок), стандартні документи
Tesseract/PaddleOCR з паралельною обробкою; Vision тільки для проблемних
Невеликий архів (<5 000 сторінок), якість важливіша за вартість
GPT-4o-mini або Azure Document Intelligence для всього архіву
Коли OCR недостатньо і потрібен Vision-підхід
Навіть ідеально налаштований OCR-пайплайн має системні обмеження. Є клас документів, де жодне покращення препроцесингу не дасть задовільного результату для RAG.
Тип документа
Проблема з OCR
Що дає Vision-підхід
Складні таблиці з об'єднаними клітинками
OCR повертає лінійний текст без збереження зв'язку між клітинками
OCR читає колонки як один потік тексту; речення з різних колонок змішуються
VLM коректно ідентифікує колонки і читає кожну незалежно
Рукописний текст і заповнені від руки форми
CER 3–5% навіть у найкращих OCR-моделей; унікальні почерки дають ще гіршу точність
Великі VLM краще справляються з нестандартними почерками; все одно потребує верифікації
Документи з схемами, кресленнями, інфографікою
OCR не читає графічний контент — повертає порожній результат або артефакти меж
VLM може описати схему, витягти числа з графіка, ідентифікувати елементи
Дуже низький DPI або сильно пошкоджений документ
Препроцесинг не рятує — вихідна якість пікселів занадто низька
VLM іноді справляється краще завдяки ширшому контекстному розумінню
Перевернуті скани (без автокорекції)
OCR без OSD-корекції повертає мусор або порожній результат
VLM розпізнає орієнтацію і читає коректно без попередньої корекції
Гібридний пайплайн: практична архітектура
Оптимальна стратегія для більшості реальних архівів — не «OCR або Vision», а маршрутизація:
Вхідний документ
│
├─► Текстовий шар? ──► Так ──► Нативний парсер (PyMuPDF) ──► Chunking
│
└─► Ні (скан)
│
├─► Препроцесинг (орієнтація, deskew, denoise)
│
├─► OCR (Tesseract / PaddleOCR)
│
├─► Garbage detector
│ │
│ ├─► Якість OK ──► Постпроцесинг ──► Chunking
│ │
│ └─► Якість низька ──► Vision OCR (GPT-4o-mini)
│ │
│ └─► Постпроцесинг ──► Chunking
│
└─► Логування: сторінка, CER-оцінка, шлях обробки
Цей підхід дозволяє обробляти 80–90% документів через дешевий self-hosted OCR і направляти лише проблемні сторінки до Vision OCR. Вартість Vision OCR при такій стратегії знижується в 5–10 разів порівняно з повним переходом.
Що Vision OCR не вирішує
Vision-підхід не є universal fix. Обмеження:
Вартість при великих обсягах: 100 000 сторінок через GPT-4o-mini — ~$1 500–3 000.
Затримка: API-виклик займає 2–10 секунд на сторінку. Для систем реального часу — неприйнятно.
Rate limits: без enterprise-доступу паралельна обробка великого архіву обмежена.
GDPR: документи відправляються зовнішньому провайдеру. Потребує DPA і може бути заблоковано compliance-політикою.
Галюцинації VLM: на дуже пошкоджених документах VLM може «вигадати» нечитабельний контент. Потребує валідації.
Деградація RAG через поганий OCR — це не проблема моделі. Це інженерна проблема вхідних даних, яка має конкретні точки виправлення.
Де саме ламається пайплайн — і що з цим робити
Де ламається
Симптом
Виправлення
Препроцесинг пропущений
Перевернуті сторінки дають 0% точності OCR
Автокорекція орієнтації (OSD або heuristic) перед OCR
OCR без постпроцесингу
Злиплі слова, мусор-рядки, помилкові переноси йдуть у chunking
Нормалізація пробілів, з'єднання переносів, видалення мусору — завжди
Chunking на брудному тексті
Некоректні кордони чанків, змішаний контекст
Постпроцесинг перед chunking — не після
OOV-токени в embeddings
Вектори зміщені; cosine similarity нижча за threshold
Виправлення злиплих слів і замін символів до embedding
Мусор у векторній базі
False positives у retrieval; LLM отримує нечитабельний контекст
Garbage detector перед індексацією; маршрутизація на Vision OCR
Відсутність моніторингу якості
Система «мовчки» повертає неправильні відповіді без сигналів
Тестовий набір з 20–30 питань; вимірювання Recall@5 на репрезентативній вибірці
Пріоритетний порядок дій
Якщо ви зараз запускаєте або налагоджуєте RAG на сканованих документах — ось послідовність з найбільшим ROI:
Аудит архіву — яка частка сканів? Чи є перевернуті сторінки? Яка типова якість?
Додати корекцію орієнтації — навіть якщо більшість сторінок нормальні, одна перевернута сторінка в критичному документі коштує дорого.
Додати базовий постпроцесинг — нормалізація пробілів, з'єднання переносів, видалення рядків-мусору. Реалізується за кілька годин, дає вимірюваний ефект на retrieval.
Побудувати тестовий набір питань — 20–30 питань з відомими відповідями. Вимірювати Recall@5 до і після кожної зміни.
Додати garbage detector і маршрутизацію на Vision OCR для проблемних сторінок.
Тільки після цього — тюнити chunking-параметри, embedding-моделі, reranker.
Кроки 1–3 дають більше ефекту ніж зміна embedding-моделі з 1536 на 3072 вимірів. Але більшість команд починають з кроку 6 — і дивуються чому результат не покращується.