Skip to content

Commit 724812a

Browse files
authored
Merge pull request #29 from KKU-NoteFlow/feat/generate_problems
feat/generate problems
2 parents 213198f + 1030e5a commit 724812a

File tree

7 files changed

+400
-0
lines changed

7 files changed

+400
-0
lines changed

main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from routers.folder import router as folder_router
1414
from routers.checklist import router as checklist_router
1515
from routers.file import router as file_router
16+
from routers import qg_router
1617

1718

1819
# 1) 환경변수 로드 (상단에서 선 로드됨)
@@ -42,6 +43,7 @@
4243
app.include_router(folder_router)
4344
app.include_router(file_router)
4445
app.include_router(checklist_router)
46+
app.include_router(qg_router.router)
4547

4648
@app.get("/")
4749
def root():

qg_answers.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"answers": [
3+
{
4+
"id": 1,
5+
"question_preview": "다음 중 인공지능(AI)의 정의로 가장 적절한 것은 무엇인가요?...",
6+
"correct_answer": "인간의 지능적 행동을 기계가 수행할 수 있도록 하는 기술"
7+
},
8+
{
9+
"id": 2,
10+
"question_preview": "지도학습(Supervised Learning)에서 학습에 사용되는 데이터는 어떤 특징을 가...",
11+
"correct_answer": "입력과 정답이 함께 주어진 데이터를 이용하여 학습"
12+
},
13+
{
14+
"id": 3,
15+
"question_preview": "강화학습(Reinforcement Learning)에서 학습하는 주요 목표는 무엇인가요?...",
16+
"correct_answer": "환경과 상호작용하며 보상을 최대화하는 행동 학습"
17+
},
18+
{
19+
"id": 4,
20+
"question_preview": "딥러닝(DL)의 핵심 기술은 무엇인가요?...",
21+
"correct_answer": "인공신경망을 여러 층으로 깊게 쌓아 복잡한 패턴을 학습하는 기술"
22+
},
23+
{
24+
"id": 5,
25+
"question_preview": "대규모 언어모델(LLM)은 어떤 특징을 가지고 있나요?...",
26+
"correct_answer": "수십억 개 이상의 파라미터를 가진 언어모델로, 다양한 언어 태스크에서 활용"
27+
}
28+
]
29+
}

qg_questions.json

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
{
2+
"questions": [
3+
{
4+
"id": 1,
5+
"question": "다음 중 인공지능(AI)의 정의로 가장 적절한 것은 무엇인가요?",
6+
"options": [
7+
"데이터를 저장하고 관리하는 기술",
8+
"인간의 지능적 행동을 기계가 수행할 수 있도록 하는 기술",
9+
"컴퓨터가 물리적인 작업을 자동으로 수행하는 방법",
10+
"네트워크를 통해 정보를 전송하는 방식"
11+
]
12+
},
13+
{
14+
"id": 2,
15+
"question": "지도학습(Supervised Learning)에서 학습에 사용되는 데이터는 어떤 특징을 가지나요?",
16+
"options": [
17+
"정답 없이 데이터의 구조를 찾아내는 학습",
18+
"입력과 정답이 함께 주어진 데이터를 이용하여 학습",
19+
"환경과 상호작용하며 보상을 최대화하는 학습",
20+
"복잡한 패턴을 학습하기 위해 여러 층의 신경망을 사용하는 학습"
21+
]
22+
},
23+
{
24+
"id": 3,
25+
"question": "강화학습(Reinforcement Learning)에서 학습하는 주요 목표는 무엇인가요?",
26+
"options": [
27+
"데이터를 분석하여 패턴을 발견하는 것",
28+
"환경과 상호작용하며 보상을 최대화하는 행동 학습",
29+
"객체를 인식하고 분류하는 것",
30+
"자연어를 이해하고 생성하는 것"
31+
]
32+
},
33+
{
34+
"id": 4,
35+
"question": "딥러닝(DL)의 핵심 기술은 무엇인가요?",
36+
"options": [
37+
"자연어를 이해하고 생성하는 기술",
38+
"이미지나 영상 데이터를 분석하는 기술",
39+
"생성자와 판별자가 경쟁하며 데이터와 유사한 샘플을 생성하는 모델",
40+
"인공신경망을 여러 층으로 깊게 쌓아 복잡한 패턴을 학습하는 기술"
41+
]
42+
},
43+
{
44+
"id": 5,
45+
"question": "대규모 언어모델(LLM)은 어떤 특징을 가지고 있나요?",
46+
"options": [
47+
"대규모 데이터로 일반적 표현을 학습한 후 특정 태스크에 맞게 미세조정",
48+
"입력과 정답이 함께 주어진 데이터를 이용하여 학습",
49+
"수십억 개 이상의 파라미터를 가진 언어모델로, 다양한 언어 태스크에서 활용",
50+
"생성자와 판별자가 경쟁하며 데이터와 유사한 샘플을 생성하는 모델"
51+
]
52+
}
53+
]
54+
}

