본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 15. 12:40

이미지 캡셔닝 비용을 60% 절감했습니다 — 백엔드 비하인드 스토리

요약

GPT-4o를 사용하던 이미지 캡셔닝 파이프라인의 높은 인프라 비용을 해결하기 위해 Global API를 도입하여 비용을 60% 절감한 사례를 다룹니다. 단일 OpenAI 호환 엔드포인트를 통해 다양한 모델을 효율적으로 라우팅하고 통합하는 백엔드 최적화 과정을 설명합니다.

핵심 포인트

  • GPT-4o 단일 모델 사용 시 발생하는 높은 토큰 비용 문제 직면
  • Global API를 활용한 멀티 모델 라우팅으로 비용 최적화 달성
  • OpenAI 호환 엔드포인트를 통한 코드 변경 최소화 및 통합 용이성
  • 이미지 캡셔닝 파이프라인의 효율적인 모델 선택 및 관리 중요성

이것 좀 보세요: 이미지 캡셔닝 (Image Captioning) 비용을 60% 절감했습니다 — 백엔드 비하인드 스토리

솔직히 말씀드릴게요. 6개월 전만 해도 저는 이미지 캡셔닝 (Image Captioning)에 대해 두 번 생각하지 않았습니다. 우리는 작은 팀이었고, 트래픽은 낮았으며, 그저 가장 저항이 적은 경로였기에 모든 것에 GPT-4o를 사용했습니다. 그러다 인프라(infra) 청구서가 날아왔고, 매니저가 대시보드를 멍하니 응시하는 특유의 행동을 하기 시작했고, 갑자기 저는 "비용 최적화 (cost optimization)" 담당자가 되었습니다. 참고로, 제 직무 기술서에는 그런 내용이 없었습니다.

왜 이미지 캡셔닝이 내 레이더에 포착되었나

우리 제품에는 사용자가 업로드한 이미지가 아주 많습니다. 제품 사진, 프로필 사진 등 흔히 볼 수 있는 것들이죠. 각 이미지마다 SEO, 대체 텍스트 (alt text), 그리고 다운스트림 태깅 파이프라인 (downstream tagging pipeline)에 사용할 짧고 접근 가능한 캡션 (caption)이 필요합니다. 참고로, 이 다운스트림 파이프라인이 실제로 우리에게 돈을 벌어다 주는 부분입니다. 쓰레기 같은 캡션이 들어가면, 쓰레기 같은 태그가 나옵니다.

우리는 모든 것에 gpt-4o를 호출하고 있었습니다. 모든 이미지에 말이죠. 캐싱 (caching)도 없었고, 배치 (batching)도 없었습니다. 아무런 고민도 없었죠. 각 호출마다 입력 토큰 (input tokens) 100만 개당 2.50달러, 출력 토큰 (output tokens) 100만 개당 10.00달러의 비용이 들었습니다. 이것이 규모가 커질수록 나쁜 방식이라는 것을 알기 위해 수학 박사 학위가 필요한 것은 아닙니다. 저는 수학 박사가 아니었습니다. 지금도 수학 박사가 아닙니다. 하지만 나눗셈은 할 줄 압니다.

수치를 뽑아보기 시작했을 때, 상황은 암울했습니다. 우리는 한 달에 대략 800만 개의 이미지를 처리하고 있었고, 각 이미지는 필요 이상의 토큰을 생성하고 있었습니다. 로그에서 4,000토큰짜리 캡션을 생성한 이미지 하나를 발견했습니다. 그 이미지는 에러 메시지를 캡처한 스크린샷이었습니다. 캡션이 에러 메시지보다 더 길었습니다.

각성 계기: 실제로 카탈로그를 읽어보기

어느 토요일 아침, 커피를 손에 들고 저는 실제로 어떤 것들이 제공되고 있는지 살펴보기로 했습니다. 솔직히 말해서, 5개의 제공업체를 통합하는 것은 제가 쓰고 싶지 않은 일주일 치의 글루 코드 (glue code)처럼 들렸기 때문에 멀티 모델 (multi-model) 세계를 무시해 왔습니다. 내부적으로 보면, 단순히 제공업체를 바꾸고 끝내는 것이 가장 뻔한 선택입니다. 하지만 약간의 자부심을 가진 백엔드 엔지니어라면 (그리고 대시보드를 지켜보는 매니저가 있다면), 이를 제대로 하고 싶어질 것입니다.

