# RAG Система - Локальний Q&A для Документів Локальна система Retrieval-Augmented Generation (RAG) для запитів до документів з використанням open-source LLM. Створена для швидкого прототипування та proof-of-concept розгортань. ## Огляд Цей проєкт реалізує повний RAG pipeline, який: - Конвертує документи (PDF, DOCX, TXT) у текст для пошуку - Розбиває контент на семантичні chunks - Генерує embeddings за допомогою локальних моделей - Зберігає вектори в ChromaDB - Відповідає на запитання використовуючи LLM через Ollama Система працює повністю локально без зовнішніх API залежностей. ## Можливості - **Обробка Документів**: Автоматична конвертація PDF, DOCX та TXT файлів - **Семантичний Пошук**: Vector-based пошук з використанням sentence transformers - **Локальний LLM**: Генерація відповідей через Ollama (llama3.2 за замовчуванням) - **Streaming Відповіді**: Генерація відповідей в реальному часі - **Мультимовність**: Підтримка запитів англійською, українською та російською - **Веб-Інтерфейс**: UI на базі Gradio для швидкого тестування ## Архітектура ``` ┌─────────────┐ │ Документи │ │ (PDF/DOCX) │ └──────┬──────┘ │ ▼ ┌─────────────────┐ │ Конвертація │ │ (PyMuPDF) │ └──────┬──────────┘ │ ▼ ┌─────────────────┐ │ Розбиття │ │ (LangChain) │ └──────┬──────────┘ │ ▼ ┌─────────────────┐ ┌──────────────┐ │ Embeddings │◄─────┤ Запит │ │ (all-MiniLM-L6) │ └──────────────┘ └──────┬──────────┘ │ ▼ ┌─────────────────┐ │ ChromaDB │ │ (Vector Store) │ └──────┬──────────┘ │ ▼ ┌─────────────────┐ │ Пошук │ │ Контексту │ └──────┬──────────┘ │ ▼ ┌─────────────────┐ │ LLM (Ollama) │ │ llama3.2 │ └──────┬──────────┘ │ ▼ ┌─────────────────┐ │ Відповідь + │ │ Джерела │ └─────────────────┘ ``` ## Технологічний Стек | Компонент | Технологія | Призначення | |-----------|-----------|-------------| | Парсинг Документів | PyMuPDF, python-docx | Витягування тексту з файлів | | Обробка Тексту | LangChain | Розбиття документів з overlap | | Embeddings | sentence-transformers | Генерація векторних представлень | | Vector Database | ChromaDB | Зберігання та пошук embeddings | | LLM Runtime | Ollama | Локальний inference моделей | | Веб-Інтерфейс | Gradio | UI для швидкого прототипування | ## Вимоги - Python 3.9+ - Ollama встановлений та запущений - 4GB+ RAM (рекомендовано 8GB+) - ~2GB дискового простору для моделей ## Швидкий Старт ### 1. Встановіть Ollama ```bash # macOS / Linux curl -fsSL https://ollama.com/install.sh | sh # Завантажте модель ollama pull llama3.2 ``` ### 2. Налаштуйте Python Середовище ```bash # Клонуйте репозиторій git clone cd rag-python-rag # Створіть віртуальне середовище python3 -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate # Встановіть залежності pip install -r requirements.txt ``` ### 3. Запустіть Застосунок ```bash python main.py ``` Застосунок: 1. Завантажить тестовий документ (Think Python PDF) 2. Обробить та проіндексує його (~30 секунд) 3. Запустить веб-інтерфейс на `http://localhost:7860` ### 4. Додайте Свої Документи Помістіть PDF, DOCX або TXT файли в директорію `documents/` та перезапустіть застосунок. ## Конфігурація Відредагуйте `config.py` для налаштування: ```python # Модель embeddings EMBEDDING_MODEL_NAME = "all-MiniLM-L6-v2" # LLM модель OLLAMA_MODEL_NAME = "llama3.2" # Розбиття тексту CHUNK_SIZE = 1000 CHUNK_OVERLAP = 200 # Результати пошуку DEFAULT_N_RESULTS = 5 ``` ### Змінні Середовища Скопіюйте `.env.example` в `.env` та налаштуйте: ```bash OLLAMA_HOST=http://localhost:11434 OLLAMA_MODEL=llama3.2 EMBEDDING_MODEL=all-MiniLM-L6-v2 ``` ## Структура Проєкту ``` rag-python-rag/ ├── config.py # Конфігурація ├── document_converter.py # PDF/DOCX в markdown ├── text_splitter.py # Логіка розбиття ├── vector_store.py # Інтерфейс ChromaDB ├── llm_handler.py # Інтеграція Ollama ├── main.py # Точка входу ├── requirements.txt # Python залежності ├── documents/ # Вихідні документи (gitignored) ├── processed_docs/ # Конвертований markdown (gitignored) └── chroma_db/ # Vector database (gitignored) ``` ## Приклади Використання ### Python API ```python from vector_store import retrieve_context from llm_handler import stream_llm_answer # Запит до документів question = "Як працюють цикли в Python?" context, sources = retrieve_context(question, n_results=5) # Stream відповідь for token in stream_llm_answer(question, context): print(token, end='', flush=True) ``` ### Веб-Інтерфейс 1. Перейдіть на `http://localhost:7860` 2. Введіть запитання будь-якою підтримуваною мовою 3. Перегляньте відповідь з посиланнями на джерела ## Обмеження Дивіться [LIMITATIONS.md](LIMITATIONS.md) для детальних обмежень включно з: - Підтримкою мов embedding моделлю - Обмеженнями форматів документів - Вимогами до обладнання - Прогалинами готовності до production ## Розгортання Це **локальний застосунок**, який потребує Python backend та Ollama runtime. Дивіться [DEPLOYMENT.md](DEPLOYMENT.md) для опцій розгортання: - Hugging Face Spaces (рекомендовано для демо) - Хмарні платформи (Render, Fly.io, Railway) - Локальне використання **Примітка**: GitHub Pages та статичний хостинг не підтримуються. ## Roadmap - [ ] Підтримка Excel та PowerPoint файлів - [ ] Кешування embeddings для швидшого запуску - [ ] REST API endpoints - [ ] Контекст розмови з кількома документами - [ ] Витягування зображень та таблиць з PDF - [ ] Docker контейнеризація ## Внесок Внески вітаються. Будь ласка: 1. Зробіть fork репозиторію 2. Створіть feature branch 3. Надішліть pull request з чітким описом ## Ліцензія MIT License - дивіться файл LICENSE для деталей. Цей проєкт призначений для освітніх цілей та прототипування. ## Подяки Створено з: - [Ollama](https://ollama.ai/) - Локальний LLM runtime - [ChromaDB](https://www.trychroma.com/) - Vector database - [LangChain](https://www.langchain.com/) - Обробка тексту - [Sentence Transformers](https://www.sbert.net/) - Embeddings - [Gradio](https://www.gradio.app/) - Веб-інтерфейс Натхнення: [Побудова RAG Системи за Один Вечір](https://habr.com/ru/articles/955798/) --- **Статус**: Proof of concept / Освітній проєкт **Підтримка**: Активна розробка **Python**: 3.9+