Skip to main content
page thumbnail

LLM 토큰 구조 및 비용 비교: TypeScript 코딩 예시와 모델별 차이

DODOSEE
DODOSEE
Views 255
Summary

AI 클립으로 정리됨

출처 및 참고 : https://www.youtube.com/watch?v=nKSk_TiR8YA

2025년 현재, 대다수 개발자가 인공지능 대형언어모델(LLM)을 이용하면서도 토큰 개념에 대해서 충분히 이해하지 못한다는 이야기를 종종 듣게 됩니다. 최근 폴란드에서 진행된 AI 워크숍에서도 참가자 중 약 1/3만이 토큰에 대한 정의를 알고 있다는 사실이 눈에 띄었습니다. 이 점을 계기로 LLM 토큰 작동 방식과 실질적 비용 구조, 그리고 모델별 차이를 중심으로 상세한 내용을 정리했습니다. 실제 TypeScript 기반의 코드 예시와 구체적 사례까지 모두 담았습니다.

토큰의 정의와 LLM에서의 역할

토큰은 LLM에서 일종의 화폐와 같은 존재입니다. 사용자가 "Hello World"와 같이 문장을 입력하면, 이것은 여러 토큰으로 분리되어 처리됩니다. 예를 들어 OpenAI의 모델에 "Hello world"를 입력하면, 이는 3개의 토큰으로 분리되고, 이에 따라 단위 토큰당 별도 비용이 청구됩니다. 구체적으로는 입력 토큰과 출력 토큰 각각의 수에 단가를 곱한 후 합산하게 됩니다. 모델마다 입력과 출력의 요금이 다를 수 있으며, 1,000 토큰 기준 미세한 비용 차이가 발생하게 됩니다.

실질 코딩 사례: Anthropic과 Google의 예시 비교

실제 API 이용 시, 동일한 텍스트를 두 모델에 보내도 토큰 수가 달라질 수 있다는 점이 중요합니다. 예시에서 Anthropic의 Claw 3.5 haik coup 모델에 "hello world"를 입력하면 입력 토큰이 11개, 출력 토큰이 20개 로 계산됩니다. 반면 Google Gemini 2.0 Flashlight 모델에서는 입력 토큰 수가 4개, 출력 토큰이 11개로 다른 결과를 확인할 수 있습니다. 이처럼 입력한 텍스트가 같은데 토큰 수가 다르게 나타나는 이유는 각 모델의 토크나이저 설계, 즉 토큰 어휘(vocabulary) 구성 차이에서 비롯됩니다.

토크나이저의 실제 동작 방식과 TypeScript 구현 예시

각 LLM은 고유한 토큰 어휘(vocabulary)를 갖습니다. 텍스트를 입력하면 이를 가능한 가장 큰 단위의 토큰(즉, 단어나 서브워드)으로 분리한 뒤, 해당 단위에 지정된 고유 번호를 부여합니다. 이런 일련의 과정은 TypeScript 환경에서도 OpenAI의 'tick token' 혹은 JS tick token 같은 토크나이저 라이브러리를 통해 구현 가능합니다.

예시로 "the wise owl of moonlight forest, where ancient trees stretch their branches toward the starry sky." 같은 약 2,300자 텍스트도 GPT40 토크나이저로 처리 시 500개 미만의 토큰으로 인코드 됩니다. "hello world"의 경우, 12자 텍스트가 3개 토큰만 할당됩니다.

LLM 내부에서는 입력된 텍스트가 모두 숫자 배열로 변환되어 계산 및 추론이 이뤄지며, 출력 역시 토큰 단위로 생성되어 마지막에 다시 문자열로 디코드 됩니다. TypeScript에서 'tokenizer.decode' 함수를 통해 토큰 배열을 원래 문자열로 복원할 수 있습니다.

토크나이저 학습과 모델별 차이의 핵심 원인

