Отметим: когда документ сканируется, стандартный OCR выдаёт плоский текст без структуры. Адрес может оказаться в поле «ФИО», а дата — в примечании. Такая ситуация типична для бухгалтерии, где на ручной ввод данных тратятся часы. Мы решаем эту проблему с помощью пайплайна Document Understanding — он не просто распознаёт символы, но и понимает, где что находится. На практике это ускоряет ввод данных в 5–10 раз и снижает количество ошибок на 70%. Для отдела из пяти операторов экономия может достигать 1,5 млн рублей в год. Система окупается за 3–6 месяцев за счёт сокращения трудозатрат.
Проблемы, которые решаем
- Неструктурированный текст после OCR. Классические Tesseract или Google Vision дают сырой текст с координатами, но не знают, что «Иванов» — фамилия, а «123456» — номер паспорта. Мы используем LayoutLM v3, который анализирует и текст, и геометрию блоков.
- Разные шаблоны документов. Накладная от одного поставщика отличается от другого, а паспорт меняет формат страниц. Наш пайплайн классифицирует тип документа и применяет специализированный экстрактор.
- Низкая точность на сложных документах. Счета с таблицами, рукописные пометки, низкое качество скана — всё это ломает обычный OCR. Мы добавляем LLM с vision, который понимает контекст и восстанавливает пропущенное.
Как AI-автозаполнение форм из документов ускоряет ввод данных?
Основой служит трёхзвенный пайплайн: классификация → экстракция → маппинг. Для стандартных типов (паспорт, ИНН) используем 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 сам по себе не решает задачу понимания структуры.
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 недели.







