Интеграция AI в систему документооборота

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Интеграция AI в систему документооборота
Средняя
от 1 недели до 3 месяцев
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    853
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

AI-интеграция в систему документооборота

Системы электронного документооборота — СЭД, ECM, EDMS — хранят документы, но не понимают их содержимое. Сотрудник получает скан договора → вручную вносит реквизиты → выбирает тип документа → назначает маршрут согласования. AI-интеграция автоматизирует весь этот процесс: документ поступает в систему, AI читает его, извлекает реквизиты, классифицирует, формирует карточку и запускает нужный маршрут.

Архитектура AI-слоя для СЭД

[Входящий документ]
PDF/scan/DOCX/email
         ↓
[Document Preprocessor]
OCR (Tesseract/Google Cloud Vision) → нормализованный текст
         ↓
[AI Processing Pipeline]
  ├── Classification: тип документа
  ├── NER: контрагент, даты, суммы, реквизиты
  ├── Summary: краткое содержание
  └── Routing: определение маршрута согласования
         ↓
[СЭД API]
Создание карточки + запуск workflow

Классификация документов

from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification
import torch

class DocumentClassifier:
    DOCUMENT_TYPES = [
        "договор", "счёт-фактура", "накладная", "акт",
        "приказ", "служебная записка", "коммерческое предложение",
        "доверенность", "устав", "протокол", "письмо входящее"
    ]

    def __init__(self, model_path: str = "cointegrated/rubert-tiny2"):
        # Для production — дообученный BERT на корпусе документов компании
        self.tokenizer = AutoTokenizer.from_pretrained(model_path)
        self.model = AutoModelForSequenceClassification.from_pretrained(
            model_path,
            num_labels=len(self.DOCUMENT_TYPES)
        )
        self.model.eval()

    def classify(self, text: str) -> dict:
        # Берём первые 512 токенов (шапка документа несёт основную семантику)
        inputs = self.tokenizer(
            text[:2000],
            return_tensors="pt",
            truncation=True,
            max_length=512,
            padding=True
        )
        with torch.no_grad():
            logits = self.model(**inputs).logits

        probs = torch.softmax(logits, dim=-1)[0]
        top_idx = probs.argmax().item()

        return {
            "type": self.DOCUMENT_TYPES[top_idx],
            "confidence": float(probs[top_idx]),
            "alternatives": [
                {"type": self.DOCUMENT_TYPES[i], "score": float(probs[i])}
                for i in probs.topk(3).indices.tolist()
                if i != top_idx
            ]
        }

Извлечение реквизитов через NER + LLM

Для структурированных документов (счета, договоры) лучше работает комбинация: NER для быстрого извлечения стандартных полей + LLM для сложных случаев:

from langchain_openai import ChatOpenAI
import re
from datetime import datetime

class DocumentExtractor:
    EXTRACTION_PROMPT = """Извлеки реквизиты из документа.

Текст документа:
{text}

Тип документа: {doc_type}

Извлеки (верни null если не найдено):
- contractor_name: название контрагента
- contractor_inn: ИНН контрагента
- contract_number: номер договора/счёта
- contract_date: дата документа (ISO 8601)
- total_amount: сумма (число)
- currency: валюта (RUB/USD/EUR)
- payment_deadline: срок оплаты (если есть)
- subject: предмет договора (1-2 предложения)
- signatory: подписант со стороны контрагента

Верни JSON."""

    def __init__(self):
        self.llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

    def extract_requisites(self, text: str, doc_type: str) -> dict:
        # Сначала быстрое regex-извлечение
        fast_extract = self._regex_extract(text)

        # LLM для пропущенных полей и валидации
        llm_result = self.llm.invoke(
            self.EXTRACTION_PROMPT.format(
                text=text[:3000],
                doc_type=doc_type
            )
        )

        import json
        llm_data = json.loads(llm_result.content)

        # Мерджим: regex имеет приоритет для числовых полей (точнее)
        return {**llm_data, **fast_extract}

    def _regex_extract(self, text: str) -> dict:
        result = {}

        # ИНН: 10 или 12 цифр
        inn_match = re.search(r'\bИНН[:\s]*(\d{10,12})\b', text)
        if inn_match:
            result["contractor_inn"] = inn_match.group(1)

        # Суммы с валютой
        amount_match = re.search(
            r'(\d[\d\s,]*\.?\d*)\s*(руб|рублей|RUB|USD|EUR)',
            text, re.IGNORECASE
        )
        if amount_match:
            amount_str = amount_match.group(1).replace(' ', '').replace(',', '.')
            result["total_amount"] = float(amount_str)

        return result

Интеграция с популярными СЭД

class SEDIntegration:
    """Интеграция с 1С:Документооборот, Directum, DocsVision"""

    def push_to_directum(self, extracted: dict, original_file: bytes) -> dict:
        """Создаёт карточку документа в Directum"""
        import requests

        # Загружаем файл
        upload_response = requests.post(
            f"{self.directum_url}/api/v1/documents",
            headers={"Authorization": f"Bearer {self.token}"},
            files={"file": original_file}
        )
        doc_id = upload_response.json()["id"]

        # Заполняем карточку
        card_response = requests.patch(
            f"{self.directum_url}/api/v1/documents/{doc_id}/properties",
            headers={"Authorization": f"Bearer {self.token}"},
            json={
                "DocumentType": extracted["type"],
                "Counterparty": extracted.get("contractor_name"),
                "INN": extracted.get("contractor_inn"),
                "Amount": extracted.get("total_amount"),
                "DocumentDate": extracted.get("contract_date"),
                "Subject": extracted.get("subject")
            }
        )

        # Запускаем маршрут согласования
        route = self._determine_route(extracted)
        requests.post(
            f"{self.directum_url}/api/v1/documents/{doc_id}/workflow/{route}",
            headers={"Authorization": f"Bearer {self.token}"}
        )

        return {"doc_id": doc_id, "route": route}

    def _determine_route(self, extracted: dict) -> str:
        """Определяет маршрут согласования по параметрам документа"""
        amount = extracted.get("total_amount", 0)
        doc_type = extracted.get("type", "")

        if doc_type == "договор":
            if amount > 1_000_000:
                return "contract_large"      # директор + юрист + финансы
            elif amount > 100_000:
                return "contract_medium"     # руководитель + юрист
            else:
                return "contract_standard"   # только руководитель
        elif doc_type == "счёт-фактура":
            return "invoice_approval"
        return "standard"

Кейс: производственная компания, 500 входящих документов в месяц. До внедрения: 2 оператора тратили 40% рабочего времени на ручной ввод реквизитов. После: точность автоматического извлечения реквизитов 94% (проверка на 1000 документов), 89% документов обрабатываются без участия оператора, операторы занимаются только исключениями (confidence < 0.8) и проверкой спорных маршрутов. Время обработки входящего документа: 8 минут → 45 секунд.

Сроки

  • Классификатор + экстрактор реквизитов: 3–4 недели
  • Интеграция с конкретной СЭД: 2–3 недели
  • Дообучение моделей на документах клиента: 1–2 недели дополнительно