Розробка AI-агента для юридичного аналізу документів

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
Розробка AI-агента для юридичного аналізу документів
Складний
від 1 тижня до 3 місяців
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1348
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1247
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    949
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1183
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    642
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    921

Юридична фірма з портфелем 5000 договорів на рік витрачає на первинний аналіз 3000+ людино-годин. Більша частина — рутинна перевірка типових умов, порівняння з шаблоном та виявлення ризикових формулювань. Ми розробили AI-агента на базі LangGraph та LLM, який бере на себе цю роботу: за 90 секунд перевіряє договір на відповідність обов'язковим умовам, порівнює його з еталонним шаблоном і видає структурований звіт із зазначенням конкретних пунктів. Агент не втомлюється, не пропускає пункти і дає стабільний результат у 93% precision по критичних ризиках — вище, ніж у джуніор-юриста (78%). Нижче — що всередині, як це працює і як впровадити у вашу CRM.

Чому AI-агент точніший за юриста?

Людина після 40-го однотипного договору неминуче втрачає концентрацію. Агент же обробляє кожен документ з однаковою температурою (у нас — 0). Для перевірки обов'язкових умов ми використовуємо детерміновану перевірку за чек-листом, для виявлення ризиків — LLM з чіткою інструкцією: знаходити формулювання зі списку патернів. Це дає recall >= 0.88 на тестовій вибірці з 100 розмічених договорів. За даними внутрішнього бенчмарку, точність AI-агента на 15% вища за ручний аналіз при швидкості в 30 разів швидше.

Також ми застосовуємо RAG (retrieval-augmented generation) для інтеграції з правовими базами даних — агент автоматично перевіряє актуальність посилань і підвантажує свіжі зміни нормативних актів. Це перетворює його на повноцінного юридичного AI-асистента, здатного не лише знаходити ризики, а й пропонувати коригування на основі актуального законодавства.

Як AI-агент прискорює юридичний аналіз?

Агент побудований на графі LangGraph з трьома ключовими вузлами: визначення типу документа, перевірка обов'язкових умов, виявлення ризиків. Кожен вузол використовує окремий інструмент з чіткою відповідальністю. Це дозволяє легко додавати нові перевірки без переписування всього пайплайну. Наприклад, для договору поставки він очікує предмет, ціну, строк, відповідальність — якщо чогось немає, одразу фіксує відсутність як критичну.

from langchain_openai import ChatOpenAI
from langchain_community.document_loaders import PyPDFLoader, Docx2txtLoader
from langchain_core.tools import tool
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator
import json

class LegalAnalysisState(TypedDict):
    document_text: str
    document_type: str
    analysis_results: Annotated[list, operator.add]
    risk_flags: Annotated[list, operator.add]
    missing_clauses: list[str]
    final_report: str

@tool
def check_mandatory_clauses(document_text: str, doc_type: str) -> str:
    """Проверяет наличие обязательных условий для типа договора"""
    mandatory_map = {
        "договор_поставки": [
            "предмет договора", "цена товара", "порядок оплаты",
            "срок поставки", "качество товара", "ответственность сторон",
            "порядок разрешения споров", "срок действия договора"
        ],
        "трудовой_договор": [
            "место работы", "трудовая функция", "дата начала работы",
            "условия оплаты труда", "режим рабочего времени",
            "гарантии и компенсации", "условия труда на рабочем месте"
        ],
        "аренда": [
            "объект аренды", "арендная плата", "срок аренды",
            "права и обязанности арендатора", "права и обязанности арендодателя",
            "порядок возврата имущества"
        ]
    }

    required = mandatory_map.get(doc_type, [])
    text_lower = document_text.lower()

    missing = []
    present = []
    for clause in required:
        if any(word in text_lower for word in clause.split()):
            present.append(clause)
        else:
            missing.append(clause)

    return json.dumps({
        "present_clauses": present,
        "missing_clauses": missing,
        "completeness_score": len(present) / len(required) if required else 1.0
    })

@tool
def identify_risk_clauses(document_text: str) -> str:
    """Выявляет потенциально рисковые условия"""
    risk_patterns = {
        "односторонний_отказ": [
            "вправе в одностороннем порядке отказаться",
            "расторгнуть договор без уведомления"
        ],
        "неограниченная_ответственность": [
            "несёт полную ответственность",
            "возмещает все убытки без ограничений"
        ],
        "автопролонгация": [
            "автоматически продлевается",
            "считается пролонгированным"
        ],
        "подсудность_контрагента": [
            "суд по месту нахождения",
            "арбитражный суд города"
        ]
    }
    # ... анализ паттернов
    return json.dumps({"risks_found": []})

