55 lines
2.0 KiB
Python
55 lines
2.0 KiB
Python
"""
|
|
API для RAG: индексация документов и ответы на вопросы
|
|
"""
|
|
from fastapi import APIRouter, status, Request
|
|
from typing import Annotated
|
|
from dishka.integrations.fastapi import FromDishka, inject
|
|
from src.domain.repositories.user_repository import IUserRepository
|
|
from src.presentation.middleware.auth_middleware import get_current_user
|
|
from src.presentation.schemas.rag_schemas import (
|
|
QuestionRequest,
|
|
RAGAnswer,
|
|
IndexDocumentRequest,
|
|
IndexDocumentResponse,
|
|
)
|
|
from src.application.use_cases.rag_use_cases import RAGUseCases
|
|
from src.domain.entities.user import User
|
|
|
|
|
|
router = APIRouter(prefix="/rag", tags=["rag"])
|
|
|
|
|
|
@router.post("/index", response_model=IndexDocumentResponse, status_code=status.HTTP_200_OK)
|
|
@inject
|
|
async def index_document(
|
|
body: IndexDocumentRequest,
|
|
request: Request,
|
|
user_repo: Annotated[IUserRepository, FromDishka()],
|
|
use_cases: Annotated[RAGUseCases, FromDishka()],
|
|
):
|
|
"""Индексирование идет через чанкирование, далее эмбеддинг и загрузка в векторную бд"""
|
|
current_user = await get_current_user(request, user_repo)
|
|
result = await use_cases.index_document(body.document_id)
|
|
return IndexDocumentResponse(**result)
|
|
|
|
|
|
@router.post("/question", response_model=RAGAnswer, status_code=status.HTTP_200_OK)
|
|
@inject
|
|
async def ask_question(
|
|
body: QuestionRequest,
|
|
request: Request,
|
|
user_repo: Annotated[IUserRepository, FromDishka()],
|
|
use_cases: Annotated[RAGUseCases, FromDishka()],
|
|
):
|
|
"""Отвечает на вопрос, используя RAG в рамках беседы"""
|
|
current_user = await get_current_user(request, user_repo)
|
|
result = await use_cases.ask_question(
|
|
conversation_id=body.conversation_id,
|
|
user_id=current_user.user_id,
|
|
question=body.question,
|
|
top_k=body.top_k,
|
|
rerank_top_n=body.rerank_top_n,
|
|
)
|
|
return RAGAnswer(**result)
|
|
|