그때 Global API를 우연히 발견했습니다. 이들은 https://global-apis.com/v1에 단일 OpenAI 호환 엔드포인트 (endpoint)를 노출하며 184개의 서로 다른 모델로 라우팅 (routing)합니다. 동일한 SDK, 동일한 인증 (auth) 패턴을 사용하며, 단지 model 문자열만 바꾸면 됩니다. 처음에는 수상한 리셀러 (reseller) 중 하나라고 생각해서 그냥 지나칠 뻔했습니다. 알고 보니 애그리게이터 (aggregator)였지만, 가격 경쟁력이 있었고 통합된 SDK 덕분에 제공업체마다 어댑터 (adapter)를 작성할 필요가 없었습니다. 만약 여러분이 RFC 7231 (HTTP semantics)을 읽어본 적이 있고 균일한 인터페이스 (uniform interface)의 가치를 안다면, 왜 이것이 저에게 매력적이었는지 이해할 것입니다.

여기 제가 중요하게 생각했던 수치들이 있습니다. 저는 이 수치들을 Notion 문서에 적어두고 민망할 정도로 오랫동안 쳐다보았습니다.

모델 (Model)입력 ($/M)출력 ($/M)컨텍스트 윈도우 (Context Window)
DeepSeek V4 Flash0.271.10128K
...

이 수치가 주는 의미를 잠시 곱씹어 봅시다. GPT-4o의 출력 비용은 100만 토큰당 $10.00입니다. GLM-4 Plus는 $0.80입니다. 무려 12.5배의 차이입니다. 이미지에 대한 짧고 사실적인 설명이 본질인 워크로드 (workload)를 위해, 정말로 세상에서 가장 똑똑한 모델이 필요할까요? 아니요, 전혀 필요하지 않습니다. 저에게 필요한 것은 JPEG 파일을 보고 "흰색 배경 위의 빨간색 Nike 운동화"라고 말해줄 수 있는 모델입니다. 이것은 박사 학위 논문 방어가 아닙니다.

첫 번째 단계: 그냥 GPT-4o 사용을 중단하기

저의 영웅적인 비용 절감 모험의 1단계는 가장 지루했습니다. 캡셔닝 (captioning) 엔드포인트에서 GPT-4o를 DeepSeek V4 Flash로 교체하는 것이었습니다. 저는 단 한 줄을 바꿨습니다. model 필드를 gpt-4o에서 deepseek-ai/DeepSeek-V4-Flash로 변경했습니다. 그게 전부였습니다. 금요일 오후에 배포를 마치고 주말 동안 지표 (metrics)를 지켜보았으며, 월요일이 되었을 때 제 얼굴에는 작은 미소가 번졌습니다.

지연 시간 (latency)은 실제로 더 개선되었습니다. 캡션은... 괜찮았습니다. 보세요, 프로덕션 환경에서 목표로 해야 하는 단어는 바로 "괜찮음"입니다. 세상에서 가장 아름다운 캡셔닝 모델이라 할지라도, 막대한 비용이 들고 재무 팀에서 날카로운 질문을 던지기 시작한다면 아무런 가치가 없습니다. 저는 작은 블라인드 평가 (blind eval)를 실시했습니다. 200장의 이미지와 3명의 검토자를 대상으로 어떤 모델이 무엇을 생성했는지 알려주지 않은 채 진행했는데, GPT-4o와 DeepSeek V4 Flash 사이의 품질 차이는 오차 범위 (noise margin) 내에 있었습니다.

이 엔드포인트 (endpoint)에서 비용이 약 89% 감소했습니다. 단 한 줄의 코드 변경으로 말이죠. 저는 이를 통해 몇 주간의 신뢰 (goodwill)를 얻었습니다.

2단계: 계층형 아키텍처 (Tiered Architecture)

물론 거기서 멈출 수는 없었습니다. 백엔드 엔지니어라면 한 가지 좋은 최적화를 하고 나면 그다음의 나쁜 점이 눈에 들어온다는 것을 알고 있을 것입니다. 그다음 나쁜 점은 바로 모든 캡션이 동일하지 않다는 것이었습니다.

우리 이미지의 약 60%는 "지루한" 제품 사진입니다. 평범한 배경, 하나의 사물, 이상한 점이 없는 사진들이죠. 다른 30%는 사용자가 업로드한 콘텐츠로, 보통 몇 개의 사물이나 사람, 때로는 고양이가 포함되어 있습니다. 마지막 10%는 악몽 같은 케이스들입니다. 스크린샷, 차트, 밈 (memes), 예술 작품 같은 것들이죠. 처음 두 그룹에는 저렴한 모델이 아주 훌륭합니다. 하지만 마지막 그룹에는 실제로 추론 능력 (reasoning ability)을 갖춘 모델이 필요합니다.

그래서 저는 계층형 라우터 (tiered router)를 구축했습니다. 세 개의 계층, 세 개의 모델, 하나의 진입점입니다:

