Основная идея
Точность извлечения данных — только половина задачи. Чтобы автоматически собрать документ, нужно ещё определить, где каждый факт должен появиться и какие исходные условия нельзя потерять.
При работе над импортом коммерческих предложений в KPNova мы столкнулись с показательной ошибкой. Система правильно находила сумму до скидки, саму скидку и итог. Но в готовом PDF они появлялись дважды: сначала в аккуратном блоке «Итого», затем в текстовом абзаце, перенесённом из исходного документа.
На первый взгляд это задача на удаление дубликатов. В действительности она затрагивала более фундаментальный вопрос: какое представление отвечает за каждый факт в итоговом документе?
Правильные цифры, неправильный результат
Импорт документа состоит из нескольких этапов. Сначала извлекаются сведения: товары, цены, реквизиты, сроки, условия оплаты. Затем они превращаются в редактируемые поля и блоки коммерческого предложения.
Одновременно система сохраняет часть исходных формулировок. Это необходимо: не всё значимое содержимое укладывается в таблицу или готовое поле. В одном абзаце могут соседствовать итоговая сумма, оговорка о налоге и условие оплаты.
Именно так возник повтор. Финансовые показатели уже попали в блок итогов, но абзац остался в документе целиком — потому что содержал важное условие «НДС включён».
Система сохранила все сведения, но получила плохой пользовательский результат. Следовательно, проверять только отсутствие потерь недостаточно: нужно проверять и то, как сведения представлены.
Почему нельзя просто удалить повтор
Простое сравнение строк здесь бесполезно. Одна и та же сумма может быть записана по-разному, а одинаковые числа могут относиться к разным позициям. Удалить абзац, в котором встретилась уже известная сумма, — значит рискнуть потерять дополнительное условие.
Обратный подход не лучше: сохранять весь исходный текст «на всякий случай» и одновременно строить структурированный документ. Тогда дубли становятся неизбежными, а пользователь не понимает, каким итогам доверять.
Поэтому пришлось разделить две задачи: сохранить смысл источника и выбрать место для показа извлечённого факта. Они связаны, но не тождественны.
Одно правило для всех представлений
Решением стал единый план представления финансовых данных. Он определяет, какие сведения уже отражены в блоке итогов, что можно исключить из повторного текста и какие условия нужно сохранить отдельно.
На него опираются сразу несколько частей системы: предварительный просмотр, создание коммерческого предложения и проверка полноты переноса. Это принципиально: если каждая часть по-своему решает, какой текст оставить, расхождения возвращаются после редактирования или повторного открытия.
При этом исходные файлы и сведения о происхождении данных остаются неизменными. Система исправляет интерпретацию, а не переписывает оригинал. Это позволяет вернуться к источнику и объяснить, откуда взялось конкретное значение.
Где автоматизация должна остановиться
Например, фраза «НДС 5% включён в стоимость» не означает, что к рассчитанному итогу нужно прибавить ещё 5%. Это самостоятельное финансовое условие. Его можно отразить в блоке итогов и при этом убрать повторяющийся абзац — только если все остальные сведения в нём уже учтены.
Если документы противоречат друг другу, неизвестна валюта, неоднозначна ставка или не хватает данных, автоматическое удаление текста недопустимо. Правильный результат в таких случаях — показать вопрос пользователю, а не выбрать правдоподобный ответ.
То же правило действует для цены за единицу: повтор можно убрать, только когда структурированное поле передаёт ту же цену, единицу измерения и необходимые оговорки. Совпадение одного числа не даёт такого права.
Что показала проверка
Исправление проверялось на реальном комплекте документов и изображений с последующим созданием PDF. В результате остался один блок итогов без повторного финансового абзаца; условия оплаты, гарантия и налоговая оговорка были сохранены. Для проверенного комплекта удалось пройти контроль полноты без обнаруженных пропусков, а готовые страницы сравнивались не только по тексту, но и визуально.
Это подтверждает исправление конкретного сценария, но не означает, что любой документ будет распознан идеально. Ошибки извлечения, конфликты источников и неполные данные остаются отдельными задачами, для которых нужны свои проверки и возможность ручного решения.
Что из этого следует
Главная ошибка была не в том, что ИИ неверно прочитал документ. Он прочитал нужные сведения, но разные части системы независимо решали, как их использовать. В итоге каждая из них по отдельности действовала разумно, а общий документ оказался неправильным.
Автоматическая обработка документа заканчивается не извлечением фактов, а их единственным, точным и проверяемым представлением.
Поэтому в подобных системах я бы начинал не с дополнительного промпта «не дублируй суммы», а с явного правила: какой блок отвечает за факт, какие исходные условия он покрывает и что остаётся в тексте. Тогда отсутствие дублей и отсутствие потерь становятся двумя проверками одного решения — вместо конкурирующих эвристик.
