대부분의 LLM이 "strawberry"에 r이 몇 개 있는지 말하지 못했던 시절을 기억하실지도 모릅니다. 그런데 왜 그런 일이 일어날까요? 그 답은 언어 모델이 무엇을 잘하고, 무엇을 어려워하며, 텍스트를 생성하기 위해 수학을 어떻게 사용하는지에 대해 놀라울 정도로 많은 것을 설명해 줍니다. 또한 이는 사용량이 어떻게 계산되는지도 설명해 주는데, 이는 속도 제한에 얼마나 빨리 도달하는지 또는 API 요금이 어떻게 나올지에 영향을 미칩니다.
역할을 좀 바꿔서 시작해 보겠습니다.
이것은 준비 운동 질문이니, 최선을 다해 추측해 보세요.
"Hello Claude"라고 입력하고 전송을 누르면, 모델에 무엇이 도착한다고 생각하시나요?
텍스트를 표현하는 세 가지 방법
다음과 같은 세 글자 문자열을 생각해 보세요: "Hi!". 이제 이 정보를 언어 모델에 전달할 수 있는 세 가지 다른 방법을 생각해 보겠습니다.
- 보이는 그대로의 방식. 문자열:
"Hi!". - 문자 목록으로.
['H', 'i', '!']. 대괄호[]는 목록을 의미하며, 이 특정 목록에는 세 개의 항목이 있습니다. - 문자당 숫자 하나로. 모든 문자는 표준 숫자에 대응할 수 있습니다:
'H'는72,'i'는105,'!'는33입니다.
string: "Hi!"
characters: [ 'H', 'i', '!' ]
numbers: [ 72, 105, 33 ]이 세 가지 접근 방식 모두 코드에서 나름의 용도가 있지만, 언어 모델은 네 번째의 더 전략적인 방식을 사용합니다. 여전히 숫자 목록이 도착하지만, 고정된 테이블에서 문자당 숫자 하나가 아니라, 모델이 학습한 어휘에서 텍스트 청크당 숫자 하나입니다.
숫자 ID가 부여된 텍스트 청크를 토큰이라고 합니다.
토큰
아래 위젯에는 토큰화할 수 있는 여러 텍스트가 포함되어 있습니다. 예시를 클릭해 보고, 각각을 토큰화하여 토큰이 단어와 어떻게 다른지 직접 확인해 보세요.
많을까요 적을까요?
이제 토큰이 어떻게 생겼는지 알았으니, 다음 문자열을 토큰화하면 몇 개의 토큰이 생성될지 예측해 보세요.
왜 서브워드일까요?
왜 문자당 하나 또는 단어당 하나의 토큰을 사용하지 않는지 궁금할 수 있습니다.
토크나이저가 생성할 수 있는 고유 토큰 ID의 집합을 어휘(vocabulary)라고 합니다. 딱 알맞은 토큰 크기와 어휘 크기를 정하는 것은 여전히 어느 정도 탐구와 연구가 필요한 문제이지만, 대부분의 공개 토크나이저는 적절한 중간 지점을 목표로 합니다. "The tokenizer rocks."라는 문장을 세 가지 다른 토크나이저가 세 가지 다른 방식으로 나누는 것을 살펴보겠습니다.
아주 작은 토큰(문자당 하나)을 사용하면 이 문장은 20개의 토큰을 사용합니다. 이는 처리 속도가 느리고 비용이 많이 들게 됩니다!
[T] [h] [e] [ ] [t] [o] [k] [e] [n] [i] [z] [e] [r] [ ] [r] [o] [c] [k] [s] [.]큰 토큰(단어당 하나)을 사용하면 이 문장은 단 4개의 토큰만 사용하지만, 모델은 "tokenizer"와 같은 특수한 단어를 알기 위해 거대한 어휘를 학습해야 합니다:
[The] [ tokenizer???] [ rocks] [.]중간 지점(단어 또는 서브워드당 하나의 토큰)을 사용하면 이 문장은 5개의 토큰을 사용하며, 어휘에 그렇게 많은 전문 단어를 포함시킬 필요가 없습니다:
[The] [ token] [izer] [ rocks] [.]토크나이저의 어휘는 모델에 고정되어 있으며, 학습이 끝난 후에는 변경할 수 없습니다. 특정 모델은 token 4062가 무엇을 의미하는지만 학습했을 뿐, "quick"이 무엇을 의미하는지는 학습하지 않았기 때문에 "토크나이저에 고정되어 있다"고 합니다.
출력 디코딩하기
이제 모델에 보내는 텍스트가 처리되기 전에 토큰 ID 목록이 된다는 것을 알게 되었습니다. 모델의 출력 역시 토큰 ID 목록입니다. 이 답변을 디코딩해 보세요.
토큰에서 의미로
토큰화는 모든 텍스트 청크에 숫자를 부여하지만, 9906과 9907처럼 ID가 비슷한 토큰이라고 해서 관련이 있는 것은 아닙니다 - 그저 목록에서 이웃일 뿐입니다. 모델은 cat과 kitten의 ID가 어휘에서 서로 멀리 떨어져 있더라도, 이 두 단어가 의미상 가깝다는 것을 알 방법이 필요합니다. 모델은 각 토큰에 다차원 점수를 부여하는 방식으로 이를 수행합니다.
2차원 점수 체계부터 시작해 보겠습니다.
임베딩
LLM 임베딩은 방금 수행한 점수 매기기와 같은 방식으로 작동합니다. 각 단어(정확히는 각 토큰)가 하나의 점이 되고, 비슷한 단어(토큰)는 서로 가까이 위치합니다. 실제 임베딩은 두 가지 면에서 더 복잡합니다:
- LLM 임베딩은 단 두 개가 아니라 수천 개의 차원을 가지고 있습니다. "위험함"에 대한 축을 추가하면 호랑이와 새끼 고양이를 구분하는 데 도움이 될 수 있다고 상상해 볼 수 있습니다.
- 하나의 차원에 담긴 의미에는 이름표가 붙어 있지 않으며, 실제로는 그것을 표현할 마땅한 인간의 단어조차 없는 무언가를 의미할 수도 있습니다. 귀여움은 어딘가에 들어 있지만, 명시적으로 "귀여움"이라는 이름이 붙은 축은 없습니다 - 모델은 학습 과정에서 차원을 만들어내거나 발견하며, 그것이 무엇을 의미하는지 해독하는 과정이 해석 가능성(interpretability) 연구의 핵심 주제 중 하나입니다.
2차원, 3차원, 그리고 수천 차원에서 "cat"을 살펴보기
2 dimensions "cat" = [ 8.0, 3.5 ] cute, big
3 dimensions "cat" = [ 8.0, 3.5, 1.0 ] cute, big, dangerous
4,096 dimensions "cat" = [ 0.031, -0.184, 0.772, …, -0.094 ] (no labels)
The exact number of dimensions varies by model. 4,096 is a common size in open-weight models.임베딩을 더 탐구해 보고 싶으신가요? Claude에게 시각화를 만들어 달라고 요청해 보세요:
저는 임베딩에 대해 배우고 있습니다. 토큰이 여러 차원을 가진 공간에서 하나의 점이 된다는 것, 비슷한 토큰은 서로 가까이 위치한다는 것, 그리고 차원에는 인간의 단어로 된 이름표가 붙어 있지 않다는 것을 이해하고 있습니다. 인터랙티브 시각화를 만들어 직관을 기를 수 있도록 도와주세요: 작은 임베딩 공간에 일상적인 단어 스무 개 정도를 배치하고, 제가 아무 단어나 선택해서 가장 가까운 이웃을 볼 수 있게 해주세요. 그리고 제가 직접 단어를 추가해서 그것이 어디에 위치하는지, 왜 그런지 볼 수 있게 해주세요.
요약
이제 LLM에 보내는 텍스트가 일련의 토큰이 되고, 토큰이 임베딩이 된다는 것을 알게 되었습니다.
text: "Hi"
token: [ 13347 ]
embedding: [ 0.12, -0.48, 0.91, …, 0.07 ]축하합니다! 이는 언어 모델이 어떻게 작동하는지 이해하는 데 있어 큰 발걸음입니다.
임베딩에 담긴 정보(사물이 얼마나 귀엽고, 크고, 그 밖의 모든 것인지)가 언어 모델이 입력을 이해하고 올바른 출력을 선택하는 데 큰 역할을 한다는 것을 이미 직관적으로 느끼고 계셨을지도 모릅니다. 만약 그렇다면, 그 직관은 맞습니다!
다음 네 가지 문장이 맞다고 느껴진다면, 이 레슨이 전달하고자 했던 내용을 모두 이해하신 것입니다.
- 100자짜리 URL이 100자짜리 문장보다 더 많은 토큰을 사용하는 이유를 설명할 수 있습니다.
- 텍스트 조각이 대략 몇 개의 토큰이 될지 예측할 수 있습니다.
- 모델이 왜 토크나이저에 고정되어 있는지, 그리고 더 드문 단어가 왜 조각으로 나뉘는지 알고 있습니다.
- "점수", "차원", "인접"이라는 단어를 사용하여 임베딩이 무엇이고 왜 중요한지 설명할 수 있습니다.
다음: 컨텍스트가 Claude의 성능과 비용에 미치는 영향(새 탭에서 열림) · 적합한 Claude 모델 선택하기(새 탭에서 열림) · Claude에서 작업 강도 선택하기(새 탭에서 열림) · Claude Code에서(새 탭에서 열림)
더 알아보기: AI는 어떻게 작동하는가(새 탭에서 열림) · AI의 역량과 한계(새 탭에서 열림)