Система для автоматического анализа юридических документов с использованием Natural Language Inference (NLI) и Retrieval-Augmented Generation (RAG). Определяет, поддерживает ли текст документа определенные гипотезы, и предоставляет обоснование с цитированием релевантных фрагментов.
nli_rag-main/
├── app/
│ ├── components/
│ │ ├── answer.py # Генерация ответов
│ │ ├── chunker.py # Разбиение текста
│ │ ├── embeder.py # Создание эмбеддингов
│ │ └── utils.py # Вспомогательные функции
│ ├── main.py # Основной сервер
│ └── model.ipynb # Модель и тестирование
├── notebook/
│ ├── test_api.ipynb # Тестирование API
│ └── test_ya_llm.ipynb # Тестирование LLM
├── docker-compose.yaml # Docker конфигурация
├── Dockerfile # Docker образ
├── requirements.txt # Зависимости Python
└── README.md # Документация
Эта система представляет собой современный подход к автоматическому анализу юридических документов с использованием AI, обеспечивая как точность анализа, так и прозрачность принятия решений.
-
FastAPI приложение с эндпоинтом
/answer -
Интеграция с Yandex Cloud ML для работы с языковыми моделями
-
Параллельная обработка гипотез с использованием ThreadPoolExecutor
-
Предварительное вычисление эмбеддингов для гипотез при запуске
app/components/chunker.py - Разбиение текста на чанки:
class TextChunker(RecursiveCharacterTextSplitter):
# Разбивает документы на фрагменты размером 200 слов
# Параллельная обработка с использованием ThreadPoolExecutor
# Разделители: "\n\n", "\n", "?", "!", ".", ";"app/components/embeder.py - Создание векторных представлений:
def embed_doc(model, text: str) -> list[float]:
# Использует Yandex Cloud модель "doc" для создания эмбеддинговapp/components/answer.py - Генерация ответов:
def answer_question(model, text: str) -> str:
# Использует YandexGPT-lite для генерации ответов
# Temperature = 0.4 для стабильностиapp/components/utils.py - Вспомогательные функции:
-
parse_response()- извлечение reasoning, label, quote из ответа модели -
find_quote_span()- поиск позиций цитаты в исходном тексте -
find_top2_closest_chunks()- поиск 2 ближайших чанков по косинусному сходству
Система поддерживает три типа анализа:
-
tos- Terms of Service (Условия использования) -
pp- Privacy Policy (Политика конфиденциальности) -
nda- Non-Disclosure Agreement (Соглашение о неразглашении)
# Разбиение входящего текста на чанки
chunks, chunks_emb = split_and_embed(text, max_workers)
# Выбор соответствующих гипотез и их эмбеддингов
hyp_emb, hypotheses = get_hypotheses(task)# Для каждой гипотезы находим 2 наиболее близких чанка
relevant = find_relevant_chunks(chunks_emb, hyp_emb)# Каждая гипотеза обрабатывается отдельно с релевантными чанками
process_hypothesis((hypothesis, relevant_chunks))# Формирование промпта с контекстом
prompt_text = build_prompt(concept, chunk_list)
# Генерация ответа моделью
tag_and_seq = answer_question(gen_model, text=prompt_text)
# Парсинг результата
reasoning, label, quote = parse_response(tag_and_seq)class AnswerItem(BaseModel):
hypothesis: str # Гипотеза
reasoning: str # Обоснование
quote: str # Цитата из документа
chunks: List[str] # Релевантные фрагменты
label: str # Entailment/Contradiction/Neutral
label_num: int # 1/0/-1
start: int # Начальная позиция цитаты
end: int # Конечная позиция цитаты-
FastAPI - веб-фреймворк
-
Pydantic - валидация данных
-
ThreadPoolExecutor - параллельная обработка
-
NumPy - векторные операции
-
Yandex Cloud ML SDK - интеграция с моделями
-
YandexGPT-lite - генеративная модель
-
Yandex Cloud Embeddings (doc) - модель эмбеддингов
-
LangChain - разбиение текста
-
Docker - контейнеризация
-
Docker Compose - оркестрация
-
Uvicorn - ASGI сервер
Система использует:
-
Переменные окружения (.env):
YC_IAM_TOKEN,FOLDER_ID -
Конфигурационный файл (config.yml): гипотезы и промпты для каждого типа задачи
docker-compose up --build
pip install -r requirements.txt
uvicorn app.main:app --host 0.0.0.0 --port 8001
Анализирует документ на соответствие гипотезам.
Запрос:
{
"text": "Текст юридического документа...",
"task": "nda"
}
Ответ:
[
{
"hypothesis": "Запрещено разглашать конфиденциальную информацию...",
"reasoning": "фрагмент 2.1.3 явно подтверждает суть концепта...",
"quote": "2.1.3. Исключит передачу такой информации...",
"chunks": ["2. ПРАВА И ОБЯЗАННОСТИ ПРИНИМАЮЩЕЙ СТОРОНЫ..."],
"label": "Entailment",
"label_num": 1,
"start": 1234,
"end": 1456
}
]
-
notebook/test_api.ipynb- тестирование API с реальными юридическими документами -
notebook/test_ya_llm.ipynb- тестирование языковых моделей
-
Вход: Текст документа + тип задачи
-
Разбиение: Документ разбивается на смысловые фрагменты
-
Векторизация: Создаются эмбеддинги для фрагментов и гипотез
-
Поиск: Для каждой гипотезы находятся наиболее релевантные фрагменты
-
Анализ: LLM анализирует, поддерживает ли документ каждую гипотезу
-
Вывод: Структурированный ответ с обоснованием и цитированием
-
Масштабируемость: Параллельная обработка гипотез
-
Точность: RAG подход с релевантными фрагментами
-
Интерпретируемость: Цитирование источников
-
Гибкость: Поддержка разных типов юридических документов
-
Производительность: Предварительное вычисление эмбеддингов гипотез