Update 6 files

- /rag/history_manager.py
- /rag/query_processor.py
- /rag/rag_orchestrator.py
- /rag/rag_api.py
- /rag/rag_server.py
- /rag/__init__.py
This commit is contained in:
Markov Andrey
2026-06-30 14:04:31 +00:00
parent c9ee8fc19a
commit a3f52888db
6 changed files with 107 additions and 114 deletions

View File

@@ -24,7 +24,7 @@ import asyncio
from pathlib import Path
from typing import Optional, Dict, List, Any
# Добавляем путь к core, если запускаем из корня проекта
# Добавляем путь к rag, если запускаем из корня проекта
sys.path.insert(0, str(Path(__file__).parent.parent))
from fastapi import FastAPI, HTTPException, Depends, UploadFile, File as FastAPIFile
@@ -32,16 +32,16 @@ from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel, Field
import uvicorn
# Импортируем наши модули
from core.utils.config_loader import BotConfig
from core.utils.logger import setup_logging
from core.services.postgres_service import PostgresService
from core.services.qdrant_service import QdrantService
from core.services.embedding_service import EmbeddingService
from core.services.kb_service import KBService
from core.services.giga_client import GigaClient
from core.services.file_service import FileService
from core.rag_orchestrator import RAGOrchestrator
# Импортируем наши модули (теперь из пакета rag)
from rag.utils.config_loader import load_config
from rag.utils.logger import setup_logging
from rag.services.postgres_service import PostgresService
from rag.services.qdrant_service import QdrantService
from rag.services.embedding_service import EmbeddingService
from rag.services.kb_service import KBService
from rag.services.giga_client import GigaClient
from rag.services.file_service import FileService
from rag.rag_orchestrator import RAGOrchestrator
logger = logging.getLogger(__name__)
@@ -58,14 +58,10 @@ class QueryRequest(BaseModel):
query: str = Field(..., description="Текст запроса пользователя")
user_jid: str = Field(..., description="JID пользователя (без ресурса)")
room_jid: Optional[str] = Field(None, description="JID комнаты (None для личного чата)")
# history: List[Dict[str, str]] = Field(...) # УБРАНО!
prompts: Dict[str, str] = Field(
default_factory=dict,
description="Словарь промптов (system, synthesis, intent, expand, critique и т.д.)"
)
intent_override: Optional[str] = Field(None, description="Принудительное переопределение намерения")
last_file_path: Optional[str] = Field(None, description="Путь к последнему загруженному файлу")
last_file_text: Optional[str] = Field(None, description="Текст последнего загруженного файла")
@@ -118,7 +114,7 @@ class TranscribeResponse(BaseModel):
# ============================================================
_orchestrator: Optional[RAGOrchestrator] = None
_config: Optional[BotConfig] = None
_config: Optional[AppConfig] = None
def get_orchestrator() -> RAGOrchestrator:
@@ -129,7 +125,7 @@ def get_orchestrator() -> RAGOrchestrator:
return _orchestrator
def init_orchestrator(config: BotConfig) -> RAGOrchestrator:
def init_orchestrator(config: AppConfig) -> RAGOrchestrator:
"""Инициализирует все сервисы и создаёт RAGOrchestrator."""
global _orchestrator, _config
_config = config
@@ -138,31 +134,31 @@ def init_orchestrator(config: BotConfig) -> RAGOrchestrator:
# ---- 1. Инициализация сервисов ----
# PostgreSQL (история, документы)
db = PostgresService(
host=config.db_host,
port=config.db_port,
user=config.db_user,
host=config.database.host,
port=config.database.port,
user=config.database.user,
password=config.db_password,
db_name=config.db_name
db_name=config.database.database
)
# Qdrant (векторный поиск)
qdrant = QdrantService(
host=config.qdrant_host,
port=config.qdrant_port,
grpc_port=config.qdrant_grpc_port,
collection_name=config.qdrant_collection,
vector_size=config.qdrant_vector_size,
distance=config.qdrant_distance,
host=config.qdrant.host,
port=config.qdrant.port,
grpc_port=config.qdrant.grpc_port,
collection_name=config.qdrant.collection,
vector_size=config.qdrant.vector_size,
distance=config.qdrant.distance,
prefer_grpc=False
)
# Эмбеддинги (GigaChat)
embedding = EmbeddingService(
api_key=config.gigachat_api_key,
model=config.embedding_model,
timeout=config.embedding_timeout,
cache_size=config.embedding_cache_size,
verify_ssl=config.embedding_verify_ssl
model=config.embedding.model,
timeout=config.embedding.timeout,
cache_size=config.embedding.cache_size,
verify_ssl=config.embedding.verify_ssl_certs
)
# База знаний (индексация, поиск)
@@ -170,19 +166,19 @@ def init_orchestrator(config: BotConfig) -> RAGOrchestrator:
db=db,
qdrant=qdrant,
embedding=embedding,
collection_name=config.qdrant_collection,
chunk_size_tokens=config.chunk_size_tokens,
overlap_tokens=config.overlap_tokens,
approx_chunk_chars=config.chunking_approx_chunk_chars,
approx_overlap_chars=config.chunking_approx_overlap_chars
collection_name=config.qdrant.collection,
chunk_size_tokens=config.chunking.chunk_size_tokens,
overlap_tokens=config.chunking.overlap_tokens,
approx_chunk_chars=config.chunking.approx_chunk_chars,
approx_overlap_chars=config.chunking.approx_overlap_chars
)
# GigaChat клиент (генерация)
giga = GigaClient(
api_key=config.gigachat_api_key,
model=config.ai_model,
temperature=config.ai_temperature,
timeout=config.ai_timeout,
model=config.gigachat.model_generation,
temperature=config.gigachat.temperature,
timeout=config.gigachat.timeout,
verify_ssl=False
)
@@ -190,15 +186,11 @@ def init_orchestrator(config: BotConfig) -> RAGOrchestrator:
files = FileService(config)
# ---- 2. Создание оркестратора ----
# Загружаем дефолтные промпты (опционально)
default_prompts = {}
system_prompt_path = getattr(config, 'system_prompt_file', None)
if system_prompt_path and system_prompt_path.exists():
try:
with open(system_prompt_path, 'r', encoding='utf-8') as f:
default_prompts['system'] = f.read()
except Exception as e:
logger.warning(f"Не удалось загрузить системный промпт: {e}")
# Загружаем дефолтные промпты (из config.prompts_content)
default_prompts = config.prompts_content or {}
system_prompt = default_prompts.get('system')
if system_prompt:
default_prompts['system'] = system_prompt
orchestrator = RAGOrchestrator(
db=db,
@@ -444,16 +436,18 @@ def main():
)
args = parser.parse_args()
# Загружаем конфигурацию
# Загружаем конфигурацию с помощью новой функции load_config
try:
config = BotConfig(args.profile_dir)
config = load_config(args.profile_dir)
except Exception as e:
print(f"Ошибка загрузки конфигурации: {e}")
sys.exit(1)
# Настраиваем логирование
log_level = getattr(logging, args.log_level.upper(), logging.INFO)
setup_logging(config.name, config.log_file, log_level=log_level)
# Передаём путь к логу из конфига
log_file_path = config.log_file_path or Path("/tmp/rag_server.log")
setup_logging(config.name, log_file_path, log_level=log_level)
logger.info(f"Запуск RAG-сервера с профилем {args.profile_dir}")
logger.info(f"Хост: {args.host}, порт: {args.port}")
@@ -467,7 +461,7 @@ def main():
# Запускаем Uvicorn
uvicorn.run(
"core.rag_server:app",
"rag.rag_server:app", # теперь модуль из пакета rag
host=args.host,
port=args.port,
log_level=args.log_level,