Generative AI/Prompt Engineering

OpenAI API input/output token(토큰) 계산 및 확인 방법 - LLM 모델 사용량과 비용 #1

eco7T 2025. 5. 23. 14:55
반응형

이번에는 토큰(Token) 수 계산 방법에 대해 살펴보도록 할게요. OpenAI API를 사용하다 보면 토큰(Token) 수에 따라 비용이 책정되는 것을 볼 수 있는데요, 이것은 LLM기반 생성형 AI 모델을 사용함에 있어서 반드시 적용되는 부분으로 어떤 모델을 사용하던지 필요한 단위가 됩니다. 

OpenAI API token(토큰) 계산 및 확인 방법.webp
OpenAI API token(토큰) 계산 및 확인 방법.webp

 

반응형

OpenAI API input/output token(토큰) 계산

간단히 말하자면, LLM(대규모 언어 모델)은 이미 언어를 구성할때 토큰이라는 개념을 사용합니다. 때문에 생성형 AI를 사용함에 있어서 토큰이 사용량 측정의 기본 단위가 되는 것은 어쩌면 너무나 당연한 것입니다. 

그러므로, 이러한 기본 단위인 토큰을 기준으로 사용량에 따른 비용을 책정한다는 것은 너무나 당연하다고도 할 수 있죠. 결국, 내가 얼마나 많은 토큰을 사용했는지 분명히 확인할 수 있다면, 비용이 얼마나 발생했는지도 비교적 정확하게 알 수 있겠죠. 

사실은 OpenAI의 홈페이지에서 다양한 각도의 사용량 분석 정보를 제공하기는 하지만, 단 한 번의 프롬프트와 그에 따른 completion에서 발생하는 토큰량까지 정확하게 보여주지는 않거든요.

 

 

  OpenAI API의 Token 형식

OpenAI API 문서에서 Chat Completion 관련 페이지를 보면 아래와 같은 json 오브젝트를 구조를 볼 수 있어요.

{
  ....
  "object": "chat.completion",
  ....
  "usage": {
    "prompt_tokens": 19,
    "completion_tokens": 10,
    "total_tokens": 29,
   ....
  },
  "service_tier": "default"
}

 

여기에서 눈에 띄는 것은 바로 직접적으로 토큰(Token)으로 정의된 부분이에요. 간단히 말하면, Chat Completion api를 사용하여 reponse 얻을 때 위와 같은 내용이 포함되어 수신된다는 거예요.

즉, 현재 사용된,

  • prompt_tokens: input tokens
  • completion_tokens: output(응답) tokens
  • total_tokens: input + output tokens

이라는 것을 알 수 있죠.

 

 

 

 

 

  Python으로 구현하기

그러면, 이제 실제 코드를 구성해서 위 내용을 확인해 볼게요.

try:
    response = openai.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "오늘 날씨 어때?"}
        ]
    )
    # 응답에서 토큰 사용량 확인
    if response.usage:
        print(f"프롬프트 토큰: {response.usage.prompt_tokens}")
        print(f"완성 토큰: {response.usage.completion_tokens}")
        print(f"총 토큰: {response.usage.total_tokens}")   
    else:
        print("토큰 사용량 정보를 찾을 수 없습니다.")

    # 모델의 응답 내용 확인
    print(f"모델 응답: {response.choices[0].message.content}")

except openai.APIError as e:
    print(f"API 오류 발생: {e}")

 

위와 같이 간단하게 chat 코드를 구성했어요. GPT 모델은 gpt-4o-mini를 프롬프트는 messages 형식으로 Role 을 정의했어요.

실제 사용되는 input token과 output token을 프린트하도록 구성했어요.

이 코드를 실행하니 다음과 같이 출력되었어요.

프롬프트 토큰: 23
완성 토큰: 54
총 토큰: 77
모델 응답: 죄송하지만, 실시간 날씨 정보를 제공할 수는 없습니다. 현재 있는 지역의 날씨 정보를 알고 싶으시다면, 날씨 웹사이트나 앱을 확인해 보시는 것이 좋습니다. 다른 질문이나 도움이 필요하시면 말씀해 주세요!

 

프롬프트 토큰이 input, 완성 토큰이 output 토큰인 것은 위에서 설명했으므로 다 아실 거예요.

실제 GPT가 응답한 내용은 그대로 "모델 응답"으로 출력했습니다. 출력 내용의 길이가 짧지 않은 것으로 봐서 completion_tokens이 54 정도는 될 것 같다는 생각이에요.

 

 

 

 

 

 

하지만, input 토큰, 즉 프롬프트 토큰이 23이라는 건 왠지 조금 많은 것 아닌가 생각이 들어요. 왜냐면, 위 코드에서 message 형식 중 key 문자열을 제외하면 "You are a helpful assistant."과 "오늘 날씨 어때?"인데, 토큰 수가 무려 23개나 된다는 것은 언 듯 이해하기 어렵습니다.

 

토큰 수가 결국 비용인데, 이해할 수 없이 증가된 토큰 수는 뭔가 사기당하는 기분이 들 수 있죠. 다음 글에서는 이 부분에 대해 이야기를 해 보겠습니다. 생성형 AI의 메시지 형식에서는 필수적으로 이러한 현상이 발생하는데, 그 이유를 정리해 보겠습니다.

 

 

 

 

 

 


2025.05.13 - [Generative AI/Prompt Engineering] - OpenAI API Chat Format으로 챗봇 만들기 - 프롬프트 엔지니어링 가이드 #5

 

OpenAI API Chat Format으로 챗봇 만들기 - 프롬프트 엔지니어링 가이드 #5

이번에는 프롬프트 엔지니어링 마지막 이야기로, OpenAI API의 "Chat Format"을 활용한 대화형 챗봇(ChatBot)을 구현해 보도록 할게요. 생성형 AI을 이해하는 데에 있어서 대화형 챗봇은 아주 좋은 예가

eco7t.tistory.com

 

반응형