콘텐츠로 이동

10. 운영: 재학습, 버전 관리, 롤백#

📚 학습 목표: 모델을 지속적으로 개선하고 안정적으로 운영
⏱️ 읽는 시간: 15분
🎯 원칙: 한 번 학습이 끝이 아님. 계속 개선.


운영 = "AI도 직원처럼 관리"#

신입 직원도 계속 교육하고, 실수를 반영하고, 승진/강등하듯: - AI도 정기 재학습 - Bad case 반영 - 버전 관리 - 문제 시 롤백


📅 재학습 주기#

권장 주기#

상황 주기 예시
정기 월 1회 매월 첫째 주
급한 개선 필요 2주 Bad case 누적 시
안정화 후 분기 1회 큰 변화 없을 때
프로젝트 종료 없음 서비스 종료 시

월간 재학습 루틴 (메디콘솔 표준)#

매월 첫째 주 일요일 밤:
  20:00 - 데이터 수집 완료
  21:00 - 학습 시작 (make all-mlx)
  06:00 - 학습 완료 (익일)

매월 첫째 주 월요일:
  09:00 - 자동 평가
  10:00 - 블라인드 평가 (수간호사)
  13:00 - 배포 결정
  14:00 - 프로덕션 전환 또는 롤백

재학습 트리거#

다음 중 하나 발생 시 긴급 재학습 고려:

  • 🚨 할루시네이션 15% 이상 (치명적 오류)
  • ⚠️ 1차 수정률 50% 초과 (저조한 실용성)
  • 📉 사용자 만족도 급락
  • 🆕 새 도메인 추가 (예: 재활 진료과 신설)
  • 🔧 베이스 모델 업데이트 (Gemma 5 출시 등)

🔢 버전 관리 전략#

Semantic Versioning (의미적 버전 관리)#

v1.2.3
 │ │ └── Patch: Bad case 반영, 작은 조정 (주간)
 │ └──── Minor: 카테고리 확장, 새 기능 (월간)
 └────── Major: 베이스 모델 변경, 큰 구조 변경 (연간)

우리 프로젝트 버전 체계#

버전 의미 예시
v0.x.x 실험/개발 v0.1.0 (첫 파이프라인 검증)
v1.x.x 프로덕션 v1.0.0 (정식 출시)
v1.1.x 마이너 개선 카테고리 확장
v1.1.1 패치 Bad case 반영
v2.0.0 메이저 업그레이드 Gemma 5 기반

버전별 명명 규칙#

HuggingFace: mediconsol/mediconsol-v1
             ├── v1.0.0 태그
             ├── v1.1.0 태그
             └── latest 태그

Ollama:      mediconsol-v1:1.0.0
             mediconsol-v1:1.1.0
             mediconsol-v1:latest  ← 현재 배포본

Harness:     project.llm_metadata.current_version = "v1.1.0"

📦 배포 절차 (정식)#

단계별 체크리스트#

배포 시 LLM_DEPLOY_CHECKLIST.md 기반:

## v1.1.0 배포 체크리스트

### 사전 검증 (배포 전날)
- [ ] 학습 완료 + 자동 평가 통과 (종합 70%+)
- [ ] 블라인드 평가 평균 4.0 이상
- [ ] 할루시네이션 10% 미만
- [ ] 이전 버전과 비교 (악화 지점 없어야)

### 배포 당일
- [ ] 오전: 프로덕션 스모크 테스트 (10건 질의)
- [ ] Ollama에 신규 버전 등록 (latest 안 바꿈)
- [ ] 베타 그룹에 1시간 테스트
- [ ] 베타 결과 문제 없음 확인
- [ ] latest 태그 전환
- [ ] Voice ENR/RNDiary 연동 확인
- [ ] 1시간 모니터링
- [ ] 24시간 모니터링

### 배포 후 (1주일)
- [ ] 사용자 피드백 수집
- [ ] 에러율 추적
- [ ] Bad case 기록 시작
- [ ] 다음 버전 이슈 정리

배포 스크립트#

scripts/08_deploy_production.sh (만들 수 있음):

#!/usr/bin/env bash
set -e

VERSION=$1  # 예: 1.1.0

echo "[1/5] 스모크 테스트"
ollama run mediconsol-v1:$VERSION "KPCS가 뭔가요?" | head -20

echo "[2/5] 베타 그룹에 태그 전환"
ollama cp mediconsol-v1:$VERSION mediconsol-v1:beta

echo "[3/5] 대기 - 베타 피드백 확인 (수동)"
read -p "베타 테스트 문제 없음? (yes/no): " ok
if [ "$ok" != "yes" ]; then
    echo "❌ 배포 중단"
    exit 1
fi

