블로그로 돌아가기

AI 입문가이드

입력 vs 출력 토큰: AI API가 청구하는 것

AI API가 입력과 출력 토큰을 따로 세는 이유, usage 필드에서 이를 읽는 곳, 그리고 한 요청의 비용을 계산하는 방법.

작성자: CheapTokens Team 게시됨 업데이트됨읽는 시간 5분

어두운 격자 배경 위에 “입력 vs 출력 토큰” 제목과 “API 요청에서 지불하는 것” 문구가 있는 커버
이 페이지의 내용
  1. 입력과 출력으로 무엇이 세어지나
  2. 숫자를 읽는 곳: usage 블록
  3. 양쪽 가격이 다른 이유
  4. 공식
  5. 실제 모델로 계산한 예
  6. 코드에서 사용하기
  7. 토큰을 덜 쓰는 방법
  8. 기억할 점

언어 모델에 첫 API 호출을 방금 했다면, 응답에서 usage 블록을 보고 정확히 무엇을 세는지 궁금했을 것입니다. 짧게 답하면: 모든 요청에는 두 개의 계량기가 있습니다. 하나는 보내는 토큰(입력)을, 다른 하나는 모델이 되돌려 쓰는 토큰(출력)을 셉니다. 각 계량기에는 자체 가격이 있고, 요청 비용은 둘의 합입니다.

이 가이드는 숫자를 어디서 찾는지, 어떻게 달러로 환산하는지, 그리고 덜 쓰기 위해 무엇을 바꿀 수 있는지 보여줍니다. "토큰"이라는 단어가 아직 모호하다면 AI에서 토큰이란?부터 시작하세요.

입력과 출력으로 무엇이 세어지나#

입력 토큰은 모델이 답하기 위해 읽어야 하는 모든 것입니다:

  • 최신 메시지;
  • 시스템 프롬프트("영어로 간단히 답하라" 같은 지시);
  • 대화의 이전 메시지(다시 보낸 경우);
  • 요청에 붙여넣은 문서, 코드 또는 검색 결과.

출력 토큰은 모델이 답으로 생성하는 모든 것입니다. OpenAI 호환 형식에서는 choices[0].message.content의 텍스트입니다. 일부 모델은 사고 모드에서 최종 답 전에 추론 토큰도 생성합니다. 출력으로 청구되는지는 모델의 가격 페이지에서 확인하세요.

초보자에게 중요한 점: 모델은 요청 사이에 대화를 기억하지 않습니다. 채팅 앱은 매번 전체 기록을 다시 보내므로, 긴 대화의 입력은 새 메시지가 한 줄이어도 매 턴마다 커집니다.

숫자를 읽는 곳: usage 블록#

OpenAI 호환 API의 모든 비스트리밍 응답은 usage 객체로 끝납니다. 다음은 그 형태의 교육용 예시입니다:

json
{
  "choices": [
    { "message": { "role": "assistant", "content": "..." }, "finish_reason": "stop" }
  ],
  "usage": {
    "prompt_tokens": 2000,
    "completion_tokens": 500,
    "total_tokens": 2500
  }
}
필드 의미 청구 구분
prompt_tokens 보낸 모든 것의 토큰 입력
completion_tokens 모델이 생성한 토큰 출력
total_tokens prompt_tokens + completion_tokens 별도 가격 아님: 단지 합계

흔한 초보자 실수는 total_tokens에 하나의 가격을 곱하는 것입니다. 입력과 출력의 가격이 다르므로 두 숫자를 따로 써야 합니다.

일부 제공자는 추가 필드를 넣습니다. 예를 들어 DeepSeek 자체 API는 prompt_tokens을 prompt_cache_hit_tokens와 prompt_cache_miss_tokens으로 나누고, 사고 모드에서는 reasoning_tokens를 보고합니다(출처: DeepSeek API 문서, 2026년 10월 21일 확인). 표의 세 필드는 모든 OpenAI 호환 응답에서 신뢰할 수 있는 것입니다.

답을 스트리밍하면 usage는 시작 시점에 알 수 없습니다. DeepSeek 자체 API에서는 data: [DONE] 전 마지막 콘텐츠 청크에 도착하며(DeepSeek API 문서, 2026년 10월 21일 확인), 다른 API는 다르게 보내거나 요청 시에만 보낼 수 있으니 클라이언트가 무엇을 받는지 확인하세요. 스트리밍 자체는 Python에서 스트리밍 응답에서 다룹니다.

양쪽 가격이 다른 이유#

프롬프트를 읽는 것과 답을 쓰는 것은 다른 종류의 작업입니다. 모델은 전체 프롬프트를 한 번에 처리하지만, 답은 한 번에 한 토큰씩 생성해야 하며 각 새 토큰은 이전 토큰에 의존합니다. 그래서 제공자는 보통 출력을 입력보다 비싸게 책정하며, 어떤 가격표에서든 모델당 두 숫자가 보입니다.

아래 예시로 쓰는 모델 MiniMax-M2.7(id minimax-m2.7)도 이 패턴을 따릅니다. 현재 1M 토큰당 가격은 입력 $0.05, 출력 $0.15입니다.

공식#

가격은 100만 토큰당으로 표시되므로, 한 요청의 비용은:

