Как сделать так, чтобы изображения в PDF-файлах можно было искать по RAG-тегам, не платя за чтение всех файлов?
Enterprise Document Intelligence [Vol.1 #5sexies] – image_df показывает, где находится каждое изображение. Преобразование немногих важных изображений в текст, доступный для поиска, — это отдельная, оплачиваемая задача.
Делиться
Эта статья является дополнением к серии статей об интеллектуальном анализе документов в рамках проекта Enterprise Document Intelligence, посвященного созданию корпоративной системы RAG из четырех компонентов. Она расширяет статью 5 (анализ документов) на основе одной таблицы: image_df , которая находит каждое изображение в PDF-файле, не читая ни одно из них. Эта часть создает набор инструментов для чтения: каскад с упорядоченной стоимостью (недорогой фильтр, проверка типа, классическое оптическое распознавание символов, модель машинного зрения), который преобразует несколько изображений, за которые стоит платить, в текст, доступный для поиска.

Блок парсинга предоставляет вам image_df : по одной строке на каждое изображение в PDF-файле, с указанием страницы, ограничивающей рамки, размера и хеша содержимого. Это позволяет найти каждое изображение. Однако не указывается, что именно на нём изображено. С точки зрения поиска, это то же самое, что и отсутствие изображений: ограничивающая рамка не является объектом поиска для пользователя, а текстовый слот изображения, где обычно находится описание, пуст.
Рефлексивный подход — использовать модель визуального восприятия для каждого изображения и на этом остановиться. Это неправильный подход по умолчанию. Реальный документ полон изображений, которые не несут в себе ничего, что читатель когда-либо стал бы искать: логотип компании в колонтитуле каждой страницы, горизонтальная линия, нарисованная в виде картинки высотой в 2 пикселя, маркер списка, декоративный баннер. Создание подписей к этим изображениям с помощью модели визуального восприятия — это все равно что платить модели за описание логотипа триста раз.
Таким образом, задача разделяется на две части. Во-первых, методы преобразования изображения в текст и стоимость каждого из них: недорогой фильтр, проверка типа, классическое оптическое распознавание текста (OCR), модель компьютерного зрения. Во-вторых, какие изображения действительно стоит обрабатывать в данном цикле. Вторая часть определяется контекстом. Строка текста, которая гласит: «На рисунке 3 ниже показано…», указывает на необходимость обработки именно этого рисунка с помощью модели компьютерного зрения, а не его соседних изображений; задаваемый вопрос еще больше сужает круг поиска. В этой статье описаны методы и показано, что каждый из них возвращает, в порядке возрастания стоимости. Выбор изображений для обработки, для каждого документа и для каждого запроса, представляет собой адаптивный синтаксический анализ, которому посвящена отдельная статья (статья 10). Здесь же мы создаем набор инструментов.

1. Большинство изображений не стоят того, чтобы звонить моделям.
Первый шаг ничего не требует. Перед любыми вызовами OCR или обработки изображений, недорогой фильтр анализирует сигналы, уже имеющиеся в image_df плюс пару статистических данных пикселей, и отбрасывает изображения, не представляющие ценности для поиска:
- Слишком маленький размер. Изображение, короткая сторона которого составляет несколько десятков пикселей или общая площадь которого меньше небольшого размера, является значком или маркером, а не цифрой. Пороговое значение размера удаляет большинство таких изображений.
- Неправильная форма. Изображение, которое слишком длинное и слишком узкое, — это правило или разделитель, а не содержание. Защита от искажения соотношения сторон выявляет такие изображения.
- Повторяется повсюду. Один и тот же хеш содержимого на большинстве страниц документа — это элемент Chrome: логотип в заголовке, знак в нижнем колонтитуле, водяной знак. Подсчет количества страниц, на которых встречается хеш изображения, показывает, что это декоративный элемент, а не информация.
is_worth_analyzing применяет эти правила размера и формы для каждого изображения, а flag_worth_analyzing сначала вычисляет частоту повторения на странице из хеша содержимого, а затем добавляет столбец worth_analyzing в image_df . Обе функции находятся в docintel.parsing.pdf.images . Пороги намеренно установлены на низком уровне: ложное сохранение изображения приводит к потере содержимого без следа, ложное удаление — к потере содержимого, поэтому в случае сомнений фильтр сохраняет изображение. Плоские, бессодержательные изображения, которые слишком велики, чтобы не пройти проверку размера (например, панель сплошного цвета), здесь не обрабатываются принудительно; они обнаруживаются на шаг позже как decorative и пропускаются точно так же.
Вход:
image_df(+ статистика по пикселям изображения). Выход: та же таблица с флагомworth_analyzing.
В типичном отчете уже одно это удаляет подавляющее большинство изображений до запуска хотя бы одной модели. Остается лишь небольшое количество изображений, имеющих реальный смысл.
2. Что это за тип изображения?
Изображения, прошедшие фильтрацию, читаются по-разному. Скриншот таблицы — это текст: классический OCR распознает его быстро и точно. Линейный график — это вовсе не текст; его смысл заключен в осях и тренде, и только модель машинного зрения может выразить это словами. При отправке графика на OCR возвращается несколько лишних меток осей; отправка скриншота на модель машинного зрения обходится графику дорого, в отличие от OCR, который делает это бесплатно.
Таким образом, на втором этапе каждое сохраненное изображение классифицируется по одному типу:
-
decorative: пустая или почти однородная панель. Пропустить. -
text: скриншот, отсканированная область, таблица, отображенная в виде изображения. Чтение осуществляется с помощью OCR. -
chart/diagram/photo: смысл визуальный. Используется модель визуального восприятия.
classify_image возвращает один ImageType на основе дешевых пиксельных сигналов: насколько различаются пиксели, насколько они насыщены, какая часть изображения представляет собой почти белый фон, насколько плотны его края. Почти однородная панель является decorative . Стоит остановиться на этом тесте, потому что очевидный вариант неверен: вы не можете определить пустую панель, подсчитывая ее цвета. Настоящая «полностью черная» или «полностью белая» область никогда не бывает идеально точной по пикселям; шум сенсора и сжатие JPEG придают ей сотни почти идентичных цветов, поэтому подсчет цветов проходит мимо нее. Что остается близким к нулю на пустой панели, со всем шумом, так это дисперсия значений пикселей, их стандартное отклонение. Низкая дисперсия означает пустую панель, независимо от подсчета цветов, поэтому это и есть сигнал. Черные чернила на белой странице, почти нулевая насыщенность с реальной структурой штрихов, — это text . Насыщенное изображение без белых полей — это photo . Все остальное, каждый неопределенный случай, попадает в chart .
Обратите внимание на то, чего нет в этом списке: шаг, определяющий, «похоже ли это на логотип». Это сделано намеренно, и это тот же урок, что и с пустой панелью. Логотип может быть выполнен в двух плоских цветах, представлять собой черный текстовый знак на белом фоне или полноцветный градиент с мягкими краями. Подсчет цветов выявляет первый вариант и пропускает второй, и, что еще хуже, двухцветный тест также обнаруживает двухуровневое сканирование реального текста, который вы хотели прочитать. Внешний вид не говорит вам, что это логотип. Это делает поведение: логотип — это хром, потому что он повторяется, один и тот же знак в каждом заголовке страницы. Этот сигнал уже прошел через фильтр, который отбрасывает изображение, хэш содержимого которого повторяется на разных страницах независимо от количества цветов. Логотип, который появляется только один раз, знак на титульной странице, не заслуживает особого внимания; он читается как все остальное, текстовый знак обрабатывается бесплатным OCR, а графика — одним визуальным запросом. Главное правило: пропускайте только то, в чём вы уверены, что это пустое место или фрагмент кода, а всё остальное читайте, потому что неправильный пропуск незаметно приводит к потере содержимого.
Переход к chart — ещё одно важное проектное решение. Классификация графика по сравнению с диаграммой и фотографией на основе одних лишь дешёвых сигналов ненадёжна, поэтому классификатор не пытается быть слишком сложным: он перенаправляет изображение на дешёвое оптическое распознавание текста (OCR) только тогда, когда уверен, что изображение представляет собой чистый монохромный текст, а всё остальное отправляет в модель машинного зрения, которая считывает графики, диаграммы, фотографии и любой текст, который они содержат. Асимметричное смещение выбрано намеренно. Пропущенный вызов OCR обходится в один вызов модели машинного зрения; OCR, запущенный на диаграмме, возвращает несколько лишних меток осей и бессмыслицу. Поэтому, когда возникают сомнения, классификатор платит за машинное зрение. Сама классификация остаётся дешёвой, без вызовов модели, потому что она должна быть дешевле, чем анализ, которого она призвана избежать.
Входные данные: изображение, прошедшее фильтр. Выходные данные: его
ImageType).
3. Каскад: самый дешевый метод, позволяющий это прочитать.
Тип определяет метод. Функция METHOD_BY_TYPE сопоставляет каждый тип с одним из трех действий, упорядоченных по стоимости, и describe_figure выполняет соответствующее действие. Вся информация о случаях, встречающихся в документе, помещается в одну таблицу: что обрабатывает изображение, сколько это стоит и что вы получаете в ответ.

