Document Intelligence — распознавание документов
Зачем
Сейчас photo analysis работает ad-hoc: юзер кидает фото → Vision (Sonnet/Opus) → RAG по caption. Этого недостаточно для реальных рабочих сценариев: HSE-специалист получает приказ/акт/разрешение/протокол в PDF или на бумажке, и ему нужно: 1) понять что это, 2) извлечь ключевые поля, 3) сверить с базой НПА, 4) получить summary и список что важно .
Это реальная боль на проверках и аудитах: аудитор приносит папку документов, HSE надо быстро проверить всё ли в порядке.
Кому
- HSE-специалист при проверках и аудитах
- При ревью контракторской документации
- При обработке входящей корреспонденции (приказы МТСЗН, предписания)
User flow
Юзер кидает PDF / фото документа (без caption или с «что это?»)
→ бот авто: детектит тип файла (PDF / image)
├── PDF с text-layer → pdfplumber извлекает текст
├── PDF-scan или фото → Vision (Sonnet/Opus) извлекает текст + structure
→ Sonnet (или Haiku для speed) классифицирует тип:
├── Приказ (и чей — МТСЗН / МЧС / МЗ / экология)
├── Акт (расследования, проверки, приёмки)
├── Протокол (инструктажа, совещания, обучения)
├── Чек-лист (аудит, обход, проверка)
├── СОП / ИОТ (стандарт операционной процедуры)
├── Лицензия / разрешение / сертификат
├── Наряд-допуск (PTW)
└── Удостоверение / диплом обучения
→ бот извлекает ключевые поля в зависимости от типа
→ бот сверяет с SQL (lookup_npa) — есть ли такой НПА в базе?
→ output: summary + критичные поля + warnings («срок действия истёк через 30 дней» / «этот Приказ отменён в 2024»)
Ключевые поля по типам
| Тип документа | Извлекаем |
|---|---|
| Приказ | номер, дата, орган (МТСЗН/МЧС/МЗ), внутренний номер (ҚР ДСМ-X), подписант, предмет |
| Акт | дата, объект, комиссия, выводы, нарушения, подпись ответственных |
| Протокол | дата, участники, повестка, решения |
| Чек-лист | пункты, статусы (OK/Fail), финдинги, подпись |
| СОП / ИОТ | объект работы, дата введения, срок пересмотра, риски, КМ |
| Лицензия | номер, орган выдачи, дата выдачи, срок действия ⚠️, вид деятельности |
| ПТД (наряд-допуск) | номер, дата, работы, ответственные, риски, КМ |
| Удостоверение | ФИО, профессия, срок действия, орган выдачи |
Критичные warnings (auto-detected)
- Срок действия близок к концу (< 30 дней) — для лицензий, удостоверений
- Документ отменён — SQL лоокап в базе НПА покажет статус
- Документ не найден в базе — это не фантом, а сигнал: «этого приказа у меня нет в SQL, проверьте выписку в Адилет»
- Несоответствие форме — для ЧП наряд-допуска (Приказ 344): если отсутствуют обязательные разделы — флаг
- Отсутствуют подписи — для актов, протоколов
Технический стек
- Trigger: автоматически при upload файла (PDF или photo без caption-question)
- PDF parsing: pdfplumber (text-layer) + Vision (Sonnet/Opus) для scan'ов
- Image: Vision (Sonnet/Opus, роутинг как сейчас)
- Classification: Haiku с одним промптом для быстрой роутировки (1-3с)
- Field extraction: Sonnet с structured output (Pydantic schema по типу документа)
- SQL verification: lookup_npa для НПА-документов (приказы/кодексы)
- Output: Markdown в Telegram + опционально .docx резюме для передачи в комиссию
Output artifacts
Документ: Приказ МТСЗН РК №344 от 28.08.2020
Статус в базе Lyumi: действует ✅
Внутренний номер: V2000021151
Предмет: Типовая форма наряда-допуска
Ключевое для вас:
• Наряд двухсторонний (выдающий + принимающий)
• 5 обязательных ролей (выдающий, ответственный руководитель, исполнитель работ, наблюдающий, принимающий)
• Раздел 5 (10 подпунктов) — обязательные КМ
⚠️ Проверьте: ваша форма содержит все 5 ролей? Связанный НПА: ТК РК ст.184
Integration с существующей Lyumi
- Reuse: photo handler (Vision Sonnet/Opus), lookup_npa, Reflection layer
- Reuse: pdfplumber (уже в npa_parser/), document_registry (4275 docs)
- Новое: classifier_prompt.py, field_extraction_schemas.py (Pydantic per type), document_intelligence.py handler
- Не связано: Investigation Module, /pack — это отдельный input
Phasing
MVP (sprint 1, ~2-3 дня): - Trigger: PDF/photo upload без caption или с caption 'что это?' - Classification в 5 базовых типов: Приказ / Акт / Протокол / Чек-лист / ПТД - Field extraction: общие поля (номер/дата/орган/предмет) - SQL verification для НПА-типов (приказы) - Output: Markdown summary в Telegram
v2 (sprint 2): - Расширить до 9 типов (СОП, лицензия, удостоверение, разрешение) - Type-specific extraction (Pydantic schemas для каждого типа) - Warnings (срок действия, отменённые НПА) - Output: .docx summary опционально
v3 (sprint 3): - Bulk upload (несколько файлов за раз) — для аудита папки от контрактора - Cross-reference: из Приказа «ввести СОП» → бот просит загрузить этот СОП для сверки - Gap analysis: «у вас папка из 5 документов, но по НПА должно быть 7 — не хватает X, Y»
Open questions
- Как обрабатывать конфиденциальные документы? Contractor иногда присылает личные данные в удостоверениях/протоколах.
- Простой ответ для MVP: warning 'Этот документ содержит ПДн — не храним, обработали и забыли'
- Multi-page PDF: резать на страницы для Vision или всё разом?
-
5 страниц → pdfplumber + structured prompts (без Vision)
- ≤ 5 страниц → Vision на каждую отдельно
- OCR фото на казахском: Vision Sonnet/Opus умеет кириллицу, но хуже с казахским. Tesseract как fallback.
Не делаем
- НЕ храним документы у себя — юзер загружает, обрабатываем, забываем
- НЕ пытаемся извлечь «всё полезное» — только ключевые поля по типу
- НЕ валидируем юридически — сказываем юзеру «вот что вижу, на всякий случай сверьтесь с юристом»
Reference
- KROT AI: их «AI — анализ протоколов и документов» — это именно этот модуль, валидирует идею
- Существующий photo handler в bot.py — основа для расширения
- npa_parser/ скрипты — паттерны extraction полей из PDF