Skip to content

Repository files navigation

AI ExamGenerator

csat_forge.mp4

수능 기출 PDF를 올리면 AI가 문제를 추출하고, 변형 문제를 만들어 시험지 PDF/Word로 뽑아주는 서비스입니다. 1인 개발·운영 중이며 실서비스로 돌아가고 있습니다.

  • 서비스 URL: https://ai-examgenerator.co.kr/
  • 운영 환경: Naver Cloud Platform, 실서비스 운영 중
  • 구조: FastAPI + React + Redis/RQ Worker + PostgreSQL, AI는 Gemini/Claude/GPT를 역할별로 나눠서 사용

주요 기능

1. 요금제별 AI 모델 라우팅 (8-Tier)

요금제(FREE~ACADEMY_PRO, 8단계)에 따라 추출/분석/생성/검증/복구 5개 역할마다 쓰는 모델이 달라집니다. Claude는 가장 비싼 ACADEMY_PRO 티어에서만 쓰고, 나머지는 Gemini/GPT로 처리해서 원가를 맞춥니다. 자세한 표는 AI 파이프라인 문서 참고.

2. 비동기 생성 파이프라인

  • PDF 분석, 변형 문제 생성처럼 오래 걸리는 작업은 Redis + RQ Worker로 큐에 넣어서 처리합니다.
  • ACADEMY/ACADEMY_PRO 유저 작업은 큐 맨 앞으로 우선 배정됩니다.
  • Gemini가 429/503으로 막히면 다른 모델로 자동 전환하고, JSON이 깨지면 GPT-4o-mini가 복구를 시도합니다.

3. 시험지 편집 및 내보내기

  • 생성된 문제를 웹에서 수정/삭제/순서 변경할 수 있는 편집기 제공
  • Puppeteer로 A4 PDF 생성 (정답지·해설 포함)
  • Word(.docx) 내보내기는 TEACHER 플랜 이상부터 지원
  • 모든 PDF 하단에 출처 표시 자동 삽입

4. 결제/크레딧

  • 토스페이먼츠 빌링키로 자동 결제 처리
  • 크레딧은 매주 초기화(컬럼명은 monthly_credit이지만 실제 리셋 주기는 7일)
  • 결제 연속 실패 시 구독 자동 일시정지(PAUSED) + Slack 알림

5. 고객지원 챗봇

Gemini 기반 FAQ 챗봇. 프롬프트 인젝션은 백엔드 키워드 필터 + 시스템 프롬프트 레벨에서 이중으로 막습니다.


Tech Stack

분류 기술 스택
Backend FastAPI (Pydantic V2), SQLAlchemy, Alembic, PostgreSQL, Redis, RQ, Prometheus
Frontend React, TypeScript, Vite, Tailwind CSS v4, Zustand, TanStack Query v5
AI Engine Multi-Provider (Gemini, Claude, GPT-4o)
결제 토스페이먼츠 (빌링키 자동결제)
PDF Puppeteer (Headless Chromium), KaTeX
모니터링 Sentry, Prometheus, Slack Webhook
Infra Naver Cloud Platform, Nginx, Systemd

Infrastructure

NCP 단일 서버(s2-g3a, 2vCPU/8GB) 위에 Nginx + FastAPI + RQ Worker + PostgreSQL/Redis를 systemd로 띄워서 운영합니다.

스케일링 (2026-07-17): DB 커넥션 pool 예산화(API 80 + 워커 N×5 < max_connections=200), 이미지 정적 파일은 Nginx가 X-Accel-Redirect로 직접 서빙(FastAPI 스레드 점유 방지), PDF 렌더 동시성 세마포어, Gemini 호출 전역 스로틀을 Redis 원자적 카운터로 교체. k6로 회원 1만/피크 동접 500 시나리오를 검증했고 현재 스펙으로 충분히 여유 있음을 확인(자세한 내용은 docs/SERVER_SETUP.md, 배포 런북은 deploy/ 참고).

graph TD
    User([사용자])
    subgraph NCP_Public_Subnet
        Nginx[Nginx Reverse Proxy]
        LB[Load Balancer]
    end
    subgraph NCP_Private_Subnet
        FastAPI[FastAPI App Server]
        subgraph Internal_Queue
            Redis[(Redis Queue)]
        end
        subgraph Worker_Pool
            Heavy[Heavy Workers]
            Middle[Middle Workers]
        end
    end
    subgraph NCP_Data_Storage
        DB[(PostgreSQL)]
        NAS[NAS / Object Storage]
    end
    subgraph External_APIs
        AI[Multi-AI: Gemini/Claude/GPT]
        Toss[토스페이먼츠]
        Slack[Slack Webhook]
    end

    User <--> LB
    LB <--> Nginx
    Nginx <--> FastAPI
    FastAPI <--> DB
    FastAPI <--> Redis
    Redis <--> Heavy
    Redis <--> Middle
    Heavy <--> AI
    Heavy <--> DB
    Heavy <--> NAS
    FastAPI <--> Toss
    FastAPI --> Slack
Loading

Documentation

상세 개발 히스토리, 기술적 의사결정과 트러블슈팅 과정은 docs/HISTORY.md에 정리되어 있습니다. AI 파이프라인 구조는 docs/AI_PIPELINE.md, 크레딧/요금제 정책은 docs/CREDIT_POLICY.md를 참고하세요.


Getting Started

1. Requirements

  • Python 3.11+ / Node.js 18+ / PostgreSQL / Redis

2. Backend Setup

cd backend
poetry install
# .env 설정 후 (GOOGLE_API_KEY, ANTHROPIC_API_KEY, OPENAI_API_KEY 필수)
poetry run alembic upgrade head
poetry run uvicorn main:app --reload

3. Frontend Setup

cd frontend
npm install
npm run dev

4. Pre-flight Check

# 저장소 루트에서, API 키 설정 후 연결성 테스트
python3 PRE_FLIGHT_CHECK.py

Contact

About

Full-stack AI system that converts PDFs into structured CSAT exam questions

Topics

Resources

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages