Spaces:
Runtime error
Runtime error
| from typing import Annotated, Any | |
| from fastapi import APIRouter, Depends, File, HTTPException, UploadFile | |
| import common.dependencies as DI | |
| from common import auth | |
| from components.services.search_metrics import SearchMetricsService | |
| from schemas.evaluation import EvaluationParams, EvaluationResponse | |
| # Создание роутера | |
| router = APIRouter(prefix="/evaluate", tags=["Evaluation"]) | |
| # Важно: добавить импорт logger, если его нет | |
| import logging | |
| logger = logging.getLogger(__name__) | |
| # Определение эндпоинта | |
| async def evaluate_rag_from_file( | |
| dataset_id: int, | |
| params: Annotated[EvaluationParams, Depends()], | |
| file: Annotated[UploadFile, File(description="XLSX файл с колонками 'id', 'question', 'text' (эталонные ответы через \\n)")], | |
| metrics_service: Annotated[SearchMetricsService, Depends(DI.get_search_metrics_service)], | |
| current_user: Annotated[any, Depends(auth.get_current_user)], # Защита эндпоинта | |
| ) -> Any: # Возвращаем Any, т.к. сервис возвращает dict, а FastAPI валидирует по response_model | |
| """Эндпоинт для оценки RAG. | |
| - Принимает ID датасета в пути. | |
| - Принимает параметры оценки (порог, top_n, use_query_expansion) и файл как multipart/form-data. | |
| - Вызывает SearchMetricsService для выполнения расчетов. | |
| - Возвращает рассчитанные метрики. | |
| """ | |
| try: | |
| # --- Вызываем сервис, он теперь возвращает полный словарь --- | |
| evaluation_full_results = await metrics_service.evaluate_from_file( | |
| file=file, | |
| dataset_id=dataset_id, | |
| similarity_threshold=params.similarity_threshold, | |
| top_n_values=params.top_n_values, | |
| use_query_expansion=params.use_query_expansion, | |
| top_worst_k=params.top_worst_k # Передаем новый параметр | |
| ) | |
| # --- Просто возвращаем результат сервиса --- | |
| # FastAPI сам проверит его по схеме EvaluationResponse | |
| return evaluation_full_results | |
| except HTTPException as e: | |
| # Просто пробрасываем HTTP ошибки дальше | |
| raise e | |
| except Exception as e: | |
| # Логирование ошибки может быть полезно здесь | |
| logger.exception("Internal server error during evaluation endpoint execution.") # Пример логирования | |
| # Ловим другие возможные ошибки во время оценки | |
| # Логгер уже есть в SearchMetricsService | |
| raise HTTPException(status_code=500, detail=f"Internal server error during evaluation: {e}") |