telegram-cli-bot/VECTOR_RAG_MEMORY.md

7.6 KiB
Raw Blame History

🧠 Векторная память с 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 с семантическим поиском.

🚀 Использование

Сохранение сообщения:

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

  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/