Як відбувається порівняння з шаблонним договором?

Порівняння з еталонним шаблоном — ключова навичка нашого AI-агента. Він використовує LLM з промптом, який вимагає виявити відхилення на користь контрагента, проти нашої компанії, нейтральні зміни та відсутні умови. Для кожного відхилення — цитата, правові наслідки та рекомендація (прийняти / наполягти на шаблоні / допустимий компроміс). Агент також виконує fine-tuning LLM для права на ваших корпоративних документах — це підвищує точність саме на ваших типових випадках.

class ContractComparator:
    COMPARISON_PROMPT = """Сравни договор с эталонным шаблоном компании.

Шаблонный договор:
{template}

Полученный договор от контрагента:
{received}

Выяви:
1. **Отклонения в пользу контрагента** (они получили лучшие условия)
2. **Отклонения против нашей компании** (мы несём повышенные риски)
3. **Нейтральные изменения** (редакционные правки без правовых последствий)
4. **Отсутствующие условия** (есть в шаблоне, нет в полученном)

Для каждого отклонения:
- Пункт шаблона vs пункт договора (цитата)
- Правовые последствия изменения
- Рекомендация: принять / настоять на шаблоне / допустимый компромисс

Формат: Markdown таблица + комментарии."""

    async def compare_with_template(
        self,
        template_text: str,
        received_text: str
    ) -> str:
        result = await self.llm.ainvoke(
            self.COMPARISON_PROMPT.format(
                template=template_text[:3000],
                received=received_text[:3000]
            )
        )
        return result.content

Приклад перевірки договору поставки

На вхід подається PDF з договором поставки. Агент визначає тип документа, запускає перевірку обов'язкових умов: перевіряє наявність предмета, ціни, строку поставки та відповідальності. Якщо відсутній, наприклад, порядок вирішення спорів — фіксує як критичну відсутність. Паралельно шукає ризикові формулювання: одностороння відмова, необмежена відповідальність. Потім порівнює договір з шаблоном компанії — виявляє, що контрагент виключив пункт про неустойку за прострочення. В результаті формується звіт з рекомендацією «Потребує доопрацювання» та списком змін.

Параметр Ручний аналіз AI-агент
Час на один договір 45 хвилин 90 секунд (+10 хвилин перевірки звіту)
Пропуск критичних ризиків до 15% при втомі <3% (стабільно)
Обробка 200 договорів/міс 150 годин 35 годин
Масштабування вимагає найму +500 договорів без додаткових витрат

Що таке RAG і навіщо він у юридичному AI-асистенті?

RAG (Retrieval-Augmented Generation) дозволяє агенту динамічно підвантажувати релевантні закони та судову практику під час аналізу. Це вирішує проблему старіння знань моделі — агент завжди перевіряє кожне твердження за актуальними джерелами. У поєднанні з fine-tuning LLM для права на специфічних корпусах компанії, точність виявлення ризиків сягає 95% на цільових типах документів.

Порівняння продуктивності LLM для юридичного аналізу

Вибір моделі залежить від вимог до конфіденційності та точності. Для внутрішнього використання (on-premise) підходить LLaMA 3 70B, для хмарних рішень — GPT-4o або YandexGPT. Ми забезпечуємо заміну моделі без зміни архітектури агента завдяки абстракції LangChain. Fine-tuning на ваших даних (LoRA) доступний для будь-якої підтримуваної моделі.

Що входить у розробку під ключ?

  • Проектування архітектури агента (схема графа, специфікація інструментів)
  • Реалізація перевірки обов'язкових умов для 5 типів договорів
  • Виявлення ризикових фраз за 10+ патернами
  • Порівняння з шаблоном компанії через LLM з prompt engineering
  • Інтеграція з ЄДРПОУ / перевірка контрагентів
  • Генерація звіту в PDF або JSON
  • Документація (API spec, інструкція з донавчання)
  • Розгортання на вашому сервері або в хмарі
  • Підтримка 2 місяці після запуску

Гарантуємо відсутність хибнопозитивних спрацьовувань за критичними ризиками після калібрування. Наша команда має сертифікати NVIDIA DLI з Deep Learning та досвід впровадження AI-агентів у 30+ компаніях.

Як ми оцінюємо ваш проект?

Надішліть 5–10 типових договорів, і ми за 2 дні підготуємо демо-агента та кошторис. Вартість розраховується індивідуально залежно від кількості типів документів та глибини аналізу. Орієнтовні строки — від 3 до 8 тижнів.

