
토큰은 단어가 아닙니다: 프롬프트를 보낼 때 실제로 일어나는 일
요약
LLM이 텍스트를 처리할 때 단어가 아닌 '토큰' 단위로 분할하여 숫자로 변환하는 과정을 설명합니다. 토큰화 원리를 이해함으로써 프롬프트 비용과 모델의 동작 방식을 파악할 수 있습니다.
핵심 포인트
- 텍스트는 토크나이저를 통해 단어, 부분 단어, 문장 부호 단위로 쪼개집니다.
- 각 토큰은 모델의 어휘 사전에 정의된 고유한 숫자로 매핑됩니다.
- 토큰화 방식은 프롬프트 비용 및 모델의 추론 능력에 직접적인 영향을 미칩니다.
AI는 빠르게 발전하고 있으며, 매주 새로운 개념을 배워야 하는 것처럼 느껴집니다. 이 완전히 새로운 세상을 단순히 훑어보는 대신 실제로 이해하기 위한 노력의 일환으로, AI 대화에서 끊임없이 등장하지만 간단하게 설명되는 경우가 드문 개념들을 풀어내는 ELI5(다섯 살 아이에게 설명하듯 쉽게 설명하기) 기사를 쓰기 시작했습니다. 첫 번째 주제는 토큰 (tokens), 그리고 프롬프트를 보낼 때 실제로 어떤 일이 일어나는가입니다.
도처에 널린 토큰들
ChatGPT, Claude, 또는 Copilot에 타이핑할 때마다, 여러분의 텍스트는 단어로서 모델에 들어가지 않습니다. 먼저 **토큰 (tokens)**이라고 불리는 조각들로 잘게 쪼개집니다. 때로는 단어 전체가 되기도 하고, 때로는 단어의 절반이 되기도 하며, 때로는 단순한 문장 부호가 되기도 합니다. 모델은 여러분의 문장을 결코 직접 보지 않습니다. 모델은 그 조각들을 대신하는 숫자들의 시퀀스 (sequence)를 봅니다.
이것은 세부 사항으로서 쉽게 지나칠 수 있는 부분 중 하나이지만, 일단 이해하고 나면 많은 AI의 동작 방식이 갑자기 이해되기 시작합니다. 왜 긴 프롬프트가 더 많은 비용을 소모하는지, 왜 어떤 단어들은 모델을 헷갈리게 만드는 것처럼 보이는지, 왜 "이 단어의 철자 수를 세어보세요"라는 요청이 LLM (Large Language Model)에게 이상할 정도로 어려운지 말입니다.
1단계: 텍스트 분할하기
**"accessibility."**라는 단어를 예로 들어보겠습니다. 토크나이저 (tokenizer)는 이를 하나의 단위/단어로 취급하지 않습니다. 이 단어는 하나의 토큰이 될 만큼 충분히 흔하지만, 실제 세상의 많은 텍스트는 인식 가능한 덩어리로 분할됩니다. "the"나 "cat" 같은 흔하고 짧은 단어들은 보통 하나의 토큰입니다. 더 길거나, 빈도가 낮거나, 혹은 더 기술적인 단어들은 종종 두 개 이상의 조각으로 나뉩니다.
2단계: 조각을 숫자로 바꾸기
각 토큰은 모델이 학습할 때 사용된 고정된 어휘 사전 (vocabulary)을 기반으로 숫자에 매핑됩니다. 따라서 "access"는 5426이 될 수 있고, "ibility"는 9821이 될 수 있습니다. 모델은 글자나 의미를 직접 처리하지 않습니다. 모델은 숫자 목록을 처리하고, 통계적으로 다음에 올 가능성이 높은 숫자가 무엇인지 예측한 다음, 사용자가 읽을 수 있도록 그 숫자를 다시 텍스트로 변환합니다.
이것이 바로 LLM (Large Language Model)이 단어를 거꾸로 뒤집거나 "strawberry"에 "r"이 몇 개 들어있는지 세는 것과 같은 작업에서 어려움을 겪는 이유입니다. 이는 모델이 s-t-r-a-w-b-e-r-r-y를 글자 하나하나로 살펴보는 것이 아니기 때문입니다. 모델은 불투명한 몇 개의 토큰 조각 (token chunks)을 보고 있으며, 그 안에 포함된 글자들에 직접 접근할 수 없습니다.
토큰화 (tokenization)의 재미있는 사실들
-
공백과 문장 부호도 토큰으로 계산됩니다. 짧은 단어와 공백이 많은 문장은, 더 적고 긴 단어로 구성된 짧은 문장보다 더 많은 토큰을 소모할 수 있습니다. 토큰 수 (token count)는 단어 수 (word count)나 글자 수 (character count)와 동일하지 않습니다.
-
영어 이외의 텍스트는 종종 토큰화 효율이 떨어집니다. 대부분의 모델은 주로 영어 텍스트로 학습되었기 때문에, 다른 언어로 된 동일한 문장은 동일한 의미를 나타내기 위해 눈에 띄게 더 많은 토큰으로 분절될 수 있습니다.
-
토큰 제한이 "컨텍스트 창 (context window)"을 정의합니다. 이는 단순히 모델을 사용하는 것을 넘어, 모델을 기반으로 제품을 구축하려는 경우 가장 중요한 부분입니다. 모든 모델은 한 번에 메모리에 보유할 수 있는 최대 토큰 수를 가지고 있습니다. 여러분의 프롬프트 (prompt), 대화 기록, 그리고 응답이 모두 이 예산을 공유합니다. 이 제한을 초과하면 컨텍스트가 압축됩니다. 즉, 오래된 메시지가 삭제되거나, 입력이 잘리거나, 에러가 발생하게 됩니다.
프론트엔드 엔지니어에게 이것이 중요한 이유
토큰화 (Tokenization)는 더 이상 백엔드나 ML 팀만의 관심사가 아닙니다. 오늘날 대부분의 제품은 AI 출력을 스트리밍 (Streaming)하는 기능을 구축하며, 이는 여러분이 인지하든 못하든 토큰 예산 (Token budgets)을 고려하여 설계하고 있음을 의미합니다.
- 스트리밍 UX (Streaming UX): 응답은 단어 단위가 아닌 토큰 단위로 도착합니다. 텍스트가 정상화되기 전에 때때로 이상한 파편 형태로 렌더링되는 것처럼 보이는 이유가 바로 이것입니다.
- 절단 처리 (Truncation handling): 대화가 컨텍스트 제한 (Context limit)에 도달했을 때 여러분의 UI는 어떻게 동작합니까?
- 비용 및 지연 시간 (Cost and latency): 토큰 수는 API 비용과 응답 시간 모두를 결정합니다. 따라서 필요 이상의 컨텍스트를 조용히 더 많이 보내는 기능은 단순한 기술적 세부 사항이 아니라 실제 제품 비용이 됩니다.
토큰을 이해한다고 해서 머신러닝 엔지니어가 되는 것은 아닙니다. 하지만 여러분을 이러한 모델들 위에 구축된 제품을 더 잘 만드는 엔지니어로 만들어 줄 것입니다. 그리고 점점 더 많은 이들이 바로 그 제품을 만드는 사람들입니다.
리소스 (Resources)
- OpenAI Tokenizer — 어떤 텍스트든 붙여넣어 토큰으로 분할되는 모습을 실시간으로 확인하세요: platform.openai.com/tokenizer
- Anthropic의 토큰 계산 문서 (Anthropic's token-counting docs) — Claude 모델 전반에서 컨텍스트 윈도우 (Context windows)와 토큰 제한이 작동하는 방식: docs.claude.com
- tiktoken — 프로그래밍 방식으로 토큰을 계산하고 싶다면, OpenAI가 토큰화에 사용하는 오픈 소스 라이브러리: github.com/openai/tiktoken
- Hugging Face Tokenizers — 특정 벤더뿐만 아니라 다양한 오픈 모델의 토큰화를 탐색하기 위한 도구: huggingface.co/docs/tokenizers
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기
