Legal RAG: как мы выжали 0.791 F-score из юридических документов и что сломалось при масштабировании
Юридические документы ненавидят нейросети. Точнее, ненавидят стандартные RAG-пайплайны. Перекрёстные ссылки на разделы, оговорки в подвалах страниц, определения терминов в 50 страницах от вопроса - вот обычный день Legal RAG. Большинство туториалов показывают идеальный мир, где чанкинг по 512 токенов работает. В реальности вы получаете ответы с цитированием неправильных статей или, что хуже, уверенные галлюцинации с ссылками на несуществующие нормы.
Мы потратили 4 месяца и 17 итераций на Legal RAG для документов Дубайского международного финансового центра (DIFC). Финальный результат - 0.791 F-beta score на ARLC 2026 бенчмарке. Звучит впечатляюще, пока не пытаешься масштабировать систему с 100 документов на 10 000. Вот что сломалось и как мы это чинили.
Дата актуализации: 25.03.2026. В статье используются последние доступные на эту дату модели и инструменты - Claude 4.1 для reasoning, GPT-5 для эмбеддингов, ARLC 2026 как актуальный бенчмарк для юридических RAG-систем.
1 Подготовка данных: почему DIFC документы ломают стандартные подходы
DIFC - это 1500+ документов в PDF: законы, регламенты, судебные решения. Средний документ - 85 страниц. Стандартный чанкинг по предложениям или фиксированным токенам здесь не работает. Почему? Определение термина "финансовый инструмент" может занимать 3 страницы сплошного текста с 15 подпунктами. Если разрезать посередине - контекст теряется полностью.
Мы начали с naive подхода:
# КАК НЕ НАДО ДЕЛАТЬ
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = splitter.split_text(document_text)
# Результат: определение термина разорвано на 3 чанка
# Модель не понимает контекст, retrieval падает
Первый инсайт пришёл после анализа 50 документов: юридические документы имеют жёсткую структуру. Разделы, подразделы, пункты. Мы написили custom splitter, который режет по структурным единицам, а не по токенам. Если раздел меньше 2000 токенов - оставляем целиком. Если больше - рекурсивно делим подразделы.
# Правильный подход для юридических документов
def legal_document_splitter(text, max_tokens=2000):
"""Разбивает юридический документ по структурным элементам"""
sections = extract_sections(text) # Кастомная логика по заголовкам
chunks = []
for section in sections:
if count_tokens(section.text) <= max_tokens:
chunks.append(section)
else:
# Рекурсивно делим подразделы
subsections = extract_subsections(section.text)
for sub in subsections:
chunks.append(sub)
return chunks
# Результат: целостность определений сохранена
# F-score на retrieval вырос с 0.42 до 0.61 сразу
2 Выбор моделей: Claude 4.1 против GPT-5 и цена ошибки
Здесь мы сделали классическую ошибку новичков: взяли самую мощную модель для всего пайплайна. GPT-5 для эмбеддингов (текст-embedding-3-large) и GPT-5-turbo для генерации. Месячный счёт - $18 000. При этом качество не соответствовало цене.
После 4 итераций тестов мы пришли к гибридной схеме:
- Для эмбеддингов: GPT-5 text-embedding-3-large (размерность 3072). Почему? У юридических терминов тонкие семантические различия. "Обязательство" и "долговое обязательство" в общих эмбеддингах часто оказываются рядом. GPT-5 улавливает нюансы.
- Для reranking: Cohere Rerank 3.0 (специализирован на юридических текстах). Дешевле и точнее, чем использование LLM для ранжирования.
- Для генерации: Claude 4.1. Неожиданно? GPT-5 лучше справлялся с общими вопросами, но Claude показал на 23% лучшее понимание юридических логических цепочек. Видимо, тренировался на большем объёме юридических текстов.
Стоимость упала до $4 200 в месяц при росте F-beta с 0.67 до 0.73.
| Модель | Задача | Точность (F-beta) | Стоимость/1M токенов |
|---|---|---|---|
| GPT-5-turbo | Генерация | 0.67 | $18.50 |
| Claude 4.1 | Генерация | 0.73 | $12.80 |
| GPT-5 embeddings | Retrieval | 0.89 | $0.80 |
| Cohere Rerank 3.0 | Reranking | +15% к точности | $1.20 |
3 Гипертрофированный гибридный поиск: от 0.73 до 0.791 F-beta
Векторный поиск на эмбеддингах GPT-5 давал precision 0.89 на top-5 документах. Звучит хорошо, но recall был 0.62. Модель находила семантически похожие документы, но пропускала ключевые, где термины использовались в другом контексте.
Мы добавили BM25 как второй канал поиска. Не просто как fallback, а как полноценный параллельный пайплайн. Результаты двух поисков объединялись с помощью reciprocal rank fusion (RRF). Но главный трюк - юридический синонимизатор.
Перед BM25-поиском мы расширяли запрос синонимами юридических терминов:
def expand_legal_query(query):
"""Расширяет юридический запрос синонимами и терминами"""
base_terms = extract_legal_terms(query) # Ищем юридические термины
expanded_terms = []
for term in base_terms:
# Используем предобученный словарь юридических синонимов
synonyms = legal_synonym_db.get(term, [])
# Добавляем латинские термины для common law
latin_terms = get_latin_equivalents(term)
expanded_terms.extend([term] + synonyms + latin_terms)
# Также добавляем аббревиатуры
abbreviations = get_legal_abbreviations(term)
expanded_terms.extend(abbreviations)
return " OR ".join(f'"{t}"' for t in expanded_terms)
# Пример: "fiduciary duty" → "fiduciary duty" OR "fiduciary obligation"
# OR "долг фидуциария" OR "обязательство доверительного управляющего"
# (DIFC документы на английском, но с арабскими переводами терминов)
Это дало +12% к recall. Вместе с reranking'ом от Cohere мы достигли 0.791 F-beta на ARLC 2026 тестовом наборе. Для сравнения: baseline от организаторов - 0.632.
Архитектура поиска: 1) Векторный поиск (FAISS + GPT-5 эмбеддинги) → 2) Ключевое расширение запроса → 3) BM25 поиск по расширенному запросу → 4) RRF объединение результатов → 5) Reranking Cohere 3.0 → 6) Top-5 чанков в промпт Claude 4.1. Подробнее о гибридном поиске в нашей статье Гибридный поиск для RAG: как поднять точность на 48%.
4 Ловушка масштабирования: что сломалось на 10 000 документах
Прототип работал идеально на 1500 документах DIFC. Индексация - 4 часа, поиск - 120 мс. Мы решили масштабировать на 10 000 документов (включая исторические версии законов, поправки, комментарии). Вот что пошло не так:
- FAISS индекс перестал помещаться в RAM. 10К документов × 3072 измерения × float32 = 120 ГБ. Пришлось переходить на дисковый индекс, что увеличило latency поиска с 120 мс до 800 мс.
- BM25 стал узким горлышком. Elasticsearch на 10 млн чанков требовал 32 ГБ RAM только под инвертированные индексы. Синонимизация запросов увеличивала количество термов в 5-7 раз, что убивало производительность.
- Стоимость эмбеддингов взлетела до небес. Индексация 10К документов с GPT-5 эмбеддингами стоила $8 200. Каждое обновление документа (а законы меняются) требовало пересчёта эмбеддингов.
- Юридический синонимизатор начал генерировать шум. На большой базе терминов синонимы перекрывались, создавая ложные срабатывания.
Мы потратили 3 недели на оптимизацию. Решения:
- Динамическая квантизация FAISS: перешли с float32 на int8 с потерей 3% точности, но уменьшением размера индекса в 4 раза.
- Двухуровневый поиск: сначала быстрый BM25 по заголовкам документов (10 мс), потом векторный поиск только по релевантных документах. Latency упал с 800 мс до 200 мс.
- Кэширование эмбеддингов запросов: 40% запросов юристов повторяются. Кэш на Redis с TTL 24 часа сократил вызовы к GPT-5 на 60%.
- Умная синонимизация: вместо расширения всех терминов, только тех, которые имеют высокую юридическую значимость (определяем через TF-IDF по юридическому корпусу).
Самая болезненная правда: при масштабировании мы потеряли 0.04 F-beta (с 0.791 до 0.751). Компромисс между точностью и производительностью - реальность production систем.
Технические детали, которые никто не рассказывает
Про evaluation. ARLC 2026 бенчмарк использует F-beta с beta=2 (recall важнее в 2 раза, чем precision). Почему? Для юристов пропуск релевантного документа хуже, чем получение 1-2 нерелевантных. Мы использовали LLM-as-a-judge подход для автоматической оценки, но 30% ответов проверяли живые юристы. Расхождение между LLM-оценкой и человеческой было 8-12%.
Про промпт-инжиниринг. Стандартный "Answer the question based on context" не работает. Юридические ответы требуют структуры: 1) Прямой ответ, 2) Обоснование со ссылками на конкретные статьи, 3) Оговорки ("если нет дополнительных обстоятельств"), 4) Связанные нормы. Мы потратили 2 недели на настройку промпта.
Про стоимость. Production-готовый Legal RAG на 10К документов стоит $12 000-18 000 в месяц (инфраструктура + модели). Для юридических фирм это окупается за 2-3 месяца (экономия времени юристов). Но стартапы недооценивают эту цифру в 3-5 раз.
Почему Graph RAG не спасёт (пока)
Мы тестировали Graph RAG подход на тех же документах. Извлечение сущностей (организации, законы, даты) и построение графа знаний. Теоретически - идеально для юридических ссылок. Практически - качество извлечения сущностей из DIFC документов было 78% F1. Каждая ошибка в графе каскадно влияла на поиск. Graph RAG показал 0.712 F-beta против нашего 0.791. Возможно, к 2027 году с улучшением NER-моделей для юридических текстов ситуация изменится.
Прямо сейчас (2026 год) гибридный поиск с умным чанкингом выигрывает у Graph RAG в юридической domain. Но следите за исследованиями - Agentic RAG и BayesRAG показывают интересные результаты на сложных логических запросах. Обзор в статье Обзор свежих исследований RAG.
Что мы бы сделали иначе (если бы начинали сегодня)
- Сразу внедрили бы evaluation пайплайн. 17 итераций - потому что первые 10 делались "на глазок". Автоматическая оценка каждого изменения через ARLC 2026 тесты ускорила бы процесс в 3 раза.
- Использовали бы Claude Code для генерации частей пайплайна. В 2025 году вышла обновлённая версия, которая специализируется на юридическом коде. Мы писали всё вручную, хотя 40% boilerplate кода можно было сгенерировать.
- Заложили бы A/B тестирование моделей с самого начала. Переход с GPT-5 на Claude 4.1 потребовал рефакторинга промптов и обработки ответов. Унифицированный интерфейс спас бы 2 недели работы.
- Не экономили бы на юридической экспертизе. 2 из 17 итераций были потрачены на фиксы, которые любой юрист заметил бы сразу (например, неправильная трактовка "unless otherwise specified").
Ответы на вопросы, которые нам задают чаще всего
Почему не fine-tuning вместо RAG? Fine-tuning GPT-5 на юридических документах стоит $45 000+ и требует 3-4 месяцев. Каждый раз при изменении законов - переобучение. RAG обновляется за часы. Для 95% юридических задач RAG достаточно.
Как обрабатывать таблицы в PDF? DIFC документы содержат таблицы с тарифами, сроками. Мы использовали комбинацию Camelot для сложных таблиц и OpenAI табличного OCR. Результат преобразовывали в markdown-таблицы и индексировали как отдельные чанки. Подробнее о работе с таблицами в RAG в 2026: хакеры атакуют, таблицы сопротивляются.
Какой latency приемлем для юридического RAG? Юристы готовы ждать 3-5 секунд на сложные запросы (анализ нескольких документов). Но простые вопросы ("какая статья регулирует X?") должны отвечать за <1 секунду. Наш production пайплайн: 80% запросов <2 сек, 95% <4 сек.
Как защитить Legal RAG от hallucinations? Три слоя: 1) Жёсткий промпт с требованием цитировать только из контекста, 2) Post-processing проверка - каждый ответ проверяется на наличие цитат из retrieved чанков, 3) Confidence score <0.7 → ответ помечается "требует проверки юристом".
Что будет с Legal RAG к концу 2026 года
Наблюдая за трендами (RAG 2026 roadmap), предсказываю:
- F-beta 0.85+ станет стандартом для production систем (сейчас 0.75-0.80)
- Появится open-source модель эмбеддингов, специализированная на юридических текстах, что снизит стоимость на 70%
- Юридические фирмы начнут требовать end-to-end encryption для RAG-систем (конфиденциальность клиентских данных)
- Стандартизируются бенчмарки по юрисдикциям: ARLC для common law, аналоги для гражданского права, мусульманского права
Самый неочевидный совет: если вы строите Legal RAG сегодня, инвестируйте 30% времени в создание собственного evaluation набора из реальных вопросов ваших юристов. ARLC 2026 - отличный benchmark, но ваши специфические документы всегда имеют нюансы, которые не покрываются общими тестами. Один наш клиент (адвокатское бюро в Абу-Даби) имел 40% вопросов про трастовое право - специализированный тест-сет сразу показал слабые места, которые ARLC не выявил.
Legal RAG - это не про технологии, а про понимание того, как юристы мыслят и работают. Самый красивый пайплайн с 0.85 F-score бесполезен, если ответы приходят в формате, который требует 10 минут дополнительного анализа. Интегрируйте юристов в процесс разработки с первого дня. Иначе получите идеальную систему, которой никто не пользуется.