처음 읽는 LLM 이해하기
文章目录
部分视频或图片暂未收录,已在正文保留提示;需要时可查看原文。查看原文 ↗
AI를 매일 쓰는 분들이 자주 하는 질문이 있습니다.
"컨텍스트 윈도가 뭐예요?" "토큰이 글자 수랑 같은 거예요?" "캐시는 왜 할인해요?"
최신 논문이나 아키텍쳐 이야기는 해도, 이걸 설명해드린 적은 없었던 것 같아...
그래서 오늘은 기본기 편입니다. 어려운 거 하나도 없습니다. 대신 비유를 많이 쓰겠습니다. 비유가 오해를 부를 수 있는 곳에서는 한계도 같이 적겠습니다.
목표는 하나입니다.
이 글을 다 읽고 나면, 채팅창 뒤에서 무슨 일이 벌어지는지 머릿속에 그림이 그려지는 것.
1. LLM의 본질: 다음 토큰 맞히기
가장 중요한 것부터 말씀드리겠습니다.
LLM(대규모 언어 모델)이 하는 일은 근본적으로 "지금까지의 글 다음에 올 조각이 무엇일지" 확률로 예측하는 것입니다.
GPT 계열 모델의 출발점이 된 논문들도 모델의 학습 목표를 이렇게 정의합니다. 앞에 나온 토큰들이 주어졌을 때 다음 토큰의 확률을 최대한 잘 맞히도록 학습시킨다는 것이죠.
"오늘 아침에 커피를"이라는 문장이 있으면, 모델은 "마셨다"에 높은 확률을, "던졌다"에 낮은 확률을 매깁니다. 하나를 고르고, 그걸 문장 끝에 붙이고, 다시 다음 조각을 예측합니다. 이걸 수백, 수천 번 반복하면 긴 답변이 됩니다.
스마트폰 키보드의 자동완성을 떠올리면 됩니다. 다만 규모가 상상을 초월하게 큰 자동완성입니다.
물론... "그냥 자동완성"이라고 하면 과소평가가 됩니다. 다음 토큰을 잘 맞히려면 문법, 사실, 맥락, 추론 패턴까지 학습해야 하기 때문입니다. GPT-3 논문은 이렇게 학습한 모델이 예시 몇 개만 보여줘도 번역과 질의응답 등 여러 과제를 수행한다는 것을 보였습니다.
그럼 여기서 말하는 '조각'이 대체 뭘까요?
2. 토큰과 토크나이저: 모델이 읽는 단위
모델은 글자를 그대로 읽지 않습니다. 먼저 글을 토큰이라는 조각으로 자르고, 각 조각에 번호를 붙입니다. 이 자르는 도구가 토크나이저입니다.
토큰은 단어일 수도, 단어의 일부일 수도, 글자 하나일 수도 있습니다. 자주 나오는 덩어리는 하나의 토큰이 되고, 드문 단어는 여러 조각으로 쪼개집니다. 널리 쓰이는 방식 중 하나인 BPE(Byte Pair Encoding)는 자주 붙어 나오는 문자 쌍을 반복해서 하나로 합쳐 가며 어휘를 만드는 방식입니다.
OpenAI 안내에 따르면 일반적인 영어 텍스트에서 1토큰은 대략 4글자, 단어로는 약 0.75단어에 해당합니다. [4] (한국어는 보통 같은 내용을 쓰는 데 토큰이 더 많이 드는 편인데, 이는 토크나이저마다 크게 다르니 실제 비율은 직접 확인하시는 게 좋습니다)
모델이 아는 토큰의 전체 목록을 어휘(vocabulary)라고 합니다.
이게 실생활에서 왜 중요할까요?
-
API 요금이 토큰 단위로 매겨집니다.
-
컨텍스트 윈도(뒤에서 설명)도 토큰 단위입니다.
-
모델이 "strawberry에 r이 몇 개냐"류의 질문에 가끔 헤매는 것도, 글자가 아니라 토큰 덩어리로 보고 있다는 점과 관련 있다고 흔히 설명됩니다.
3. 임베딩: 단어에 좌표를 주기
토큰은 번호일 뿐입니다. 하지만 '커피'가 4521번이고 '차'가 4522번이라고 해서, 두 단어가 비슷하다는 뜻은 아니죠. 번호에는 의미가 없습니다.
그래서 모델은 각 토큰을 수백~수천 개의 숫자로 이뤄진 벡터로 바꿉니다. 이걸 임베딩이라고 합니다. Transformer 원 논문은 이 벡터 크기를 512로 썼습니다. 현재 오픈웨이트 모델 중 가장 사이즈가 큰 Kimi K3는 7,168개입니다.
갑자기 뭔가 어렵죠?
지도에 비유하면 이해가 쉽습니다. 모든 단어가 거대한 지도 위 어딘가에 점으로 찍혀 있고, 의미가 비슷한 단어끼리는 가까이 모여 있습니다. 2013년 word2vec 연구에서는 이런 벡터에서 "king − man + woman"을 계산하면 "queen"에 가장 가까운 벡터가 나온다는 유명한 결과를 보였습니다.
주석: 물론 실제 '지도'는 2차원이 아니라 수천 차원이고, 각 축이 "성별", "크기"처럼 사람이 이름 붙일 수 있는 의미를 갖는 것도 아닙니다. 이 좌표 역시 사람이 정해 주는 게 아니라 학습 과정에서 저절로 만들어집니다.
4. 신경망과 파라미터: 수십억 개의 다이얼
자, 이제 이 벡터를 받아 "다음 토큰 확률"을 계산하는 기계가 필요합니다. 그게 신경망입니다. (신경망의 '뉴런'은 이름과 달리 뇌세포를 흉내 낸 것이 아닙니다. 단지 숫자를 곱하고 더하는 계산 단위입니다.)
신경망은 본질적으로 거대한 계산식입니다. 입력 숫자에 어떤 값을 곱하고 더하고, 비선형 함수를 통과시키는 일을 수없이 반복합니다. 여기서 "곱하는 값"들이 파라미터, 가중치입니다.
거대한 오디오 믹싱 콘솔을 떠올려 보세요. 다이얼이 수십억 개 달려 있고, 다이얼을 어떻게 돌려 두었느냐에 따라 같은 입력에서 전혀 다른 소리가 나옵니다. GPT-3는 이 다이얼이 1,750억 개였습니다. "30B 모델", "70B 모델"이라고 할 때의 B(billion)가 바로 이 개수입니다.
그래서 학습이란 이 다이얼들을 잘 맞춰 두는 과정이고, 다 맞춰진 다이얼 설정값 묶음이 우리가 다운로드하는 모델 파일입니다.
음악에는 정답이 없지만, 모델의 지능은 높고 낮음이 있죠. '정답'이 있다고 가정합시다. 그럼 다이얼이 많으면 더 정확한 소리를 뽑을 수 있게 되는 겁니다. 대신 더 많아진 필터를 뚫어야 하니, 계산할 양도 많아지는 거죠.
다이얼 하나를 16비트(bf16)로 저장하면 2바이트입니다.
Qwen3.8-27B의 총 파라미터 수는 약 277.8억(비전 인코더 포함)입니다. bf16 기준 가중치 용량은 55.6GB로 산출되며, 공식 BF16 체크포인트 크기와 일치하지요.
이를 4비트 근처로 줄이는 게 양자화입니다.
5. 학습은 어떻게 하나: 손실, 역전파, 경사하강법
수십억 개 다이얼을 사람이 손으로 맞출 수는 없습니다. 그래서 이렇게 합니다.
1. 순전파(forward pass): 문장을 넣고, 현재 다이얼 상태로 다음 토큰 확률을 계산합니다.
2. 손실(loss): 정답 토큰에 매긴 확률이 낮을수록 큰 벌점을 줍니다. 이 벌점이 손실입니다. 다음 토큰 예측에서는 보통 정답 토큰 확률의 로그에 마이너스를 붙인 값(교차 엔트로피)을 씁니다.
3. 역전파(backpropagation): 이 벌점에 각 다이얼이 얼마나 책임이 있는지, 출력에서 입력 방향으로 거슬러 올라가며 계산합니다. 1986년 Rumelhart, Hinton, Williams의 논문이 이 방법을 널리 알렸습니다.
4. 경사하강법(gradient descent): 벌점이 줄어드는 방향으로 모든 다이얼을 아주 조금씩 돌립니다.
으악, 어려워! 움짤로 보시면 이렇습니다.
제가 만든 건데, 아무데나 쓰셔도 됩니다.
이걸 수조 개 토큰에 대해 반복합니다.
안개 낀 산에서 눈을 가리고 골짜기를 찾아 내려가는 장면을 생각해 봅시다. 발밑의 경사만 느끼면서, 내리막 쪽으로 한 걸음씩. 경사를 계산하는 게 역전파, 한 걸음 내딛는 게 경사하강법입니다.
6. 트랜스포머와 어텐션: 문맥을 읽는 방법
여기까지 오면 질문이 생깁니다. "은행"이라는 토큰은 "은행나무"와 "은행 대출"에서 뜻이 다르잖아요. 모델은 이걸 어떻게 구분할까요?
답이 어텐션(attention)입니다. 2017년 구글 연구진의 논문 「Attention Is All You Need」가 어텐션만으로 구성된 구조, 트랜스포머(Transformer)를 제안했고, 이후 거의 모든 LLM의 뼈대가 됐습니다.
어텐션의 아이디어는 이렇습니다. 각 토큰이 문장 안의 다른 토큰들을 둘러보고, "지금 내 의미를 정하는 데 누가 중요한가"를 점수로 매긴 뒤, 중요한 토큰의 정보를 더 많이 섞어 자기 벡터를 업데이트합니다.
조금 더 구체적으로, 논문은 각 토큰에서 세 가지 벡터를 만듭니다.
-
Query(질문): "나는 이런 정보를 찾고 있어"
-
Key(색인): "나는 이런 정보를 갖고 있어"
-
Value(내용): "실제로 건네줄 내용은 이거야"
Query와 Key가 잘 맞을수록 그 토큰의 Value를 많이 가져옵니다. 회의실에서 내가 궁금한 걸 들고(Query) 둘러보다가, 그 주제에 대해 아는 사람(Key)에게 귀를 기울이고, 그 사람의 말(Value)을 받아 적는 것과 비슷합니다.
논문은 이걸 여러 갈래로 동시에 하는 멀티헤드 어텐션도 제안했습니다(원 논문 기본 모델은 8개 헤드). 논문 부록의 시각화에서도 헤드마다 다른 일을 하는 모습, 예컨대 문장 구조나 대명사가 가리키는 대상과 관련돼 보이는 헤드들이 나왔습니다.
트랜스포머가 중요했던 또 하나의 이유는 병렬 처리입니다. 이전에 주로 쓰던 순환신경망(RNN)은 단어를 하나씩 순서대로 처리해야 했지만, 트랜스포머는 문장 전체를 한 번에 처리할 수 있어 학습이 훨씬 빨랐습니다. GPU가 비싸진 이유가 이거 하나입니다.
주석: "중요한 단어에 주목한다"는 표현 때문에 모델이 사람처럼 '의도적으로 집중'한다고 오해하기 쉽습니다. 실제로는 벡터끼리의 유사도 점수를 계산해 가중 평균을 내는 연산입니다.
7. 레이어와 디코더 구조
점점 어려워지는 것 같기도 하지만........
트랜스포머 블록 하나는 대략 "어텐션 → 피드포워드 신경망"으로 이뤄져 있습니다. 어텐션이 토큰끼리 정보를 주고받는 단계라면, 피드포워드는 각 토큰이 받은 정보를 혼자 소화하는 단계입니다.
이 블록을 층층이 쌓은 것이 레이어입니다. 아래층에서 단순한 패턴을, 위층으로 갈수록 더 추상적인 관계를 다룬다고 흔히 설명합니다.
공장의 조립 라인을 생각하면 됩니다. 원재료(임베딩)가 들어와 수십 개 공정(레이어)을 거치며 점점 다듬어지고, 마지막 공정에서 "다음 토큰 확률표"라는 완제품이 나옵니다.
그런데 원래 트랜스포머는 번역기였습니다. 원문을 읽는 인코더와 번역문을 쓰는 디코더, 두 부분으로 되어 있었죠. GPT 계열은 이 중 디코더 쪽만 가져와 쌓았습니다. 오늘날 ChatGPT, Claude, Llama 같은 대화형 LLM 대부분이 이 디코더 전용(decoder-only) 구조입니다.
디코더의 핵심 규칙은 하나입니다.
각 토큰은 자기보다 앞에 있는 토큰만 볼 수 있습니다.
미래를 훔쳐보지 못하게 가린 것이죠(마스킹). 다음 토큰을 예측하는 모델이 정답을 미리 보면 안 되니까요.
8. 사전학습, 파인튜닝, RLHF: 학생에서 비서로
방금 설명한 방식으로 인터넷 규모의 텍스트를 학습시키면 사전학습(pre-training) 모델이 나옵니다. 이 모델은 아는 건 많지만, 대화 상대로는 이상합니다. 질문을 던지면 답하는 대신 비슷한 질문을 몇 개 더 써 내려갈 수도 있습니다. 문서 이어 쓰기를 배웠지, 질문에 답하기를 배운 건 아니니까요.
그래서 두 단계를 더 거칩니다. OpenAI의 InstructGPT 논문이 이 과정을 잘 정리했습니다.
[未转换内容,参见原始 JSON]
1. 지도 파인튜닝(SFT): 사람이 직접 쓴 "질문–모범 답변" 예시로 추가 학습합니다.
2. RLHF(인간 피드백 기반 강화학습): 모델이 쓴 여러 답변을 사람이 순위 매기고, 그 선호를 학습한 보상 모델을 만든 뒤, 보상 모델 점수가 높아지도록 원래 모델을 강화학습으로 조정합니다.
결과가 인상적이었습니다. 사람 평가자들은 RLHF를 거친 13억 파라미터 InstructGPT의 답변을, 100배 이상 큰 1,750억 파라미터 GPT-3의 답변보다 더 선호했습니다. (전설의 시작)
비유하면, 사전학습은 도서관 책을 전부 읽은 박식한 학생이고, 파인튜닝과 RLHF는 그 학생에게 "손님 응대하는 법"을 가르치는 신입 연수입니다. 지식을 새로 넣는다기보다, 이미 가진 지식을 어떤 태도와 형식으로 꺼낼지를 다듬는 쪽에 가깝습니다.
주석: 요즘은 RLHF 외에도 다양한 후속 학습 기법이 쓰이며, 각 회사가 구체적 방법을 모두 공개하지는 않습니다.
9. 학습과 추론: 공장 짓기와 공장 돌리기
여기서 꼭 구분해야 할 두 단어가 있습니다.
- 학습(training): 다이얼을 맞추는 과정. 순전파 + 역전파 + 경사하강법을 반복합니다. 엄청난 연산이 들고, 끝나면 다이얼이 고정됩니다. 우리가 할 일은 별로 없습니다.
- 추론(inference): 고정된 다이얼로 답을 만드는 과정. 순전파만 합니다. 역전파도, 가중치 업데이트도 없습니다. 우리가 맨날 합니다.
우리가 ChatGPT와 대화하는 건 전부 추론입니다. 대화 중에 모델이 "학습"되고 있는 게 아닙니다. 대화 중에 모델이 내 말을 기억하는 것처럼 보이는 건, 대화 내용 전체가 매번 입력(컨텍스트)으로 다시 들어가기 때문입니다. (대화 기록이 서비스 개선용 학습 데이터로 쓰일지는 각 서비스 정책의 문제이고, 그 대화 순간에 다이얼이 바뀌는 것은 아닙니다.)
공장으로 말하면, 학습은 공장을 짓고 기계를 세팅하는 일, 추론은 다 지은 공장을 돌려 제품을 찍어내는 일입니다. 지난 글의 "맥에서 로컬로 돌린다"는 이야기는 전부 추론 이야기였습니다.
10. 프리필과 디코딩: 추론의 두 박자
추론은 다시 두 박자로 나뉩니다.
① 프리필(prefill): 내 프롬프트 전체를 한꺼번에 모델에 통과시키는 단계. 프롬프트 토큰들은 이미 다 주어져 있으니 동시에, 병렬로 처리할 수 있습니다. GPU의 병렬 연산을 효율적으로 쓸 수 있는 단계라, 계산량이 많고 연산력이 속도를 좌우합니다.
② 디코딩(decoding): 답을 한 토큰씩 만드는 단계. 1장에서 말했듯 토큰 하나를 뽑아야 다음 토큰을 예측할 수 있으니, 본질적으로 순차적입니다. vLLM 논문은 이 단계가 병렬화가 어렵고 행렬-벡터 곱 위주라 GPU 연산력을 다 쓰지 못하는 메모리 병목(memory-bound) 단계라고 설명합니다. 그래서 이 단계의 속도는 계산 능력보다 메모리 대역폭에 더 크게 좌우됩니다(자세한 건 지난 글 참고).
ChatGPT에 긴 문서를 붙여 넣으면 첫 글자가 나오기까지 잠깐 멈칫하고(프리필), 그다음엔 일정한 속도로 글자가 흘러나오죠(디코딩). 그 두 박자입니다.
11. KV 캐시: 이미 읽은 건 다시 읽지 않기
디코딩에는 낭비가 숨어 있습니다. 토큰을 하나 새로 만들 때마다, 앞의 모든 토큰에 대해 어텐션을 계산해야 하거든요. 앞의 토큰들의 Key와 Value(6장)를 매번 처음부터 다시 계산한다면 엄청난 중복입니다.
그래서 한 번 계산한 Key와 Value를 메모리에 저장해 두고 재사용합니다. 이게 KV 캐시입니다. 새 토큰은 자기 Query만 계산해서, 저장된 Key와 Value와 비교하면 됩니다.
시험공부할 때 이미 읽은 챕터의 요점 노트를 만들어 두는 것과 같습니다. 새 챕터를 읽을 때마다 앞 챕터를 처음부터 다시 읽지 않고, 노트만 펼쳐 보면 되죠.
대가는 메모리입니다.
대화가 길어질수록 노트도 두꺼워집니다. vLLM 논문에 따르면 130억 파라미터 OPT 모델은 토큰 하나당 KV 캐시가 800KB이고, 최대 2,048토큰짜리 요청 하나면 KV 캐시만 최대 1.6GB까지 차지할 수 있습니다.
그래서 모델 설계자들은 KV 캐시를 줄이려고 애씁니다.
12. 프롬프트 캐싱: 남이 만든 요점 노트를 빌려 쓰기
"캐시는 왜 할인해요?"
API 요금표를 보면 '캐시된 입력(cached input)' 가격이 따로 있고, 일반 입력보다 훨씬 쌉니다. 같은 토큰인데 왜 값이 다를까요?
답은 11장의 요점 노트에 있습니다.
① 원리: 같은 앞부분이면 노트를 다시 만들 필요가 없다
11장에서 KV 캐시는 한 번의 대화 안에서 쓰는 요점 노트라고 했습니다. 그런데 요청이 끝나면 그 노트는 보통 버려집니다. 다음 요청이 오면 프리필(10장)부터 다시, 프롬프트 전체의 Key·Value를 처음부터 계산하죠.
그런데 많은 요청은 앞부분이 똑같습니다.
같은 시스템 프롬프트, 같은 툴 정의, 같은 참고 문서를 매번 맨 앞에 붙이니까요. 그렇다면 그 공통 앞부분(접두부, prefix)의 노트는 보관해 뒀다가 다음 요청에서 그대로 꺼내 쓰면 됩니다. 이게 프롬프트 캐싱(prefix caching)입니다.
OpenAI도 정확히 이렇게 설명합니다. 입력을 처리하며 만든 중간 상태, 즉 Key·Value를 재사용 가능한 접두부에 대해 보관해 두고, 다음 요청이 같은 접두부를 가지면 그 토큰을 다시 처리하지 않고 저장된 상태를 쓴다는 것이죠. 저장하는 건 토큰 자체가 아니라 KV 텐서라고 명시합니다. 오픈소스 서빙 엔진 vLLM의 '자동 프리픽스 캐싱'도 같은 원리로, 공유된 접두부의 계산을 건너뜁니다.
그러니 할인의 이유는 단순합니다.
계산을 안 했으니 덜 받는 겁니다.
캐시를 맞힌 부분은 프리필 연산을 건너뛰고, 그만큼 첫 글자가 나오기까지의 시간도 줄어듭니다.
② 캐시 히트와 캐시 미스
-
캐시 히트(hit): 보관된 노트 중 내 요청의 앞부분과 똑같은 게 있어서 꺼내 쓴 경우. 그 부분은 할인된 가격으로 계산됩니다.
-
캐시 미스(miss): 맞는 노트가 없어서 처음부터 계산한 경우. 노트가 아예 없었거나, 유효 기간이 지났거나, 앞부분이 조금이라도 달랐을 때입니다.
여기서 핵심은 "조금이라도"입니다. Anthropic 문서는 캐시 히트에 캐시 지점까지의 텍스트와 이미지가 100% 똑같아야 한다고 씁니다. OpenAI도 렌더링된 접두부 전체가 일치해야 재사용된다고 설명합니다. 노트는 첫 페이지부터 순서대로 쌓이니, 3쪽에서 한 글자가 바뀌면 3쪽 이후의 노트는 모두 쓸 수 없습니다.
③ 얼마나 할인되나 (2026년 10월 기준)
- OpenAI: GPT-5.6 이후 모델은 캐시 읽기가 일반 입력의 0.1배(GPT-6.1 Sol은 0.05배)입니다. 대신 처음 캐시에 쓸 때는 기본 30분 보관 시 1.25배, 12시간 보관(Responses API) 시 2.5배를 냅니다. 이전 모델은 쓰기 추가 요금이 없고 캐시 입력 할인율이 모델마다 다릅니다. (그런데... 최근 이걸 영구보관해준다고 합니다. SSD에 저장해놓는 듯)
-
Anthropic: 캐시 쓰기는 5분 보관 시 기본 입력의 1.25배, 1시간 보관 시 2배, 캐시 읽기는 0.1배가 기본입니다(일부 최신 모델은 0.05배, 0.025배).
-
Google Gemini: 2.5 이후 모델은 암묵적 캐싱이 기본으로 켜져 있고, 캐시를 맞히면 비용 절감분이 자동으로 반영된다고 문서에 적혀 있습니다.
잠깐, 캐시 히트를 내는 실전 팁
1) 안 바뀌는 건 앞에, 바뀌는 건 뒤에.
시스템 프롬프트, 툴 정의, 참고 문서처럼 고정된 부분을 맨 앞에 두고, 사용자의 질문처럼 매번 달라지는 부분은 맨 뒤에 둡니다. 세 회사 문서가 모두 같은 조언을 합니다. Anthropic은 캐시 접두부가 tools → system → messages 순서로 만들어지고, 앞 단계가 바뀌면 그 뒤가 모두 무효가 된다고 설명합니다.
2) 접두부를 바이트 단위까지 똑같이.
가장 흔한 실수는 시스템 프롬프트 맨 앞에 "현재 시각: 2026-10-23 09:52" 같은 값을 넣는 겁니다. 매 요청마다 첫 줄이 바뀌니 노트를 한 장도 못 씁니다. OpenAI는 타임스탬프나 사용자별 내용을 접두부 앞이 아니라 끝으로 옮기라고 하고, Anthropic도 타임스탬프가 들어간 블록에 캐시 지점을 두면 매번 쓰기 비용만 내고 읽기는 한 번도 못 한다고 경고합니다.
눈에 안 띄는 함정도 있습니다. 툴 정의의 순서나 스키마를 바꾸는 것, 일부 언어에서 JSON 키 순서가 무작위로 바뀌는 것도 캐시를 깹니다. 툴을 잠시 끄고 싶다면 정의를 지우지 말고 tool_choice: "none" 등으로 막으라는 게 OpenAI의 권고입니다.
3) 최소 길이를 넘기세요.
너무 짧은 접두부는 아예 캐시되지 않습니다.
-
OpenAI: GPT-5.6 이후 1,024토큰(이전 모델은 요청 설정에 따라 다름)
-
Anthropic: 모델에 따라 512~4,096토큰. 이보다 짧으면
cache_control을 붙여도 오류 없이 그냥 캐싱 없이 처리됩니다. -
Gemini: 2.5 Flash·Pro는 2,048토큰, 그 이후 모델은 4,096토큰
4) 유효 기간(TTL) 안에 다시 쓰세요.
노트에는 유통기한이 있습니다.
-
Anthropic: 기본 5분, 쓸 때마다 무료로 갱신. 1시간 옵션은 추가 요금.
-
OpenAI: 앞서 말했듯 영구보관 된다고 하네요!
-
Gemini: 문서는 "비슷한 접두부의 요청을 짧은 시간 안에 보내라"고만 권합니다.
한 줄 요약:
안 바뀌는 건 앞에 두고 한 글자도 건드리지 마세요.
13. 컨텍스트 윈도우: 책상의 크기
컨텍스트 윈도우는 모델이 한 번에 볼 수 있는 토큰의 최대 개수입니다. 내 프롬프트, 대화 기록, 첨부 문서, 그리고 모델이 생성하는 답변까지 모두 이 안에 들어가야 합니다.
책상 크기라고 생각하면 됩니다. 책상이 넓으면 자료를 많이 펼쳐 놓고 일할 수 있지만, 넘치는 건 책상에서 밀려납니다.
다만 책상이 넓어지면 비용도 따라옵니다. 어텐션은 모든 토큰 쌍을 비교하므로 컨텍스트가 길수록 계산이 늘, KV 캐시도 커집니다(11장). 그래서 긴 프롬프트일수록 프리필이 오래 걸리는 겁니다.
14. MoE: 전문가 여러 명 중 몇 명만 부르기
마지막으로, 요즘 자주 보이는 MoE(Mixture of Experts)를 간단히.
일반 모델(dense)은 토큰 하나를 처리할 때 모든 파라미터를 씁니다. MoE는 피드포워드 부분을 여러 개의 '전문가'로 나누고, 라우터가 토큰마다 그중 몇 개만 골라 쓰게 합니다.
Mixtral 8x7B가 대표적인 예입니다. 레이어마다 전문가 8개가 있고 토큰마다 2개만 쓰기 때문에, 전체 파라미터는 470억 개지만 토큰 하나에 실제로 쓰는 건 130억 개입니다.
종합병원과 비슷합니다. 병원에는 전문의가 수십 명 있지만, 환자 한 명은 접수처(라우터)의 안내에 따라 필요한 과 두어 곳만 들릅니다.
전체 전문가를 메모리에 올려 둬야 하니 용량은 크게 필요하지만, 토큰마다 읽어 오는 양은 적으니 대역폭 부담은 작죠.
주석: '전문가'라는 이름과 달리, 각 전문가가 "의학", "법률"처럼 사람이 알아볼 수 있는 주제를 맡는 건 아닙니다. Mixtral 논문도 전문가 배정이 주제보다는 문법적·구조적 패턴과 더 관련 있어 보인다고 보고했습니다.
마치며: 다시, 채팅창 뒤에서
이제 채팅창에 질문을 입력하는 순간 벌어지는 일을 한 번에 따라가 볼 수 있습니다.
-
내 질문이 토크나이저로 잘려 토큰 번호가 됩니다.
-
각 토큰은 임베딩 벡터가 됩니다.
-
수십 개의 레이어를 지나며, 어텐션으로 서로의 문맥을 주고받습니다. 프롬프트 전체를 한 번에 처리하는 이 단계가 프리필이고, 이때 KV 캐시가 만들어집니다.
-
마지막 레이어가 다음 토큰의 확률표를 내고, 온도와 샘플링 규칙에 따라 하나를 고릅니다.
-
그 토큰을 붙이고 다시 예측합니다. 이 반복이 디코딩입니다. 모두 컨텍스트 윈도우 안에서 일어납니다.
-
이 모든 과정에서 쓰인 수십억 개의 파라미터는 사전학습과 파인튜닝, RLHF로 미리 맞춰져 있었고, 대화하는 동안에는 바뀌지 않습니다.
처음의 질문으로 돌아가 볼까요.
ChatGPT는 생각을 할까요, 다음 단어를 고를까요?



