Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from routers.folder import router as folder_router
from routers.checklist import router as checklist_router
from routers.file import router as file_router
from routers import qg_router


# 1) 환경변수 로드 (상단에서 선 로드됨)
Expand Down Expand Up @@ -42,6 +43,7 @@
app.include_router(folder_router)
app.include_router(file_router)
app.include_router(checklist_router)
app.include_router(qg_router.router)

@app.get("/")
def root():
Expand Down
29 changes: 29 additions & 0 deletions qg_answers.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"answers": [
{
"id": 1,
"question_preview": "다음 중 인공지능(AI)의 정의로 가장 적절한 것은 무엇인가요?...",
"correct_answer": "인간의 지능적 행동을 기계가 수행할 수 있도록 하는 기술"
},
{
"id": 2,
"question_preview": "지도학습(Supervised Learning)에서 학습에 사용되는 데이터는 어떤 특징을 가...",
"correct_answer": "입력과 정답이 함께 주어진 데이터를 이용하여 학습"
},
{
"id": 3,
"question_preview": "강화학습(Reinforcement Learning)에서 학습하는 주요 목표는 무엇인가요?...",
"correct_answer": "환경과 상호작용하며 보상을 최대화하는 행동 학습"
},
{
"id": 4,
"question_preview": "딥러닝(DL)의 핵심 기술은 무엇인가요?...",
"correct_answer": "인공신경망을 여러 층으로 깊게 쌓아 복잡한 패턴을 학습하는 기술"
},
{
"id": 5,
"question_preview": "대규모 언어모델(LLM)은 어떤 특징을 가지고 있나요?...",
"correct_answer": "수십억 개 이상의 파라미터를 가진 언어모델로, 다양한 언어 태스크에서 활용"
}
]
}
54 changes: 54 additions & 0 deletions qg_questions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
{
"questions": [
{
"id": 1,
"question": "다음 중 인공지능(AI)의 정의로 가장 적절한 것은 무엇인가요?",
"options": [
"데이터를 저장하고 관리하는 기술",
"인간의 지능적 행동을 기계가 수행할 수 있도록 하는 기술",
"컴퓨터가 물리적인 작업을 자동으로 수행하는 방법",
"네트워크를 통해 정보를 전송하는 방식"
]
},
{
"id": 2,
"question": "지도학습(Supervised Learning)에서 학습에 사용되는 데이터는 어떤 특징을 가지나요?",
"options": [
"정답 없이 데이터의 구조를 찾아내는 학습",
"입력과 정답이 함께 주어진 데이터를 이용하여 학습",
"환경과 상호작용하며 보상을 최대화하는 학습",
"복잡한 패턴을 학습하기 위해 여러 층의 신경망을 사용하는 학습"
]
},
{
"id": 3,
"question": "강화학습(Reinforcement Learning)에서 학습하는 주요 목표는 무엇인가요?",
"options": [
"데이터를 분석하여 패턴을 발견하는 것",
"환경과 상호작용하며 보상을 최대화하는 행동 학습",
"객체를 인식하고 분류하는 것",
"자연어를 이해하고 생성하는 것"
]
},
{
"id": 4,
"question": "딥러닝(DL)의 핵심 기술은 무엇인가요?",
"options": [
"자연어를 이해하고 생성하는 기술",
"이미지나 영상 데이터를 분석하는 기술",
"생성자와 판별자가 경쟁하며 데이터와 유사한 샘플을 생성하는 모델",
"인공신경망을 여러 층으로 깊게 쌓아 복잡한 패턴을 학습하는 기술"
]
},
{
"id": 5,
"question": "대규모 언어모델(LLM)은 어떤 특징을 가지고 있나요?",
"options": [
"대규모 데이터로 일반적 표현을 학습한 후 특정 태스크에 맞게 미세조정",
"입력과 정답이 함께 주어진 데이터를 이용하여 학습",
"수십억 개 이상의 파라미터를 가진 언어모델로, 다양한 언어 태스크에서 활용",
"생성자와 판별자가 경쟁하며 데이터와 유사한 샘플을 생성하는 모델"
]
}
]
}
47 changes: 47 additions & 0 deletions routers/qg_router.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel, Field
from typing import List
import asyncio

# qg_service.py에서 정의할 서비스 함수를 가져옵니다.
from utils.qg_service import generate_questions_from_text

# schemas에서 정의할 모델을 가져옵니다.
from schemas import QuestionGenerationRequest, QuestionGenerationResponse, QuestionItem

router = APIRouter(prefix="/qg", tags=["Question Generation"])

@router.post(
"/generate",
response_model=QuestionGenerationResponse,
summary="요약 텍스트를 기반으로 예상 문제(객관식)를 생성합니다."
)
async def generate_questions_endpoint(request: QuestionGenerationRequest):
"""
제공된 텍스트(주로 LLM 요약 결과)를 사용하여 예상 문제를 생성합니다.
"""
if not request.text or len(request.text.strip()) < 100:
raise HTTPException(
status_code=400,
detail="문제 생성을 위한 텍스트 내용이 너무 짧거나 비어 있습니다. (최소 100자 이상 필요)"
)

try:
# 비동기적으로 문제 생성 서비스 호출
questions = await generate_questions_from_text(
text=request.text,
num_questions=request.num_questions,
question_type=request.question_type,
language=request.language
)

return QuestionGenerationResponse(
questions=questions
)
except Exception as e:
# 실제 환경에서는 로깅이 필요합니다.
print(f"문제 생성 중 오류 발생: {e}")
raise HTTPException(
status_code=500,
detail="문제 생성 서비스 처리 중 서버 오류가 발생했습니다."
)
6 changes: 6 additions & 0 deletions schemas/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,10 @@
GoogleLoginRequest, NaverLoginRequest,
KakaoLoginRequest,
)

from .qg_schema import (
QuestionItem,
QuestionGenerationRequest,
QuestionGenerationResponse,
)

26 changes: 26 additions & 0 deletions schemas/qg_schema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from pydantic import BaseModel, Field
from typing import List, Literal, Optional

# =========================================================
# 문제 생성(Question Generation, QG) 스키마
# =========================================================

class QuestionItem(BaseModel):
"""생성된 문제 하나에 대한 데이터 모델"""
question: str = Field(..., description="질문 내용")
answer: str = Field(..., description="정답 내용")
# 객관식일 경우 4개의 보기, 주관식일 경우 빈 리스트
options: List[str] = Field(default_factory=list, description="질문 보기를 포함하는 리스트")

class QuestionGenerationRequest(BaseModel):
"""문제 생성 요청 시 사용되는 입력 모델"""
text: str = Field(..., description="문제를 생성할 기반 텍스트 (LLM 요약 결과 등)")
num_questions: int = Field(5, description="생성할 문제 개수 (1-10)", ge=1, le=10)
question_type: Literal["multiple_choice", "short_answer"] = Field(
"multiple_choice", description="생성할 문제 유형"
)
language: Literal["ko", "en"] = Field("ko", description="텍스트의 언어 (ko 또는 en)")

class QuestionGenerationResponse(BaseModel):
"""문제 생성 결과 응답 모델"""
questions: List[QuestionItem] = Field(..., description="생성된 문제 리스트")
Loading
Loading