Snowbike RAG — MVP
Гибридный поиск по 140K+ сообщениям Telegram-группы «Сноубайк Россия».
Архитектура
Запрос → Flask API → Meilisearch (точный) + ChromaDB (семантика) → Sonnet 4.6 → Ответ
Быстрый старт
# Запустить все сервисы
./start.sh
# Поиск
curl "http://localhost:5557/search?q=масло+для+Polaris+850"
# С фильтром по топику (63467 = Техничка)
curl "http://localhost:5557/search?q=гусеницы&topics=63467&limit=10"
Эндпоинты
| Метод | URL | Описание |
|---|---|---|
| GET | /health |
Проверка здоровья |
| GET | /search?q=...&topics=...&limit=... |
Гибридный поиск |
| GET | /topics |
Список топиков |
| GET | /stats |
Статистика индексов |
Структура
tasks/snowbike-rag/
├── server.py — Flask API (порт 5557)
├── start.sh — Запуск сервисов
├── scripts/
│ ├── parse_messages.py — Парсинг batch-файлов → JSONL
│ ├── index_meilisearch.py — Загрузка в Meilisearch
│ ├── index_chromadb.py — Embeddings + ChromaDB
│ └── search.py — Гибридный поиск + LLM
├── config/
│ ├── requirements.txt
│ └── docker-compose.yml — Для запуска Meilisearch через Docker
├── bin/
│ └── meilisearch — Бинарник Meilisearch (если без Docker)
└── data/
├── messages.jsonl — Распаршенные сообщения
├── meilisearch/ — Данные Meilisearch
├── chromadb/ — Векторная БД
└── logs/ — Логи
Данные
- Источник:
/data/telegram-collector/raw/1242788123/ - Топиков: 12
- Сообщений с текстом: 140,275
- Meilisearch: 140,275 документов
- ChromaDB: ~10,000–136,000 документов (векторная база, доступна с Flask)
- Модель embeddings:
paraphrase-multilingual-MiniLM-L12-v2(локальная, бесплатно) - LLM:
claude-sonnet-4-5через OpenRouter (~$0.005/запрос)
Примечание по ChromaDB: ChromaDB работает в embedded mode (PersistentClient). Это значит:
- Отдельного сервера на порту 8000 нет и не нужно
- ChromaDB загружается автоматически при первом запросе к Flask
- Данные хранятся в
data/chromadb/- При ошибке
Error loading hnsw index— коллекция повреждена, см. раздел «Восстановление»
Топики
| ID | Название |
|---|---|
| 1 | Основная |
| 63155 | Барахолка |
| 63467 | Техничка |
| 63469 | Экип |
| 64805 | Обзоры |
| 76611 | Инструкции и 3D |
| 97494 | Электрички |
| 99795 | Китай |
| 103316 | ОФФТОП |
| 103317 | Локации |
| 117112 | Опросы |
| 161840 | Соревнования |
Первый запуск (индексация)
# 1. Парсинг сырых данных (~2 мин)
python3 scripts/parse_messages.py
# 2. Индексация в Meilisearch (~5 мин)
python3 scripts/index_meilisearch.py
# 3. Генерация embeddings + ChromaDB (~25 мин на CPU)
python3 scripts/index_chromadb.py
# 4. Запуск API
python3 server.py
Обновление (инкрементальное)
# 1. Обновить source-файл (parse_messages.py) — получить incremental_YYYYMMDD.jsonl
# 2. Долить в Meilisearch
python3 scripts/index_incremental_meili.py
# 3. Долить в ChromaDB
python3 scripts/index_incremental_chroma.py
# 4. Перезапустить Flask (для сброса кэша коллекции)
./start.sh
⚠️ Не запускайте
reindex_safe.pyбез необходимости — он переиндексирует весь корпус (~140K сообщений) и занимает ~1–2 часа. Только для полного восстановления после потери данных ChromaDB.
Восстановление ChromaDB
Если при поиске ошибка Error loading hnsw index или ChromaDB errors в /stats:
# 1. Остановить Flask
pkill -f "server.py"
# 2. Бэкап и очистка
cp -r data/chromadb "data/chromadb.bak-$(date +%Y%m%d-%H%M%S)"
rm -rf data/chromadb/*
# 3. Запустить инкрементальную индексацию (только новые сообщения)
python3 scripts/index_incremental_chroma.py
# 4. Запустить Flask
./start.sh
Если нужен полный rebuild ChromaDB (долго, ~1–2 часа):
python3 scripts/reindex_safe.py # запускать в screen/tmux!