Files
anti-plagiarism/services/worker-gpu/app/config.py
jze9 76e221f856
All checks were successful
Deploy / test (push) Successful in 3m32s
Deploy / deploy (push) Successful in 23s
fix(embeddings): не терять батч на таймауте Ollama, уменьшить пачку
Ollama обрабатывает тексты в пачке последовательно (один "slot" в
llama.cpp, не параллельно) — 64 реальных документа в одном HTTP-запросе
регулярно не укладывались в 120с, весь батч падал с ReadTimeout и
терялся без ретрая (embed_documents была без bind/max_retries).
Теперь: пачка 16, таймаут 300с, задача ретраится до 3 раз при сбое.
2026-08-26 18:37:49 +05:00

95 lines
4.4 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.
"""Конфигурация GPU воркера."""
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
"""Настройки GPU воркера."""
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding="utf-8",
case_sensitive=False,
extra="ignore", # игнорировать поля общего .env, не относящиеся к воркеру
)
# PostgreSQL
POSTGRES_HOST: str = "postgres"
POSTGRES_PORT: int = 5432
POSTGRES_DB: str = "antiplagiator"
POSTGRES_USER: str = "antiplagiator"
POSTGRES_PASSWORD: str = "changeme"
# Redis
REDIS_URL: str = "redis://redis:6379/0"
# RabbitMQ
RABBITMQ_URL: str = "amqp://guest:guest@rabbitmq:5672/"
# MinIO
MINIO_ENDPOINT: str = "minio:9000"
MINIO_ACCESS_KEY: str = "minioadmin"
MINIO_SECRET_KEY: str = "changeme"
MINIO_BUCKET_DOCS: str = "documents"
# Elasticsearch
ELASTICSEARCH_URL: str = "http://elasticsearch:9200"
# Ollama
OLLAMA_URL: str = "http://ollama:11434"
# LLM_BACKEND: "ollama" (локальная модель, нужен GPU-хост) или "openrouter"
# (облачный API, дешёвая модель — для L4-проверки парафраза "умность" не
# критична, это не творческая задача). Переключается без изменения кода.
LLM_BACKEND: str = "ollama"
OPENROUTER_API_KEY: str = ""
OPENROUTER_MODEL: str = "deepseek/deepseek-chat"
OPENROUTER_URL: str = "https://openrouter.ai/api/v1/chat/completions"
# OpenRouter блокирует запросы из РФ — заворачиваем именно эти запросы
# через sing-box (docker-compose сервис singbox-proxy). Пусто = без прокси.
OPENROUTER_PROXY_URL: str = "socks5://singbox-proxy:1080"
# FAISS / ML
FAISS_INDEX_PATH: str = "/data/index/faiss.index"
FAISS_ID_MAP_PATH: str = "/data/index/faiss_id_map.json"
# EMBED_BACKEND: "ollama" (GGUF-модель через Vulkan, для AMD GPU без ROCm/atomics),
# "sentence_transformers" (локальная загрузка, CUDA/CPU) или "cloud" (облачный
# инференс той же модели — не нужен вообще никакой локальный GPU).
EMBED_BACKEND: str = "ollama"
EMBED_MODEL: str = "bge-m3"
EMBED_DEVICE: str = "cuda" # используется только при EMBED_BACKEND=sentence_transformers
# Ollama обрабатывает тексты в пачке последовательно (один "slot" в llama.cpp,
# не параллельно) — 64 реальных документа в один HTTP-запрос регулярно не
# укладывались в таймаут. Меньше пачка — короче и надёжнее каждый запрос.
EMBED_BATCH_SIZE: int = 16
EMBED_DIM: int = 1024 # bge-m3; было 768 у paraphrase-multilingual-mpnet-base-v2
# DeepInfra — OpenAI-совместимый инференс BAAI/bge-m3 в облаке, та же модель,
# что и на VM109, дешёвый пей-пер-токен. Используется при EMBED_BACKEND=cloud.
CLOUD_EMBED_URL: str = "https://api.deepinfra.com/v1/openai/embeddings"
CLOUD_EMBED_MODEL: str = "BAAI/bge-m3"
CLOUD_EMBED_API_KEY: str = ""
FAISS_NLIST: int = 1024 # Количество кластеров для IVFFlat
FAISS_NPROBE: int = 64 # Количество кластеров для поиска
# Векторный бэкенд: "faiss" (файловый синглтон, дефолт) или "qdrant" (сервис,
# снимает SPOF и конкурентную запись). Переключается без изменения кода.
VECTOR_BACKEND: str = "faiss"
QDRANT_URL: str = "http://qdrant:6333"
QDRANT_COLLECTION: str = "documents"
# App
APP_URL: str = "https://academic.jze9.ru"
ENVIRONMENT: str = "development"
DEBUG: bool = False
@property
def database_url_sync(self) -> str:
"""Синхронный URL для SQLAlchemy (psycopg2)."""
return (
f"postgresql+psycopg2://{self.POSTGRES_USER}:{self.POSTGRES_PASSWORD}"
f"@{self.POSTGRES_HOST}:{self.POSTGRES_PORT}/{self.POSTGRES_DB}"
)
settings = Settings()