Files
anti-plagiarism/services/worker-gpu/tests/test_vector_store.py
jze9 012b17304f 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>
2026-08-11 20:34:43 +05:00

26 lines
835 B
Python

"""Тест выбора векторного бэкенда по настройке VECTOR_BACKEND."""
from app import vector_store
from app.config import settings
def test_default_backend_is_faiss(monkeypatch):
monkeypatch.setattr(settings, "VECTOR_BACKEND", "faiss")
from app.faiss_manager import FAISSManager
assert vector_store.get_backend() is FAISSManager
def test_qdrant_backend_selected(monkeypatch):
monkeypatch.setattr(settings, "VECTOR_BACKEND", "qdrant")
from app.qdrant_manager import QdrantManager
assert vector_store.get_backend() is QdrantManager
def test_unknown_backend_falls_back_to_faiss(monkeypatch):
monkeypatch.setattr(settings, "VECTOR_BACKEND", "что-то не то")
from app.faiss_manager import FAISSManager
assert vector_store.get_backend() is FAISSManager