AI в юриспруденции: анализ документов, Legal AI

AI для юристов: анализ контрактов, юридический поиск, due diligence, генерация документов, риски галлюцинаций и ответственность

Юриспруденция — одна из профессий с самым большим разрывом между тем, сколько стоит труд специалиста, и тем, сколько рутинной работы этот труд составляет. Старший партнёр за $1 000 в час не должен читать 300 однотипных контрактов в поисках одной рискованной оговорки. Именно здесь AI меняет уравнение: анализ документов, поиск прецедентов, due diligence при сделках M&A — задачи, где нейросеть работает быстрее, дешевле и без усталости. При этом юридический AI имеет специфическую и хорошо задокументированную проблему: модели галлюцинируют ссылки на несуществующие судебные решения. Один американский адвокат уже был оштрафован судом именно за это. Разберём, как использовать AI в праве — и как не попасть в ловушку фиктивных цитат.

Представьте, что вам нужно проверить договор аренды перед подписанием. Можно нанять юриста за 10 000 рублей, а можно попросить AI прочитать документ и объяснить, где «подводные камни»: одностороннее расторжение, автоматическая пролонгация, скрытые штрафы. AI не заменяет юриста в сложных спорах — но как «первый взгляд» и защита от очевидных ловушек он уже работает. Именно в этом направлении сейчас развивается Legal AI.

Суть за 2 минуты

AI в юриспруденции решает задачи, которые юристы делают руками, но которые по сути являются задачами извлечения паттернов из текста — именно то, в чём LLM (Large Language Model, большая языковая модель) сильны.

Основные применения сегодня:

ЗадачаЧто делает AIЭкономия
Анализ контрактовИзвлекает ключевые условия, находит рискиДо 80% времени на первичный анализ
Юридический поискИщет прецеденты, статьи законов, судебную практикуЧасы → минуты
Due diligenceПроверяет сотни документов при сделках M&AНедели → дни
Генерация документовDrafts контрактов, NDA, меморандумов по шаблонуЧас → минуты
СуммаризацияКраткое изложение длинных договоров и судебных решенийЧитать 200 страниц → 2 минуты

Главные инструменты:

  • Harvey — специализированный юридический AI, партнёрство с Allen & Overy (один из крупнейших юрфирм мира)
  • CoCounsel (Thomson Reuters) — AI-ассистент для юристов на базе GPT-4
  • Casetext (приобретён Thomson Reuters) — поиск по судебной практике США
  • Lexis+ AI (LexisNexis) — AI поверх базы Lexis, крупнейшей правовой базы данных
  • КонсультантПлюс AI — поиск с элементами AI по российскому законодательству
  • Гарант — аналогичный продукт для российского рынка с AI-поиском
В 2023 году американский адвокат Стивен Шварц подал в суд документ, содержавший ссылки на шесть судебных решений, найденных через ChatGPT. Все шесть дел оказались несуществующими — AI их придумал. Суд наложил штраф $5 000. Это не теоретический риск: в юридическом контексте галлюцинации AI могут стоить вам карьеры и репутации.

Анализ и рецензия контрактов

Анализ договоров — первая и наиболее зрелая область применения юридического AI. Причина: контракт — структурированный текст с предсказуемыми элементами (стороны, предмет, цена, ответственность, расторжение), и задача «найди нестандартные или рискованные условия» хорошо решается языковыми моделями.

Что AI делает при анализе контракта

Извлечение ключевых условий (clause extraction). AI читает договор и структурирует его: кто стороны, каков предмет, какова цена, каковы условия оплаты, срок действия, условия расторжения, штрафные санкции, подсудность. Это превращает 30-страничный договор в структурированную таблицу за 30 секунд.

Выявление рисков. AI сравнивает условия договора с базовыми рыночными стандартами и флагирует отклонения: одностороннее право расторжения у контрагента, исключение ответственности за умысел, необычные условия о переходе права собственности, ограничение возмещения убытков.

