Автоматизация автозаполнения форм из документов: Donut, LLM и PyTorch

Отметим: когда документ сканируется, стандартный OCR выдаёт плоский текст без структуры. Адрес может оказаться в поле «ФИО», а дата — в примечании. Такая ситуация типична для бухгалтерии, где на ручной ввод данных тратятся часы. Мы решаем эту проблему с помощью пайплайна Document Understanding — он

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1302
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    714
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1006

Отметим: когда документ сканируется, стандартный OCR выдаёт плоский текст без структуры. Адрес может оказаться в поле «ФИО», а дата — в примечании. Такая ситуация типична для бухгалтерии, где на ручной ввод данных тратятся часы. Мы решаем эту проблему с помощью пайплайна Document Understanding — он не просто распознаёт символы, но и понимает, где что находится. На практике это ускоряет ввод данных в 5–10 раз и снижает количество ошибок на 70%. Для отдела из пяти операторов экономия может достигать $14k–20k в год. Система окупается за 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% Максимальная Средняя Основной пайплайн
Процесс работы
  1. Анализ типов документов — собираем 50–100 образцов каждого типа, размечаем поля вручную.
  2. Выбор модели — для частых типов дообучаем LayoutLM, для редких — настраиваем few-shot промпты для LLM.
  3. Интеграция — подключаем REST API к вашей CRM или ERP (1С, Bitrix24, самописные системы).
  4. Тестирование — прогоняем 500+ документов, измеряем precision/recall. Если точность ниже 90% — дорабатываем.
  5. Деплой — разворачиваем на ваших серверах или в облаке (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 недели.