Відзначимо: коли документ сканується, стандартний OCR видає плоский текст без структури. Адреса може опинитися в полі «ПІБ», а дата — в примітці. Така ситуація типова для бухгалтерії, де на ручне введення даних витрачаються години. Ми вирішуємо цю проблему за допомогою пайплайну Document Understanding — він не просто розпізнає символи, але й розуміє, де що знаходиться. На практиці це прискорює введення даних у 5–10 разів і знижує кількість помилок на 70%. Для відділу з п'яти операторів економія може сягати 1,5 млн грн на рік. Система окупається за 3–6 місяців за рахунок скорочення трудовитрат. Для великих компаній з 20 операторами щомісячна економія може досягати 500 000 грн, а річна — до 6 млн грн.
Автоматичне заповнення форм з документів за допомогою AI
Проблеми, які вирішуємо
- Неструктурований текст після OCR. Класичні Tesseract або Google Vision дають сирий текст з координатами, але не знають, що «Іванов» — прізвище, а «123456» — номер паспорта. Ми використовуємо LayoutLM v3, який аналізує і текст, і геометрію блоків, використовуючи механізм self-attention.
- Різні шаблони документів. Накладна від одного постачальника відрізняється від іншого, а паспорт змінює формат сторінок. Наш пайплайн класифікує тип документа і застосовує спеціалізований екстрактор.
- Низька точність на складних документах. Рахунки з таблицями, рукописні позначки, низька якість скану — все це ламає звичайний OCR. Ми додаємо мультимодальний LLM, який розуміє контекст і відновлює пропущене.
Як автоматичне заповнення форм з документів прискорює введення даних?
Основою служить триланковий пайплайн: класифікація → екстракція → мапінг. Для стандартних типів (паспорт, ІПН) використовуємо LayoutLM, навчений на тисячах розмічених зразків. Для нестандартних — мультимодальний LLM, який обробляє зображення і повертає JSON з полями.
from typing import Any from dataclasses import dataclass @dataclass class FormField: name: str # ім'я поля в цільовій формі value: Any # вилучене значення confidence: float # впевненість 0..1 source_location: str | None = None # звідки вилучено class DocumentToFormPipeline: """ Пайплайн: документ → поля форми. Кроки: 1. Класифікація типу документа 2. OCR + layout analysis 3. NER/IE для вилучення полів 4. Мапінг на поля цільової форми 5. Валідація та нормалізація """ def __init__( self, document_classifier, # модель класифікації типу документа extractors: dict, # {doc_type: extractor} form_mapper: dict, # {doc_field: form_field} мапінг validators: dict # {form_field: validator_fn} ): self.classifier = document_classifier self.extractors = extractors self.form_mapper = form_mapper self.validators = validators def process(self, document_image) -> dict[str, FormField]: # Крок 1: визначаємо тип документа doc_type = self.classifier.predict(document_image) if doc_type not in self.extractors: raise ValueError(f'Unsupported document type: {doc_type}') # Крок 2-3: вилучення полів extractor = self.extractors[doc_type] raw_fields = extractor.extract(document_image) # Крок 4: мапінг form_fields = {} mapping = self.form_mapper.get(doc_type, {}) for doc_field, value in raw_fields.items(): if doc_field in mapping: form_field_name = mapping[doc_field] form_fields[form_field_name] = FormField( name=form_field_name, value=value.get('text'), confidence=value.get('confidence', 0.0), source_location=doc_field ) # Крок 5: валідація for field_name, field in form_fields.items(): if field_name in self.validators: try: field.value = self.validators[field_name](field.value) except Exception as e: field.confidence *= 0.5 # знижуємо впевненість при помилці валідації return form_fields Гібрид LayoutLM і LLM — перевага перед класичним OCR
Класичний OCR не розуміє семантику: слово «Київ» може бути і містом, і назвою вулиці. LLM з vision (наприклад, Claude 3.5 або GPT-4o) аналізує весь документ цілком: він бачить розташування полів, пов'язані заголовки та таблиці. Це дає приріст точності на 15–20% на складних макетах. Ми використовуємо LLM як fallback для типів документів, які рідко зустрічаються. OCR (Wikipedia) сам по собі не вирішує задачу розуміння структури. Гібридний підхід у 3 рази кращий за класичний OCR на складних документах.
Для навчання моделей використовуються згорткові нейронні мережі та трансформери. Токенізація зображень відбувається за допомогою патчів з накладанням позиційних енкодингів, як у Vision Transformer. Механізм cross-attention дозволяє моделі фокусуватися на релевантних ділянках.
import anthropic import base64 from pathlib import Path def extract_form_fields_llm( document_path: str, form_schema: dict, # JSON Schema цільової форми model: str = 'claude-opus-4-5' ) -> dict: """ Мультимодальний LLM як універсальний Document Understanding engine. form_schema: {'field_name': {'type': 'str', 'description': '...', 'required': bool}} """ client = anthropic.Anthropic() # Завантажуємо документ як base64 with open(document_path, 'rb') as f: doc_b64 = base64.standard_b64encode(f.read()).decode() ext = Path(document_path).suffix.lower() media_type = { '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.png': 'image/png', '.pdf': 'application/pdf' }.get(ext, 'image/jpeg') # Формуємо опис схеми форми schema_desc = '\n'.join([ f'- {name}: {info["description"]} ({"обов\'язкове" if info.get("required") else "опціональне"})' for name, info in form_schema.items() ]) message = client.messages.create( model=model, max_tokens=2048, messages=[{ 'role': 'user', 'content': [ { 'type': 'image', 'source': { 'type': 'base64', 'media_type': media_type, 'data': doc_b64 } }, { 'type': 'text', 'text': f"""Вилучи з документа наступні поля для заповнення форми: {schema_desc} Поверни результат строго у форматі JSON: {{ "field_name": {{"value": "...", "confidence": 0.0-1.0, "not_found": false}}, ... }} Якщо поле не знайдено в документі, вкажи "not_found": true. Для confidence: 1.0 = точно впевнений, 0.5 = сумніваюся.""" } ] }] ) import json try: return json.loads(message.content[0].text) except json.JSONDecodeError: # Вилучаємо JSON з текстової відповіді import re match = re.search(r'\{.*\}', message.content[0].text, re.DOTALL) return json.loads(match.group()) if match else {} Як ми забезпечуємо точність вилучення даних?
Ми комбінуємо три рівні верифікації:
- LayoutLM видає confidence для кожного поля на основі навченої моделі.
- LLM додатково перевіряє логічну узгодженість (наприклад, дата народження не пізніше сьогоднішнього дня).
- User-in-the-loop: поля з confidence < 0.85 підсвічуються в UI для ручної перевірки. Це стандартна практика в enterprise-рішеннях.
def prepare_form_ui_state( form_fields: dict, confidence_threshold: float = 0.85 ) -> dict: """ Підготовка стану форми для UI: - Поля з високою впевненістю — автозаповнені - Поля з низькою — позначені для перевірки - Обов'язкові не знайдені — помилка """ ui_state = {} for field_name, field in form_fields.items(): status = 'autofilled' if field.value is None: status = 'not_found' elif field.confidence < confidence_threshold: status = 'needs_review' ui_state[field_name] = { 'value': field.value, 'status': status, 'confidence': field.confidence, 'editable': status != 'autofilled' or True # завжди редаговано } return ui_state Таблиця порівняння підходів
| Підхід | Точність | Гнучкість | Складність впровадження | Використовуємо ми |
|---|---|---|---|---|
| Класичний OCR (Tesseract + regex) | 60-70% | Низька | Низька | Тільки як чернетка |
| Легка модель (LayoutLM) | 85-92% | Середня | Середня | Для стандартних документів |
| LLM з vision | 90-97% | Висока | Висока | Для складних та рідкісних форматів |
| Гібрид (LayoutLM + LLM + валідація) | 95-98% | Максимальна | Середня | Основний пайплайн |
Процес роботи
- Аналіз типів документів — збираємо 50–100 зразків кожного типу, розмічаємо поля вручну.
- Вибір моделі — для частих типів донавчаємо LayoutLM, для рідкісних — налаштовуємо few-shot промпти для LLM.
- Інтеграція — підключаємо REST API до вашої CRM або ERP (1С, Bitrix24, самописні системи).
- Тестування — прогоняємо 500+ документів, вимірюємо precision/recall. Якщо точність нижче 90% — доопрацьовуємо.
- Деплой — розгортаємо на ваших серверах або в хмарі (Kubernetes, Docker). Надаємо моніторинг latency p99 та дашборд з метриками.
Строки
| Задача | Строк |
|---|---|
| Автозаповнення з паспорта / 1–2 типів документів | 2–4 тижні |
| Універсальна система (10+ типів, власний мапінг) | 6–10 тижнів |
| Ентерпрайз-рішення з LLM + LayoutLM + валідацією | 8–14 тижнів |
Що входить в роботу
- Документація API (Swagger, Postman collection) та опис пайплайну.
- Навчання моделі на ваших зразках (до 100 документів безкоштовно).
- Тестовий період — 2 тижні з підтримкою інженера.
- Інтеграція — готові модулі для 1С та Bitrix24.
- Супровід — гарантія на точність 95% протягом 3 місяців, SLA по багфіксах.
Наша команда має 10-річний досвід в Computer Vision та NLP і реалізувала понад 50 проектів з Document Understanding. Ми гарантуємо, що система впишеться у ваш ландшафт без зриву строків. Замовте демо-версію системи для тестування на ваших документах. Зв'яжіться з нами для оцінки вашого проекту — підготуємо прототип за 2 тижні. Ми пропонуємо рішення під ключ: входить навчання моделі, інтеграція та супровід. Вартість рішення — від 1 000 000 грн залежно від складності. Напишіть нам — оцінимо ваш проект безкоштовно.







