# AI 모델 업데이트 워크플로우

> **작성일**: 2026-03-03
> **상태**: 확정
> **대상**: Google Gemini, Claude, OpenAI 등 AI 모델 버전 업데이트 시 적용

---

## 1. 개요

### 1.1 목적

AI 제공사(Google, Anthropic, OpenAI)가 모델을 업데이트하거나 기존 모델을 종료(deprecate)할 때, SAM 시스템 전체를 안전하게 마이그레이션하기 위한 표준 절차를 정의한다.

### 1.2 핵심 원칙

SAM의 AI 설정은 **환경변수 기반 아키텍처**로 설계되어 있어, 모델 변경 시 코드 수정이 최소화된다.

```
.env (GEMINI_MODEL=gemini-2.5-flash)         ← ① 여기만 바꾸면 동작
  ↓
config/services.php (env() + fallback 기본값)  ← ② fallback도 업데이트 권장
  ↓
AiConfig 모델 (DEFAULT_MODELS 상수)            ← ③ 관리 화면 기본값
  ↓
서비스 클래스 (config 또는 AiConfig 참조)       ← 코드 수정 불필요
```

---

## 2. 수정 대상 전체 매핑

### 2.1 환경변수 (.env) — 🔴 필수

| 환경 | 파일 위치 | 변수명 |
|------|----------|--------|
| 로컬 API | `/home/aweso/sam/api/.env` | `GEMINI_MODEL` |
| 로컬 MNG | `/home/aweso/sam/mng/.env` | `GEMINI_MODEL` |
| 개발서버 API | `/home/webservice/api/.env` | `GEMINI_MODEL` |
| 개발서버 MNG | `/home/webservice/mng/.env` | `GEMINI_MODEL` |
| 운영서버 API | `/home/webservice/api/.env` | `GEMINI_MODEL` |
| 운영서버 MNG | `/home/webservice/mng/.env` | `GEMINI_MODEL` |

> **참고**: API와 MNG가 같은 `.env` 값을 사용하므로 둘 다 동일하게 변경해야 한다.
> **참고**: `GEMINI_API_KEY`와 `GEMINI_BASE_URL`은 모델 변경 시 대부분 그대로 유지된다.

### 2.2 코드 Fallback 기본값 — 🟡 권장

코드에 하드코딩된 fallback 기본값. `.env`가 정상 설정되어 있으면 동작에 영향 없지만, 유지보수를 위해 함께 업데이트한다.

| 파일 | 줄 | 현재 값 |
|------|---|---------|
| `api/config/services.php` | 46 | `env('GEMINI_MODEL', 'gemini-2.0-flash')` |
| `mng/config/services.php` | 40 | `env('GEMINI_MODEL', 'gemini-2.0-flash')` |
| `mng/app/Models/System/AiConfig.php` | 62 | `DEFAULT_MODELS['gemini'] = 'gemini-2.0-flash'` |
| `mng/app/Models/System/AiConfig.php` | 97 | `config('services.gemini.model', 'gemini-2.0-flash')` |
| `api/app/Services/AiReportService.php` | 326 | `config('services.gemini.model', 'gemini-2.0-flash')` |

### 2.3 데이터베이스 — 🟢 필요 시

| 테이블 | 변경 내용 | 변경 방법 |
|--------|----------|----------|
| `ai_configs` | 모델명 변경 | MNG 관리 화면 (`/system/ai-config`) |
| `ai_pricing_configs` | 새 모델 단가 추가 | MNG 관리 화면 (`/system/ai-token-usage` → 단가 설정) |

> `ai_token_usages` 테이블은 과거 기록이므로 수정 불필요. 새 호출부터 새 모델명으로 기록된다.

### 2.4 Google API Base URL — 보통 변경 불필요

| 변수 | 현재 값 | 비고 |
|------|---------|------|
| `GEMINI_BASE_URL` | `https://generativelanguage.googleapis.com/v1beta` | v1beta → v1 변경 시에만 수정 |

> Google이 API 버전을 올릴 때(v1beta → v1) Base URL도 변경 필요. 모델명만 바뀔 때는 그대로 유지.

