Skip to content

itmoCamp/nli_rag

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NLI RAG - Система анализа юридических документов

Система для автоматического анализа юридических документов с использованием 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, обеспечивая как точность анализа, так и прозрачность принятия решений.

Архитектура системы

Основные компоненты

1. Главный сервер (app/main.py)

  • FastAPI приложение с эндпоинтом /answer

  • Интеграция с Yandex Cloud ML для работы с языковыми моделями

  • Параллельная обработка гипотез с использованием ThreadPoolExecutor

  • Предварительное вычисление эмбеддингов для гипотез при запуске

2. Компоненты обработки текста

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 ближайших чанков по косинусному сходству

3. Типы задач (task)

Система поддерживает три типа анализа:

  • tos - Terms of Service (Условия использования)

  • pp - Privacy Policy (Политика конфиденциальности)  

  • nda - Non-Disclosure Agreement (Соглашение о неразглашении)

Процесс обработки запроса

Этап 1: Подготовка данных

# Разбиение входящего текста на чанки

chunks, chunks_emb = split_and_embed(text, max_workers)

  

# Выбор соответствующих гипотез и их эмбеддингов

hyp_emb, hypotheses = get_hypotheses(task)

Этап 2: Поиск релевантных фрагментов

# Для каждой гипотезы находим 2 наиболее близких чанка

relevant = find_relevant_chunks(chunks_emb, hyp_emb)

Этап 3: Параллельная обработка гипотез

# Каждая гипотеза обрабатывается отдельно с релевантными чанками

process_hypothesis((hypothesis, relevant_chunks))

Этап 4: Генерация ответа

# Формирование промпта с контекстом

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            # Конечная позиция цитаты

Технологический стек

Backend

  • FastAPI - веб-фреймворк

  • Pydantic - валидация данных

  • ThreadPoolExecutor - параллельная обработка

  • NumPy - векторные операции

AI/ML

  • 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

docker-compose up --build

Локальный запуск

pip install -r requirements.txt

uvicorn app.main:app --host 0.0.0.0 --port 8001

API

POST /answer

Анализирует документ на соответствие гипотезам.

Запрос:

{

    "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 - тестирование языковых моделей

Принцип работы NLI

  1. Вход: Текст документа + тип задачи

  2. Разбиение: Документ разбивается на смысловые фрагменты

  3. Векторизация: Создаются эмбеддинги для фрагментов и гипотез

  4. Поиск: Для каждой гипотезы находятся наиболее релевантные фрагменты

  5. Анализ: LLM анализирует, поддерживает ли документ каждую гипотезу

  6. Вывод: Структурированный ответ с обоснованием и цитированием

Преимущества архитектуры

  • Масштабируемость: Параллельная обработка гипотез

  • Точность: RAG подход с релевантными фрагментами

  • Интерпретируемость: Цитирование источников

  • Гибкость: Поддержка разных типов юридических документов

  • Производительность: Предварительное вычисление эмбеддингов гипотез

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published