Основная идея

Точность извлечения данных — только половина задачи. Чтобы автоматически собрать документ, нужно ещё определить, где каждый факт должен появиться и какие исходные условия нельзя потерять.

При работе над импортом коммерческих предложений в KPNova мы столкнулись с показательной ошибкой. Система правильно находила сумму до скидки, саму скидку и итог. Но в готовом PDF они появлялись дважды: сначала в аккуратном блоке «Итого», затем в текстовом абзаце, перенесённом из исходного документа.

На первый взгляд это задача на удаление дубликатов. В действительности она затрагивала более фундаментальный вопрос: какое представление отвечает за каждый факт в итоговом документе?

Правильные цифры, неправильный результат

Импорт документа состоит из нескольких этапов. Сначала извлекаются сведения: товары, цены, реквизиты, сроки, условия оплаты. Затем они превращаются в редактируемые поля и блоки коммерческого предложения.

Одновременно система сохраняет часть исходных формулировок. Это необходимо: не всё значимое содержимое укладывается в таблицу или готовое поле. В одном абзаце могут соседствовать итоговая сумма, оговорка о налоге и условие оплаты.

Именно так возник повтор. Финансовые показатели уже попали в блок итогов, но абзац остался в документе целиком — потому что содержал важное условие «НДС включён».

Система сохранила все сведения, но получила плохой пользовательский результат. Следовательно, проверять только отсутствие потерь недостаточно: нужно проверять и то, как сведения представлены.

Почему нельзя просто удалить повтор

Простое сравнение строк здесь бесполезно. Одна и та же сумма может быть записана по-разному, а одинаковые числа могут относиться к разным позициям. Удалить абзац, в котором встретилась уже известная сумма, — значит рискнуть потерять дополнительное условие.

Обратный подход не лучше: сохранять весь исходный текст «на всякий случай» и одновременно строить структурированный документ. Тогда дубли становятся неизбежными, а пользователь не понимает, каким итогам доверять.

Поэтому пришлось разделить две задачи: сохранить смысл источника и выбрать место для показа извлечённого факта. Они связаны, но не тождественны.

Одно правило для всех представлений

Решением стал единый план представления финансовых данных. Он определяет, какие сведения уже отражены в блоке итогов, что можно исключить из повторного текста и какие условия нужно сохранить отдельно.

На него опираются сразу несколько частей системы: предварительный просмотр, создание коммерческого предложения и проверка полноты переноса. Это принципиально: если каждая часть по-своему решает, какой текст оставить, расхождения возвращаются после редактирования или повторного открытия.

Проверка и генерация используют одно решение о том, как представлен каждый факт.

При этом исходные файлы и сведения о происхождении данных остаются неизменными. Система исправляет интерпретацию, а не переписывает оригинал. Это позволяет вернуться к источнику и объяснить, откуда взялось конкретное значение.

Где автоматизация должна остановиться

Например, фраза «НДС 5% включён в стоимость» не означает, что к рассчитанному итогу нужно прибавить ещё 5%. Это самостоятельное финансовое условие. Его можно отразить в блоке итогов и при этом убрать повторяющийся абзац — только если все остальные сведения в нём уже учтены.

Если документы противоречат друг другу, неизвестна валюта, неоднозначна ставка или не хватает данных, автоматическое удаление текста недопустимо. Правильный результат в таких случаях — показать вопрос пользователю, а не выбрать правдоподобный ответ.

То же правило действует для цены за единицу: повтор можно убрать, только когда структурированное поле передаёт ту же цену, единицу измерения и необходимые оговорки. Совпадение одного числа не даёт такого права.

Что показала проверка

Исправление проверялось на реальном комплекте документов и изображений с последующим созданием PDF. В результате остался один блок итогов без повторного финансового абзаца; условия оплаты, гарантия и налоговая оговорка были сохранены. Для проверенного комплекта удалось пройти контроль полноты без обнаруженных пропусков, а готовые страницы сравнивались не только по тексту, но и визуально.

Это подтверждает исправление конкретного сценария, но не означает, что любой документ будет распознан идеально. Ошибки извлечения, конфликты источников и неполные данные остаются отдельными задачами, для которых нужны свои проверки и возможность ручного решения.

Что из этого следует

Главная ошибка была не в том, что ИИ неверно прочитал документ. Он прочитал нужные сведения, но разные части системы независимо решали, как их использовать. В итоге каждая из них по отдельности действовала разумно, а общий документ оказался неправильным.

Автоматическая обработка документа заканчивается не извлечением фактов, а их единственным, точным и проверяемым представлением.

Поэтому в подобных системах я бы начинал не с дополнительного промпта «не дублируй суммы», а с явного правила: какой блок отвечает за факт, какие исходные условия он покрывает и что остаётся в тексте. Тогда отсутствие дублей и отсутствие потерь становятся двумя проверками одного решения — вместо конкурирующих эвристик.

Есть вопрос по теме?Обсудить в Telegram