Сравнение с шаблоном (redline comparison). Юрист загружает стандартный шаблон компании и договор контрагента — AI показывает все отличия и оценивает, насколько каждое отличие выгодно или невыгодно вашей стороне.

Многоязычный анализ. AI без дополнительных усилий работает с контрактами на английском, немецком, французском, русском — важно для международных сделок.

Без техники
Ручной анализ контракта: • Юрист читает 40 страниц: 2-3 часа • Риск пропустить нетипичную оговорку в середине приложения • Параллельный анализ 50 контрактов при M&A: 2-3 недели команды • Унифицировать выводы по 50 контрактам — ещё день работы • Усталость к концу рабочего дня — больше пропущенных рисков
С техникой
Анализ контракта с AI: • 40 страниц — структурированное резюме за 2-3 минуты • AI флагирует все отклонения от стандарта, ничего не пропускает • 50 контрактов при M&A: анализ за несколько часов • Единый формат выводов — легко сравнивать • Консистентность: 50-й контракт анализируется так же внимательно, как первый

Практический промпт для анализа договора

ПромптЮрист → AI: анализ рискованных условий
Ты опытный корпоративный юрист. Проанализируй следующий договор поставки и выдели:
1. ВСЕ условия, отклоняющиеся от рыночного стандарта в пользу поставщика
2. Условия, которые могут создать значительные финансовые риски для покупателя
3. Отсутствующие стандартные условия (что упущено)
Для каждого пункта: процитируй конкретное условие, объясни риск, предложи формулировку для переговоров.

[текст договора]
Ответ модели

Риски в пользу поставщика:

  1. п. 8.3 — одностороннее изменение цены: «Поставщик вправе изменить цену, уведомив за 5 рабочих дней». Риск: неконтролируемый рост цен. Рекомендация: заменить на «изменение цены только по соглашению сторон» или «не более X% в квартал».

  2. п. 11.2 — ограничение ответственности: «Ответственность поставщика не превышает стоимости партии». Риск: не покрывает убытки от простоя производства. Рекомендация: включить прямые убытки и упущенную выгоду.

Отсутствуют: условия о гарантийном сроке, порядок разрешения разногласий по качеству, форс-мажор.

Юридический поиск и исследование

Legal research (юридическое исследование) — поиск прецедентов, статей законов, судебной практики, доктринальных источников — традиционно занимает значительную часть рабочего времени юриста, особенно при подготовке позиции по сложному делу.

Как AI меняет юридический поиск

До AI юрист делал это вручную через Westlaw, LexisNexis, КонсультантПлюс или Гарант: формировал запросы, читал сотни нерелевантных документов, отбирал нужное. AI-слой поверх этих баз позволяет:

  • Задавать вопросы естественным языком: «Какова практика судов по спорам о взыскании неустойки в размере выше двукратной ставки рефинансирования?»
  • Получать структурированный ответ со ссылками на конкретные дела и нормы
  • Автоматически находить противоречия в судебной практике: «В одних округах суды считают так, в других — иначе»
  • Отслеживать изменения в законодательстве, релевантные для конкретной практики

Casetext / CoCounsel (Thomson Reuters) — наиболее зрелый инструмент для американского права: позволяет загрузить документы дела и задавать вопросы в контексте всей базы судебной практики США.

Lexis+ AI — аналогичный инструмент от LexisNexis: AI поверх крупнейшей правовой базы данных мира.

Российский рынок: КонсультантПлюс и Гарант

КонсультантПлюс и Гарант — два доминирующих игрока на российском рынке справочных правовых систем. Оба активно внедряют AI-функции:

  • КонсультантПлюс добавил семантический поиск и AI-ассистента «Антон» для объяснения сложных норм
  • Гарант развивает AI-поиск по судебной практике и нормативным актам
  • Оба пока уступают западным аналогам по качеству AI-слоя, но покрывают российское право несравнимо полнее

