Initial commit: RAG Service

This commit is contained in:
2026-01-26 20:17:44 +03:00
commit 9b8a1c64bc
22 changed files with 2255 additions and 0 deletions

104
app/config.py Normal file
View File

@@ -0,0 +1,104 @@
"""
Конфигурация RAG сервиса через переменные окружения.
"""
import os
import secrets
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class Settings:
"""
Настройки RAG сервиса.
Все параметры загружаются из переменных окружения.
"""
# Модель
model_name: str = field(
default_factory=lambda: os.getenv("RAG_MODEL", "DeepPavlov/rubert-base-cased")
)
cache_dir: str = field(
default_factory=lambda: os.getenv("RAG_CACHE_DIR", "data/models")
)
# VectorStore
vectors_path: str = field(
default_factory=lambda: os.getenv("RAG_VECTORS_PATH", "data/vectors/vectors.npz")
)
max_examples: int = field(
default_factory=lambda: int(os.getenv("RAG_MAX_EXAMPLES", "10000"))
)
score_multiplier: float = field(
default_factory=lambda: float(os.getenv("RAG_SCORE_MULTIPLIER", "5.0"))
)
# Батч-обработка
batch_size: int = field(
default_factory=lambda: int(os.getenv("RAG_BATCH_SIZE", "16"))
)
# Минимальная длина текста
min_text_length: int = field(
default_factory=lambda: int(os.getenv("RAG_MIN_TEXT_LENGTH", "3"))
)
# API настройки
api_host: str = field(
default_factory=lambda: os.getenv("RAG_API_HOST", "0.0.0.0")
)
api_port: int = field(
default_factory=lambda: int(os.getenv("RAG_API_PORT", "8000"))
)
# Безопасность
# API ключ для авторизации (обязателен в продакшене!)
api_key: Optional[str] = field(
default_factory=lambda: os.getenv("RAG_API_KEY")
)
# Разрешить запросы без ключа (только для разработки)
allow_no_auth: bool = field(
default_factory=lambda: os.getenv("RAG_ALLOW_NO_AUTH", "false").lower() == "true"
)
# Логирование
log_level: str = field(
default_factory=lambda: os.getenv("LOG_LEVEL", "INFO")
)
# Автосохранение (интервал в секундах, 0 = отключено)
autosave_interval: int = field(
default_factory=lambda: int(os.getenv("RAG_AUTOSAVE_INTERVAL", "600")) # 10 минут
)
# Размерность векторов (768 для ruBERT)
vector_dim: int = 768
@property
def is_auth_required(self) -> bool:
"""Проверяет, требуется ли авторизация."""
return self.api_key is not None and not self.allow_no_auth
@staticmethod
def generate_api_key() -> str:
"""Генерирует случайный API ключ."""
return secrets.token_urlsafe(32)
# Глобальный экземпляр настроек
_settings: Optional[Settings] = None
def get_settings() -> Settings:
"""
Возвращает глобальный экземпляр настроек.
Returns:
Settings: Настройки приложения
"""
global _settings
if _settings is None:
_settings = Settings()
return _settings