토크나이저 학습 방식에 따라 토큰 구성이 달라지므로, 같은 문장이라도 모델별로 토큰 수가 다르게 나타납니다. 각 모델 제공자는 방대한 데이터셋(텍스트 코퍼스)에서 자주 등장하는 단어, 서브워드, 문자 등을 분석해 토큰 어휘를 설계합니다.

예를 들어 매우 단순한 'character level tokenizer'를 활용하면 한 문장을 문자 단위로 모두 분할하게 됩니다. "cats sat mat"라는 텍스트에서는 11개 문자, 11개 토큰이 생성되며, 이는 토크나이저의 효율 측면에서는 바람직하지 않습니다. 토큰이 많을수록 LLM 계산부하가 증가하고, 비용 역시 높아집니다.

이 때문에 실제 LLM은 'subword level tokenizer' 방식으로 더 자주 등장하는 문자 그룹, 단어 파편까지 확보해 2~3글자 단위, 혹은 단어 단위의 토큰을 우선적으로 생성합니다. 예시에서 'understanding'이라는 긴 단어는 토크나이저의 어휘 크기에 따라 5개, 3개, 2개 등으로 분할될 수 있습니다. 대형 모델일수록 토큰 어휘가 크지만, 너무 커지면 내부 메모리 및 처리 공간 부담이 늘어납니다. 따라서 토큰 수 효율성과 모델 크기의 균형 설계가 필요합니다.

특이 단어, 미사용 언어 입력 시의 주의점

토크나이저의 어휘에 잘 포함되지 않은 특이 단어(예: 시에서만 등장하는 'fragus')는 여러 개의 토큰으로 과도하게 분할됩니다. 실제 GPT 0.200K 기준으로 "fragus"는 4개 토큰으로 분할되었습니다. 이런 현상은 덜 사용되는 자연어, 코딩 언어에서도 마찬가지로 발생합니다. 자주 쓰이는 언어일수록 토크나이저가 더 효율적으로 단어를 처리하여 더 적은 토큰으로 인코딩하게 됩니다. 예를 들어 20줄의 JavaScript 코드는 Haskell 코드에 비해 토큰 수가 효율적으로 적게 산출될 수 있습니다.

LLM 토큰 사용의 실질적 팁과 적용 방법

  • 비용 산출: 입력/출력 토큰 단가와 합산 방식, 모델마다 단가 차이 포함해 미리 계산할 수 있습니다.

  • 토크나이저 확인: 주요 토크나이저별 어휘 크기, 처리 효율을 미리 살펴볼 수 있습니다.

  • 특이 단어나 비주류 언어 사용: 토큰이 늘어날 수 있으므로 비용과 처리 속도에 영향이 있음을 인지하는 것이 실용적입니다.

  • TypeScript 코드 활용: OpenAI 등 주요 LLM의 토크나이저를 자바스크립트 환경에서도 충분히 재현할 수 있습니다.

마무리와 모델 선정 시 고려사항

토큰은 LLM에서 계산과 비용의 기본 단위로 작동하며, 각 모델마다 토크나이저 설계의 차이로 인해 입력/출력 토큰 수가 상이하게 산출됩니다. 텍스트 인코딩은 큰 의미단위(단어/서브워드)별 토큰화와 해당 번호로 변환하는 과정, 디코딩은 그 반대로 다시 문자열로 복원됩니다. 전체 LLM 프로세스는 인코딩→추론→디코딩의 구조라는 점이 분명합니다.

2025년 기준 많은 AI 활용 및 애플리케이션 개발이 TypeScript 기반으로 진행되고 있으며, 모델 개발은 Python이 대세로 자리잡은 상황입니다. 각 모델 및 토크나이저의 특성, 비용 구조, 효율성을 충분히 파악해서 실질적인 프로젝트에 적용하는 것이 현명한 방향입니다. 이와 같은 구조와 특징을 이해함으로써 LLM API 사용을 보다 정확하게 계획하고, 불필요한 비용과 리소스 낭비를 최소화할 수 있습니다.

출처 및 참고 :

이 노트는 요약·비평·학습 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.