Для задач по российскому праву связка «Консультант/Гарант + ChatGPT/Claude для анализа и формулировок» на практике работает лучше, чем любой зарубежный инструмент.

Due Diligence при сделках M&A

Due diligence (правовая проверка) при слиянии и поглощении — один из самых ресурсоёмких процессов в корпоративной юриспруденции. Средняя сделка M&A может включать проверку 500–5 000 документов: договоров, лицензий, корпоративных решений, судебных дел, регуляторных разрешений.

Генерация юридических документов

AI способен создавать черновики типовых юридических документов по шаблону и инструкциям. Важный акцент: черновик, требующий проверки юриста, — не финальный документ.

Что хорошо получается:

  • NDA (соглашение о неразглашении) — один из самых типовых документов
  • Договор возмездного оказания услуг, подряда, поставки — по заданным условиям
  • Претензии и письма
  • Юридические меморандумы — анализ правового вопроса по собранным материалам
  • Процессуальные документы — первый драфт по фабуле дела

Что требует особой осторожности:

  • Документы с жёсткими формальными требованиями (нотариально удостоверяемые сделки, государственная регистрация)
  • Специализированные области: налоговое структурирование, санкционное compliance, РДКБ
  • Любой документ, который идёт «в бой» без правки юриста
ПромптЮрист → AI: драфт NDA
Составь NDA (соглашение о неразглашении конфиденциальной информации) между двумя компаниями — ООО «Альфа» (раскрывающая сторона) и ООО «Бета» (получающая сторона) — в рамках переговоров о возможном партнёрстве в сфере разработки ПО.
Условия: срок действия соглашения — 3 года, срок конфиденциальности — 5 лет после окончания соглашения, подсудность — Арбитражный суд г. Москвы, применимое право — российское.
Стандартные исключения из режима конфиденциальности включи. Документ должен быть готов к использованию как основа для согласования.
Ответ модели

СОГЛАШЕНИЕ О КОНФИДЕНЦИАЛЬНОСТИ

г. Москва «__» ________ 2026 г.

ООО «Альфа»... и ООО «Бета»... заключили настоящее соглашение о нижеследующем:

  1. ПРЕДМЕТ СОГЛАШЕНИЯ 1.1. Стороны обязуются соблюдать конфиденциальность в отношении информации, раскрытой в рамках переговоров о партнёрстве...

[полный текст документа на ~2 страницы со всеми стандартными разделами]

Риски галлюцинаций: дело Mata v. Avianca

Это самый важный раздел для любого юриста, рассматривающего AI-инструменты.

Что произошло

В 2023 году нью-йоркский адвокат Стивен Шварц и его партнёр Питер Лодука представляли истца в деле Mata v. Avianca Airlines. При подготовке документов для суда Шварц использовал ChatGPT для юридического исследования. Модель предоставила ссылки на шесть судебных решений с детальными цитатами и фактическими обстоятельствами.

Проблема: ни одно из шести дел не существовало. ChatGPT галлюцинировал несуществующие судебные решения, включая несуществующих судей, несуществующие даты и несуществующие правовые выводы.

Когда суд запросил полные тексты решений, Шварц обратился к ChatGPT с вопросом «существуют ли эти дела?» — и модель подтвердила их существование. Обман вскрылся. Суд провёл слушание, оштрафовал адвокатов на $5 000 каждого и обязал направить решение всем судьям, упомянутым в фиктивных делах.

Почему это происходит

LLM обучены предсказывать следующий токен, наиболее вероятный в контексте. Когда модель не знает ответа, она не говорит «не знаю» — она генерирует правдоподобный ответ. Для юридических ссылок «правдоподобный» означает: реальное название суда + реальное имя судьи + реальный год + правдоподобный номер дела + логичная правовая позиция. Всё это существует по отдельности — но конкретное сочетание выдумано.