text
cost = input_tokens × input_price ÷ 1,000,000
     + output_tokens × output_price ÷ 1,000,000

산술을 보여주기 위해 임의의 둥근 가격으로 나타낸 것입니다(예시이며, 아래 표의 현재 가격으로 대체하세요):

python
# example, substitute current prices from the table
price_in = 0.20    # USD per 1M input tokens
price_out = 0.80   # USD per 1M output tokens

prompt_tokens = 2000
completion_tokens = 500

cost = (prompt_tokens * price_in + completion_tokens * price_out) / 1_000_000
# 2000 × 0.20 ÷ 1,000,000 = 0.0004 (input)
# 500 × 0.80 ÷ 1,000,000 = 0.0004 (output)
# 0.0004 + 0.0004 = 0.0008 USD

실제 모델로 계산한 예#

위 usage 예시의 요청을 보겠습니다: 입력 2,000 토큰, 출력 500 토큰. CheapTokens를 통한 MiniMax-M2.7에서는 $0.00018입니다. 이 숫자는 페이지가 표시될 때마다 현재 가격표로 계산됩니다.

요청 하나는 아주 작으니 규모를 키워 보면 도움이 됩니다. 이 크기의 요청을 10,000번 보내는 작은 앱은 입력 20,000,000 토큰과 출력 5,000,000 토큰을 쓰며, 이는 $1.75입니다.

우리 목록의 다른 모델에서 같은 요청:

모델 비용 OpenRouter
GLM-5.3-Flash $0.00006 $0.00012
DeepSeek-V4-Flash $0.00008 $0.00017
MiniMax-M2.7 $0.00018 $0.0012

총 입력 2,000개 및 출력 500개 토큰입니다. 100만 토큰당 가격은 현재 기준이며 당사 요금제에 따라 함께 변경됩니다. OpenRouter 열은 동일한 작업량에 대한 참고 가격을 보여줍니다.

여기서 출력은 토큰 수에서 작은 부분(2,500 중 500)이지만 토큰 비중보다 청구서에서 더 큰 부분을 차지합니다. 출력 토큰 가격이 더 높기 때문입니다(표 참조). 이 모델에서는 출력 쪽이 OpenRouter 기준 가격 대비 절감이 확인되는 부분이기도 하며, 앱이 긴 답을 쓴다면 유용합니다.

코드에서 사용하기#

공식 openai Python 패키지에서 CheapTokens base URL을 지정해 usage을 읽을 수 있습니다:

python
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key="YOUR_API_KEY",
)

response = client.chat.completions.create(
    model="MiniMaxAI/MiniMax-M2.7",
    messages=[{"role": "user", "content": "Explain input and output tokens in two sentences."}],
)

usage = response.usage
print("input:", usage.prompt_tokens)
print("output:", usage.completion_tokens)
print("total:", usage.total_tokens)

# example, substitute current prices from the table above
price_in, price_out = 0.20, 0.80
cost = (usage.prompt_tokens * price_in + usage.completion_tokens * price_out) / 1_000_000
print(f"approx. cost: ${cost:.6f}")

아직 요청을 보내지 않았다면 먼저 CheapTokens로 첫 API 요청을 따르세요.

토큰을 덜 쓰는 방법#

  • 프롬프트를 줄이세요. 시스템 프롬프트를 다듬고 모델에 필요 없는 지시를 제거하세요. 보내는 모든 토큰은 매 요청마다 청구됩니다.
  • 기록을 줄이세요. 긴 채팅에서는 전체 대화 대신 마지막 몇 턴이나 짧은 요약을 유지하세요.
  • 문서의 관련 부분만 보내세요. 한 페이지의 텍스트가 파일 전체보다 저렴합니다.
  • 필요한 형식을 요청하세요. "세 개의 불릿으로 답하라"는 열린 에세이보다 출력 토큰이 적습니다.
  • max_tokens을 의도적으로 설정하세요. 출력만 제한합니다. 너무 낮으면 답이 잘립니다. 자세한 내용은 AI 답변이 문장 중간에 멈추는 이유?에 있습니다. CheapTokens의 MiniMax-M2.7은 답당 최대 8,192 출력 토큰을 허용하며 180K 컨텍스트 창을 가집니다.

더 큰 워크플로의 비용을 추정하려면 AI 에이전트 비용을 추정하는 방법을 참조하세요.

기억할 점#

  1. 모든 요청에는 입력 토큰(prompt_tokens)과 출력 토큰(completion_tokens)이 있습니다.
  2. 가격이 별도이며, 보통 출력이 더 비쌉니다.
  3. 비용 = 입력 토큰 × 입력 가격 + 출력 토큰 × 출력 가격, 가격은 1M 토큰당.
  4. 추측하지 말고 응답의 usage에서 숫자를 읽으세요.

CheapTokens에서는 선불 잔액 하나로 모든 모델을 이용할 수 있고, 모델별 가격은 피크 시간 요금 없이 고정되며, API는 OpenAI Chat Completions 및 Anthropic Messages와 호환됩니다. 위 예시를 시도하려면 API 키를 받아 첫 요청을 보내세요.

모든 모델의 현재 가격: CheapTokens 가격.