Перейти к содержанию

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