# task-1624.1 완료 보고서: 블로그 이미지 생성 Phase 2 — photo 모델 A/B 테스트

## SCQA

**S**: 블로그 이미지 생성 파이프라인에서 photo 타입은 Gemini(`gemini-3-pro-image-preview`)가 primary, GPT Image(`gpt-image-1`)가 fallback으로 운영 중이다. Phase 1(task-1622.1)에서 구조형→HTML→PNG 라우팅을 수정 완료했고, Phase 2로 photo 모델 A/B 테스트가 예정되었다.

**C**: 3가지 제약 발견. (1) Imagen 3은 Vertex AI 인증 정보(`.env.keys`에 `GOOGLE_CLOUD_PROJECT`, `VERTEX` 관련 키 없음)가 없어 사용 불가. (2) GPT Image는 OpenAI API 키가 만료/무효(401 Unauthorized)하여 fallback 포함 전면 작동 불가. (3) Gemini는 추상적 프롬프트(P3)에서 "INSURANCE PROTECTION" 텍스트를 이미지에 렌더링하는 문제 확인 — systemInstruction 무시.

**Q**: 현재 사용 가능한 모델로 photo 경로의 품질을 개선하고, 텍스트 렌더링 문제를 해결할 수 있는가?

**A**: Gemini 프롬프트 래핑에 anti-text 지시문을 추가하여 텍스트 렌더링 문제를 해결했다. 개선 전 P3에서 "INSURANCE PROTECTION" 텍스트가 렌더링되었으나, 개선 후 재테스트에서 텍스트 0건으로 확인. Gemini가 현재 유일한 작동 모델이므로 primary를 유지하되, GPT Image fallback 복구(API 키 갱신)를 에스컬레이션한다. pytest 87건 전체 통과, 기존 기능 회귀 없음.

---

## A/B 테스트 결과

### 테스트 환경
- 테스트 일시: 2026-04-11
- 프롬프트 3개 (보험 도메인)
- 비교 대상: Gemini vs GPT Image (Imagen 3은 인증 부재로 제외)

### Gemini (gemini-3-pro-image-preview)

- 성공률: 3/3 (100%)
- 평균 생성 시간: 20.32초
- 해상도: 1408x768 (일관)
- 파일 크기: 435KB~830KB (JPEG)
- P1 (사무실): 고품질, 자연광, 한국식 인테리어 정확. 명패에 "한국 보험" 자연스러운 문맥 텍스트만 포함.
- P2 (가족): 고품질, 한국인 가족+보험설계사 구성 정확. 텍스트 렌더링 없음.
- P3 (추상 컨셉): **개선 전** "INSURANCE PROTECTION" 텍스트 렌더링됨 → **개선 후** 텍스트 0건, 순수 비주얼(방패+우산).

### GPT Image (gpt-image-1)

- 성공률: 0/3 (0%)
- 실패 원인: `401 Unauthorized` — OpenAI API 키 만료/무효
- 품질/성능 평가 불가

### Imagen 3 (imagegeneration@006)

- 테스트 불가: `.env.keys`에 Vertex AI 인증 정보 없음
- 필요 키: `GOOGLE_CLOUD_PROJECT`, Vertex AI 서비스 계정 또는 ADC 설정

## primary 모델 결정

- **Primary**: Gemini (`gemini-3-pro-image-preview`) — 유지 (유일한 작동 모델)
- **Fallback**: GPT Image — 현재 비활성 (API 키 갱신 필요)
- **Fallback 순서 변경 없음**: `_FALLBACK_CHAIN` 기존 유지 (`gemini → gpt`)

## 코드 변경 내역

### 수정 파일

`/home/jay/workspace/tools/ai-image-gen/image_router.py` (Line 188-193):
- `_generate_gemini()` 프롬프트 래핑에 anti-text 지시문 추가
- 변경 전: `"Generate a high-quality image based on this description:"`
- 변경 후: `"IMPORTANT: Do not render any text... Generate a high-quality photorealistic image..."`
- 모든 프롬프트에 anti-text 지시가 적용됨 (startswith 분기 양쪽 모두)

### 신규 파일

- `/home/jay/workspace/tools/ai-image-gen/ab_test_photo_models.py` — A/B 테스트 스크립트

## 발견 이슈 및 해결

### 자체 해결 (2건)
1. **Gemini P3 텍스트 렌더링** — `_generate_gemini()` 프롬프트에 anti-text 지시문 추가. 재테스트 결과 텍스트 0건 확인.
2. **A/B 테스트 스크립트 Pyright 에러** — `t0` 변수 unbound 수정 (try 밖으로 이동), import 타입 주석 추가.

### 범위 외 미해결 (2건)
1. **GPT Image API 키 만료** — 범위 외 사유: OpenAI 플랫폼 계정 접근 및 키 재발급은 관리자(아누/제이) 권한 필요. 현재 `.env.keys`의 `OPENAI_API_KEY`가 `401 Unauthorized` 반환.
2. **Imagen 3 Vertex AI 인증 부재** — 범위 외 사유: Google Cloud Vertex AI 프로젝트 설정 및 서비스 계정 생성은 인프라 팀 소관. `.env.keys`에 관련 키 없음.

## 테스트 결과

- pytest: 87/87 통과 (0 실패, 0.24초)
- 테스트 대상: `test_image_router.py`
- 기존 기능 회귀: 없음

## 셀프 QC 체크리스트

- [x] 1. 영향 파일: `image_router.py` 1개 파일만 수정, 다른 파일 영향 없음 (프롬프트 문자열 변경만)
- [x] 2. 엣지 케이스: 빈 프롬프트 → 기존 fallback HTML 동작 유지, create/generate/design 시작 프롬프트 → else 분기에서 anti-text 추가
- [x] 3. 작업 지시 일치: A/B 테스트 실행, 비교 평가, primary 결정 완료
- [x] 4. 에러 처리/보안: API 키 로그에 마스킹 됨 (OpenAI 라이브러리 자체 마스킹)
- [x] 5. 테스트 커버리지: 87/87 통과
- [x] 6. 발견 이슈 해결: 2건 자체 해결, 2건 범위 외 사유 명시
- [x] 7. 코드 아키텍처: 기존 구조 유지, 프롬프트 문자열 변경만
- [x] 8. 인터페이스 변경 없음

## 산출물 파일

- `/home/jay/workspace/tools/ai-image-gen/image_router.py`
- `/home/jay/workspace/tools/ai-image-gen/ab_test_photo_models.py`
- `/home/jay/workspace/tools/ai-image-gen/output/ab_test/results.json`
- `/home/jay/workspace/tools/ai-image-gen/output/ab_test/gemini_p1.jpg`
- `/home/jay/workspace/tools/ai-image-gen/output/ab_test/gemini_p2.jpg`
- `/home/jay/workspace/tools/ai-image-gen/output/ab_test/gemini_p3.jpg`
- `/home/jay/workspace/tools/ai-image-gen/output/ab_test/gemini_p3_improved.jpg`

## 모델 사용 기록

- 팀장 다그다(Opus): 분석, 의사결정, 보고서 작성
- 루(Sonnet): A/B 테스트 스크립트 작성, anti-text 프롬프트 개선
