AI κΈ°λ° κ΅μ‘ νλ«νΌμ μν λ§μ΄ν¬λ‘μλΉμ€ μν€ν μ² λ°±μλ μμ€ν μ λλ€.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Client (Frontend) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββ
β β
β βββββββββββββββ βββββββββββββββ β
β βAuth Service β β Market β β
β β (Port β β Service β β
β β 8003) β β (Port 8005) β β
β ββββββββ¬βββββββ ββββββββ¬βββββββ β
β β β β
β β JWT μΈμ¦ β ν¬μΈνΈ/ꡬ맀 β
β βΌ βΌ β
β ββββββββββββββββββββββββββββββββββββββββ β
β β Content Generation Services β β
β β ββββββββ ββββββββ ββββββββ β β
β β β Math β βKoreanβ β Eng β β β
β β β 8001 β β 8004 β β 8002 β β β
β β βββββ¬βββ βββββ¬βββ βββββ¬βββ β β
β ββββββββΌββββββββββΌββββββββββΌββββββββββββ β
β βββββββββββΌββββββββββ β
β βΌ β
β ββββββββββββββββββββββ β
β β Notification β β
β β Service (8006) β β
β β (SSE Real-time) β β
β ββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββΌββββββββββββββββββββββ
β β β
βΌ βΌ βΌ
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
β PostgreSQL ββββββ€ Celery/Redis βββββΊβ Redis β
β (Port 5433) β β Task Queue β β (Port 6379) β
β β β β β β
β μλΉμ€λ³ μ€ν€λ§ β β β’ Math β β β’ Task Queue β
β λ
립 κ΄λ¦¬ β β β’ Korean β β β’ Result β
β β β β’ English β β Backend β
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
[λ°μ΄ν° νλ¦]
1. μ¬μ©μ μμ² β Auth Service (JWT λ°κΈ/κ²μ¦)
2. μΈμ¦λ μμ² β Content Services (Math/Korean/English)
3. μ½ν
μΈ μμ± β Celery Task Queue (λΉλκΈ°)
4. Worker β Gemini/GPT API νΈμΆ β AI Judge κ²μ¦
5. μλ£ μ β Notification Service (SSE) β μ¬μ©μ μ€μκ° μλ¦Ό
6. λ§μΌ κ±°λ β Market Service β PostgreSQL νΈλμμ
보μ₯
- λ§μ΄ν¬λ‘μλΉμ€ κΈ°λ°: λ 립μ μΌλ‘ λ°°ν¬ κ°λ₯ν 6κ° μλΉμ€
- μ€μ μΈμ¦: Auth Serviceλ₯Ό ν΅ν JWT ν ν° κ²μ¦
- λΉλκΈ° μ²λ¦¬: Celery + Redisλ₯Ό νμ©ν λ°±κ·ΈλΌμ΄λ μμ
- AI ν΅ν©: Gemini 2.5 Pro, GPT-4o-mini κΈ°λ° λ¬Έμ μμ± λ° κ²μ¦
- μλΉμ€ κ° ν΅μ : HTTP REST API
- λ°μ΄ν° 격리: μλΉμ€λ³ PostgreSQL μ€ν€λ§ λΆλ¦¬
- νμ₯μ±: Docker Compose κΈ°λ° μ»¨ν μ΄λ μ€μΌμ€νΈλ μ΄μ
μΈμ¦ λ° μ¬μ©μ κ΄λ¦¬
-
ν΅μ¬ κΈ°λ₯:
- κ΅μ¬/νμ νμκ°μ λ° λ‘κ·ΈμΈ (JWT)
- ν΄λμ€λ£Έ μμ± λ° νμ κ°μ κ΄λ¦¬
- κ΅μ¬-νμ κ° μͺ½μ§ μμ€ν
- μ€μ ν ν° κ²μ¦ (
/api/auth/verify-token)
-
μ£Όμ νλ‘μ°:
- κ΅μ¬κ° ν΄λμ€ μμ± β κ³ μ ν΄λμ€ μ½λ λ°κΈ
- νμμ΄ ν΄λμ€ μ½λλ‘ κ°μ μ μ² β κ΅μ¬ μΉμΈ/κ±°λΆ
- μΉμΈλ νμκ³Ό κ΅μ¬ κ° μͺ½μ§ μ‘μμ
-
λ°μ΄ν° λͺ¨λΈ: Teacher, Student, ClassRoom, StudentJoinRequest, Message
-
κΈ°μ : FastAPI, PostgreSQL, JWT, bcrypt, Redis
AI κΈ°λ° μν λ¬Έμ μμ± λ° μ±μ
-
ν΅μ¬ κΈ°λ₯:
- κ΅μ‘κ³Όμ κΈ°λ° λ¬Έμ μλ μμ± (Gemini 2.5 Pro)
- AI Judge κ²μ¦ μμ€ν (GPT-4o-mini)
- TikZ κ·Έλν μλ μμ± (LaTeX)
- OCR κΈ°λ° μμ ν μ±μ (Google Vision API)
- λμ΄λ 3λ¨κ³ (A: μ§μ κ³μ°, B: μμ©λ²μ, C: ν΅ν©λ°κ²¬)
-
μ£Όμ νλ‘μ°:
- κ΅μ¬κ° νλ /λ¨μ/λμ΄λ μ€μ β λ¬Έμ μμ± μμ²
- Celery λ°±κ·ΈλΌμ΄λμμ Geminiλ‘ λ¬Έμ μμ±
- AI Judgeκ° μνμ νμ±/μ λ΅μΌμΉ/μκ²°μ±/λ Όλ¦¬μ± κ²μ¦
- λΆν©κ²© λ¬Έμ λ νΌλλ°± ν¬ν¨ μ¬μμ± (μ΅λ 3ν)
- νμ λ΅μ μ μΆ β OCR μΈμ β AI μ±μ β νΌλλ°± μ 곡
-
λ°μ΄ν° λͺ¨λΈ: Worksheet, Problem, GradingSession, Curriculum
-
κΈ°μ : FastAPI, Celery, Gemini, GPT-4o-mini, Google Vision API
AI κΈ°λ° κ΅μ΄ λ¬Έμ μμ± λ° μ±μ
-
ν΅μ¬ κΈ°λ₯:
- μ§λ¬Έ κΈ°λ° λ¬Έμ μμ± (μ/μμ€/μν/λ¬Έλ²)
- AI Judge μ νλ³ κ²μ¦ (λ¬Ένμ±, μμ¬μ±, λ Όμ¦μ±)
- λ³λ ¬ μ²λ¦¬ (ThreadPoolExecutor)
- κ³Όμ μμ± λ° λ°°ν¬
-
μ£Όμ νλ‘μ°:
- κ΅μ¬κ° κ΅μ΄ μ ν/λμ΄λ μ€μ β λ¬Έμ μμ± μμ²
- data/ ν΄λμμ μ§λ¬Έ λλ€ μ ν (poem/novel/non-fiction/grammar)
- ThreadPoolExecutorλ‘ μνλ³ λ³λ ¬ μμ±
- AI Judgeκ° μ νλ³ κΈ°μ€ κ²μ¦ (κ° νλͺ© β₯ 3.5/5.0)
- λΆν©κ²© λ¬Έμ μ¬μμ± β DB μ μ₯
- κ³Όμ λ°°ν¬ β νμ μ μΆ β μ±μ
-
λ°μ΄ν° λͺ¨λΈ: Worksheet, Problem, GradingSession, Assignment
-
κΈ°μ : FastAPI, Celery, Gemini, GPT-4o-mini, ThreadPoolExecutor
μν¬μνΈ λ§μΌνλ μ΄μ€
-
ν΅μ¬ κΈ°λ₯:
- μν¬μνΈ μν λ±λ‘ λ° νλ§€
- ν¬μΈνΈ μμ€ν (μΆ©μ /ꡬ맀/μμ΅)
- μλ κ°κ²© μ± μ (10λ¬Έμ : 1,500P, 20λ¬Έμ : 3,000P)
- 리뷰 μμ€ν (μΆμ²/보ν΅/λΉμΆμ²)
-
μ£Όμ νλ‘μ°:
- κ΅μ¬κ° μν¬μνΈ λ±λ‘ β μλ κ°κ²© μ± μ λ° νκ·Έ μμ±
- λ€λ₯Έ κ΅μ¬κ° ν¬μΈνΈλ‘ ꡬ맀
- ꡬ맀μ ν¬μΈνΈ μ°¨κ° β νλ§€μ μμ΅ μ 립 (νλ«νΌ μμλ£ 10%)
- μν¬μνΈ μλ λ³΅μ¬ β ꡬ맀μ κ³μ μ μΆκ°
- ꡬ맀μ 리뷰 μμ± β λ§μ‘±λ κ³μ°
-
λ°μ΄ν° λͺ¨λΈ: MarketProduct, MarketPurchase, MarketReview, UserPoint
-
κΈ°μ : FastAPI, PostgreSQL, Auth Service λ―Έλ€μ¨μ΄
μμ΄ λ¬Έμ μμ± λ° κ΄λ¦¬ (λ΄λΉμ: λ€λ₯Έ κ°λ°μ)
-
ν΅μ¬ κΈ°λ₯: (μΆκ° μμ )
- AI κΈ°λ° μμ΄ λ¬Έμ μμ±
- μμ΄ μν¬μνΈ κ΄λ¦¬
- μμ΄ μ±μ μμ€ν
-
ν¬νΈ: 8002
-
κΈ°μ μ€ν: FastAPI, PostgreSQL, AI Models
μ€μκ° μλ¦Ό λ° WebSocket (λ΄λΉμ: λ€λ₯Έ κ°λ°μ)
-
ν΅μ¬ κΈ°λ₯: (μΆκ° μμ )
- WebSocket κΈ°λ° μ€μκ° μλ¦Ό
- λ©μμ§ νΈμ μλ¦Ό
- μ΄λ²€νΈ λΈλ‘λμΊμ€ν
-
ν¬νΈ: 8006
-
κΈ°μ μ€ν: FastAPI, Redis, WebSocket
- FastAPI: κ³ μ±λ₯ λΉλκΈ° μΉ νλ μμν¬
- SQLAlchemy: ORM (PostgreSQL)
- Pydantic: λ°μ΄ν° κ²μ¦
- PostgreSQL 15: λ©μΈ λ°μ΄ν°λ² μ΄μ€
- Redis 7: μΊμ± λ° Celery λΈλ‘컀
- Gemini 2.5 Pro: λ¬Έμ μμ±
- GPT-4o-mini: AI Judge κ²μ¦
- Google Vision API: OCR (μν μμ ν)
- Celery: λΉλκΈ° μμ μ²λ¦¬
- Redis: λ©μμ§ λΈλ‘컀
- JWT (HS256): ν ν° κΈ°λ° μΈμ¦
- bcrypt: λΉλ°λ²νΈ ν΄μ±
- Docker: 컨ν μ΄λν
- Docker Compose: μ€μΌμ€νΈλ μ΄μ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β [1] μ¬μ©μ μμ² μ μ β
β POST /api/worksheets/generate β
β {grade, unit, difficulty_ratio, problem_count, ...} β
ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β [2] Celery λΉλκΈ° νμ€ν¬ μμ± β
β β’ FastAPI β Celery.delay() β Task ID μ¦μ λ°ν β
β β’ μ¬μ©μ μ²΄κ° μλ΅ μκ°: 3μ΄ μ΄λ΄ (202 Accepted) β
ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β [3] Celery Worker - λ°±κ·ΈλΌμ΄λ μ²λ¦¬ μμ β
β β’ κ΅μ‘κ³Όμ λ°μ΄ν° λ‘λ (curriculum.json) β
β β’ ν둬ννΈ κ΅¬μ± (λμ΄λ/μ ν λΆλ°°) β
ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β [4] AI λ¬Έμ μμ± (Gemini 2.5 Pro) β
β β
β Math Service: β
β β’ TikZ κ·Έλν μλ μμ± β
β β’ λμ΄λ 3λ¨κ³ (A/B/C) β
β β’ λ³λ ¬ μ²λ¦¬ (ThreadPoolExecutor) β
β β
β Korean Service: β
β β’ μ νλ³ ν΅μ¬ λ°μ· (Context Engineering) β
β - μμ€: κ°λ±/λν μ€μ¬ (800-1200μ) β
β - λΉλ¬Έν: λ
Όμ§/μ¦κ±° μ€μ¬ (800-1200μ) β
β β’ μνλ³ λ³λ ¬ μμ± (max_workers=5) β
β β’ Input Token 92% μ κ° β
ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β [5] AI Judge κ²μ¦ (GPT-4o-mini) - κ° λ¬Έμ λ³ β
β β
β κ²μ¦ κΈ°μ€ (1-5μ ): β
β ββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Math: β β
β β β’ mathematical_accuracy (μνμ μ νμ±) β β
β β β’ consistency (μ λ΅ μΌμΉλ) β₯ 4.0 (νμ) β β
β β β’ completeness (μκ²°μ±) β β
β β β’ logic_flow (λ
Όλ¦¬μ±) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β β Korean: β β
β β β’ literary_accuracy / narrative_comprehension β β
β β β’ relevance (μ§λ¬Έ κ΄λ ¨μ±) β β
β β β’ textual_analysis / critical_thinking β β
β β β’ answer_clarity (μ λ΅ λͺ
νμ±) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ν©κ²© 쑰건: λͺ¨λ μ μ β₯ 3.5 (λλ consistency β₯ 4.0) β
ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββ΄βββββββββββ
βΌ βΌ
ββββββββββββββββ ββββββββββββββββ
β VALID β β INVALID β
β (ν©κ²©) β β (λΆν©κ²©) β
ββββββββ¬ββββββββ ββββββββ¬ββββββββ
β β
β νΌλλ°± μ μ₯:
β β’ μ μ: {accuracy: 3.0, ...}
β β’ μ΄μ: "μ λ΅ λΆμΌμΉ"
β β
βΌ βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β [6] μ¬μλ λ©μ»€λμ¦ (μ΅λ 3ν) β
β β
β len(valid_problems) < target_count? β
β ββ NO β [7] DB μ μ₯ (μ±κ³΅) β
β ββ YES β νΌλλ°± κΈ°λ° ν둬ννΈ μ¬κ΅¬μ± β
β β
β μ¬κ΅¬μ± ν둬ννΈ μμ: β
β """ β
β **IMPORTANT: Previous attempt had issues. Fix these:** β
β β
β Problem 1 feedback: β
β - Scores: consistency=2.5, accuracy=4.0 β
β - Issue: νμ΄ κ³Όμ μ λ§μ§λ§ λ΅μ΄ μ λ΅κ³Ό μΌμΉνμ§ μμ΅λλ€ β
β β
β **MUST ensure**: consistency β₯ 4.0, all scores β₯ 3.5 β
β """ β
β β
β β [4] AI λ¬Έμ μμ±μΌλ‘ λμκ° λΆμ‘±ν κ°μλ§ μ¬μμ± ββββββββββ
ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ β
βΌ β
[λͺ©ν λ¬μ± μ] [μ¬μλ νμ μ]
β β
βββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β [7] PostgreSQL μ μ₯ β
β β’ Worksheet μμ± β
β β’ Problem μ μ₯ (TikZ μ½λ ν¬ν¨) β
β β’ Transaction μ»€λ° β
ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β [8] μ€μκ° μλ¦Ό (Notification Service) β
β β’ SSE (Server-Sent Events) μ€νΈλ¦¬λ° β
β β’ μ§ν μν: λκΈ° β μμ± μ€ β κ²μ¦ μ€ β μλ£ β
β β’ μ¬μ©μμκ² μ€μκ° νΌλλ°± β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
[ν΅μ¬ μ±κ³Ό]
β’ μ΄κΈ° ν΅κ³Όμ¨: 78% (First-Pass Yield)
β’ μ΅μ’
ν©κ²©λ₯ : 99% (Feedback-Enhanced Regeneration)
β’ κ΅μ‘ νμ§ μ λ’°λ: 95% (Independent AI Audit)
β’ κ²μ¦ λΉμ©: μ 체 μμ± λΉμ©μ 0.8% (νμ΄λΈλ¦¬λ μν€ν
μ²)
κ΅μ¬ β Auth Service (μΈμ¦) β Market Service
β
μν μ‘°ν β ν¬μΈνΈ μ°¨κ°
β
νλ§€μ μμ΅ μ 립 (90%)
β
Math/Korean/English Service β μν¬μνΈ λ³΅μ¬
β
ꡬ맀μ κ³μ μ μν¬μνΈ μΆκ°
β
ꡬ맀 κΈ°λ‘ μ μ₯ β μλ¦Ό μ μ‘
κ΅μ¬ β Korean Service β κ³Όμ μμ±
β
ν΄λμ€λ£Έ νμλ€μκ² λ°°ν¬
β
νμ λ΅μ μ μΆ (OCR ν¬ν¨)
β
AI μ±μ (Gemini) β νΌλλ°± μμ±
β
μ±μ κ²°κ³Ό μ μ₯ β κ΅μ¬/νμ μλ¦Ό
# Database
DB_USER=postgres
DB_PASSWORD=password
DB_NAME=qt_project_db
# AI API Keys
GEMINI_API_KEY=your-gemini-key
MATH_GEMINI_API_KEY=your-math-gemini-key (optional)
KOREAN_GEMINI_API_KEY=your-korean-gemini-key (optional)
ENGLISH_GEMINI_API_KEY=your-english-gemini-key (optional)
OPENAI_API_KEY=your-openai-key
GOOGLE_VISION_API_KEY=your-vision-key (optional)
# Auth
AUTH_SECRET_KEY=your-jwt-secret-key
# Redis
REDIS_URL=redis://redis:6379/0| μλΉμ€ | μΈλΆ ν¬νΈ | λ΄λΆ ν¬νΈ | μ€ν€λ§ |
|---|---|---|---|
| Math Service | 8001 | 8000 | math_service |
| English Service | 8002 | 8000 | english_service |
| Auth Service | 8003 | 8000 | auth_service |
| Korean Service | 8004 | 8000 | korean_service |
| Market Service | 8005 | 8000 | market_service |
| Notification Service | 8006 | 8000 | notification_service |
| PostgreSQL | 5433 | 5432 | - |
| Redis | 6379 | 6379 | - |
# 1. νκ²½ λ³μ μ€μ
cp .env.example .env
# .env νμΌ μμ
# 2. Docker Composeλ‘ λͺ¨λ μλΉμ€ μ€ν
docker-compose up -d
# 3. λ‘κ·Έ νμΈ
docker-compose logs -f
# 4. νΉμ μλΉμ€λ§ μ¬μμ
docker-compose restart math-service
# 5. μ 체 μ’
λ£
docker-compose down# Math Service
cd services/math-service
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000
# Math Celery Worker
celery -A app.celery_app worker --loglevel=info
# Korean Service
cd services/korean-service
pip install -r requirements.txt
python korean_main.py
# Korean Celery Worker
celery -A app.celery_app worker --loglevel=info --concurrency=4
# Auth Service
cd services/auth-service
pip install -r requirements.txt
uvicorn auth_main:app --reload --port 8000
# Market Service
cd services/market-service
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000κ° μλΉμ€λ μλ μμ±λ API λ¬Έμλ₯Ό μ 곡ν©λλ€:
- Math Service: http://localhost:8001/docs
- English Service: http://localhost:8002/docs
- Auth Service: http://localhost:8003/docs
- Korean Service: http://localhost:8004/docs
- Market Service: http://localhost:8005/docs
- Notification Service: http://localhost:8006/docs
- λ‘κ·ΈμΈ: μ¬μ©μκ° Auth Serviceλ‘ λ‘κ·ΈμΈ
- ν ν° λ°κΈ: JWT ν ν° μμ± (7μΌ μ ν¨)
- ν ν° κ²μ¦: λ€λ₯Έ μλΉμ€κ° Auth Serviceμ
/api/auth/verify-tokenμΌλ‘ κ²μ¦ - κΆν νμΈ: κ΅μ¬/νμ μν κΈ°λ° μ κ·Ό μ μ΄
- JWT ν ν° κΈ°λ° stateless μΈμ¦
- bcrypt λΉλ°λ²νΈ ν΄μ± (rounds=12)
- CORS μ€μ (νλ‘ νΈμλ λλ©μΈλ§ νμ©)
- μλΉμ€ κ° λ΄λΆ ν΅μ (Docker λ€νΈμν¬)
- νκ²½ λ³μλ‘ λ―Όκ° μ 보 κ΄λ¦¬
services/λλ ν 리μ μ μλΉμ€ ν΄λ μμ±Dockerfileλ°requirements.txtμμ±docker-compose.ymlμ μλΉμ€ μΆκ°- PostgreSQL μ€ν€λ§ μμ± (
scripts/init-schema.sql) - Auth Service λ―Έλ€μ¨μ΄ μ°λ
- README.md μμ±
# μ€ν€λ§ μ΄κΈ°ν (μ£Όμ: λ°μ΄ν° μμ€)
docker-compose down -v
docker-compose up -d postgres
# νΉμ μλΉμ€ μ€ν€λ§λ§ μ¬μμ±
docker exec -it qt_project_db psql -U postgres -d qt_project_db
DROP SCHEMA math_service CASCADE;
# μλΉμ€ μ¬μμνλ©΄ μλ μμ±- Celery Worker: λ‘컬μμλ
--pool=soloμ΅μ μ¬μ© - Redis: Dockerλ‘ μ€ννκ³ λ‘컬μμ μ°κ²°
- PostgreSQL: pgAdmin λλ DBeaverλ‘ DB κ΄λ¦¬
- Hot Reload:
--reloadμ΅μ μΌλ‘ μλ μ¬μμ
- ν¬νΈ μΆ©λ:
docker-compose downν μ¬μμ - DB μ°κ²° μ€ν¨: PostgreSQL 컨ν μ΄λ μν νμΈ
- Celery μμ μ€ν¨: Redis μ°κ²° λ° Worker λ‘κ·Έ νμΈ
- AI API μλ¬: API ν€ μ ν¨μ± λ° ν λΉλ νμΈ
- μΈμ¦ μ€ν¨: Auth Service μν λ° ν ν° λ§λ£ νμΈ
# μ 체 μλΉμ€ λ‘κ·Έ
docker-compose logs -f
# νΉμ μλΉμ€ λ‘κ·Έ
docker-compose logs -f math-service
# Celery Worker λ‘κ·Έ
docker-compose logs -f celery-worker