echo "[4/5] 프로덕션 전환"
OLD_LATEST=$(ollama show mediconsol-v1:latest --version)
ollama cp mediconsol-v1:$VERSION mediconsol-v1:latest
echo "이전 latest: $OLD_LATEST → 신규: $VERSION"

echo "[5/5] 확인"
ollama list | grep mediconsol-v1

🔙 롤백 절차#

롤백이 필요한 경우#

  • 🚨 치명적 할루시네이션 발견
  • 🐛 특정 카테고리에서 품질 급락
  • ⚡ 성능 저하 (응답 시간 2배)
  • 📢 사용자 불만 다수

즉시 롤백 (3분 이내)#

# 1. 이전 버전 확인
ollama list
# NAME                    SIZE    MODIFIED
# mediconsol-v1:latest    3.2GB   1시간 전 (v1.1.0 = 문제)
# mediconsol-v1:1.0.0     3.2GB   1개월 전 (안정)
# mediconsol-v1:1.1.0     3.2GB   1시간 전

# 2. latest를 이전 버전으로
ollama cp mediconsol-v1:1.0.0 mediconsol-v1:latest

# 3. Voice ENR/RNDiary 재시작 (캐시 클리어)
# 각 서비스 재시작

# 4. 확인
ollama run mediconsol-v1 "KPCS가 뭔가요?"
# (이전 버전 답변 나오는지 확인)

echo "✅ 롤백 완료"

롤백 후 작업#

# 1. 문제 버전 별도 보관 (분석용)
# 삭제하지 말고 태그만 변경
ollama cp mediconsol-v1:1.1.0 mediconsol-v1:1.1.0-problematic

# 2. 사후 분석 기록
cat >> docs/incidents.md <<EOF

## 2026-07-15 v1.1.0 롤백

### 문제
- 증상: consulting 카테고리에서 GODCH 설명 오류
- 영향: 컨설팅 보고서 자동 생성 품질 저하
- 발견: 배포 3시간 후

### 원인
- GODCH 관련 학습 데이터 중 일부에 오타
- v1.0.0에는 없던 새 데이터가 오염

### 조치
- 즉시 v1.0.0으로 롤백
- 문제 데이터 검증 시스템 강화

### 재발 방지
- 배포 전 GODCH 체크리스트 20건 필수 검증
EOF

# 3. Harness 메타데이터 업데이트
# projects.llm_metadata.current_version = "v1.0.0"
# EVAL_REPORT.md 에 롤백 사유 기록

🔄 재학습 워크플로우#

월간 재학습 체크리스트#

Week 1: 준비#

# 1. Bad case 정리
ls data/bad_cases/
# 2026-06-nursing.md, 2026-06-management.md, ...

# 2. 사용자 피드백 분석
# - 1차 수정률 높은 카테고리?
# - 자주 나오는 실수 패턴?

# 3. 신규 데이터 수집 목표
# - Bad case 기반 100건
# - 신규 요청 카테고리 50건
# - 기존 약점 보완 100건

Week 2: 데이터 추가#

# 1. data/raw/ 에 신규 데이터 추가
# 2. PHI 검증
python3 scripts/check_phi.py data/raw/

# 3. 카테고리 분포 확인
python3 scripts/show_distribution.py

Week 3: 학습 + 평가#

# 1. 전처리
make data

# 2. 학습 (야간)
make train-mlx &

# 3. 다음날 평가
make fuse-mlx convert deploy evaluate

# 4. 블라인드 평가
# (수간호사 2명에게 요청)

Week 4: 배포#

# 1. 베타 테스트 (월요일)
# 2. 프로덕션 배포 (수요일)
# 3. 모니터링 (목-금)
# 4. 회고 + 다음 주기 계획

📊 모니터링 지표#

일일 모니터링#

# 간단한 헬스체크 스크립트 (scripts/healthcheck.sh)

#!/bin/bash
echo "[$(date)] 헬스체크 시작"

# 1. Ollama 동작 확인
ollama list | grep -q mediconsol-v1 || echo "❌ 모델 없음"

# 2. 응답 시간 측정
START=$(date +%s)
ollama run mediconsol-v1 "테스트" > /dev/null
END=$(date +%s)
echo "응답 시간: $((END - START))초"

# 3. 스모크 쿼리
RESP=$(ollama run mediconsol-v1 "KPCS가 뭔가요?")
if echo "$RESP" | grep -q "Korean"; then
    echo "✅ 기본 지식 유지"
else
    echo "⚠️ 기본 지식 손실 가능"
fi

주간 지표#

매주 월요일 수집: - 총 질의 수 - 응답 시간 평균/p95 - 에러율 - 사용자 피드백 (긍정/부정) - Bad case 건수

월간 회고#

매월 말: - 이번 달 배포 이력 - 이슈/롤백 횟수 - 지표 변화 - 다음 달 계획


💾 데이터 아카이브 전략#

