Files
anti-plagiarism/services/worker-gpu/app/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
1.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Выбор бэкенда векторного индекса по настройке 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