7.6 KiB
7.6 KiB
🧠 Векторная память с RAG
Гибридная система памяти для ИИ-чата на SQLite + ChromaDB.
📋 Обзор
Система использует двухуровневую архитектуру:
- SQLite — хранение фактов и истории диалогов
- 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 + ChromaDBsearch_relevant()— приоритет векторному поиску, фоллбэк на LIKEformat_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 с семантическим поиском.
🚀 Использование
Сохранение сообщения:
from vector_memory import save_message
save_message(user_id=123456, role="user", content="Меня зовут Владимир")
save_message(user_id=123456, role="assistant", content="Приятно познакомиться!")
Семантический поиск:
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}")
Контекст для ИИ:
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 хранилище
⚙️ Настройка
Требования:
pip install chromadb sentence-transformers
Модель эмбеддингов:
По умолчанию используется all-MiniLM-L6-v2 (лёгкая, быстрая).
Для изменения модели:
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
- Пользователь отправляет сообщение → сохраняется в SQLite + ChromaDB
- ИИ запрашивает контекст → гибридный менеджер формирует промпт:
- Профиль пользователя (факты)
- Последние N сообщений
- Релевантные сообщения из векторного поиска
- ИИ получает контекст → отвечает с учётом истории
Пример:
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/