feat(gpu): Qdrant как векторный бэкенд под флагом — снимает SPOF FAISS
FAISS-индекс — файловый синглтон в RAM одного воркера (save на каждую запись, без блокировок, без HA, не горизонтален). Добавлен альтернативный бэкенд Qdrant с тем же classmethod-интерфейсом, выбор через VECTOR_BACKEND — аддитивно и безопасно: дефолт остаётся faiss, ничего не ломается, пока не переключат. - app/qdrant_manager.py — search/add_vectors/save(no-op)/total_vectors поверх qdrant-client (коллекция Cosine, id точки = doc_id, upsert идемпотентен); - app/vector_store.py — get_backend() по настройке; задачи search/plagiarism переведены на него (больше не импортируют FAISSManager напрямую); - app/migrate_faiss_to_qdrant.py — перелив существующих векторов (reconstruct из IndexIDMap2 → upsert), идемпотентно; - docker-compose.prod.yml — сервис qdrant под профилем `qdrant` (по умолчанию не поднимается, ресурсов не ест) + volume; README — раздел про переключение. Тесты (9) гоняют QdrantManager против ВСТРОЕННОГО Qdrant (qdrant-client :memory:, не моки) + диспетчеризацию бэкенда. Всего тестов: 82 (indexer 24, gost 24, gpu 34). Плюсы Qdrant активируются только после явного переключения + миграции. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
25
services/worker-gpu/app/vector_store.py
Normal file
25
services/worker-gpu/app/vector_store.py
Normal file
@@ -0,0 +1,25 @@
|
||||
"""Выбор бэкенда векторного индекса по настройке VECTOR_BACKEND.
|
||||
|
||||
Единая точка входа: задачи (search / plagiarism) зовут get_backend().search(...) /
|
||||
.add_vectors(...) / .save(...), не зная, какой бэкенд под капотом — FAISS (файловый
|
||||
синглтон в RAM воркера, дефолт) или Qdrant (сетевой сервис, снимает SPOF и допускает
|
||||
конкурентную запись). Оба класса имеют одинаковый classmethod-интерфейс.
|
||||
"""
|
||||
|
||||
import logging
|
||||
|
||||
from app.config import settings
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def get_backend():
|
||||
"""Вернуть класс активного векторного бэкенда согласно settings.VECTOR_BACKEND."""
|
||||
if settings.VECTOR_BACKEND == "qdrant":
|
||||
from app.qdrant_manager import QdrantManager
|
||||
|
||||
return QdrantManager
|
||||
|
||||
from app.faiss_manager import FAISSManager
|
||||
|
||||
return FAISSManager
|
||||
Reference in New Issue
Block a user