Відзначимо: коли документ сканується, стандартний 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 грн залежно від складності. Напишіть нам — оцінимо ваш проект безкоштовно.