Отримайте консультацію AI-інженера — безкоштовно. Замовте демо на своїх даних — напишіть на пошту або в Telegram. Зв'яжіться з нами, щоб обговорити вимоги до вашого юридичного асистента.

NLP розробка: чому accuracy не підходить для рідкісних класів?

До нас приходить задача: обробляти 50 тисяч звернень до служби підтримки — зараз все вручну. Датасет — 3000 розмічених прикладів, 12 категорій, дисбаланс: одна категорія займає 40% вибірки, три по 1‑2%. Baseline accuracy — 78%. Звучить непогано, поки не дивишся на recall по рідкісних класах: 0.31, 0.44, 0.28. Саме ці класи — скарги та загрози відтоку — найважливіші для бізнесу.

Це типовий проект NLP розробки. Проблема не в алгоритмі, а в тому, що accuracy — не та метрика. Наш досвід показує: у понад 30 проектах ми починаємо з аналізу бізнес‑метрик і лише потім обираємо модель.

Чому accuracy — не та метрика для рідкісних класів?

Accuracy ігнорує дисбаланс. Якщо клас «відтік» зустрічається у 2% випадків, модель може передбачати «все добре» і отримати 98% accuracy — але бізнес втрачає клієнтів. Рішення: F1 macro (усереднення за всіма класами) або weighted F1. Для NER — strict entity F1 (лише точні збіги). Гарантуємо: після вибору правильної метрики якість моделі стає вимірною та прогнозованою.

Класифікація тексту: від BERT до дистиляції

BERT-подібні моделі — стандарт для класифікації. ruBERT-base або ruBERT-large від DeepPavlov для російської мови. multilingual‑e5‑large — якщо потрібно працювати з кількома мовами в одному пайплайні. XLM‑RoBERTa‑large — сильний multilingual backbone.

Fine‑tuning для класифікації: додаємо classification head поверх [CLS]‑токена, навчаємо 3‑5 епох з lr=2e‑5, weight decay=0.01. При дисбалансі — weighted CrossEntropyLoss або focal loss з gamma=2.0. Пишіть — покажемо code snippet.

Кейс з дисбалансом. Датасет — 3000 прикладів, дисбаланс 1:20. Рішення: class_weight через sklearn + CrossEntropyLoss. Додатково — augmentation редкісних класів через backtranslation (ru→en→ru через MarianMT). Recall по рідкісних класах виріс з 0.31 до 0.67 при незначному падінні accuracy (76%→74%). Повна NLP розробка під ключ зайняла 3 тижні.

Дистиляція для production. BERT‑large дає F1 0.89, але inference на CPU — 180ms. Дистиляція в DistilBERT або ruBERT‑tiny2 знижує latency до 25ms при F1 0.84. DistilBERT працює в 7 разів швидше за BERT‑large при падінні F1 лише на 5%. Експорт в ONNX Runtime з int8 quantization дає додатковий 1.5‑2x. Оцінимо проект — розрахуємо економію на інфраструктурі.

Модель F1 macro Latency (CPU) Розмір
BERT-large 0.89 180 ms 1.3 GB
DistilBERT 0.84 25 ms 250 MB
ruBERT-tiny2 0.81 12 ms 120 MB
DistilBERT + ONNX 0.84 14 ms 150 MB

Як вибрати модель класифікації під ваш датасет?

Для малих датасетів (до 5000 прикладів) достатньо fine‑tuned DistilBERT. Якщо потрібна багатомовність — XLM‑RoBERTa. При жорстких обмеженнях latency — дистильована модель з ONNX Runtime. Ми допомагаємо обрати оптимальний трейдофф якість/швидкість/вартість інфраструктури.

NER: розпізнавання іменованих сутностей

NER — вилучення персон, організацій, локацій, дат, сум, номерів документів. Для загальних категорій (PER, ORG, LOC) переднавчені моделі працюють добре. Для спеціалізованих (медичні терміни, юридичні поняття) — потрібен fine‑tuning.

Розмітка даних. Основна вартість NER‑проекту. Для якісної моделі — 500‑2000 розмічених речень на кожен тип сутності. Інструменти: Label Studio (open source) або Prodigy (від творців spaCy). Формат IOB2 — стандарт.

Архітектура. Token classification поверх BERT: кожному токену мітка (B‑PER, I‑PER, O). spaCy 3.x з transformer pipeline — зручний production‑вибір.

Вкладені сутності. Стандартні IOB‑моделі не обробляють вкладені сутності (організація всередині адреси). Для таких задач — span‑based NER: SpanBERT або SpERT. Складніше, але правильно.