Любую ссылку на судебное решение, полученную от AI (ChatGPT, Claude, Gemini, Harvey, CoCounsel — неважно), ОБЯЗАТЕЛЬНО верифицировать в первоисточнике: КонсультантПлюс, Гарант, ГАС «Правосудие», Westlaw, Lexis, официальные базы судов. Это не рекомендация — это профессиональный стандарт. AI-инструменты, специально обученные для юридических задач (Harvey, CoCounsel), имеют встроенную верификацию и ссылаются только на документы из проверенных баз — но даже они требуют проверки критически важных ссылок.

Как Harvey и CoCounsel снижают этот риск

Harvey и CoCounsel решают проблему галлюцинаций архитектурно: модель отвечает только на основе документов из верифицированной правовой базы (Westlaw для США, локальные базы для других юрисдикций). Это RAG (Retrieval-Augmented Generation — генерация с поиском по базе знаний): сначала база данных находит релевантные документы, затем модель формулирует ответ, ссылаясь только на них. Если документа нет в базе — модель не цитирует его.

Но и это не гарантия от всех ошибок: модель может неверно интерпретировать найденный реальный документ.

Ответственность и этика

Юридический AI поднимает острые вопросы об ответственности и профессиональной этике.

Кто отвечает за ошибку AI в юридическом документе? В большинстве юрисдикций — адвокат, подписавший документ. Дело Шварца это подтвердило: суд не принял аргумент «мне сказал ChatGPT». Использование AI не освобождает от профессиональной ответственности.

Стандарт компетентности. В США Американская ассоциация адвокатов (ABA) в 2023 году разъяснила: обязанность компетентности включает понимание возможностей и ограничений AI-инструментов. Применять AI, не зная о риске галлюцинаций — это нарушение стандарта компетентности.

Конфиденциальность. Загружая документы клиента в внешний AI-сервис (ChatGPT, Claude.ai и т.д.), юрист потенциально нарушает адвокатскую тайну. Корпоративные версии (ChatGPT Enterprise, Claude for Enterprise, Harvey) обеспечивают изоляцию данных — но и здесь нужна проверка условий сервиса на соответствие регуляторным требованиям.

Плюсы

  • Скорость: анализ 100 контрактов за часы вместо недель
  • Доступность: юридический анализ становится доступнее для малого бизнеса
  • Консистентность: AI не устаёт и применяет одинаковые критерии к каждому документу
  • Масштаб: due diligence при крупных сделках ускоряется в разы
  • Экономия: младший юрист с AI делает работу старшего за меньшее время

Минусы

  • Галлюцинации ссылок: риск фиктивных судебных решений — реальный и задокументированный
  • Ответственность остаётся у юриста: AI не несёт профессиональной ответственности
  • Конфиденциальность: загрузка документов клиента в внешние сервисы — юридический риск
  • Устаревшие данные: модель не знает о последних изменениях в законодательстве
  • Юрисдикционная ограниченность: западные инструменты плохо работают с российским правом

Практические промпты для юристов

Вот промпты, которые юристы могут использовать прямо сейчас:

1. Суммаризация договора:

Сделай структурированное резюме этого договора: стороны, предмет, ключевые финансовые условия,
срок, условия расторжения, ответственность сторон, подсудность.
Выдели жирным всё нестандартное или потенциально рискованное для [сторона X].
[текст договора]

2. Анализ конкретного пункта:

Проанализируй п. [X.X] этого договора. Насколько типична такая формулировка
для [тип договора]? Какие риски она создаёт для [сторона]?
Предложи 2-3 альтернативных формулировки от умеренной до строгой позиции.
[пункт договора]

3. Чеклист due diligence:

Составь чеклист документов для due diligence при покупке 100% доли в российском ООО,
ведущем деятельность в сфере [отрасль]. Организуй по разделам: корпоративные документы,
договорная база, судебные дела, интеллектуальная собственность, налоги, трудовые отношения.

4. Объяснение нормы:

