토큰 예산에 대한 한 시간의 논의: 사용량 기록 장부(Usage Ledger)를 유지하기까지 거친 세 번의 막다른 길
요약
본 글은 AI 모델의 무료 티어 사용 시 발생하는 비용 추적 문제를 다루며, 단순한 대시보드 집계나 문자열 기반 추정치로는 정확한 사용량 측정이 불가능함을 지적합니다. 결국 모든 호출을 기록하는 '사용량 장부(Usage Ledger)'를 유지하는 것이 필수적인 개발 가이드라인임을 강조합니다.
핵심 포인트
- 무료 티어는 비용 측정의 간극을 만들 위험이 있다.
- 대시보드 집계값은 전체 계정 사용량을 보여줄 뿐, PR당 비용을 알 수 없다.
- 문자열 기반 추정치는 오차 범위가 너무 커서 신뢰할 수 없다.
- 모든 호출을 기록하는 '사용량 장부'를 유지해야 정확한 비용 관리가 가능하다.
무료 티어는 특정한 종류의 낙관론을 불러일으킵니다. 처음 100회 호출은 비용이 들지 않기 때문에 아무도 그 횟수를 측정하지 않습니다. 그러다가 테스트 스위트가 엔드포인트를 가리키면 할당량이 사라지고, 팀은 어떤 호출이 이를 소진했는지 알 수 없게 됩니다. 아래 설명할 페어링 시간(pairing hour)은 바로 이 간극이 벌어지기 전에 메우는 것에 관한 것입니다.
이 세션은 선임 엔지니어가 "무료 티어를 사용해봤다"라는 풀 리퀘스트(pull request)에 대해 일반적으로 진행하는 검토 과정의 종합본입니다. 이것은 녹취록이 아니며, 제시된 수치들은 자리 표시자(placeholder)입니다. 아티팩트들은 레이블링되어 있습니다: 실행 가능한 형태는 모양으로, 실행되지 않은 것은 인쇄된 대로입니다.
이 시간을 시작하게 만든 질문
해당 풀 리퀘스트는 CI 작업 내부에 모델 호출을 추가했습니다. 작동했습니다. 설명에는 무료 티어가 이를 커버한다고 되어 있었습니다.
선임 엔지니어는 단 하나의 질문만 던지고 말을 멈췄습니다: 그 주장은 어떤 수치를 기반으로 한 것인가요?
"어떤 모델인지", "얼마나 빠른지"가 아닙니다. 오직 그 숫자 자체입니다. 작성자는 대시보드 총합계, 요청당 대략적인 추정치, 그리고 녹색 CI 실행 결과를 가지고 있었습니다. 이 세 가지 중 어느 것도 같은 것을 측정하는 지표는 아니었습니다.
막다른 길 1: 대시보드 집계값 (dashboard aggregate)
첫 번째 본능은 제공업체 콘솔을 스크린샷으로 찍고 테스트 실행 횟수로 나누는 것이었습니다. 하지만 이것은 지루한 이유로 실패했습니다: 콘솔 총합계에는 사흘 전의 피처(fixture) 작성 대화 내용이 수트 실행과 몇 가지 수동 탐색과 뒤섞여 포함되어 있었기 때문입니다.
집계값은 "이 계정이 얼마나 많은 비용을 썼는지"에 답합니다. 그것은 "풀 리퀘스트 하나가 얼마의 비용이 드는지"에 답하지 못합니다. 이들은 서로 다른 분모(denominators)이며, CI는 후자(두 번째 것)를 필요로 합니다.
- 콘솔 총합계는 작업별로 나눌 수 없었습니다.
- 작업은 동일한 카운터에 다시 재생할 수 없었습니다.
- 저장소 내의 어떤 것도 실제로 어떤 호출이 발생했는지 기록하고 있지 않았습니다.
막다른 길이었습니다. 페어는 다음 단계로 넘어갔습니다.
막다른 길 2: len(text) / 4를 이용한 추정치 계산
두 번째 시도는 산술적이었습니다. 문자 수를 네로 나눈 값에, 프롬프트 전체에 걸쳐 합산하고, 완성(completion)을 위한 임의 계수(fudge factor)를 곱하는 방식이었습니다.
그것은 정확히 하나의 실험만을 견뎠습니다. 이 테스트 스위트는 JSON fixture를 들여쓰기하여 보내며, 여러 케이스에 걸쳐 긴 키가 반복됩니다. 토크나이저는 공백과 중괄호를 문자 휴리스틱(character heuristic)이 가정하는 방식대로 처리하지 않으며, 추정치는 날마다 다른 방향으로 결정을 뒤집을 만큼 넓은 오차 범위로 표류했습니다.
때로는 높고 때로는 낮은 추정치는 보수적인 추정치가 아닙니다. 그것은 소수점이 붙은 노이즈일 뿐입니다.
막다른 길 3: 시간 경과(wall-clock time)를 비용 대리 지표로 사용하기
세 번째 시도: 실행 속도가 느리면, 비싸야 한다고 생각했습니다. 매력적이지만, 무료 티어 환경에서 콜드 스타트 타이밍이 오해의 소지가 있는 것과 같은 이유로 틀렸습니다. 분산(variance)이 지배적이었습니다. 한 번의 큐 문제(queue hiccup)가 다른 열 번의 실행에 걸친 실제 토큰 변화량보다 더 큰 영향을 미쳤습니다.
지연 시간(Latency)은 측정할 가치가 있습니다. 다만, 사용량과는 다른 것을 측정한다는 점만 다를 뿐입니다.
우리가 유지한 아티팩트: 사용량 장부와 실패 시 폐쇄 게이트
프레임워크 없이 두 개의 작은 파일이었습니다. 첫 번째는 모든 호출을 감싸고 요청당 하나의 JSON 라인을 추가합니다.
# budget_probe.py — 예시이며, 인쇄된 대로 실행되지 않습니다.
# OpenAI와 호환되는 엔드포인트로의 각 호출마다 장부 행(ledger row) 하나를 추가합니다.
import json, os, time, urllib.request
...
두 번째 파일은 이 장부를 읽고 추측하는 것을 거부합니다. 이것이 검토에서 중요했던 부분입니다: 측정되지 않은 호출은 편안한 숫자로 조용히 평균화되는 대신 게이트를 통과하지 못하게 합니다.
# budget_gate.py — 예시이며, 인쇄된 대로 실행되지 않습니다.
import json, sys
from datetime import datetime
...
python budget_gate.py <allowance> 30으로 실행합니다. 이 임계값은 의도적으로 거칠게 설정되었습니다: 95%가 아니라 80%입니다. 왜냐하면 테스트 스위트는 성장하는데 허용량(allowance)은 그렇지 않기 때문입니다.
장부를 정직하게 유지하는 카나리아
회계(Accounting)는 제공업체가 카운팅 방식을 변경하거나 프록시가 usage 블록을 제거할 때 흐트러집니다. 저장소에 보관된 매주 동일한 텍스트인 고정 캐나리 프롬프트(canary prompt)는 비교할 수 있는 안정적인 토큰 수를 제공합니다. 몇 개의 토큰 이상 변동이 생기는 것은 임계값을 수정해야 한다는 신호가 아니라 약관을 다시 읽어봐야 한다는 신호입니다.
두 사람이 작성한 의사결정표
| 장부(ledger)의 신호 | 조치 (Action) |
|---|---|
| 사용량이 측정되고, 여유분(headroom)이 20% 초과함 | CI를 위해 무료 등급 유지 |
| ... |
무료 등급과 무료 서버가 실제로 맞는 곳
운영자(operator)는 이 워크플로우에 대해 무료 모델 접근 및 무료 서버 옵션을 설명합니다. 이 조합은 장부의 첫 주 동안 진정으로 유용합니다. 즉, 수집하고 있는 숫자들이 무료 배열이 충분한지 알려주는 바로 그 숫자들입니다.
공개 고지: 본 기사는 MonkeyCode의 제품 아웃리치(product outreach)의 일환으로 작성되었습니다.
이 시스템을 겨냥하기 전에 두 가지 주의사항이 있습니다. 할당량과 가용성은 변하므로, 이 달을 포함하여 어떤 월의 게시물보다는 현재 약관을 읽으십시오. 그리고 무료 서버는 여전히 서버입니다. 레이턴시(latency) 편차가 시간 측정만으로 하려는 모든 비용 추론을 오염시키기 때문에, 콜드 스타트(cold-start) 동작을 별도로 측정해야 합니다.
한계점 및 건너뛰어야 할 사람들
- 장부는 엔드포인트가
usage블록을 반환한다고 가정합니다. 만약 그렇지 않다면, 설계상 게이트는 닫히고(fail closed) 서버 측에서 측정할 때까지 접근 방식은 정체됩니다. - 토큰 수는 통화 단위가 아닙니다. 제공업체가 토큰으로 매핑할 수 없는 단위로 청구한다면, 이 표는 잘못된 추상화입니다.
- 엄격한 데이터 거주지(data-residency) 규칙을 가진 팀은 할당량에 관계없이 어떠한 호스팅 무료 등급을 통해서도 테스트 환경(fixtures)을 라우팅해서는 안 됩니다.
- 보장된 레이턴시 하한선이 필요한 사람은 무료 서버 경로를 건너뛰고 격리(isolation) 비용을 지불해야 합니다.
지루하지만 결론은 검토 과정에서 유지되었다: 장부 자체가 모델보다 더 가치가 있었다. 무료 접근이 내일 사라진다 해도, 이 게이트는 여전히 스위트의 비용과 어디를 줄여야 하는지를 알려준다. 그것이 당신이 간직해야 할 부분이다.
만약 이것의 형태를 시험해 보고 싶다면, 하나의 작업(job), 하나의 카나리아 프롬프트(canary prompt), 그리고 이 기사에 있는 숫자(allowance number)를 포함하여 어떤 허용치 숫자도 신뢰하기 전에 일주일 분량의 행으로 시작하라.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기