212 lines
7.6 KiB
Markdown
212 lines
7.6 KiB
Markdown
# 🧠 Векторная память с RAG
|
||
|
||
Гибридная система памяти для ИИ-чата на **SQLite + ChromaDB**.
|
||
|
||
---
|
||
|
||
## 📋 Обзор
|
||
|
||
Система использует **двухуровневую архитектуру**:
|
||
|
||
1. **SQLite** — хранение фактов и истории диалогов
|
||
2. **ChromaDB** — векторные эмбеддинги для семантического поиска
|
||
|
||
**Модель эмбеддингов:** `all-MiniLM-L6-v2`
|
||
- Размер: 90MB
|
||
- Измерения: 384
|
||
- Скорость: ~1000 эмбеддингов/сек на CPU
|
||
- Потребление памяти: <200MB
|
||
|
||
---
|
||
|
||
## 🏗️ Архитектура
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ Telegram Bot (bot.py) │
|
||
│ │
|
||
│ ┌─────────────┐ ┌──────────────┐ ┌───────────┐ │
|
||
│ │ handle_ai_ │───▶│ hybrid_ │───▶│ qwen_ │ │
|
||
│ │ task() │ │ memory_ │ │ integration│ │
|
||
│ └─────────────┘ │ manager │ └───────────┘ │
|
||
│ └───────┬──────┘ │
|
||
│ ┌────────────────┼────────────────┐ │
|
||
│ │ │ │ │
|
||
│ ▼ ▼ │ │
|
||
│ ┌──────────────────┐ ┌──────────────────┐ │ │
|
||
│ │ SQLiteStorage │ │ VectorStorage │ │ │
|
||
│ │ (facts, │ │ (ChromaDB, │ │ │
|
||
│ │ messages, │ │ sentence- │ │ │
|
||
│ │ sessions) │ │ transformers) │ │ │
|
||
│ └──────────────────┘ └──────────────────┘ │ │
|
||
│ │ │
|
||
└────────────────────────────────────────────┼───────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 Компоненты
|
||
|
||
### vector_memory.py
|
||
|
||
**VectorMemoryStorage** — векторное хранилище:
|
||
- `add_message()` — добавить сообщение с эмбеддингом
|
||
- `search_similar()` — семантический поиск по запросу
|
||
- `search_by_session()` — поиск внутри сессии
|
||
- `get_stats()` — статистика
|
||
|
||
**HybridMemoryManager** — гибридный менеджер:
|
||
- `add_message()` — сохранение в SQLite + ChromaDB
|
||
- `search_relevant()` — приоритет векторному поиску, фоллбэк на LIKE
|
||
- `format_context_for_ai()` — контекст для ИИ с профилем и релевантными сообщениями
|
||
- `extract_and_save_facts()` — извлечение фактов из сообщений
|
||
|
||
### memory_system.py
|
||
|
||
**SQLiteMemoryStorage** — реляционное хранилище:
|
||
- Таблицы: `facts`, `messages`, `sessions`
|
||
- Поиск через `LIKE`
|
||
- Извлечение фактов по эвристикам
|
||
|
||
---
|
||
|
||
## 📊 Команды
|
||
|
||
### /memory — Статистика памяти
|
||
|
||
```
|
||
🧠 Статистика памяти:
|
||
|
||
📊 Сообщений: 42
|
||
📌 Фактов: 5
|
||
📁 Сессий: 3
|
||
|
||
🔮 Векторная память:
|
||
Документы: 42
|
||
Модель: all-MiniLM-L6-v2
|
||
|
||
Память использует SQLite + ChromaDB с семантическим поиском.
|
||
```
|
||
|
||
---
|
||
|
||
## 🚀 Использование
|
||
|
||
### Сохранение сообщения:
|
||
|
||
```python
|
||
from vector_memory import save_message
|
||
|
||
save_message(user_id=123456, role="user", content="Меня зовут Владимир")
|
||
save_message(user_id=123456, role="assistant", content="Приятно познакомиться!")
|
||
```
|
||
|
||
### Семантический поиск:
|
||
|
||
```python
|
||
from vector_memory import search_memory
|
||
|
||
# Найти сообщения по смыслу (не точное совпадение!)
|
||
results = search_memory(user_id=123456, query="как настроить сервер", limit=5)
|
||
|
||
for msg, score in results:
|
||
print(f"{score:.2f}: {msg.content}")
|
||
```
|
||
|
||
### Контекст для ИИ:
|
||
|
||
```python
|
||
from vector_memory import get_context
|
||
|
||
context = get_context(user_id=123456, query="Где мои файлы?")
|
||
# Включает:
|
||
# - Профиль пользователя
|
||
# - Последние 5 сообщений
|
||
# - Релевантные сообщения по запросу
|
||
```
|
||
|
||
---
|
||
|
||
## 📁 Файлы
|
||
|
||
- `vector_memory.py` — векторная память (ChromaDB + sentence-transformers)
|
||
- `memory_system.py` — SQLite память
|
||
- `memory.db` — SQLite база данных
|
||
- `vector_db/` — ChromaDB хранилище
|
||
|
||
---
|
||
|
||
## ⚙️ Настройка
|
||
|
||
### Требования:
|
||
|
||
```bash
|
||
pip install chromadb sentence-transformers
|
||
```
|
||
|
||
### Модель эмбеддингов:
|
||
|
||
По умолчанию используется `all-MiniLM-L6-v2` (лёгкая, быстрая).
|
||
|
||
Для изменения модели:
|
||
|
||
```python
|
||
vector_storage = VectorMemoryStorage(
|
||
persist_directory="./vector_db",
|
||
model_name="all-mpnet-base-v2" # Более точная, но тяжелее
|
||
)
|
||
```
|
||
|
||
**Доступные модели:**
|
||
- `all-MiniLM-L6-v2` — 90MB, 384 dim (быстрая)
|
||
- `all-mpnet-base-v2` — 420MB, 768 dim (точная)
|
||
- `paraphrase-multilingual-MiniLM-L12-v2` — мультиязычная
|
||
|
||
---
|
||
|
||
## 🎯 Как работает RAG
|
||
|
||
1. **Пользователь отправляет сообщение** → сохраняется в SQLite + ChromaDB
|
||
2. **ИИ запрашивает контекст** → гибридный менеджер формирует промпт:
|
||
- Профиль пользователя (факты)
|
||
- Последние N сообщений
|
||
- Релевантные сообщения из векторного поиска
|
||
3. **ИИ получает контекст** → отвечает с учётом истории
|
||
|
||
**Пример:**
|
||
```
|
||
User: Помнишь, я спрашивал про настройку nginx?
|
||
|
||
RAG находит:
|
||
- Сообщение 3-дневной давности про nginx config
|
||
- Факт: "Использует nginx"
|
||
|
||
ИИ отвечает:
|
||
"Да, вы спрашивали про настройку nginx. Вот что мы обсуждали..."
|
||
```
|
||
|
||
---
|
||
|
||
## 📈 Производительность
|
||
|
||
| Операция | Время |
|
||
|----------|-------|
|
||
| Добавление сообщения | ~50ms |
|
||
| Векторный поиск (5 результатов) | ~100ms |
|
||
| Извлечение фактов | ~5ms |
|
||
| Формирование контекста | ~20ms |
|
||
|
||
**Потребление памяти:**
|
||
- Модель: ~200MB
|
||
- ChromaDB: ~100-500MB (зависит от количества сообщений)
|
||
- SQLite: ~10MB
|
||
- **Итого: <1GB** ✅
|
||
|
||
---
|
||
|
||
## 🔒 Безопасность
|
||
|
||
- Данные хранятся локально
|
||
- Нет отправки третьим сторонам
|
||
- Можно удалить: `rm memory.db vector_db/`
|