---

## 3. 실행 절차 (Step-by-Step)

### Step 1: 사전 확인 (10분)

```bash
# 1. 새 모델명 확인 (Google AI Studio 또는 공식 문서)
# 예: gemini-2.0-flash → gemini-2.5-flash

# 2. API 호환성 확인
# - Base URL 변경 여부 (v1beta → v1 등)
# - 요청/응답 스키마 변경 여부
# - 가격 변경 여부

# 3. 현재 사용 중인 모델 확인
grep -r "GEMINI_MODEL" /home/aweso/sam/api/.env /home/aweso/sam/mng/.env
```

---

### Step 2: 로컬 환경 테스트 (15분)

```bash
# 1. 로컬 .env 수정
# api/.env
GEMINI_MODEL=gemini-2.5-flash

# mng/.env
GEMINI_MODEL=gemini-2.5-flash

# 2. 캐시 클리어 (config가 캐시되어 있을 수 있음)
docker exec sam-api-1 php artisan config:clear
docker exec sam-mng-1 php artisan config:clear

# 3. MNG 관리 화면에서 테스트
# http://mng.sam.kr/system/ai-config → "연결 테스트" 버튼

# 4. 실제 기능 테스트
# - 명함 OCR 테스트 (BusinessCardOcrService)
# - 사업자등록증 OCR 테스트 (TradingPartnerOcrService)
# - AI 리포트 생성 테스트 (AiReportService)
```

---

### Step 3: 코드 Fallback 업데이트 (5분)

```bash
# Claude Code에게 요청:
# "Gemini 모델 fallback 기본값을 gemini-2.5-flash로 업데이트해줘"

# 수정 대상 (5개 파일):
# 1. api/config/services.php
# 2. mng/config/services.php
# 3. mng/app/Models/System/AiConfig.php (DEFAULT_MODELS + getActiveGemini)
# 4. api/app/Services/AiReportService.php
```

---

### Step 4: 개발서버 배포 + 테스트 (10분)

```bash
# 1. 코드 커밋 & 푸시 (Jenkins 자동 배포)
# "개발서버 푸시"

# 2. 개발서버 .env 수정 (SSH 접속)
ssh pro@114.203.209.83

# API
cd /home/webservice/api
# .env 파일에서 GEMINI_MODEL 수정
php artisan config:clear

# MNG
cd /home/webservice/mng
# .env 파일에서 GEMINI_MODEL 수정
php artisan config:clear

# 3. 개발서버에서 기능 테스트
# https://admin.codebridge-x.com/system/ai-config → 연결 테스트
```

---

### Step 5: 단가 설정 업데이트 (5분)

```
# MNG 관리 화면 접속
# /system/ai-token-usage → 단가 설정 탭

# 기존 모델 단가 비활성화 (삭제하지 않음 — 과거 기록 참조용)
# 새 모델 단가 추가:
# - provider: gemini
# - model_name: gemini-2.5-flash
# - input_price_per_million: (Google 공식 가격)
# - output_price_per_million: (Google 공식 가격)
# - exchange_rate: (현재 환율)
# - is_active: true
```

---

### Step 6: 운영서버 배포 (10분)

```bash
# 1. 운영 코드 배포
# "운영서버 푸시"

# 2. 운영서버 .env 수정 (개발팀장이 직접)
# API: /home/webservice/api/.env → GEMINI_MODEL=gemini-2.5-flash
# MNG: /home/webservice/mng/.env → GEMINI_MODEL=gemini-2.5-flash
# php artisan config:clear (api, mng 각각)

# 3. 운영서버 기능 확인
```

---

### Step 7: 사후 모니터링 (1일)

```
# 1. AI 토큰 사용량 모니터링
# /system/ai-token-usage → 새 모델명으로 로그 기록되는지 확인

# 2. 에러 로그 모니터링
# API: storage/logs/laravel.log
# MNG: storage/logs/laravel.log

# 3. 기존 모델 종료일 전까지 롤백 준비
# .env의 GEMINI_MODEL만 이전 값으로 되돌리면 즉시 롤백
```