Объясни простым языком, как работает ст. 333 ГК РФ (снижение неустойки судом).
Какие условия нужны для применения? Какова текущая практика арбитражных судов?
Ответь как опытный процессуалист, объясняющий клиенту.

Если вы разрабатываете юридический AI-продукт, ключевой вызов — не сам LLM, а верификация ссылок и работа с правовыми базами данных.

┌─────────────────────────────────────────────────────────────────┐
│                    Legal AI Pipeline                             │
│                                                                  │
│  ┌──────────────┐   ┌─────────────────┐   ┌──────────────────┐  │
│  │  Документ    │──▶│ Document Parser  │──▶│  Chunking +      │  │
│  │  (PDF/DOCX)  │   │ (PyMuPDF/        │   │  Embedding       │  │
│  └──────────────┘   │  python-docx)    │   │  (text-emb-3)    │  │
│                     └─────────────────┘   └────────┬─────────┘  │
│                                                    │             │
│  ┌──────────────┐   ┌─────────────────┐   ┌────────▼─────────┐  │
│  │  Запрос      │──▶│ Legal RAG:       │──▶│  LLM (Claude /   │  │
│  │  юриста      │   │ retrieve docs   │   │  GPT-4) + prompt │  │
│  └──────────────┘   │ from vector DB  │   └────────┬─────────┘  │
│                     └─────────────────┘            │            │
│                                                    │             │
│  ┌─────────────────────────────────────────────────▼──────────┐  │
│  │  Citation Verifier: каждая ссылка проверяется по базе     │  │
│  │  Если не найдена — убрать из ответа или пометить [!]      │  │
│  └────────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘

Парсинг юридических документов

import re
from pathlib import Path
import pymupdf  # PyMuPDF
from docx import Document


def parse_legal_document(file_path: str) -> dict:
    """
    Parse legal document (PDF or DOCX) into structured sections.
    Returns dict with metadata and text chunks.
    """
    path = Path(file_path)
    suffix = path.suffix.lower()

    if suffix == ".pdf":
        text = _parse_pdf(str(path))
    elif suffix in (".docx", ".doc"):
        text = _parse_docx(str(path))
    else:
        raise ValueError(f"Unsupported format: {suffix}")

    return {
        "filename": path.name,
        "full_text": text,
        "sections": _extract_sections(text),
        "clauses": _extract_numbered_clauses(text),
        "parties": _extract_parties(text),
        "dates": _extract_dates(text),
    }


def _parse_pdf(path: str) -> str:
    doc = pymupdf.open(path)
    return "\n".join(page.get_text() for page in doc)


def _parse_docx(path: str) -> str:
    doc = Document(path)
    return "\n".join(p.text for p in doc.paragraphs if p.text.strip())


def _extract_sections(text: str) -> list[dict]:
    """Extract numbered sections from contract."""
    # Match patterns like "1. ", "1.1 ", "Article 1.", "Раздел 1."
    pattern = r"(?:^|\n)((?:Article|Раздел|Статья|Section)?\s*\d+(?:\.\d+)*\.?\s+[А-ЯA-Z][^\n]{10,80})"
    matches = re.findall(pattern, text, re.MULTILINE)
    return [{"heading": m.strip()} for m in matches]


def _extract_numbered_clauses(text: str) -> dict[str, str]:
    """
    Extract individual numbered clauses for targeted analysis.
    e.g. {"8.3": "Поставщик вправе изменить цену..."}
    """
    clauses = {}
    # Match "8.3. Text of clause until next numbered item or blank line"
    pattern = r"(\d+\.\d+)[\.\s]+([^\n]+(?:\n(?!\d+\.\d+)[^\n]+)*)"
    for match in re.finditer(pattern, text):
        clause_num = match.group(1)
        clause_text = re.sub(r"\s+", " ", match.group(2)).strip()
        clauses[clause_num] = clause_text
    return clauses


