2
2
from sqlalchemy .orm import Session
3
3
from database .nolly import get_db
4
4
from crud .answer import get_answer_history , get_answer_scores
5
- from schemas .answer import AnswerResponse , AnswerScoreResponse
5
+ from schemas .answer import AnswerResponse , AnswerScoreResponse , AnswerSubmit
6
+ from crud .model_inference import get_tokenizer , get_model # , get_device
6
7
7
8
router = APIRouter ()
8
9
@@ -22,4 +23,72 @@ async def get_answer_scores_api(user_id: int, question_id: int, db: Session = De
22
23
if not answer_scores :
23
24
raise HTTPException (status_code = 404 , detail = "채점 결과를 찾을 수 없습니다." )
24
25
25
- return answer_scores
26
+ return answer_scores
27
+
28
+ # 문제 답안 제출 == 채점
29
+ @router .post ("/{user_id}/{question_id}" )
30
+ async def grade_answers (
31
+ user_id : int , question_id : int ,
32
+ answer_data : AnswerSubmit , tokenizer = Depends (get_tokenizer ), model = Depends (get_model ),
33
+ db : Session = Depends (get_db ) # device: str = Depends(get_device),
34
+ ):
35
+
36
+ # 1. 사용자 답변 불러오기
37
+ input_text = answer_data .answer
38
+ # 2. 모델에 넣을 수 있도록 토큰화 ########################## pt 맞는지 확인 ###
39
+ inputs = tokenizer (input_text , return_tensors = "pt" )
40
+
41
+ # 3. 모델 추론 수행
42
+ with torch .no_grad ():
43
+ outputs = model (** inputs )
44
+
45
+ # 4. 모델 결과 가공 ########################## 실제 결과에 맞게 수정 필요 ###
46
+ scores = outputs ["scores" ].tolist () # [창의, 논리, 사고, 설득, 깊이]
47
+ reviews = outputs ["explanations" ] # ["창의성 설명", "논리 설명", ...]
48
+
49
+ total_score = sum (scores ) / len (scores ) if scores else 0
50
+
51
+ # 5. DB에 저장 : 기존 답변 O (값 update), X (db에 새로 add)
52
+ existing_answer = db .query (Answer ).filter (
53
+ Answer .user_id == user_id ,
54
+ Answer .question_id == question_id
55
+ ).first ()
56
+
57
+ if existing_answer :
58
+ # 기존 데이터가 있으면 업데이트
59
+ existing_answer .content = input_text
60
+ existing_answer .creativity = scores [0 ]
61
+ existing_answer .logic = scores [1 ]
62
+ existing_answer .thinking = scores [2 ]
63
+ existing_answer .persuasion = scores [3 ]
64
+ existing_answer .depth = scores [4 ]
65
+ existing_answer .creativity_review = reviews [0 ]
66
+ existing_answer .logic_review = reviews [1 ]
67
+ existing_answer .thinking_review = reviews [2 ]
68
+ existing_answer .persuasion_review = reviews [3 ]
69
+ existing_answer .depth_review = reviews [4 ]
70
+ existing_answer .total_score = total_score
71
+ else :
72
+ # 기존 데이터가 없으면 새로 추가
73
+ new_answer = Answer (
74
+ user_id = user_id ,
75
+ question_id = question_id ,
76
+ content = input_text ,
77
+ creativity = scores [0 ],
78
+ logic = scores [1 ],
79
+ thinking = scores [2 ],
80
+ persuasion = scores [3 ],
81
+ depth = scores [4 ],
82
+ creativity_review = reviews [0 ],
83
+ logic_review = reviews [1 ],
84
+ thinking_review = reviews [2 ],
85
+ persuasion_review = reviews [3 ],
86
+ depth_review = reviews [4 ],
87
+ total_score = total_score
88
+ )
89
+ db .add (new_answer )
90
+
91
+ # DB 반영
92
+ db .commit ()
93
+
94
+ return # 응답 없이 종료 / FastAPI는 자동으로 200 OK 반환
0 commit comments