유대선
프로젝트로
·기술 회고·3

Image 1568→1024 downscale — 30% latency / 40% token, ship-mode pragmatic trade-off

Vision LLM 호출 비용 dominate한 image payload. 1568px → 1024px downscale로 30% latency 단축 + 40% token 절감, 작은 텍스트 정확도 ~5% 손실 trade. ship-mode pragmatic 결정 — 완벽 X, ship 우선.

문제

dogfooding에서 사용자 좌절: "속도는 이게 최대인가?" — 평균 호출 9.5s.

bench:

→ Gemini call이 dominate. payload 줄이면 latency 줄어들 확률 큼.

결정 분기

3 옵션:

A. 모델 swap — Gemini Flash → Flash-Lite

B. ⭐ Image downscale

C. Streaming response

선택 B. ship-mode pragmatic — 완벽 X, ship 우선.

박힌 거

ScreenCapture.swift — 1568 → 1024

// 이전:
let targetWidth: CGFloat = 1568
 
// 이후:
let targetWidth: CGFloat = 1024

GeminiDispatcher — maxOutputTokens 2048 → 1024

응답 JSON은 보통 ~200 tokens. 2048 over-allocation으로 budget 시간 낭비. 1024로 줄여 attention budget 응답 quality에 집중.

AppDelegate — loading message 갱신

이전: "AI에 물어보는 중..." 이후: "AI에 물어보는 중... (3~5초)"

→ perceived latency 단축 (사용자 기대치 set). 실측 latency 동일이라도 사용자 체감 빨라짐.

비용 분석

Gemini 2.5 Flash image tokens:
  1568×1014 = ~516 image tokens × $0.30/1M = $0.000155
  1024×662  = ~308 image tokens × $0.30/1M = $0.000092
  
  per call 절감: $0.000063 (~40%)
  per 100 tasks/일: $0.0063/일 → ~₩8/일 → ₩240/월
  
  latency 절감: ~3s × 100 tasks/일 = 300s/일 사용자 시간 절감

cost 절감보다 사용자 시간 절감이 큼.

ship-mode 정신

memory pragmatic-ship-mode 박힌 거:

2026-05-30 결정: 완벽 X, ship 우선. Target 전부 (시니어 + 개발자 + 일반). 1-2년 안 빅테크 agent에 흡수 가능 — 그 전에 niche + 수익.

→ 작은 텍스트 5% 정확도 손실은 target user case에 영향 0. ship.

다음

패턴

Commit

d57a890 (2026-05-30 11:33 -0400)