def _extract_parties(text: str) -> list[str]:
    """Extract party names from contract preamble."""
    # Russian legal entities: ООО, АО, ПАО, ИП
    pattern = r"(?:ООО|АО|ПАО|ЗАО|ИП)\s+[«"]([^»"]+)[»"]"
    return list(set(re.findall(pattern, text)))


def _extract_dates(text: str) -> list[str]:
    """Extract dates in Russian format."""
    pattern = r"\d{1,2}\s+(?:января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря)\s+\d{4}\s+г(?:ода)?\."
    return re.findall(pattern, text, re.IGNORECASE)

Contract Analysis API

import anthropic
import json

client = anthropic.Anthropic()

CONTRACT_ANALYSIS_PROMPT = """Ты опытный корпоративный юрист. Проанализируй договор и верни структурированный JSON.

ВАЖНО:
- Цитируй конкретные пункты договора при выявлении рисков
- Не добавляй информацию, которой нет в тексте
- Отмечай RISK_HIGH / RISK_MEDIUM / RISK_LOW для каждого риска

Анализируемый договор:
{contract_text}

Верни строго JSON без пояснений:
{{
  "contract_type": "тип договора",
  "parties": [{{"role": "...", "name": "..."}}],
  "subject": "предмет договора",
  "key_terms": {{
    "price": "...",
    "payment_terms": "...",
    "duration": "...",
    "termination": "..."
  }},
  "risks": [
    {{
      "level": "RISK_HIGH|RISK_MEDIUM|RISK_LOW",
      "clause": "номер пункта",
      "description": "описание риска",
      "recommendation": "рекомендация"
    }}
  ],
  "missing_standard_clauses": ["..."],
  "summary": "краткое резюме на 2-3 предложения"
}}"""


def analyze_contract(
    contract_text: str,
    client_side: str = "покупатель",  # с чьей позиции анализировать
) -> dict:
    """
    Analyze contract and return structured risk assessment.

    Args:
        contract_text: Full text of the contract
        client_side: Whose perspective to analyze from

    Returns:
        Structured dict with risks and recommendations
    """
    # Trim to avoid hitting context limits (keep first 100k chars)
    text = contract_text[:100_000]

    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=4096,
        system=f"Анализируй договор с позиции: {client_side}",
        messages=[{
            "role": "user",
            "content": CONTRACT_ANALYSIS_PROMPT.format(contract_text=text),
        }],
    )

    raw = response.content[0].text
    # Extract JSON from response (model may add commentary)
    start = raw.index("{")
    end = raw.rindex("}") + 1
    result = json.loads(raw[start:end])

    # Sort risks by level
    level_order = {"RISK_HIGH": 0, "RISK_MEDIUM": 1, "RISK_LOW": 2}
    result["risks"].sort(key=lambda r: level_order.get(r.get("level", "RISK_LOW"), 3))

    return result

Верификация юридических ссылок

Это самый критически важный компонент для любого юридического AI. Без верификации ссылок — продукт для юристов нельзя выпускать.

import httpx
import re


# Паттерны для распознавания ссылок на судебные решения
CITATION_PATTERNS = {
    "ru_arbitration": r"(?:дело\s+)?[АА]\d{2}-\d{4,5}/\d{4}",        # А40-12345/2023
    "ru_court": r"\d{2}-\d{4,5}/\d{4}",                               # 77-12345/2023
    "us_federal": r"\d+\s+[A-Z][a-z]+\.?\s+\d+\s+\(\w+\.?\s+\d{4}\)", # 123 F.3d 456 (9th Cir. 2020)
    "echr": r"[A-Z][a-z]+\s+v\.\s+[A-Z][a-z]+,?\s+(?:App\. No\.|)\s*\d+",
}


def extract_citations(text: str) -> list[dict]:
    """Extract all legal citations from text."""
    citations = []
    for citation_type, pattern in CITATION_PATTERNS.items():
        for match in re.finditer(pattern, text):
            citations.append({
                "text": match.group(),
                "type": citation_type,
                "position": match.start(),
                "verified": None,  # to be filled by verifier
            })
    return citations


