ИИ-сверка сканированного документа с оригиналом

Vision-LLM читает скан, docling — оригинал, а модель находит смысловые различия абзац за абзацем

Заказчик: Собственный R&D-проект
Стек: Python, FastAPI, LangChain, Vision-LLM (OpenAI / GigaChat / OpenRouter / Ollama / LlamaCpp), docling и markitdown (DOCX/PDF → Markdown), aiogram (Telegram-бот)

Задача

Подписанный и отсканированный документ нужно сверить с оригиналом: не подменили ли пункт, не изменилась ли сумма или срок. Вручную сравнивать скан с DOCX долго и ненадёжно — глаз пропускает мелкие правки. Нужен сервис, который сам находит смысловые различия между сканом и исходником.

Результат

Сервис приводит и оригинал, и скан к единому виду (Markdown) и находит смысловые различия абзац за абзацем, помечая критичные. Скан читает Vision-LLM (в том числе рукописный текст), оригинал разбирает docling. Модель работает по строгому правилу — не выдумывать различия, а показывать только реально существующие.

Это R&D-кейс про ИИ-сверку сканированного документа с оригиналом. Ситуация частая: есть исходный договор в DOCX и его подписанный скан. Нужно убедиться, что в скане ничего не подменили — ни сумму, ни срок, ни пункт. Глазами это делать долго и ненадёжно, поэтому сверку берёт на себя связка Vision-LLM и языковой модели.

Проблема: два документа в разных форматах

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

Решение: привести к Markdown, потом сравнить

Пайплайн из двух шагов. Оригинал (DOCX/PDF) конвертируется в Markdown через docling или markitdown. Скан читает Vision-LLM и тоже отдаёт Markdown — модель распознаёт даже рукописный текст. Дальше языковая модель сравнивает два текста по строгим правилам:

1. Разбить оба документа на абзацы.
2. Для каждого абзаца оригинала найти самый похожий в скане (по смыслу).
3. Нет абзаца в скане        -> различие (critical).
4. Найден, но совпадение <90% -> разобрать построчно.
Правило: не придумывать различия, показывать только реальные.

Почему это не просто OCR

Распознать текст — половина дела; в кейсе про распознавание документов для 1С задача именно такая. Здесь другая цель: не извлечь данные, а сравнить два документа и найти расхождения. Поэтому главный компонент — не OCR, а логика сопоставления абзацев и оценка критичности различий. Качество распознавания при этом важно, и стабильность OCR мы отдельно мерили — про это статья про рейтинг стабильности OCR.

Провайдеры и интерфейс

Модель подключается через фабрику: OpenAI, GigaChat, OpenRouter, локальные Ollama и LlamaCpp — для конфиденциальных документов всё разворачивается локально. Тестировать удобно через Telegram-бота: отправил скан и оригинал — получил список различий.

Где это применимо

Сверка подписанных договоров со скан-копиями, контроль версий первички, проверка, что распечатанный и подписанный документ соответствует согласованному. Хотите такую сверку под свои документы — этот и другие сценарии с Vision-LLM разбираем на курсе по ChatGPT и нейросетям для 1С.

Частые вопросы

Нужен похожий проект?

Опишите задачу — оценю сроки и стоимость.