ChatGPT API 요금이 높은 이유: 프롬프트가 비대하기 때문입니다. 이를 해결할 무료 체크리스트를 소개합니다
요약
ChatGPT API 사용 시, 전송하는 모든 토큰에 대해 비용이 발생하므로 시스템 프롬프트와 컨텍스트 관리가 중요합니다. 본 글은 OpenAI의 `tiktoken`을 활용하여 토큰 사용량을 측정하고, 불필요한 정보를 제거하는 8가지 체크리스트를 제시하며 API 비용 절감 방법을 안내합니다.
핵심 포인트
- 토큰 비용은 전송되는 모든 입력(Input)에 대해 발생한다.
- 불필요한 시스템 프롬프트나 컨텍스트는 반드시 간소화해야 한다.
- 측정 도구(`tiktoken`)를 사용하여 실제 토큰 사용량을 확인하는 것이 필수적이다.
- 단순 질문은 저렴하고 작은 모델로 라우팅하여 비용을 절감하라.
지난달에 OpenAI 사용 대시보드를 열어보고 좀 민망한 것을 발견했습니다. 사용자(user)가 단순히 "예"나 "감사합니다"라고 입력했을 때조차 매번 동일한 약 400 토큰 분량의 시스템 프롬프트(system prompt)를 전송하고 있었던 것입니다. 이것은 모델 문제가 아닙니다. 프롬프트 문제입니다. 그리고 한번 눈으로 확인하면 쉽게 고칠 수 있는 문제입니다.
LLM을 사용해 개발을 시작할 때 아무도 알려주지 않는 것이 있습니다: 중요한 토큰만 비용을 지불하는 것이 아니라, 전송하는 모든 토큰에 대해 비용을 지불합니다. 비대해진 시스템 프롬프트, 매번 호출(call)마다 복사하여 붙여넣는 몇 단락의 "컨텍스트(context)", 또는 잘라내지 않은 채팅 기록은 실제 답변 길이가 변하지 않더라도 당신의 요금을 조용히 두 배 또는 세 배로 늘릴 수 있습니다.
1단계: 추측하기 전에 측정하라
측정하지 않으면 고칠 수 없습니다. 다음은 tiktoken (OpenAI 자체 토크나이저)을 사용하여 프롬프트가 전송되기 전에 정확히 몇 개의 토큰 비용이 드는지 확인하는 10줄 스크립트입니다:
import tiktoken
def count_tokens(text, model="gpt-4o"):
...
지금 바로 이 코드를 당신의 시스템 프롬프트에 적용해 보세요. 만약 토큰 수가 100개를 초과하고 하루에 수천 번 호출을 한다면, 단순한 "2+2는 무엇인가"라는 질문에 아무런 가치도 더하지 못하는 수천 개의 토큰 비용을 지불하고 있는 것입니다.
2단계: 실제로 효과를 본 체크리스트
저 자신의 에이전트 스크립트를 검토한 후, 제가 토큰이 새고 있는 모든 곳을 적어 한 페이지짜리 체크리스트로 만들었습니다. 요약하자면:
- 측정부터 하라(Measure first) — 무언가를 최적화하기 전에 토큰 수를 먼저 세어보세요 (위 참고).
- 시스템 프롬프트 간소화(Trim the system prompt) — 대부분의 시스템 프롬프트는 모델이 기본적으로 따르는 지침("도움이 되게," "공손하게")을 반복합니다. 하드 제약 조건이 아닌 것은 모두 잘라내세요.
- 정적 컨텍스트 재전송 금지(Don't resend static context) — 동일한 참고 문서가 모든 호출에 들어간다면, 이는 파인튜닝(fine-tuning), 임베딩(embeddings)을 사용하거나, 아니면... 아예 매번 보내지 않을 후보입니다.
- 채팅 기록 제한(Cap chat history) — 전체 대화를 매번 재현하는 대신, 오래된 턴(turn)은 잘라내거나 요약하세요.
- 간단한 질문은 우회 처리(Short-circuit cheap questions) — "예/아니오/감사합니다"와 같은 스타일의 응답은 주력 모델 대신 더 작고 저렴한 모델로 라우팅하세요.
- 출력 토큰도 확인하라(Watch your output tokens too) — 장황하게 "단계별로 설명해 주세요"라고 지시하는 것은 입력뿐만 아니라 출력 단계에서도 비용을 발생시킵니다.
- 배치 처리(Batch)를 할 수 있을 때 하라 — 5개의 질문이 담긴 한 번의 호출은 반복되는 상투적인 내용물과 함께 5번 분리하여 호출하는 것보다 비용이 적게 드는 경우가 많습니다.
- 변경 후 매번 재측정하라(Re-measure after every change) — 토큰 다이어트(token diet)는 느낌으로 측정되는 것이 아니라 백분율로 측정됩니다.
실제 사례: 전후 비교 (A real before/after)
위의 시스템 프롬프트를 가져와 하드 제약 조건만 남기고 간소화한 경우를 살펴보세요:
system_prompt_trimmed = "Be concise. Ask a clarifying question only if the request is ambiguous."
print(count_tokens(system_prompt_trimmed)) # 14 토큰 vs 73 토큰 — 모든 호출에서 80% 절감
이것이야말로 단 5분의 노력으로 영구적인 개선을 가져오는 수정입니다. 왜냐하면 이는 지금 디버깅하는 한 번의 호출뿐만 아니라, 미래의 모든 호출에 적용되기 때문입니다.
저는 전체 체크리스트(각 항목이 언제 적용되는지에 대한 메모를 포함한 8가지 포인트)를 여러분 자신의 에이전트나 챗봇 코드에서 실행할 수 있는 무료 1페이지 PDF/체크리스트로 만들었습니다: Prompt Token Diet Checklist (무료이며, 가입 장벽 없음).
여러분 자신의 프롬프트에서 발견한 가장 큰 토큰 비대화(token-bloat)는 무엇인가요? 오래된 시스템 프롬프트인가요, 무제한 채팅 기록인가요, 아니면 다른 것인가요?
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기