철도 차량 시계열 데이터 기반 AI 학습 · 운영 통합 플랫폼 FastAPI 백엔드 + Svelte 5 프론트엔드로 구성된 풀스택 웹 애플리케이션
노선 → 편성 → 호차 → 장치 → 센서로 이어지는 자산 계층을 따라 시계열 데이터를 수집하고, 4 단계 워크플로(데이터 생성 → 전처리 → 알고리즘 선택 → 학습 실행)로 AI 모델을 학습 · 등록 · 배포 · 모니터링까지 한 번에 수행할 수 있습니다.
drop / mean / median / zero / ffill / keep3σ 규칙 / IQR (1.5) / Z-score / 미적용 + σ 임계값 슬라이더Min-Max / Standard / Robust / 미적용 (numpy 직접 구현, sklearn 의존 없음)1m / 5m / 1h (시간 컬럼 자동 탐지 후 평균 집계)| 영역 | 라이브러리 |
|---|---|
| 웹 프레임워크 | FastAPI ≥ 0.109 |
| ASGI 서버 | Uvicorn + websockets |
| ORM | SQLAlchemy 2.x + aiosqlite |
| 데이터 검증 | Pydantic v2 + pydantic-settings |
| 데이터 처리 | pandas, numpy, scipy |
| 머신러닝 | scikit-learn ≥ 1.3 |
| 파일 파싱 | openpyxl (xlsx) |
| LLM | openai (Anthropic / OpenAI 호환 엔드포인트) |
| HTTP 클라이언트 | httpx |
| 영역 | 라이브러리 |
|---|---|
| 프레임워크 | Svelte 5 (runes mode) |
| 빌드 도구 | Vite 6 + @sveltejs/vite-plugin-svelte |
| 스타일링 | Tailwind CSS 3 + PostCSS / Autoprefixer |
| 차트 | plotly.js-dist-min |
| 스프레드시트 | xlsx (SheetJS, dynamic import) |
┌──────────────────────────┐ ┌────────────────────────────┐
│ Svelte 5 Frontend │ HTTP │ FastAPI Backend │
│ (Vite, Tailwind) │ ◄─────► │ (uvicorn, websockets) │
│ │ │ │
│ • TrainingApp.svelte │ │ routers/ │
│ • ModelApp.svelte │ │ ├─ analysis │
│ • ScheduleApp.svelte │ │ ├─ datasets / data_upload│
│ • App.svelte (Setup) │ │ ├─ devices / sensors │
│ • lib/components/... │ │ ├─ training / algorithms │
└──────────────────────────┘ │ ├─ ai_models / moe_chat │
│ ├─ auth / notifications │
│ └─ llm_chat / vitzrocell │
│ │
│ services/ │
│ ├─ data_processor │
│ ├─ data_upload │
│ ├─ ml_service │
│ ├─ model_executor │
│ ├─ model_persistence │
│ ├─ training_enhanced │
│ ├─ moe_router / monitor │
│ ├─ scheduler │
│ ├─ code_versioning │
│ └─ ai_analyzer │
│ │
│ models/ (SQLAlchemy) │
└────────────────────────────┘
│
▼
┌────────────────────────────┐
│ SQLite (ai_operation.db) │
│ + 파일 스토리지 │
│ ├─ uploaded_data/ │
│ ├─ dataset_files/ │
│ └─ saved_models/ │
└────────────────────────────┘
AI_Operation_Platform/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI 엔트리포인트
│ │ ├── config.py # 환경 설정
│ │ ├── database.py # DB 세션 / 엔진
│ │ ├── timezone.py # KST 헬퍼
│ │ ├── seed_data.py # 초기 시드 데이터
│ │ ├── algorithm_templates.py # 빌트인 알고리즘 정의
│ │ ├── routers/ # 15개 API 라우터
│ │ │ ├── auth.py
│ │ │ ├── vitzrocell.py
│ │ │ ├── analysis.py
│ │ │ ├── llm_chat.py
│ │ │ ├── custom_algorithms.py
│ │ │ ├── training.py
│ │ │ ├── datasets.py
│ │ │ ├── data_upload.py
│ │ │ ├── devices.py
│ │ │ ├── sensors.py
│ │ │ ├── algorithms.py
│ │ │ ├── ai_models.py
│ │ │ ├── learning_options.py
│ │ │ ├── moe_chat.py
│ │ │ └── notifications.py
│ │ ├── services/ # 도메인 서비스
│ │ │ ├── data_processor.py # 전처리 파이프라인
│ │ │ ├── data_upload.py
│ │ │ ├── ml_service.py
│ │ │ ├── model_executor.py
│ │ │ ├── model_persistence.py
│ │ │ ├── training_enhanced.py
│ │ │ ├── ai_analyzer.py
│ │ │ ├── algorithm_base.py
│ │ │ ├── algorithms/
│ │ │ ├── code_versioning.py
│ │ │ ├── moe_config.py
│ │ │ ├── moe_router.py
│ │ │ ├── moe_monitor.py
│ │ │ ├── auth.py
│ │ │ ├── email_service.py
│ │ │ └── scheduler.py
│ │ ├── models/ # SQLAlchemy ORM 모델
│ │ │ ├── user.py
│ │ │ ├── device.py
│ │ │ ├── sensor.py
│ │ │ ├── dataset.py
│ │ │ ├── algorithm.py
│ │ │ ├── custom_algorithm.py
│ │ │ ├── ai_model.py
│ │ │ ├── training.py
│ │ │ ├── notification.py
│ │ │ ├── chat.py
│ │ │ └── vitzrocell.py
│ │ └── schemas/ # Pydantic 입출력 스키마
│ ├── requirements.txt
│ ├── requirements_extra.txt
│ └── run.py # uvicorn 실행기
│
├── frontend/
│ ├── src/
│ │ ├── main.js # 메인 엔트리 (Setup)
│ │ ├── App.svelte # 셋업/관리 페이지
│ │ ├── TrainingApp.svelte # 4단계 학습 워크플로 메인 화면
│ │ ├── ModelApp.svelte # 등록된 모델 관리
│ │ ├── ScheduleApp.svelte # 스케줄 / 트리거
│ │ ├── model_main.js
│ │ ├── app.css # Tailwind 진입 CSS
│ │ └── lib/
│ │ ├── api.js # REST 클라이언트
│ │ ├── auth.js # JWT 토큰 관리
│ │ ├── model_api.js
│ │ └── components/
│ │ ├── SetupPage.svelte
│ │ ├── DeviceHierarchySelector.svelte
│ │ ├── DataUpload.svelte
│ │ ├── PreprocessingPanel.svelte
│ │ ├── ModelRegistrationForm.svelte
│ │ ├── MoEChat.svelte
│ │ └── LoginPage.svelte
│ ├── index.html
│ ├── model.html
│ ├── package.json
│ ├── vite.config.js
│ ├── svelte.config.js
│ ├── tailwind.config.js
│ └── postcss.config.js
│
├── start.sh # 백엔드+프론트 동시 실행
├── generate_manual.py # PDF 사용자 매뉴얼 생성기
├── AI_Operation_Platform_사용자매뉴얼.pdf
├── .gitignore
└── README.md # ← 이 문서
git clone https://github.com/masterj7874/AI_Operation_Platform.git
cd AI_Operation_Platform
cd backend
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
pip install -r requirements_extra.txt # 옵션 기능 (LLM 등)
# .env 파일 작성 (환경 변수 섹션 참고)
cat > .env <<'EOF'
DATABASE_URL=sqlite:///./ai_operation.db
SECRET_KEY=change_me_to_a_random_string
OPENAI_API_KEY=sk-... # 선택: LLM/AI 코드 편집기 사용 시
EOF
python run.py # http://localhost:8040
API 문서: http://localhost:8040/docs (Swagger) · http://localhost:8040/redoc
cd frontend
npm install
npm run dev # http://localhost:5002
./start.sh
Backend: http://localhost:8040 · Frontend: http://localhost:5002
cd frontend && npm run build # → frontend/dist
# uvicorn / nginx 등으로 dist 정적 호스팅 + FastAPI 리버스 프록시
모든 단계는
frontend/src/TrainingApp.svelte한 화면에서 진행되며, 상단 스텝퍼로 진행 상태를 시각화합니다.
PPT 디자인을 따라 한 페이지에 모든 입력을 통합한 단계입니다.
| 영역 | 설명 |
|---|---|
| 노선 / 편성 선택 | 상단 드롭다운 2개 |
| 현재 장치 구조 (트리) | 셋업 페이지와 동일한 트리: 🚃 호차 → ⚙️ 장치 → 📡 센서. 펼침/접힘 토글 + [선택] 버튼으로 태그 추가 |
| 선택한 태그 목록 | 칩 형태로 표시, × 로 제거. ↶ 원상복귀 버튼으로 마지막 삭제 복원, 모두 복원 버튼으로 일괄 복원 |
| 시계열 모드 | 시작/종료 시간 + [데이터 조회] → ts_tag DB 조회 후 통계 카드 + Preview 표 |
| 파일 모드 | CSV/Excel/JSON 업로드 → 클라이언트 파싱으로 즉시 정렬된 표 미리보기 (sticky 헤더, zebra). 컬럼 구성(tag, 시간, 측정값) 자동 표시 |
KNIME / Trifacta / Dataiku 스타일의 풀 페이지 전처리 UI. 자세한 내용은 전처리 파이프라인 섹션 참고.
backend/app/services/data_processor.py)DataProcessor.preprocess(df, config) 메서드는 다음 순서로 실행됩니다.
dedup_rows)missing_strategy)drop : 결측 행 삭제mean / median : 평균 / 중앙값 대체zero : 0 대체ffill : 직전값으로 전방 채움 + bfillkeep : 그대로 유지outlier_method, outlier_sigma)3sigma / zscore : N-시그마 규칙 (σ 임계값 조절 가능)iqr : 사분위수 1.5 × IQRnone : 미적용resample_interval)time / timestamp / o_time / datetime / date)1m / 5m / 1h 간격으로 평균 집계normalization)minmax : (x - min) / (max - min)standard : (x - mean) / stdrobust : (x - median) / IQRnone : 미적용반환 페이로드:
{
"original_rows": 10000,
"processed_rows": 9421,
"removed_missing": 142,
"removed_outliers": 437,
"removed_duplicates": 0,
"statistics": [
{ "column": "AS1_Pressure", "count": 9421, "min": 1.5, "max": 9.4, "avg": 4.8, "std": 1.2 }
],
"sample_data": [ /* 상위 10행 */ ],
"applied_config": { /* 실제 적용된 PreprocessingConfig */ }
}
| 컴포넌트 | 설명 |
|---|---|
| 데이터 품질 점수 | 0~100, 색상 코딩 (≥90 emerald / ≥70 yellow / 그 외 red) |
| 전략 카드 4개 | 🔍 결측치 / 📊 이상치 / 📐 스케일링 / ⏱️ 시계열 옵션 |
| 파이프라인 칩 | RAW → 결측 → 이상치 → 스케일 → 리샘플 → CLEAN |
| 결과 통계 카드 4개 | 원본 / 결측 −N / 이상치 −N / 최종 |
| 데이터 보존율 게이지 | 그라데이션 progress bar |
| 태그별 처리표 (시계열) | 원본·결측·이상치·최종·보존율 미니바 |
| 컬럼 통계표 (파일) | count / min / max / avg / std |
| 샘플 미리보기 | sticky 헤더, zebra, 모노스페이스 |
| 사이드 가이드 | 전략별 권장 사례 + 학습 준비 완료 카드 |
Line (노선)
└─ Formation (편성)
└─ Car (호차)
└─ Device (장치)
└─ Sensor (센서)
└─ TsTag (시계열 측정값)
| 모델 | 설명 |
|---|---|
User |
인증 / 권한 |
Line / Formation / Car / Device / Sensor |
자산 계층 |
Dataset |
업로드 파일 또는 DB 조회 결과의 메타데이터 + 전처리 설정 |
Algorithm / CustomAlgorithm |
빌트인 + 사용자 정의 알고리즘 |
Training |
학습 작업 / 메트릭 / 하이퍼파라미터 / 결과 |
AIModel |
등록된 모델 (파일 경로 / 입출력 / 버전) |
Notification |
시스템 알림 |
Chat |
LLM / MoE 채팅 히스토리 |
전체 명세는 서버 실행 후 http://localhost:8040/docs 에서 확인 가능합니다.
| 그룹 | Prefix | 주요 엔드포인트 |
|---|---|---|
| 인증 | /api/auth |
POST /register, POST /login, GET /me |
| 자산 | /api/devices, /api/sensors |
GET /lines, GET /formations, GET /cars, GET /devices/hierarchy/full |
| 데이터셋 | /api/datasets |
POST /upload, POST /{id}/preprocess, GET /preprocessing-rules/list |
| 시계열 분석 | /api/analysis |
GET /dataset/preview, POST /preprocess, GET /optimal-params |
| 알고리즘 | /api/algorithms, /api/custom-algorithms |
GET /, POST /, PUT /{id}, DELETE /{id} |
| 학습 | /api/training |
POST /run, GET /jobs, GET /jobs/{id} |
| 모델 | /api/ai-models |
POST /register, POST /{id}/predict, GET / |
| MoE | /api/moe |
POST /chat, GET /experts, GET /monitor |
| 알림 | /api/notifications |
GET /, POST /mark-read |
| LLM | /api/llm |
POST /chat, GET /providers |
backend/.env 파일에 작성합니다.
| 변수 | 필수 | 기본값 | 설명 |
|---|---|---|---|
DATABASE_URL |
✓ | sqlite:///./ai_operation.db |
SQLAlchemy 연결 문자열 |
SECRET_KEY |
✓ | (없음) | JWT 서명 키. 충분히 긴 랜덤 문자열 권장 |
ACCESS_TOKEN_EXPIRE_MINUTES |
60 * 24 |
JWT 만료 시간 | |
OPENAI_API_KEY |
(없음) | LLM 채팅 / AI 코드 편집기 사용 시 필요 | |
OPENAI_BASE_URL |
(없음) | OpenAI 호환 게이트웨이 사용 시 | |
EMAIL_HOST / EMAIL_PORT / EMAIL_USER / EMAIL_PASS |
(없음) | 알림 메일 발송 | |
UPLOAD_DIR |
./uploaded_data |
업로드 파일 저장 경로 | |
MODEL_DIR |
./saved_models |
학습된 모델 저장 경로 |
⚠️
.env와*.db파일은 절대 커밋하지 마세요..gitignore에 이미 포함되어 있습니다.
cd backend
source venv/bin/activate
uvicorn app.main:app --reload --host 0.0.0.0 --port 8040
app/routers/your_router.py 작성 후 app/main.py 의 include_router 에 등록app/models/your_model.py 정의 + app/schemas/your_model.py 에 Pydantic 스키마 작성cd frontend
npm run dev # HMR 개발 서버
npm run build # 프로덕션 번들 (dist/)
npm run preview # 빌드 결과 로컬 미리보기
$state, $derived, $props, $effect)src/lib/components/ 하위에 .svelte 파일 작성src/lib/api.js 를 통해 일관된 인터페이스 사용app.css 에 글로벌 스타일ruff / black 권장prettier-plugin-svelte# 프론트엔드 빌드 통과 확인
cd frontend && npx vite build
# 백엔드 임포트 검증
cd backend && python -c "from app.main import app; print('OK')"
이 저장소는 사내 / 연구 목적으로 공개되었습니다. 상업적 사용 또는 재배포 전 저장소 소유자에게 문의하십시오.
이슈 / 풀 리퀘스트 환영합니다. 큰 변경 사항은 먼저 이슈를 열어 논의해 주세요.
GitHub Issues : https://github.com/masterj7874/AI_Operation_Platform/issues
🚄 Made for railway operations · Powered by FastAPI + Svelte 5