---

## 4. 체크리스트 (모델 업데이트 시)

### 사전 준비

- [ ] 새 모델명 확인 (공식 문서)
- [ ] API 호환성 확인 (Base URL, 스키마 변경 여부)
- [ ] 새 모델 가격 확인

### 로컬 테스트

- [ ] `api/.env` 의 `GEMINI_MODEL` 수정
- [ ] `mng/.env` 의 `GEMINI_MODEL` 수정
- [ ] Docker config:clear 실행
- [ ] MNG AI 설정 화면에서 연결 테스트 성공
- [ ] 명함 OCR / 사업자등록증 OCR / AI 리포트 테스트

### 코드 업데이트

- [ ] `api/config/services.php` fallback 기본값 변경
- [ ] `mng/config/services.php` fallback 기본값 변경
- [ ] `AiConfig.php` DEFAULT_MODELS 상수 변경
- [ ] `AiConfig::getActiveGemini()` fallback 변경
- [ ] `AiReportService.php` fallback 변경
- [ ] Git 커밋

### 개발서버

- [ ] 코드 푸시 (Jenkins 배포)
- [ ] `.env` 수정 (api, mng)
- [ ] `config:clear` 실행
- [ ] 연결 테스트 + 기능 테스트

### 단가 설정

- [ ] 기존 모델 단가 비활성화
- [ ] 새 모델 단가 추가 (input/output 가격, 환율)

### 운영서버

- [ ] 코드 푸시 (cherry-pick → main)
- [ ] `.env` 수정 (개발팀장 직접)
- [ ] `config:clear` 실행
- [ ] 기능 확인

### 사후 관리

- [ ] 토큰 사용량 로그에 새 모델명 확인
- [ ] 에러 로그 모니터링 (1일)
- [ ] 구 모델 종료일 전 롤백 가능 상태 유지

---

## 5. 긴급 롤백 절차

모델 변경 후 문제 발생 시:

```bash
# 1. .env만 이전 모델로 변경 (코드 수정 불필요)
GEMINI_MODEL=gemini-2.0-flash

# 2. 캐시 클리어
php artisan config:clear

# 3. 즉시 이전 모델로 복구됨
```

> `.env` 기반 아키텍처의 장점: 코드 배포 없이 환경변수만 변경하면 즉시 롤백 가능

---

## 6. FAQ

### Q: Base URL도 바꿔야 하나?

A: 대부분 **변경 불필요**. Google이 API 버전을 올릴 때(예: `v1beta` → `v1`)에만 `GEMINI_BASE_URL`도 함께 변경한다. 모델명만 바뀔 때는 `GEMINI_MODEL`만 수정하면 된다.

### Q: API 키도 바꿔야 하나?

A: **변경 불필요**. 동일 프로젝트 내에서 모델이 바뀌어도 API 키는 유지된다.

### Q: React 프로젝트도 수정해야 하나?

A: **불필요**. React는 Google Maps API Key만 사용하며, Gemini AI 호출 코드가 없다.

### Q: MNG 관리 화면에서만 바꾸면 안 되나?

A: 현재 구조상 `AiConfig::getActiveGemini()`는 **DB가 아니라 .env 값을 읽는다**. DB의 `ai_configs` 테이블은 관리 화면 표시/테스트용이며, 실제 API 호출은 `.env` → `config()` 경로를 따른다. 따라서 `.env` 수정이 필수다.

### Q: 향후 DB 기반으로 전환하면 더 편해지나?

A: 맞다. `AiConfig::getActiveGemini()`가 DB에서 활성 설정을 읽도록 리팩토링하면, MNG 관리 화면에서만 모델을 바꿔도 전체 적용된다. 서버 SSH 접속 없이 웹에서 즉시 변경 가능해진다. 이는 향후 개선 과제로 검토할 수 있다.

---

## 관련 문서

- [AI 설정 가이드](/home/aweso/sam/docs/guides/ai-config-settings.md)
- [서버 환경 비교](/home/aweso/sam/CLAUDE.md) — 실행 환경 섹션

---

**최종 업데이트**: 2026-03-03