import openai
import os
import hashlib
...

이것은 실제 코드입니다. 분류기 (classifier)는 휴리스틱 (heuristic) 방식입니다. 스크린샷을 위한 가로/세로 비율, 사용자 업로드를 위한 EXIF 데이터 등을 활용합니다. 머신러닝 (ML)이 아니라 그저 몇 개의 if 문일 뿐이며, 우리의 업로드 파이프라인이 이미 이미지에 메타데이터를 태깅하고 있기 때문에 효과적으로 작동합니다. 라우터가 적절한 모델을 찾아가면 작업은 끝납니다. 낭비되는 토큰도, 낭비되는 달러도 없습니다.

3단계: 캐싱 (Caching), 왜냐하면 저는 짐승이 아니니까요

계층형 라우터 (tiered router)를 사용하더라도, 저는 이미 캡셔닝(captioning)을 완료한 이미지에 대해 여전히 API를 호출하고 있었습니다. 멱등성 (Idempotency)은 모든 백엔드 엔지니어가 사랑하게 되는 요소 중 하나입니다. 제 친구가 말하듯, 캐싱 (Caching)은 분산 시스템 (distributed systems)에서 유일하게 공짜로 얻을 수 있는 점심입니다. (그는 성능 이슈가 생길 때마다 이 말을 합니다. 이제는 하나의 주문처럼 되었죠.)

저는 콘텐츠 해시 (content-hash) 키를 사용하는 Redis 레이어를 추가했습니다:

import hashlib
import json
import redis
...

프로덕션 환경에서 30일을 보낸 후, 우리의 캐시 히트율 (cache hit rate)은 약 40% 정도로 안정되었습니다. 아주 좋지도, 아주 나쁘지도 않은 — 스태프 회의에서 눈 하나 깜짝하지 않고 인용할 수 있는 수치입니다. 40%의 히트율만으로도 상당한 비용을 절감할 수 있으며, 더 중요한 것은 상당한 지연 시간 (latency)을 줄일 수 있다는 점입니다. 사용자들은 캡션이 캐시 덕분에 빠른 것이라고 인지하지 못합니다. 그들은 그저 캡션이 빠르다고 느낄 뿐입니다.

6개월 후의 수치들

이 여정의 반대편에서 온 엽서(결과 보고)를 보여드리겠습니다.

비용 절감: GPT-4o 베이스라인보다 60% 낮습니다. 사실 그보다 약간 더 높은 — 정확히는 62%입니다. 하지만 저는 영업사원이 아니기에 내림하여 말하겠습니다.

지연 시간 (Latency): 엔드 투 엔드 (end-to-end) 평균 1.2초. 피크 시 처리량 (throughput)은 초당 약 320 토큰입니다. 1.2초라는 수치에는 캐시 미스 (cache miss) 경로가 포함되어 있습니다. 당연히 캐시 히트 (cache hit)는 50ms 미만입니다.

품질: 내부 평가 (internal eval) 기준 평균 벤치마크 점수 84.6%. 평가 데이터는 공개할 수 없습니다 — NDA(비밀 유지 계약) 문제라, 어떤 상황인지 아실 겁니다. 하지만 순수 GPT-4o를 사용했을 때의 78%보다 높습니다. 계층형 접근 방식 덕분에 까다로운 케이스들이 이제 일반적인 모델 대신 실제로 똑똑한 모델을 할당받기 때문입니다. 허, 누가 생각이나 했을까요.

설정 시간: 초기 통합에 10분 미만이 소요되었습니다. 첫 번째 버전은 단 한 줄의 변경이었습니다. 계층형 라우터 (tiered router)를 만드는 데는 오후 한때가 걸렸지만, 그 시간의 대부분은 분류기 임계값 (classifier thresholds)에 대해 스스로와 논쟁하는 데 쓰였습니다.

처음부터 다시 시작한다면 다르게 할 일들