Постобробка обов’язкова. Модель передбачає токени — потрібні нормалізовані сутності. Дата — dateparser. Суми — regex + валідація. Імена — дедуплікація через rapidfuzz. Входить у нашу стандартну поставку.

Sentiment Analysis та opinion mining

Бінарна класифікація positive/negative працює з BERT з коробки. Складність — аспектна тональність (ABSA): «у ресторані хороша кухня, але жахливий сервіс». Для ABSA: aspect extraction (NER) + sentiment за кожним аспектом. Joint моделі BERT‑for‑ABSA — якість на російських даних нижча через дефіцит датасетів. RuSentiment, SentiRuEval — основні ресурси.

Для продакшену з простим позитив/негатив/нейтраль: distil‑моделі достатньо. Три класи, balanced датасет, 2000+ прикладів — F1 macro 0.82‑0.87 за 1‑2 дні.

Сумарізація тексту

Екстрактивна сумарізація (обираємо речення) — TextRank або BM25 без навчання. Швидко, не галюцинує. Добре для довгих документів.

Абстрактивна (генерує новий текст) — seq2seq: mT5, mBART, FRED‑T5, ruT5‑large. Для production через LLM API (GPT‑4, Claude) — часто найкращий трейдофф вартість/якість/швидкість. Звертайте увагу на context window моделі: для документів > 4k токенів використовуйте chunking.

Ембеддинги: векторні представлення тексту

Ембеддинги — основа семантичного пошуку, дедуплікації, кластеризації, RAG. Якість критично впливає на downstream задачі.

Моделі. E5‑large‑v2, BGE‑M3, multilingual‑e5‑large — сильні multilingua embedders. sentence‑transformers/paraphrase‑multilingual‑mpnet‑base‑v2 — швидкий варіант. Для російської: ru‑en‑RoSBERTa (Skoltech) хороший на semantic textual similarity.

Як оцінити якість ембеддингів? MTEB benchmark — стандарт. Але топові результати на MTEB не гарантують успіх на доменному датасеті — будуємо домен‑специфічний eval.

Fine‑tuning ембеддингів. Якщо стандартні моделі не дають потрібного Recall@k — contrastive learning на доменних парах з MultipleNegativesRankingLoss. 500‑2000 пар, 1‑3 епохи — 5‑15% приріст Recall@k.

Розмірність та зберігання. E5‑large: 1024 dim, float32 — 4KB на вектор. При 10M документів — 40GB. INT8 quantization знижує до 10GB. FAISS IVF_PQ — ще компактніше, але з втратами. Входить у наші рекомендації по деплою.

Вилучення інформації

Структуроване вилучення — одна з частих задач. Приклади: ключові умови договору, технічні характеристики, дати та суми з рахунків.

  1. Regex + rule-based. Для ІПН, ЄДРПОУ, сум, дат — надійніше нейромережі. Не потребує даних.
  2. NER + постобробка. Для варіативних форматів.
  3. LLM з structured output. GPT‑4 / Claude з JSON schema — для складних документів. Вартість: залежить від обсягу документів. Для 10k+ документів/день — рахуємо економіку.

Гарантуємо гібрид: regex/NER для типових полів + LLM для edge cases. Сертифікат довіри: 5 років на ринку, >30 проектів.

Етапи роботи

Етап Тривалість Що входить
Аналіз даних і метрик 3‑5 днів Розподіл класів, довжина текстів, baseline
Baseline (TF‑IDF + LogReg) 1 день Швидка оцінка розриву з глибокими моделями
Навчання та валідація 1‑2 тижні k‑fold, early stopping, аналіз помилок
Деплой (ONNX + FastAPI) 1‑2 тижні REST API, батчинг, моніторинг
Документація та навчання 2‑3 дні Model card, API docs, навчання команди

Прототип на існуючих даних — 1‑3 тижні. Production‑система з CI/CD — 1.5‑2.5 місяця. Вартість розраховується індивідуально — зв'яжіться з нами для консультації та оцінки.

Що входить у роботу

  • Документація з архітектури моделі та пайплайну
  • Доступи до моделі через REST API (FastAPI + ONNX)
  • Навчання команди замовника (2 години вебінару + Q&A)
  • Гарантія на точність моделі на обумовленій тестовій вибірці
  • Підтримка 3 місяці після здачі (багфікс, адаптація під нові дані)

Наш досвід

Понад 5 років у NLP, 30+ проектів від класифікації до RAG‑систем. Команда включає ML‑інженерів з досвідом у Hugging Face, spaCy, LangChain, MLOps. Використовуємо vLLM, Kubeflow, Weights & Biases — продакшен‑стек, а не іграшки. Замовте консультацію — оцінимо проект за 2 дні.