routers/qg_router.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from fastapi import APIRouter, HTTPException
2+
from pydantic import BaseModel, Field
3+
from typing import List
4+
import asyncio
5+
6+
# qg_service.py에서 정의할 서비스 함수를 가져옵니다.
7+
from utils.qg_service import generate_questions_from_text
8+
9+
# schemas에서 정의할 모델을 가져옵니다.
10+
from schemas import QuestionGenerationRequest, QuestionGenerationResponse, QuestionItem
11+
12+
router = APIRouter(prefix="/qg", tags=["Question Generation"])
13+
14+
@router.post(
15+
"/generate",
16+
response_model=QuestionGenerationResponse,
17+
summary="요약 텍스트를 기반으로 예상 문제(객관식)를 생성합니다."
18+
)
19+
async def generate_questions_endpoint(request: QuestionGenerationRequest):
20+
"""
21+
제공된 텍스트(주로 LLM 요약 결과)를 사용하여 예상 문제를 생성합니다.
22+
"""
23+
if not request.text or len(request.text.strip()) < 100:
24+
raise HTTPException(
25+
status_code=400,
26+
detail="문제 생성을 위한 텍스트 내용이 너무 짧거나 비어 있습니다. (최소 100자 이상 필요)"
27+
)
28+
29+
try:
30+
# 비동기적으로 문제 생성 서비스 호출
31+
questions = await generate_questions_from_text(
32+
text=request.text,
33+
num_questions=request.num_questions,
34+
question_type=request.question_type,
35+
language=request.language
36+
)
37+
38+
return QuestionGenerationResponse(
39+
questions=questions
40+
)
41+
except Exception as e:
42+
# 실제 환경에서는 로깅이 필요합니다.
43+
print(f"문제 생성 중 오류 발생: {e}")
44+
raise HTTPException(
45+
status_code=500,
46+
detail="문제 생성 서비스 처리 중 서버 오류가 발생했습니다."
47+
)

schemas/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,10 @@
66
GoogleLoginRequest, NaverLoginRequest,
77
KakaoLoginRequest,
88
)
9+
10+
from .qg_schema import (
11+
QuestionItem,
12+
QuestionGenerationRequest,
13+
QuestionGenerationResponse,
14+
)
915

schemas/qg_schema.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from pydantic import BaseModel, Field
2+
from typing import List, Literal, Optional
3+
4+
# =========================================================
5+
# 문제 생성(Question Generation, QG) 스키마
6+
# =========================================================
7+
8+
class QuestionItem(BaseModel):
9+
"""생성된 문제 하나에 대한 데이터 모델"""
10+
question: str = Field(..., description="질문 내용")
11+
answer: str = Field(..., description="정답 내용")
12+
# 객관식일 경우 4개의 보기, 주관식일 경우 빈 리스트
13+
options: List[str] = Field(default_factory=list, description="질문 보기를 포함하는 리스트")
14+
15+
class QuestionGenerationRequest(BaseModel):
16+
"""문제 생성 요청 시 사용되는 입력 모델"""
17+
text: str = Field(..., description="문제를 생성할 기반 텍스트 (LLM 요약 결과 등)")
18+
num_questions: int = Field(5, description="생성할 문제 개수 (1-10)", ge=1, le=10)
19+
question_type: Literal["multiple_choice", "short_answer"] = Field(
20+
"multiple_choice", description="생성할 문제 유형"
21+
)
22+
language: Literal["ko", "en"] = Field("ko", description="텍스트의 언어 (ko 또는 en)")
23+
24+
class QuestionGenerationResponse(BaseModel):
25+
"""문제 생성 결과 응답 모델"""
26+
questions: List[QuestionItem] = Field(..., description="생성된 문제 리스트")

0 commit comments

Comments
 (0)