특별한 순서 없이, 과거의 나에게 남기는 몇 가지 메모입니다:

  1. 쉬운 작업에 GPT-4o를 사용하지 마세요. 지나고 나면 당연한 소리처럼 들릴 것입니다. 이것은 토큰 100만 개당 10달러짜리 망치입니다. 나사를 박는 데 망치를 쓰지 마세요.

  2. 실제 워크로드(Workload)로 품질을 측정하세요. 캡셔닝 벤치마크(Benchmark)에 관한 논문들을 읽으며 2주를 허비한 뒤에야, 우리 이미지는 대부분 제품 사진이고 학술적 벤치마크는 대부분 COCO 이미지라는 사실을 깨달았습니다. 논문은 당신의 사용자가 아닙니다.

  3. 모델이 아니라 캐싱(Caching)부터 시작하세요. 저는 순서를 잘못 잡았습니다. 캐싱은 가장 지루하지만 가장 영향력 있는 변화입니다. 캐싱을 먼저 추가하고, 모델 선택을 두 번째로 최적화하세요.

  4. "GA-Economy" 티어는 사소한 쿼리에 정말로 괜찮습니다. 저는 회의적이었습니다. 하지만 이제는 아닙니다. 지루한 50%의 이미지들에 대해서는, 입력 $0.27, 출력 $1.10인 deepseek V4 Flash로도 충분하고도 남습니다. 모든 API 호출이 최첨단(State-of-the-art)일 필요는 없다는 점을 인정하기만 한다면, 50%의 비용 절감 기회가 눈앞에 놓여 있습니다.

  5. 의미가 있는 곳에는 스트리밍(Streaming)을 적용하세요. 대화형 UI(Interactive UI)의 경우, 캡션이 생성되는 대로 스트리밍하는 것은 UX(사용자 경험) 측면에서 엄청난 차이를 만듭니다. 체감 지연 시간(Perceived latency)이 절반으로 줄어듭니다. 하지만 배치 작업(Batch jobs)에는 하지 마세요. 오버헤드(Overhead)를 감수할 가치가 없습니다.

  6. 폴백(Fallback)을 구현하세요. 제공업체의 속도 제한(Rate limits), 일시적인 503 오류 등 흔히 발생하는 문제들 말입니다. 바로 사용할 수 있는 두 번째 모델을 준비해 두세요. 제 경우에는 단순히 설정 플래그(Config flag) 하나로 되어 있습니다.

  7. 프로덕션 환경에서 품질을 모니터링하세요. 사용자 만족도, 수동 검토 샘플, 다운스트림 지표(Downstream metrics)를 추적하세요. 모델 교체가 태깅 파이프라인(Tagging pipeline)에 악영향을 주기 시작한다면, 슬랙(Slack) 메시지를 받기 전에 데이터에서 먼저 확인할 수 있을 것입니다.

내가 놓칠 뻔했던 가격 하한선

제가 꼭 짚고 넘어가고 싶은 점은, 아무도 이야기하지 않지만 Global API의 가격 범위가 매우 광범위하다는 것입니다. 184개의 모델에 걸쳐 100만 토큰당 0.01달러에서 3.50달러까지의 가격대를 형성하고 있습니다. 저렴한 모델은 분류 (classification), 라우팅 (routing), 의도 탐지 (intent detection) 등 과거에는 정규 표현식 (regex)으로 처리하던 작업을 이제 모델로 수행하는 모든 '글루 워크 (glue work)'에 적합합니다. 비싼 모델은 실제로 '큰 뇌 (big brain)'가 필요한 드문 1%의 쿼리에 사용하기에 좋습니다. 핵심은 선택할 수 있는 범위가 있다는 것입니다. 그 범위를 활용하세요. 예/아니오 질문에 대해 출력 100만 토큰당 10.00달러를 지불하는 팀이 되지 마십시오.

솔직히 제가 가장 높게 평가하는 부분은 운영의 단순함입니다. 하나의 베이스 URL (base URL), 하나의 인증 헤더 (auth header), 하나의 SDK. https://global-apis.com/v1 하나면 끝납니다. 저는 모든 모델 이름을 설정 파일의 상수로 유지하며, 제공업체 (provider)를 교체하는 것은 배포 (deploy)가 아닌 설정 변경만으로 가능합니다. 만약 제공업체 X의 지역적 장애 (regional outage) 때문에 새벽 3시에 호출을 받은 적이 있다면, 이것이 왜 중요한지 이해할 것입니다.

그럼, 이렇게 해야 할까요?

아마도, 네. 만약 당신이 이미지 캡셔닝(image captioning) — 또는 솔직히 말해 어떤 생성형 API 호출이든 — 에 실제 비용을 지출하고 있는 백엔드 엔지니어라면, 정답은 거의 항상 "모든 것에 가장 비싼 모델을 사용하는 것"이 아닙니다. 정답은 "적절한 도구를 선택하고, 공격적으로 캐싱 (cache)하며, 대시보드를 모니터링하는 것"입니다.

저는 "사용하기 편하니까 GPT-4o를 쓴다"는 방식에서, 비용은 60% 적게 들면서 성능은 더 나은 계층화되고, 캐싱되며, 모니터링되는 멀티 모델 (multi-model) 설정으로 전환했습니다. 저는 새로운 제공업체를 통합하기 위해 글루 코드 (glue code)를 단 한 줄도 작성하지 않았습니다. 기업용 계약 (enterprise contract)을 단 한 번도 협상하지 않았습니다. 저는

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0