MAX / README.md
1
docs: detailed README with system architecture and tech stack
aee6bcc

A newer version of the Gradio SDK is available: 6.12.0

Upgrade
metadata
title: Document RAG Chatbot
emoji: 📄
colorFrom: blue
colorTo: green
sdk: gradio
sdk_version: 6.9.0
app_file: app.py
pinned: false
python_version: '3.11'

📄 Интеллектуальная система поиска по документам (RAG)

Система позволяет загрузить любой PDF или DOCX документ и задавать по нему вопросы на естественном языке — получая точные ответы со ссылками на конкретные страницы источника.


Что это такое и зачем

Представьте: у вас 50-страничный тарифный документ, регламент или договор. Чтобы найти конкретную цифру или условие — нужно читать весь документ. Эта система решает проблему: загружаете документ, задаёте вопрос как живому человеку, получаете точный ответ с указанием страницы.

Примеры вопросов:

  • «Какова комиссия за снятие наличных в банкомате?»
  • «Какие условия прописаны в разделе 3.2?»
  • «Есть ли в документе льготный период?»
  • «Сравни тарифы пакета А и пакета Б»

Как работает система — простыми словами

Система состоит из трёх последовательных этапов:

Этап 1 — Загрузка и индексация документа

PDF/DOCX файл
      │
      ▼
 Извлечение текста          ← pdfplumber читает каждую страницу,
 и таблиц                      включая структуру таблиц
      │
      ▼
 Разбивка на чанки          ← Документ делится на фрагменты по ~600 символов
 (фрагменты)                   с перекрытием 100 символов (чтобы не терять контекст
      │                         на границах фрагментов)
      ▼
 Создание векторных         ← Каждый фрагмент превращается в числовой вектор
 эмбеддингов                   (модель multilingual-e5: понимает русский язык)
      │
      ▼
 Сохранение в базе          ← ChromaDB хранит векторы и текст;
 ChromaDB                      BM25-индекс строится для точного поиска по словам

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

Когда пользователь задаёт вопрос, система одновременно запускает два вида поиска:

Тип поиска Что ищет Сильная сторона
Векторный (семантический) Смысл вопроса Находит «дешевле» когда спрашивают «скидка»
BM25 (ключевые слова) Точные совпадения слов Находит «405-А» или «п.3.2.1» по точному коду

Результаты объединяются, дублирующиеся фрагменты удаляются. Фрагменты с низкой релевантностью (порог 35%) отфильтровываются.

Этап 3 — Генерация ответа

Отобранные фрагменты (контекст)
              +
         Вопрос пользователя
              │
              ▼
         Языковая модель (LLM)
         работает по алгоритму Chain of Thought:
         
         ШАГ 1: Выписывает все факты из документа
         ШАГ 2: Проводит вычисления (если нужно)
         ШАГ 3: Проверяет каждый вывод
         ШАГ 4: Формулирует итоговый ответ
              │
              ▼
         Ответ + ссылки на источники (файл, страница, % релевантности)

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

┌─────────────────────────────────────────────────────────────┐
│                    Веб-интерфейс (Gradio)                    │
│         Загрузка файлов │ Вопрос-ответ │ Инструкция          │
└──────────────┬──────────────────┬───────────────────────────┘
               │                  │
               ▼                  ▼
        ┌─────────────┐    ┌─────────────┐
        │  Индексация │    │   Вопрос    │
        │  документов │    │             │
        └──────┬──────┘    └──────┬──────┘
               │                  │
               ▼                  ▼
        ┌─────────────────────────────────┐
        │           RAG System            │
        │                                 │
        │  ┌─────────┐   ┌─────────────┐ │
        │  │ ChromaDB│   │ BM25 Index  │ │
        │  │ (векторы)│  │ (ключ.слова)│ │
        │  └─────────┘   └─────────────┘ │
        │         │           │           │
        │         └─────┬─────┘           │
        │               │ Гибридный поиск │
        │               ▼                 │
        │  ┌─────────────────────────┐    │
        │  │   Языковая модель (LLM) │    │
        │  │  Gemini / Groq / OpenAI │    │
        │  └─────────────────────────┘    │
        └─────────────────────────────────┘

Ключевые технические решения

Защита от галлюцинаций

Модель работает строго по принципу: «нет в документе — не отвечать». Промпт (инструкция модели) запрещает домыслы. Если информации нет — система честно отвечает «Информация не найдена (отсутствует в документе)».

Детектор противоречий

Если загружено несколько документов с конфликтующими данными (например, два тарифных плана с разными процентами), система автоматически выявляет и сообщает о противоречии.

Поддержка таблиц

Таблицы из PDF извлекаются с сохранением структуры: Номер | Услуга: Стоимость. Это позволяет системе корректно отвечать на вопросы типа «сколько стоит пункт 3.4».

Отсутствие дублирования

При повторной загрузке уже проиндексированного файла система распознаёт дубликат и пропускает его, не засоряя базу.

Бесплатные языковые модели

Система поддерживает несколько LLM-провайдеров, включая полностью бесплатные:

Провайдер Модель Бесплатный тариф Где получить ключ
Groq llama-3.3-70b 14 400 запросов/день console.groq.com
Gemini gemini-1.5-flash 1 500 запросов/день aistudio.google.com
OpenAI gpt-4o-mini Платный platform.openai.com
Ollama llama3.1:8b Полностью локально Локальная установка

Используемые технологии

Технология Роль в системе
Python 3.11 Основной язык
Gradio 6 Веб-интерфейс (запускается в браузере)
LangChain Оркестрация: связывает поиск, промпт и LLM
ChromaDB Векторная база данных для хранения эмбеддингов
multilingual-e5 Модель эмбеддингов (понимает русский язык, работает локально)
BM25 Алгоритм точного текстового поиска (как в поисковых системах)
pdfplumber Извлечение текста и таблиц из PDF
python-docx Работа с DOCX файлами
HuggingFace Spaces Облачный хостинг приложения

Развёртывание

Приложение задеплоено на HuggingFace Spaces — бесплатная облачная платформа для ML-приложений.

Публичная ссылка: https://huggingface.co/spaces/ssj122/MAX

Особенности развёртывания на HF Spaces:

  • При каждом push в git — автоматическая пересборка Docker-контейнера
  • Векторная база работает в оперативной памяти (in-memory ChromaDB)
  • Модель эмбеддингов загружается при старте (~471 MB, ~30 сек)
  • После загрузки документов — данные хранятся до перезапуска Space

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

# Установка зависимостей
pip install -r requirements.txt

# Запуск приложения
python app.py

Откроется браузер на http://localhost:7860


Инструкция по использованию

  1. Открыть приложение по ссылке
  2. Выбрать провайдер LLM (рекомендуется Groq — бесплатный)
  3. Ввести API-ключ в поле рядом
  4. Вкладка «Загрузка документов» → выбрать PDF/DOCX → нажать «Индексировать»
  5. Вкладка «Вопрос-ответ» → ввести вопрос → нажать «Спросить»
  6. Получить ответ с указанием источника (файл + страница + % релевантности)

Что планируется развить

  • Авторизация пользователей (у каждого своя база документов)
  • Постоянное хранилище (сейчас при перезапуске документы теряются)
  • История диалога (контекстные уточняющие вопросы)
  • Экспорт ответов в PDF/Word
  • Пакетная обработка папок с документами