async def verify_ru_citation(case_number: str) -> dict:
    """
    Verify Russian court decision via GAS Pravosudie API.
    Returns verification result with case details if found.
    """
    # ГАС «Правосудие» — официальная база решений судов РФ
    # В реальном продукте: интеграция с API kad.arbitr.ru (арбитраж)
    # или bsr.arbitr.ru (банк судебных решений)
    base_url = "https://kad.arbitr.ru/api/search"

    async with httpx.AsyncClient(timeout=10.0) as http:
        try:
            resp = await http.get(
                base_url,
                params={"number": case_number},
                headers={"User-Agent": "LegalAI-CitationVerifier/1.0"},
            )
            if resp.status_code == 200:
                data = resp.json()
                found = bool(data.get("items"))
                return {
                    "citation": case_number,
                    "verified": found,
                    "source": "kad.arbitr.ru",
                    "details": data.get("items", [{}])[0] if found else None,
                }
        except httpx.RequestError:
            pass

    return {"citation": case_number, "verified": None, "source": "error", "details": None}


def flag_unverified_citations(
    ai_response: str,
    verified_citations: list[dict],
) -> str:
    """
    Add [UNVERIFIED] flag to citations that couldn't be confirmed.
    Critical safety feature for legal AI outputs.
    """
    result = ai_response
    for citation in verified_citations:
        if citation["verified"] is False:
            result = result.replace(
                citation["text"],
                f"{citation['text']} [⚠ НЕ НАЙДЕНО В БАЗЕ — ПРОВЕРИТЬ ВРУЧНУЮ]",
            )
        elif citation["verified"] is None:
            result = result.replace(
                citation["text"],
                f"{citation['text']} [? ВЕРИФИКАЦИЯ НЕДОСТУПНА]",
            )
    return result

Построение правового RAG

from openai import OpenAI
import hashlib
from datetime import datetime

oai = OpenAI()

LEGAL_DOCUMENT_TYPES = [
    "federal_law",         # Федеральный закон
    "civil_code",          # Гражданский кодекс
    "arbitration_case",    # Арбитражное дело
    "court_decision",      # Решение суда общей юрисдикции
    "plenum_resolution",   # Постановление Пленума ВС/ВАС
    "contract_template",   # Шаблон договора
    "legal_commentary",    # Комментарий к законодательству
]


def embed_legal_document(
    text: str,
    doc_type: str,
    jurisdiction: str,       # RU, US, EU
    effective_date: str,     # дата вступления в силу
    source_url: str,
    vector_store,            # Qdrant / pgvector
) -> str:
    """
    Index legal document with metadata critical for legal RAG.
    Metadata determines whether a document is relevant and current.
    """
    if doc_type not in LEGAL_DOCUMENT_TYPES:
        raise ValueError(f"Unknown doc_type: {doc_type}")

    # Chunk legal documents by article/section, not by token count
    # Splitting mid-clause destroys legal meaning
    chunks = _chunk_by_legal_structure(text)

    doc_id = hashlib.sha256(f"{source_url}{effective_date}".encode()).hexdigest()[:16]

    for i, chunk in enumerate(chunks):
        embedding = oai.embeddings.create(
            model="text-embedding-3-large",
            input=chunk,
        ).data[0].embedding

        vector_store.upsert(
            collection_name="legal_knowledge",
            points=[{
                "id": f"{doc_id}_{i}",
                "vector": embedding,
                "payload": {
                    "text": chunk,
                    "doc_type": doc_type,
                    "jurisdiction": jurisdiction,
                    "effective_date": effective_date,
                    "source_url": source_url,
                    "indexed_at": datetime.utcnow().isoformat(),
                    "chunk_index": i,
                    "doc_id": doc_id,
                },
            }],
        )

    return doc_id


