2장. Transformer 입력 표현
토큰 수가 중요한 이유
택시 요금을 생각해 봅니다. 요금은 내가 몇 글자를 말했는지가 아니라 몇 킬로미터를 달렸는지로 매깁니다. LLM 에서 킬로미터에 해당하는 단위가 토큰입니다. 한 번에 갈 수 있는 거리(컨텍스트 길이), 내는 돈(API 요금), 걸리는 시간(계산량)이 모두 토큰 수로 정해집니다.
그림의 세 상자 가운데 오른쪽 "계산 속도" 가 가장 무섭습니다. 3장에서 배울 Attention 은 토큰마다 다른 모든 토큰과 점수를 매기므로, 토큰이 n 개면 n × n 칸의 점수표를 채웁니다. 토큰이 두 배가 되면 칸은 네 배가 됩니다.
토큰과의 관계
| 항목 | 토큰과의 관계 | 택시로 치면 |
|---|---|---|
| 컨텍스트 길이 | 모델이 한 번에 볼 수 있는 최대 토큰 수(Qwen2.5-0.5B-Instruct 는 32K 토큰) | 연료 한 통으로 갈 수 있는 거리 |
| API 요금 | 입력·출력 토큰 수에 비례해 과금 | 미터기 요금 |
| 학습·추론 속도 | Attention 계산량이 토큰 수의 제곱에 비례 | 거리가 두 배면 시간이 네 배인 길 |
짧은 예시
# 실습 2에서 센 값: 같은 뜻의 문장이 한국어 13토큰, 영어 10토큰
ko_tokens, en_tokens = 13, 10
# Attention 점수표의 칸 수 = 토큰 수 × 토큰 수
print(ko_tokens * ko_tokens, en_tokens * en_tokens) # 결과: 169 100
# 토큰이 1,000개에서 2,000개로 두 배가 되면 칸은 몇 배일까
print((2000 * 2000) / (1000 * 1000)) # 결과: 4.0
# 컨텍스트 32,768 토큰에 13토큰짜리 문장이 몇 개 들어갈까(// 는 몫만 구하는 나눗셈)
print(32768 // ko_tokens, 32768 // en_tokens) # 결과: 2520 3276이 코드가 뜻하는 것
택시 미터기를 직접 눌러 본 코드입니다. 손으로 계산하면 13 × 13 = 169, 10 × 10 = 100 이라서 같은 뜻인데도 한국어 문장의 점수표가 1.69배 큽니다. 토큰이 두 배가 되면 2 × 2 = 4 배가 됩니다. 마지막 줄은 같은 연료 통에 한국어 문장이 영어 문장보다 적게 들어간다는 뜻입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
ko_tokens * ko_tokens | 점수표 칸 수를 구한다 | n × n 표의 크기 |
(2000*2000)/(1000*1000) | 토큰이 두 배일 때의 비 | 거리 두 배, 시간 네 배 |
32768 // ko_tokens | 컨텍스트에 들어가는 문장 수 | 연료 한 통으로 몇 번 갈까 |
주의할 점
- 한국어 데이터의 길이를 정할 때는 글자 수 대신 실제 토크나이저로 센 토큰 수를 씁니다. 7장에서 SFT 데이터의 최대 길이를 정할 때도 토큰 수로 잽니다.
- 토큰 수는 토크나이저마다 다릅니다. 같은 문장이라도 BERT 와 Qwen 의 토큰 수가 다르므로, 비교할 때는 같은 토크나이저로 셉니다.