Задача
Поставщики присылают договоры на своих условиях, а счета приходят с ошибками в суммах, с ценами выше согласованных и иногда с подменённым расчётным счётом. Юрист и бухгалтер сверяют всё вручную. Нужна проверка, которая сама сравнивает договор с эталоном компании, а счёт — с договором, спецификацией и заказом, объясняет каждое замечание и отдаёт правки в привычных Word и Excel. Демо должно открываться без регистрации и ничего не стоить.
Решение
Решения принимает код, а не модель. Сопоставление только находит, с чем сравнивать: пункт эталона, позицию спецификации, строку заказа. Пара засчитывается, если тексты похожи и по сочетаниям букв, и по общим словам, а совпадающий номер пункта добавляет уверенности, поэтому перенумерованный пункт находит свой эталон, а новый остаётся новым. Дальше работают правила юриста, контрольные цифры и арифметика, у каждого замечания есть причина и правильный вариант. Для Word правки собираются по словам, как их внёс бы юрист, и поставщик принимает или отклоняет каждую.
Решённые задачи
- Сделал сопоставление без нейросети: сочетания букв, общие слова и номер пункта ставят пункт договора в пару к эталону, а строку счёта — к спецификации и заказу
- Сделал правила юриста отдельным файлом: регулярное выражение, проверка и объяснение словами
- Проверил счёт целиком: арифметика строк, итог, ставка и сумма НДС, сумма прописью, основание
- Проверил реквизиты по контрольным цифрам ИНН, ОГРН и счёта вместе с БИК банка и сверил их с договором
- Научил читать сканы: Tesseract на сервере, линии таблицы убираются до распознавания
- Сделал выгрузку в Excel и Word: договор с правками в режиме рецензирования и примечаниями, письмо поставщику по счёту
- Подключил GigaChat и OpenAI-совместимые модели за одним интерфейсом: модель только выписывает строки счёта, если правила их не нашли
- Ограничил демо: 10 своих файлов в сутки, каждая проверка в отдельном процессе, файлы живут в памяти час — контейнер держит около 40 МБ
Результат
Приёмочный тест: в трёх примерах — договоре, счёте и скане счёта — найдены все 25 заложенных ошибок, а эталон, сверенный с самим собой, и чистый счёт не получили ни одного замечания. Скан счёта читается примерно за 5 секунд, проверка идёт в отдельном процессе, и в простое контейнер занимает около 40 МБ памяти. Демо на этом сайте — тот же контейнер проекта: файлы не сохраняются, отчёты скачиваются в течение часа.
Комментарий разработчика
Что было трудно
Сложнее всего было со сканом: линии таблицы Tesseract читал как «|» и «[», терял номера строк и цифры рядом с ними. Помогло убрать длинные линии до распознавания: у букв нет таких длинных штрихов, поэтому исчезает только сетка. Второе — фасовка: «мешок 25 кг» и «мешок 50 кг» по тексту почти одно и то же, поэтому вес и жирность сверяются отдельно.
Что далось легко
Легко далась арифметика счёта: строки, итог, НДС и сумма прописью проверяются точно, без порогов.
Технологии
PythonFastAPITesseract OCRpypdfpython-docxopenpyxlGigaChatDocker