def _chunk_by_legal_structure(text: str) -> list[str]:
    """
    Chunk legal text by articles/clauses, not by token count.
    A legal clause must not be split across chunks — it loses meaning.
    """
    # Split on numbered articles (1., 1.1., Article 1., Статья 1.)
    pattern = r"(?=(?:Статья|Article|§)\s+\d+|\n\s*\d+\.\s+[А-ЯA-Z])"
    parts = re.split(pattern, text)
    # Filter empty, keep chunks of reasonable size
    return [p.strip() for p in parts if len(p.strip()) > 50]


def retrieve_legal_context(
    query: str,
    jurisdiction: str,
    doc_types: list[str],
    vector_store,
    top_k: int = 6,
) -> list[dict]:
    """
    Retrieve relevant legal documents with jurisdiction and recency filters.
    """
    query_embedding = oai.embeddings.create(
        model="text-embedding-3-large",
        input=query,
    ).data[0].embedding

    results = vector_store.search(
        collection_name="legal_knowledge",
        query_vector=query_embedding,
        query_filter={
            "jurisdiction": {"$in": [jurisdiction]},
            "doc_type": {"$in": doc_types},
        },
        limit=top_k,
    )

    return [
        {
            "text": r.payload["text"],
            "doc_type": r.payload["doc_type"],
            "source_url": r.payload["source_url"],
            "effective_date": r.payload["effective_date"],
            "score": r.score,
        }
        for r in results
    ]

Eval для юридического AI

from dataclasses import dataclass, field


@dataclass
class LegalAIEvalResult:
    """Метрики качества юридического AI-ответа."""

    # Фактическая точность
    citation_accuracy: float = 0.0       # доля верифицированных ссылок
    hallucinated_citations: int = 0      # количество фиктивных ссылок
    legal_accuracy: float = 0.0          # точность правовых утверждений (ручная оценка)

    # Качество анализа
    risk_recall: float = 0.0             # доля реальных рисков, обнаруженных AI
    risk_precision: float = 0.0          # доля AI-рисков, подтверждённых юристом
    missed_critical_risks: int = 0       # пропущенные критические риски

    # Форматирование и полезность
    structure_score: float = 0.0         # 1-5: структурированность ответа
    actionability_score: float = 0.0     # 1-5: насколько ответ применим на практике

    notes: list[str] = field(default_factory=list)

    @property
    def is_safe_for_production(self) -> bool:
        """
        Минимальные условия для Production: нет фиктивных ссылок,
        нет пропущенных критических рисков, accuracy > 0.9.
        """
        return (
            self.hallucinated_citations == 0
            and self.missed_critical_risks == 0
            and self.legal_accuracy >= 0.9
        )
В Legal AI верификация ссылок — не feature, а обязательный компонент безопасности. Прежде чем выпускать продукт для юристов: (1) интегрируйтесь с официальными базами судебной практики, (2) каждая ссылка в ответе модели должна быть проверена по базе до отображения пользователю, (3) непроверенные ссылки должны быть явно помечены. Иначе ваш продукт создаёт юридическую ответственность для ваших пользователей.

Проверьте себя

Проверьте себя

1. Что произошло в деле Mata v. Avianca (2023) и почему это важно для юристов, использующих AI?

2. Почему Harvey и CoCounsel менее склонны к галлюцинациям ссылок, чем ChatGPT?

3. Юрист использовал AI для анализа договора и обнаружил риск в п. 8.3. Что он должен сделать перед тем, как показать результат клиенту?

Связанные темы

  • AI в здравоохранении — другая профессиональная область с высокими ставками и схожими проблемами ответственности
  • RAG: основы — как построить поиск по правовой базе данных
  • Structured Outputs — структурированные ответы для анализа контрактов
  • Hallucinations и верификация — как детектировать и снижать галлюцинации
  • AI Red Teaming — тестирование безопасности AI-систем

Источники