Читайте сверху вниз, и вы прочитаете каскад по порядку. Первые три строки вообще не попадают в модель: фильтр отбрасывает их из-за размера, формы или повторения. Следующая строка классификатор распознается как пустая панель и тоже пропускается. Только пять нижних строк стоят денег, и из них только подлинный текст-изображение получает бесплатный путь. Остальные попадают в модель обработки изображений, а именно туда вам и нужны деньги.
Осторожно: фигуры, расположенные боком. Широкая таблица или диаграмма альбомной ориентации часто располагаются под углом 90 градусов, чтобы поместиться на странице портретной ориентации. Поворот редко отображается там, где вы бы посмотрели в первую очередь: флаг поворота страницы остается равным 0, а угол находится в собственной матрице размещения изображения. В исходном виде фигура попадает в OCR или модель компьютерного зрения в горизонтальном положении, где OCR возвращает шум, а модель компьютерного зрения считывает его с ошибочной уверенностью и без предупреждения о возникших трудностях. Поэтому каскад считывает угол размещения и поворачивает область в противоположную сторону до того, как ее увидит какой-либо из методов: автоматически, точно, без угадывания ориентации. Единственный оставшийся случай — сканирование с поворотом, заложенным в пиксели, без матрицы для чтения; в этом случае ветвь OCR повторяет четвертьобороты и сохраняет лучший результат.
3.1. Пропуск: за шум ничего не платите.
decorative : нет вызова. Пустая или почти однородная панель сохраняет свой пустой текстовый слот. Вместе с изображениями, которые фильтр уже отбросил (слишком маленькими, неправильной формы, повторяющимися хромированными элементами), именно здесь оказывается большая часть изображений чистого документа, в чем и заключается смысл.
3.2. Классическое оптическое распознавание текста и изображений.
text : скриншот, отсканированная таблица, изображение, которое на самом деле является текстом. Классический OCR считывает его локально, за миллисекунды, бесплатно. В серии используется EasyOCR ( docintel.parsing.pdf.easyocr ); Tesseract — другой распространенный вариант. OCR точно распознает чистый печатный текст и никогда не придумывает слова, что именно то, что нужно, когда изображение представляет собой текст. В сопутствующей статье (статья 5 quinquies) подробно рассматривается OCR как бэкэнд парсера; здесь же это одна из ветвей каскада.
Проблема заключается в рукописном тексте. Рукописная записка выглядит для классификатора как текст, но классический OCR обучен на печатном тексте и считывает курсив как последовательность предположений. Решение состоит в том, чтобы позволить OCR сообщать о степени уверенности. EasyOCR возвращает оценку уверенности для каждой строки, поэтому describe_figure считывает текст и его среднюю уверенность: уверенное считывание возвращается как есть, считывание с низкой уверенностью рассматривается как неудачная попытка, и изображение передается модели компьютерного зрения, которая гораздо лучше обрабатывает рукописный текст. Тот же путь охватывает более редкий случай, когда классификатор ошибочно принял изображение, не являющееся текстом, за текст. Таким образом, ветка OCR — это не «слепо доверять OCR», а «попробовать бесплатный считыватель, сохранять его ответ только тогда, когда он уверен, в противном случае платить за компьютерное зрение».
3.3. Магистр права в области визуального анализа для создания диаграмм, схем и фотографий.
chart , diagram , photo : единственные изображения, смысл которых действительно визуален. Модель обработки изображений анализирует картинку и записывает краткое описание: «линейный график цен на сырьевые товары с 2022 года, сначала растущий, затем стагнирующий после 3 квартала», «архитектура Transformer, кодировщик из N слоев, подаваемых на декодер». Это предложение представляет собой текст, поэтому поиск наконец-то может его сопоставить. Это единственное, что не может сделать ни один текстовый парсер, и это самый дорогостоящий этап, поэтому вся каскадная обработка существует для того, чтобы гарантировать, что до него доходят только эти изображения. Сам вызов функции обработки изображений проходит через docintel.core.analyze_image , единственное место, где находится каждый вызов модели в этой серии (наряду с llm_parse и llm_chat ); стоимость этого процесса рассматривается в статье 5quater (чтение изображений).
Классификатор уже знает тип, поэтому запрос на определение типа настраивается именно на него, а не представляет собой общий запрос типа «опишите это изображение». Запрашивается информация о координатах, единицах измерения и тренде графика; о компонентах и способах их соединениях — диаграмма с указанием каждой метки; о строках таблицы, отображаемой в виде изображения, — текст в формате Markdown; о том, что на ней изображено, — фотография. Правильный вопрос приводит к правильному ответу: запросите у графика тренд — получите тренд, запросите «опишите изображение» — получите предложение о цветах. Вызывающая сторона может передать один явный запрос, чтобы переопределить запросы, специфичные для типа, — именно так обрабатывается инструкция, заданная в рамках проекта или отредактированная пользователем.
Вход: напечатанное изображение. Выход: краткое описание или
Noneдля пропуска.
4. Написание описания в обратную сторону.
Описание полезно только в том случае, если его можно найти с помощью функции поиска. Изображение уже имеет ячейку строки в line_df (изображение располагается в определенной позиции на странице, поэтому оно занимает строку с пустой text ячейкой, как описано в статье 5B (реляционная модель данных)). Каскад записывает свое описание в эту ячейку. describe_image_df добавляет столбец description в image_df , и вызывающая сторона соединяет его обратно со строкой изображения.
В результате, «архитектурная схема» или «диаграмма доходов» теперь автоматически перенаправляют на нужную страницу, используя то же ключевое слово и путь встраивания, что и любая другая строка. Дальнейшим действиям не нужно знать, что текст был получен из изображения.
По своей сути, обогащение происходит постепенно. Каскад обработки можно запускать во время синтаксического анализа для небольшого корпуса или лениво, только для тех изображений, которые действительно необходимы для данного запуска. Текстовый слот пуст, пока его не заполнит кто-то другой, и его заполнение никогда не меняет контракта: это по-прежнему одна строка, одно text значение. Когда его заполнять — это открытый вопрос, который эта статья оставляет для адаптивного синтаксического анализа (статья 10): вместо того, чтобы читать каждый рисунок сразу, сначала читается простой текст, и перекрестная ссылка в этом тексте («Рисунок 3 ниже показывает преимущества») запускает вызов визуализации для рисунка, на который она указывает. Методы, описанные здесь, — это то, что будет вызывать эта политика; сама политика — тема следующей статьи.
Весь каскад передается в виде одного вызова. Передайте ему image_df из parse_pdf и pdf_path из которого он был получен, и считайте обратно тот же кадр с тремя новыми столбцами, которые заполняет каскад.
parsed = parse_pdf("data/paper/1706.03762v7.pdf") # image_df locates the pictures enriched = describe_image_df(parsed["image_df"], pdf_path="data/paper/1706.03762v7.pdf") # describe_image_df adds three columns to image_df: enriched[["page_num", "worth_analyzing", "image_type", "description", "prompt"]].head() # worth_analyzing : the cheap filter's verdict (True/False) # image_type : "decorative" | "text" | "chart" | "diagram" | "photo" | None # description : the searchable text written into the image's line slot # prompt : the instruction sent to the vision model (None for OCR / skip)
Это также та часть каскада, которую пользователь может увидеть и исправить. На скриншоте ниже показано приложение для настольных документов, работающее с тем же конвейером обработки данных на основе NIST AI 100-1 (структура управления рисками в области ИИ, разработка правительства США, общественное достояние): на вкладке «Изображения» перечислены все изображения, найденные парсером, выбранная диаграмма содержит описание, написанное для нее gpt-4.1 , и описание остается редактируемым. Элементы управления для каждого изображения повторно запускают OCR или принудительно задействуют модель компьютерного зрения, если «дешевый» путь дал сбой.

