A newer version of the Gradio SDK is available: 6.12.0
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
Инструкция по использованию
- Открыть приложение по ссылке
- Выбрать провайдер LLM (рекомендуется Groq — бесплатный)
- Ввести API-ключ в поле рядом
- Вкладка «Загрузка документов» → выбрать PDF/DOCX → нажать «Индексировать»
- Вкладка «Вопрос-ответ» → ввести вопрос → нажать «Спросить»
- Получить ответ с указанием источника (файл + страница + % релевантности)
Что планируется развить
- Авторизация пользователей (у каждого своя база документов)
- Постоянное хранилище (сейчас при перезапуске документы теряются)
- История диалога (контекстные уточняющие вопросы)
- Экспорт ответов в PDF/Word
- Пакетная обработка папок с документами