From b31e1377b3c99ef845925a3c6c23a755fd3e561e Mon Sep 17 00:00:00 2001 From: "ki.sagidullin" Date: Wed, 1 Apr 2026 08:50:27 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D1=8E=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 259 ++++++++++++++++++++++++++++++++++++++++++++++- requirements.txt | 8 ++ 2 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 requirements.txt diff --git a/README.md b/README.md index 684122f..3848b0c 100644 --- a/README.md +++ b/README.md @@ -1 +1,258 @@ -pu pu puuuu \ No newline at end of file +# πŸ€– Agentic RAG β€” Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ AI-ассистСнт с Π±Π°Π·ΠΎΠΉ Π·Π½Π°Π½ΠΈΠΉ + +ΠŸΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ AI-Π°Π³Π΅Π½Ρ‚ с RAG (Retrieval-Augmented Generation) для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с вашими Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΈ ΠΊΠΎΠ΄ΠΎΠΌ. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π΅Π· ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°! + +## πŸ“‹ ВрСбования + +- **Python 3.10+** +- **Ollama** β€” для запуска LLM локально +- **Qdrant** β€” вСкторная Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… (запускаСтся автоматичСски) +- ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма: Linux, macOS, Windows (WSL2 рСкомСндуСтся) + +## πŸš€ Установка + +### 1. ΠšΠ»ΠΎΠ½ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ + +```bash +git clone <ваш-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ> +cd <ΠΏΠ°ΠΏΠΊΠ°-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°> +``` + +### 2. УстановитС Ollama + +```bash +# macOS / Linux +curl -fsSL https://ollama.com/install.sh | sh + +# Windows (Ρ‡Π΅Ρ€Π΅Π· WSL2) +# УстановитС WSL2, Π·Π°Ρ‚Π΅ΠΌ слСдуйтС инструкции для Linux +``` + +### 3. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ + +```bash +# LLM модСль (рСкомСндуСтся 3B ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²) +ollama pull llama3.2:3b + +# МодСль эмбСддингов +ollama pull nomic-embed-text +``` + +### 4. УстановитС Qdrant + +ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Qdrant Π² embedded-Ρ€Π΅ΠΆΠΈΠΌΠ΅ (Π±Π°Π·Π° хранится локально Π² ΠΏΠ°ΠΏΠΊΠ΅ `qdrant_data/`). Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½ΡƒΠΆΠ΅Π½ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ Qdrant. + +#### Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ А: Π§Π΅Ρ€Π΅Π· Docker (рСкомСндуСтся) + +```bash +# Π‘ΠΊΠ°Ρ‡Π°ΠΉΡ‚Π΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ Qdrant +curl -L https://github.com/qdrant/qdrant/releases/latest/download/qdrant-x86_64-unknown-linux-musl.tar.gz \ + | tar -xz + +# Или для macOS: +curl -L https://github.com/qdrant/qdrant/releases/latest/download/qdrant-x86_64-apple-darwin.tar.gz \ + | tar -xz + +# ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅ Π² PATH +sudo mv qdrant /usr/local/bin/ +``` + +#### Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ Π‘: Волько Python (Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°) + +Если Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Qdrant ΠΊΠ°ΠΊ Python-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ (трСбуСтся большС рСсурсов): + +```bash +pip install qdrant[fast] +``` + +ΠŸΡ€ΠΈ этом Π² ΠΊΠΎΠ΄Π΅ `local_knowledge_base.py` Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°: + +```python +# ВмСсто: +self.client = QdrantClient(path=persist_dir, prefer_grpc=True) + +# Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ: +self.client = QdrantClient.from_mutable_local(path=persist_dir) +``` + +#### Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ Π’: Π§Π΅Ρ€Π΅Π· Docker + +```bash +# Запуск Qdrant Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ +docker run -d --name qdrant \ + -p 6333:6333 \ + -p 6334:6334 \ + -v $(pwd)/qdrant_storage:/qdrant/storage \ + qdrant/qdrant +``` + +ПослС запуска ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² `local_knowledge_base.py`: + +```python +# ВмСсто локального ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ: +self.client = QdrantClient(path=persist_dir, prefer_grpc=True) + +# Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ HTTP ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: +self.client = QdrantClient(host="localhost", port=6333) +``` + +### 5. НастройтС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ (рСкомСндуСтся) + +```bash +# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ окруТСния +python -m venv venv + +# Активация (Linux/macOS) +source venv/bin/activate + +# Активация (Windows) +venv\Scripts\activate +``` + +### 6. УстановитС Python-зависимости + +```bash +pip install -r requirements.txt +``` + +### 7. ЗапуститС Ollama (Ссли Π½Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½) + +```bash +ollama serve +``` + +ΠžΡΡ‚Π°Π²ΡŒΡ‚Π΅ этот Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ (ΠΈΠ»ΠΈ запуститС Π² Ρ„ΠΎΠ½Π΅). + +## ▢️ Запуск + +```bash +python main.py +``` + +ПослС запуска ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΠΎ адрСсу: **http://localhost:7860** + +## πŸ“– ИспользованиС + +### Базовая Ρ€Π°Π±ΠΎΡ‚Π° + +1. Π’Π²Π΅Π΄ΠΈΡ‚Π΅ ваш запрос Π² тСкстовоС ΠΏΠΎΠ»Π΅ +2. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅/Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ **"Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ (RAG)"** +3. НаТмитС **"ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ"** ΠΈΠ»ΠΈ Enter + +### Π˜Π½Π΄Π΅ΠΊΡΠ°Ρ†ΠΈΡ Ρ„Π°ΠΉΠ»ΠΎΠ² + +1. Π’Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Π² ΠΏΠΎΠ»Π΅ **"ΠŸΡƒΡ‚ΡŒ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ"** +2. НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ **"πŸ“₯ Π˜Π½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ"** +3. Π”ΠΎΠΆΠ΄ΠΈΡ‚Π΅ΡΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ индСксации (ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ прогрСсса) + +#### ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Ρ„Π°ΠΉΠ»ΠΎΠ² + +| Π’ΠΈΠΏ | Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ | +|-----|------------| +| PDF | `.pdf` | +| ВСкст | `.txt` | +| Word | `.docx` | +| C++ | `.cpp`, `.hpp`, `.h`, `.cc` | + +#### Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ ΠΏΠΎ индСксации + +- Для C++ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΊΠΎΡ€Π½Π΅Π²ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ с исходным ΠΊΠΎΠ΄ΠΎΠΌ +- Папки `build`, `.git`, `vendor`, `node_modules` автоматичСски ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ +- ПослС индСксации ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ вопросы ΠΎ ΠΊΠΎΠ΄Π΅ + +### ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ запросов + +``` +"Объясни ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ класс Parser Π² Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅" +"Найди Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ JSON" +"Π‘ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠΉ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ Python Π½Π° мСсяц" +"ΠŸΠΎΡΡ‡ΠΈΡ‚Π°ΠΉ: (15 * 4) + (120 / 3)" +``` + +## βš™οΈ ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ + +### ИзмСнСниС ΠΌΠΎΠ΄Π΅Π»ΠΈ LLM + +Π’ Ρ„Π°ΠΉΠ»Π΅ `agent_core.py`: + +```python +llm = Ollama( + model="llama3.2:3b", # Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ здСсь + temperature=0.1, + num_predict=1024, +) +``` + +### ИзмСнСниС ΠΌΠΎΠ΄Π΅Π»ΠΈ эмбСддингов + +Π’ Ρ„Π°ΠΉΠ»Π΅ `agent_core.py`: + +```python +embeddings = OllamaEmbeddings( + model="nomic-embed-text", # Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ здСсь +) +``` + +### ДоступныС ΠΌΠΎΠ΄Π΅Π»ΠΈ Ollama + +Бписок доступных ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ: https://ollama.com/library + +Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ для эмбСддингов: +- `nomic-embed-text` (768 dim) β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ +- `mxbai-embed-large` (1024 dim) β€” Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹Π΅ +- `bge-m3` (1024 dim) β€” ΠΌΡƒΠ»ΡŒΡ‚ΠΈΡΠ·Ρ‹Ρ‡Π½Ρ‹Π΅ + +## πŸ›  УстранСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ + +### Ошибка: "connection refused" + +Ollama Π½Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½. ЗапуститС: +```bash +ollama serve +``` + +### Ошибка: "model not found" + +МодСль Π½Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π°. Π‘ΠΊΠ°Ρ‡Π°ΠΉΡ‚Π΅: +```bash +ollama pull llama3.2:3b +ollama pull nomic-embed-text +``` + +### МСдлСнная Ρ€Π°Π±ΠΎΡ‚Π° + +- Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ модСль мСньшСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `llama3.2:1b`) +- Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚Π΅ `num_predict` Π² настройках LLM +- Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ SSD для хранСния Qdrant + +### НС Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ + +- ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ +- Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ прилоТСния Π΅ΡΡ‚ΡŒ ΠΏΡ€Π°Π²Π° Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ +- ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ + +### Ошибка: "Qdrant binary not found" + +Qdrant Π½Π΅ установлСн. Π‘Π»Π΅Π΄ΡƒΠΉΡ‚Π΅ инструкции Π²Ρ‹ΡˆΠ΅ (Ρ€Π°Π·Π΄Π΅Π» "УстановитС Qdrant"). + +### Ошибка: "Failed to connect to Qdrant" + +ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Qdrant. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅: +- Qdrant Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ установлСн ΠΈ доступСн Π² PATH +- ΠŸΡ€Π°Π²Π° Π½Π° запись Π² ΠΏΠ°ΠΏΠΊΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (Π½ΡƒΠΆΠ½ΠΎ для создания `qdrant_data/`) + +## πŸ“‚ Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° + +``` +. +β”œβ”€β”€ main.py # Π’ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° +β”œβ”€β”€ agent_core.py # Π›ΠΎΠ³ΠΈΠΊΠ° Π°Π³Π΅Π½Ρ‚Π° ΠΈ инструмСнты +β”œβ”€β”€ local_knowledge_base.py # Π Π°Π±ΠΎΡ‚Π° с Qdrant +β”œβ”€β”€ agentic_rag_interface.py # Gradio-интСрфСйс +β”œβ”€β”€ README.md # Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» +└── qdrant_data/ # Π”Π°Π½Π½Ρ‹Π΅ Qdrant (создаётся автоматичСски) +``` + +## πŸ“„ ЛицСнзия + +MIT License \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e469ba1 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,8 @@ +langchain>=0.2.0 +langchain-core>=0.2.0 +langchain-community>=0.2.0 +langgraph>=0.2.0 +langchain-text-splitters>=0.2.0 +qdrant-client>=1.7.0 +gradio>=4.0.0 +numpy>=1.24.0