5. Стоимость и задержка: оплата за изображение, а не за страницу.
Главная цель каскадной обработки — обеспечить соответствие стоимости и ценности. Дешевый фильтр и классификатор обрабатывают каждое сохраненное изображение, но фактически ничего не стоят. OCR работает локально и бесплатно. Модель машинного зрения, единственная статья расходов, которая действительно обходится в деньги и секунды, обрабатывает только диаграммы, схемы и фотографии, которые в большинстве корпоративных документов составляют лишь небольшую часть изображений и крошечную часть страниц.
Альтернативный вариант, заключающийся в добавлении подписей к каждому изображению с помощью модели машинного зрения, обходится одинаково в расчете на одно изображение, будь то логотип или диаграмма, а большинство изображений — это логотипы. Каскадный подход заменяет фиксированную стоимость машинного зрения на одно изображение фильтром, недорогим классификатором и вызовом системы машинного зрения только в тех случаях, когда ничто другое не может прочитать изображение. В отчете с одним логотипом на странице и двумя реальными цифрами это означает два вызова системы машинного зрения вместо десятков.
Одно и то же изображение никогда не оплачивается дважды. Фильтр уже удаляет повторяющиеся элементы оформления, которые встречаются на большинстве страниц, но реальный рисунок все еще может появляться на нескольких страницах (например, справочная диаграмма, повторяющийся экспонат). Каскадные ключи основаны на хеше контента, поэтому рисунок, который появляется на десяти страницах, считывается один раз, а описание используется повторно для остальных девяти. Одно изображение, один вызов модели, независимо от того, сколько раз оно появляется.
6. Заключение
image_df находит каждое изображение; он не считывает ни одно из них. Считывание — это отдельный процесс, и в этой статье изложены его методы, упорядоченные по стоимости: бесплатное удаление шума, дешевая классификация оставшегося текста, чтение чистого текста с помощью OCR и сохранение модели зрения для диаграмм и графиков, где смысл действительно визуальный. Каждый метод оставляет свой результат в текстовом поле изображения, и оттуда изображение становится просто еще одной строкой для поиска. В этой статье намеренно не рассматривается вопрос о том, какие изображения следует обрабатывать в данном проходе: чтение каждого изображения заранее редко бывает тем, что нужно, и контекстно-ориентированный выбор, позволяющий окружающему тексту и вопросу определять результат, — это адаптивный синтаксический анализ (статья 10). Сначала инструментарий; затем политика.
Источники и дополнительная литература
- Статья 5 (анализ текста) и статья 5B (реляционные таблицы) вводят
image_dfи строку, в которую записывается описание. - Статья 5 (квартал, посвященный чтению) описывает процесс подготовки к получению степени магистра права в области зрения и его стоимость.
- В статье 5 quinquies (EasyOCR) рассматривается классическое оптическое распознавание символов (OCR) в качестве бэкэнда парсера.
- Статья 10 (адаптивный анализ) — это место, где делается выбор, на который откладывается рассмотрение в данной статье: какие изображения считывать в данном цикле, переходя от простого текста к визуальному анализу только там, где этого требует контекст.
Ранее в серии:
- Документальная разведка: введение к серии. Что представляет собой серия, кирпичик за кирпичиком, и в каком порядке.
- Базовая модель Enterprise RAG: от PDF-файла до выделенного ответа. Четырехэтапный конвейер от начала до конца: PDF-файл на входе, выделенный ответ на выходе.
- Эмбеддинги — это не магия: предсказуемые сбои в поиске RAG. Где сходство эмбеддингов приносит пользу (синонимы, опечатки, перефразирование), где оно предсказуемо дает сбой (неизвестные термины, отрицание, релевантность термина и ответа) и как его все равно использовать.
- Переранжировщики тоже не волшебство: когда слой кросс-кодировщика оправдывает затраты. Что добавляет кросс-кодировщик по сравнению с встраиванием на основе двух кодировщиков (измеренные показатели) и когда оправдана задержка.
- RAG — это не машинное обучение, и инструментарий машинного обучения решает не ту задачу. Почему оптимизация по размеру фрагментов и тонкая настройка оптимизируют не то, что нужно; вместо этого следует ориентироваться на тип вопроса.
- От регулярных выражений до моделей компьютерного зрения: какой метод RAG подходит для какой задачи? Две оси — сложность документа и контроль вопросов — определяют, какой метод подходит для каждого конкретного случая.
- 10 распространенных ошибок RAG, которые мы постоянно видим на производстве. Десять производственных ошибок, расположенные по пунктам, с указанием способа их исправления.
- Помимо функции extract_text: два слоя PDF-файла, определяющие качество RAG. Первая половина блока анализа: характер документа, сигналы и резюме.
- Прекратите возвращать плоский текст из PDF-файла: необходима реляционная структура RAG. Вторая половина блока парсинга: реляционные таблицы, которые считывает каждый последующий блок.
Кежан Ши Посмотреть все Кежан Ши
Источник: towardsdatascience.com
Похожие записи
Оцените материал:
Похожие записи
Новая математика квантовой криптографии
26.09.2025
Сторонникам идеи «плоской Земли» дали удивительный шанс
13.12.2025
Учёные отправили нейросети на психотерапию – и выявили тревожность, ОКР и внутренние конфликты
19.12.2025Присоединяйтесь и подпишитесь на рассылку самых свежих новостей по Email
Получайте свежие новости и идеи на почту. Без спама — только самое интересное.
Нажимая «Подписаться», вы соглашаетесь с политикой конфиденциальности.