버전별 데이터 보관#

archives/
├── v1.0.0/
│   ├── train.jsonl         ← 학습 데이터
│   ├── eval.jsonl
│   ├── adapter.safetensors ← 어댑터
│   ├── eval_report.json    ← 평가 결과
│   └── README.md           ← 버전 노트
├── v1.1.0/
│   └── ...
└── v1.2.0/
    └── ...

삭제 금지#

  • ❌ 학습 데이터 (data/processed/train.jsonl)
  • ❌ 어댑터 (adapters.safetensors)
  • ❌ 평가 결과
  • ❌ Bad case 기록

이유: 재현성. 6개월 후 "이 버전 왜 이렇게 됐지?" 질문 올 때.

HuggingFace 업로드 (백업)#

# 매 버전마다 Private 저장소에 업로드
export HF_TOKEN="hf_xxx"
make upload-all

# HF에 태그로 저장
# https://huggingface.co/mediconsol/mediconsol-v1
# Tags: v1.0.0, v1.1.0, v1.2.0 ...

🎓 숙련도별 가이드#

초급 (첫 3개월)#

목표: 파이프라인에 익숙해지기

  • 월 1회 재학습 엄수
  • Bad case 수집 루틴
  • 롤백 절차 한번 연습

중급 (3-6개월)#

목표: 품질 개선

  • 하이퍼파라미터 실험
  • 카테고리별 A/B 테스트
  • 블라인드 평가 시스템화

고급 (6개월+)#

목표: 자동화 및 확장

  • 자동 재학습 파이프라인
  • 다중 모델 관리 (특화 모델)
  • 외부 평가 데이터셋 활용

🚨 긴급 상황 대응 매뉴얼#

시나리오 1: "AI가 틀린 의료 정보 제공 중"#

우선순위: 즉시 서비스 중단

# 1. 즉시 Ollama 중단
brew services stop ollama

# 2. 영향 범위 파악
# - 얼마나 오랫동안?
# - 몇 명이 영향?

# 3. 내부 공지
# Slack에 상황 공유

# 4. 이전 버전 롤백
brew services start ollama
ollama cp mediconsol-v1:1.0.0 mediconsol-v1:latest

# 5. 사후 보고

시나리오 2: "Voice ENR 연동 실패"#

진단 순서:

# 1. Ollama 상태
curl http://localhost:11434/api/tags

# 2. 모델 응답
ollama run mediconsol-v1 "테스트"

# 3. Cloudflare Tunnel
curl https://llm.mediconsol.com/api/tags

# 4. Voice ENR 로그
# (Voice ENR 쪽 로그 확인)

시나리오 3: "학습 중 맥미니 다운"#

# 1. 맥미니 재부팅
# 2. 체크포인트 확인
ls outputs/mlx_adapter/*_adapters.safetensors

# 3. 이어서 학습
python3 -m mlx_lm.lora \
    --resume-adapter-file outputs/mlx_adapter/0000XXX_adapters.safetensors \
    --iters 200

📚 운영 문서 자동 업데이트#

매 버전 배포 시 다음 문서 업데이트:

  1. Harness 프로젝트 llm_metadata
  2. current_version
  3. latest_eval

  4. EVAL_REPORT.md (Harness 아티팩트)

  5. 새 버전 섹션 추가 (맨 위)

  6. MODEL_CARD.md (Harness + HF)

  7. 최신 평가 점수
  8. 버전 이력

  9. LLM_DEPLOY_CHECKLIST.md

  10. 체크리스트 완료 기록

✅ 자가 체크#

  • 재학습 주기 이해 (월 1회)
  • 버전 관리 체계 이해 (Semantic Versioning)
  • 배포 체크리스트 실행 가능
  • 롤백 절차 연습 완료
  • 긴급 상황 대응 매뉴얼 숙지

🎉 축하합니다!#

여기까지 읽으셨다면, 당신은 이제: - LLM 파인튜닝의 개념을 이해함 - 실제 파이프라인을 실행할 수 있음 - 학습 결과를 해석할 수 있음 - 문제 상황에 대처할 수 있음 - 데이터를 수집하고 품질 관리할 수 있음 - 하이퍼파라미터를 조정할 수 있음 - 평가 시스템을 구축할 수 있음 - 지속적으로 운영할 수 있음

당신은 이제 LLM 엔지니어입니다! 🎓


다음 단계#

필요할 때 참조할 자료:

그리고 실전으로!


💡 핵심 요약#

재학습: 월 1회 (매월 첫째 주 일요일 야간)
버전: Semantic (v1.0.0 → v1.1.0 → v2.0.0)
배포: 스모크 → 베타 → latest 전환
롤백: 3분 이내 (ollama cp)
기록: 모든 버전/데이터/평가 아카이브 필수