2장 토큰과 트랜스포머, 최소한의 내부

LLM이 세는 단위인 토큰과 트랜스포머의 최소 부품

토큰은 정확히 무엇이고 왜 단어가 아닌가요?

글자 단위로 다루면 시퀀스가 너무 길어지고 단어 단위로 다루면 목록에 다 담을 수 없어, 자주 나오는 덩어리는 크게 드문 덩어리는 잘게 쪼개는 절충이 토큰입니다. 쪼개는 규칙이 모델마다 달라서 토큰 수는 텍스트의 속성이자 모델의 속성입니다.

필요한 만큼만 여는 덮개

앞 장의 마지막 질문을 그대로 이어받자. 학습이 끝나 고정된 이 기계는 도대체 무엇을 하는 기계인가. 답을 한 문장으로 먼저 적어 두면 이렇다. 지금까지의 토큰들이 주어졌을 때, 다음에 올 토큰의 확률을 계산하는 기계다. 이 문장에 들어 있는 낱말들, 토큰이 무엇이고 확률을 계산한다는 것이 무엇이며 그 계산이 어떤 부품들을 통과하는지를 이해하는 것이 이 장의 전부다. 부품의 수는 많지 않다. 입구의 토크나이저와 임베딩, 몸통의 층들, 층 안의 어텐션과 MLP, 그리고 출구의 확률 분포. 이 여섯 개의 이름이 이 장의 중심이고, 이후의 모든 장은 이 부품들과 그 사이에 놓인 보조 장치들에서 벌어지는 이야기다.

미리 범위를 긋는다. 이 장은 트랜스포머 해설이 목적이 아니다. 트랜스포머를 제대로 다루는 훌륭한 자료는 이미 많고, 그 깊이는 이 책의 일이 아니다. 여기서는 이후의 장들, 특히 추론의 두 단계와 KV 캐시와 메모리 병목을 이해하는 데 필요한 부품만 골라서 연다. 자동차 정비를 배우려는 사람에게 열역학 전체를 강의하는 대신 엔진의 네 행정만 먼저 보여 주는 것과 같은 태도다. 그래서 학습이 어떻게 이루어지는지, 수식이 정확히 어떻게 생겼는지는 다루지 않는다. 대신 이 장을 마치면 다음 장부터 나오는 모든 논의를 부품의 이름과 위치로 따라갈 수 있게 된다. 동선은 텍스트가 걷는 길을 그대로 따른다. 글이 토큰이 되는 입구에서 시작해, 토큰이 숫자가 되는 임베딩을 지나, 층이라는 몸통을 통과하고, 확률이라는 출구로 나온다.

토큰: 이 기계가 세는 단위

언어 모델의 기본 입력 단위는 글자나 단어로 고정되어 있지 않다. 모델이 다루는 것은 토크나이저가 만든 토큰의 열이다. 현대 언어 모델에서 널리 쓰이는 서브워드 방식을 기준으로 말하면, 토큰은 글자나 바이트, 단어의 일부, 또는 단어 전체에 해당하는 조각이다. 자주 쓰이는 단어는 통째로 토큰 하나가 되고, 드문 단어는 여러 조각으로 쪼개진다. 이 쪼개는 규칙의 집합을 토크나이저라고 부르며, 모델마다 자기의 토크나이저를 갖는다.

감각을 잡기 위해 짧은 문장 하나가 걷는 길을 상상해 보자. “서울의 아침은 분주하다”라는 문장이 들어오면, 토크나이저는 자기 어휘 목록과 대조하며 이 문자열을 조각낸다. 자주 등장해 목록에 통째로 올라 있는 덩어리는 한 조각으로, 그렇지 않은 부분은 더 잘게 나뉜다. 결과는 예컨대 네 조각일 수도, 여섯 조각일 수도 있다. 정확히 몇 조각이 되는지는 그 모델의 어휘 목록에 달렸고, 그래서 토큰 수는 텍스트의 속성이면서 동시에 모델의 속성이다. 중요한 것은 이 조각의 개수가 이후 모든 셈, 즉 계산량과 요금과 문맥 사용량의 밑수가 된다는 점이다.

왜 이런 어중간한 단위를 쓰는가. 글자 단위로 다루면 어떤 문자열이든 표현할 수 있지만 시퀀스가 너무 길어진다. 단어 단위로 다루면 시퀀스는 짧아지지만 세상의 모든 단어를 목록에 담을 수 없어, 처음 보는 단어 앞에서 기계가 멈춘다. 토큰은 이 둘의 절충이다. 자주 나오는 덩어리는 크게, 드문 덩어리는 잘게 쪼개는 방식으로 시퀀스 길이를 관리하고, 많은 현대 토크나이저는 바이트 단위로 되돌아가는 안전장치를 함께 두어 유한한 어휘 목록으로 사실상 모든 입력 문자열을 표현한다. 모델의 어휘 목록, 즉 토큰의 전체 종류 수는 모델에 따라 수만에서 수십만 개 수준으로 설계된다.

토큰이라는 단위는 이 책의 관점에서 세 가지 의미를 갖는다. 첫째, 토큰은 계산의 단위다. 앞으로 나올 모든 논의에서 작업량은 토큰 수로 세어진다. 둘째, 토큰은 과금의 단위다. 토큰 수가 모델이 처리할 작업량과 밀접하게 이어지기 때문에 계산량의 실용적인 대리 지표이자 과금 단위로 쓰인다. 다만 모든 토큰의 비용이 같다는 뜻은 아니다. 입력과 출력의 처리 비용이 다르고 문맥 길이와 캐시 적중에 따라서도 달라지는데, 그 차이의 정체가 다음 장부터의 주제다. 셋째, 토큰은 문맥 창의 단위다. 모델이 한 번에 다룰 수 있는 입력의 길이 한계도 토큰으로 표현된다.

토크나이저가 모델마다 다르다는 사실에도 실무적 함의가 있다. 같은 문장이라도 모델이 다르면 토큰 수가 다르게 세어진다. 그래서 서로 다른 모델의 토큰당 요금을 나란히 놓고 비교하는 일은 겉보기보다 조심스럽다. 단가가 같아도 한쪽이 같은 텍스트를 더 많은 토큰으로 세면 실제 지불액은 달라지기 때문이다. 모델 간 비용 비교는 토큰 단가 대신 같은 작업을 끝내는 데 드는 총액으로 해야 한다는 원칙을 여기서 미리 얻어 두자.

같은 글이라도 언어에 따라 토큰 수가 달라진다는 점도 알아 둘 가치가 있다. 토크나이저의 어휘는 그것을 만들 때 쓴 말뭉치의 구성과 어휘 크기, 분할 알고리즘의 영향을 받는다. 그래서 말뭉치에서 충분히 반영되지 못한 언어는 같은 내용을 표현하는 데 더 많은 토큰이 필요해질 수 있다. 같은 의미의 문장이 언어에 따라 토큰 수에서 차이가 나는 경우가 생기고, 이는 곧 비용과 문맥 사용량의 차이로 이어진다. 다국어 서비스를 설계하는 독자라면 자기 언어의 토큰 효율을 실제 토크나이저로 확인해 보는 것이 좋다.

토큰이라는 단위를 모르면 설명되지 않는 일상 현상도 몇 가지 있다. 언어 모델이 단어의 글자 수 세기나 특정 글자로 시작하는 단어 찾기 같은 과제에서 이따금 헛발질을 하는 데에는, 모델의 눈에 단어가 글자의 나열이 아닌 토큰 덩어리로 보인다는 사정이 크게 작용한다. 스트리밍 응답에서 글자가 단어 중간에서 툭 끊겨 도착하는 데에도, 모델의 출력이 토큰 경계에서 만들어지고 서버가 이를 하나 이상의 토큰 단위로 묶어 전송한다는 사정이 영향을 준다. 숫자 계산이 자릿수에 따라 들쭉날쭉해지는 현상에도 숫자의 토큰 분할 방식이 한몫한다. 물론 이 현상들에는 다른 요인들도 섞여 있지만, 토큰화가 공통의 용의자라는 점은 알아 둘 만하다. 토큰은 눈에 보이지 않는 단위지만, 그 이음매는 이렇게 서비스의 표면까지 올라와 만져진다. 서비스를 만드는 입장에서는 이런 현상을 버그 신고로 만나기 전에 원리로 알아 두는 편이 낫다.

파라미터: 고정된 숫자들의 정체

이제 기계의 몸통을 보자. 7B 모델이라는 말의 B는 10억을 뜻하고, 7B는 파라미터가 약 70억 개라는 뜻이다. 파라미터는 신비한 무엇이 아니라 그냥 숫자다. 정확히는, 거대한 행렬들을 채우고 있는 실수 값들이다. 학습이란 이 숫자들을 데이터에 맞게 조정하는 과정이었고, 학습이 끝났다는 것은 이 숫자들이 더 이상 변하지 않는다는 뜻이다. 추론 내내 이 숫자들은 읽히기만 한다.

이 숫자들 안에 무엇이 들어 있는지의 감각도 잡아 두자. 파라미터는 학습 문서를 원문 그대로 찾아볼 수 있게 정리한 데이터베이스가 아니다. 대부분의 정보는 데이터에서 학습된 통계적 패턴과 관계의 형태로 행렬 값들에 분산되어 들어 있고, 지식은 검색되기보다 계산 과정에서 재구성된다. 다만 학습 과정에서 일부 문장이나 코드가 강하게 암기되어 그대로 재현되는 경우가 있다는 연구들이 있으므로(Carlini 외, 2020·2022), 원문이 절대 저장되지 않는다고 단정할 일은 아니다. 이 성질에서 실무적으로 중요한 결론 하나가 나온다. 모델을 다시 학습하거나 조정하지 않은 채 최신 정보와 사내 문서를 즉시 활용하게 하는 가장 일반적인 운영 통로는 입력 문맥이다. 검색한 문서를 프롬프트에 넣어 주는 방식이 대표적이다. 파라미터 자체를 바꾸는 미세조정이나 지속 학습도 물론 가능하지만 비용과 검증 절차가 훨씬 크다. 그리고 문맥이라는 통로에 의존할수록 문맥이 길어지고, 그 길이가 비용이 된다는 사정이 뒤의 장들에서 중요한 문제로 자란다.

추론의 계산은 본질적으로 이 행렬들과의 곱셈이다. 입력에서 온 벡터에 행렬을 곱하고, 간단한 비선형 처리를 하고, 또 다음 행렬을 곱하는 일의 연속이다. 그래서 파라미터 수는 두 가지를 동시에 결정한다. 하나는 저장 공간이다. 숫자 하나를 2바이트로 저장하는 반정밀도(FP16) 형식이라면 70억 개는 약 14기가바이트가 되고, 빠른 추론을 위해서는 이 덩어리가 GPU 메모리에 올라가 있는 것이 일반적이다. 한 장에 들어가지 않으면 여러 GPU에 나누거나 일부를 다른 메모리 계층으로 내리는 방법을 쓰게 되는데, 그 이야기는 뒤의 장들에서 만난다. 다른 하나는 계산량이다. 토큰 하나를 처리하려면 이 행렬들을 통과해야 하므로, 파라미터가 많을수록 곱셈도 많다. 같은 정밀도의 밀집형 모델을 가정하면 저장 공간은 파라미터 수에 거의 비례하고 계산량도 대체로 함께 늘어난다. 일부 파라미터만 골라 쓰는 구조, 흔히 전문가 혼합이라 부르는 구조에서는 전체 파라미터 수와 실제 계산량이 갈라질 수 있는데, 이 구조는 병렬화 장에서 다시 만난다. 능력 쪽은 그보다 사정이 복잡해서, 비슷한 계열과 학습 조건에서는 큰 모델이 더 넓은 표현력을 갖는 경향이 있지만 파라미터 수만으로 성능이 보장되지는 않는다. 이 책의 장부에서 확실한 것은 비용 쪽이다. 크기는 곧 저장이고 계산이다.

저장 쪽의 산술은 손으로 바로 확인된다. 파라미터 수에 숫자 하나의 바이트 수를 곱하면 된다. 70억 개 곱하기 2바이트는 약 14기가바이트. 700억 개, 즉 70B 모델이라면 약 140기가바이트다. 이는 KV 캐시나 실행 중간값을 뺀, 가중치만의 이론적 크기다. 시중 GPU 한 장의 메모리가 수십 기가바이트 수준임을 떠올리면, 이 계산만으로도 큰 모델이 왜 GPU 한 장에 들어가지 못하고 여러 장에 쪼개져야 하는지가 보인다. 모델을 쪼개는 기술은 뒤의 병렬화 장에서 다루며, 이 곱셈 한 번이 그 장 전체의 출발점이다. 계산 절차는 부록의 워크시트에 정리되어 있다.

텍스트가 숫자의 세계로 들어오는 입구도 여기서 정리하자. 토큰은 문자열 조각이지만 행렬 곱셈의 세계는 숫자만 다룬다. 그래서 모델의 첫 부품은 각 토큰을 수백에서 수천 개의 숫자로 이루어진 벡터로 바꿔 주는 표, 즉 임베딩이다. 어휘 목록의 토큰마다 대응하는 벡터가 하나씩 있고, 입력 토큰 열은 이 표를 거쳐 벡터의 열이 된다. 임베딩 표 자체도 파라미터의 일부다. 어휘 수에 벡터 폭을 곱한 크기의 행렬이며, 어휘가 십만 단위인 모델에서는 이 입구의 표 하나도 상당한 덩치가 된다. 이 벡터가 이후 모든 층을 타고 흐르며 다듬어지는 재료다. 벡터의 폭, 그러니까 숫자 몇 개로 토큰 하나를 표현하는가는 모델의 설계 값이며, 뒤에서 KV 캐시의 크기를 셈할 때 다시 만나게 된다.

토큰 벡터에는 순서의 정보도 함께 실려야 한다. 같은 토큰들로 이루어진 문장이라도 배열이 달라지면 뜻이 달라지는데, 벡터의 구성만으로는 몇 번째 토큰인지 알 수 없기 때문이다. 그래서 트랜스포머는 각 토큰의 위치를 알려 주는 정보를 계산에 포함한다. 초기 설계는 위치마다 정해진 벡터를 더하는 방식을 썼고, 현대의 많은 생성형 모델은 검색어와 문패에 위치 관계를 반영하는 회전 위치 임베딩(RoPE) 계열을 쓴다. 방식의 세부는 달라도, 이 책에서는 토큰을 처리하는 계산에 내용과 함께 순서의 좌표가 들어간다고 이해하면 충분하다. 이 위치 정보는 뒤에서 긴 문맥의 한계를 다룰 때 다시 등장한다.

층을 통과한다는 것

트랜스포머의 몸통은 같은 구조의 층을 수십 개 쌓아 올린 형태다. 각 층은 크게 두 부분으로 이루어진다. 하나는 어텐션으로, 토큰들 사이의 관계를 계산해 문맥의 정보를 섞는 부분이다. 다른 하나는 흔히 MLP라고 부르는 부분으로, 각 토큰의 벡터를 그 자리에서 더 크게 펼쳤다가 다시 접으며 가공하는 부분이다. 거칠게 말하면 어텐션은 토큰들 사이를 가로지르는 계산이고, MLP는 토큰 각자의 자리에서 일어나는 계산이다. 파라미터의 배분으로 보면 일반적인 밀집형 디코더 모델에서는 MLP 쪽이 어텐션 쪽보다 더 큰 몫을 차지하는 경우가 많다. 어텐션이 이야기의 주인공처럼 다뤄지는 것은 그것이 문맥이라는 마법의 출처이기 때문이지, 계산과 저장의 장부에서 혼자 큰손이어서가 아니다. 장부의 감각으로는 두 부품이 함께 몸통을 이룬다고 기억해 두는 편이 정확하다.

벡터의 열은 1층의 어텐션과 MLP를 지나고, 2층의 어텐션과 MLP를 지나고, 그렇게 마지막 층까지 흐른다. 층을 지날 때마다 각 토큰의 벡터는 문맥과 다른 토큰의 정보를 반영하며 계속 갱신된다. 어떤 종류의 정보가 어느 깊이에서 두드러지는지는 모델과 과제에 따라 달라진다는 것이 관찰 연구들의 전언이라, 아래에서 위로 의미가 계단처럼 한 단계씩 추상화된다고 못 박을 필요는 없다. 이 책의 목적에는 층을 지나며 벡터가 점점 문맥을 머금는다는 감각이면 충분하다. 중요한 것은 구조의 반복성이다. 일반적인 밀집형 디코더 모델은 대체로 같은 계산 블록을 반복해 쌓으므로, 한 층의 계산 형태를 이해하면 전체 경로를 따라갈 수 있다. 다만 각 층이 사용하는 파라미터는 서로 다르며, 층마다 구조를 달리하는 변형 모델도 있다. 파라미터의 대부분은 이 층들 안의 행렬로 존재하므로, “모델을 통과한다”는 말은 “모든 층의 행렬들과 차례로 곱해진다”는 말과 같다.

이 그림을 붙잡으면 앞으로 자주 쓸 표현 하나가 정확해진다. 3장에서 “토큰 하나를 만들 때마다 모델 전체를 통과한다”고 말할 때, 그것은 새 토큰의 벡터가 1층부터 마지막 층까지의 모든 어텐션과 MLP를 순서대로 거친다는 뜻이다. 층은 건너뛸 수 없고, 위층은 아래층의 출력을 재료로 삼는다. 이 직렬성은 층 방향의 성질이라는 점을 짚어 두자. 다음 장에서 볼 프리필에서는 여러 토큰이 같은 층을 병렬로 통과할 수 있는데, 그것은 토큰 방향의 이야기다. 여러 토큰이 1층을 함께 통과할 수는 있어도, 어떤 토큰도 1층을 건너뛰고 2층으로 갈 수는 없다. 병렬의 여지가 어느 방향에 있고 어느 방향에 없는지의 이 구분은, 뒤에서 모델을 여러 GPU에 쪼개는 방식들이 왜 그런 모양인지를 이해하는 열쇠가 된다. 이 직렬성이 파라미터 전체를 읽어야 하는 이유였다.

층의 그림을 갖고 나면 모델 소개 문서, 이른바 모델 카드의 구조 항목이 읽히기 시작한다. 층 수는 이 반복 구조가 몇 번 쌓였는가이고, 은닉 차원은 층 사이를 흐르는 벡터의 폭이며, 헤드 수는 다음 절에서 볼 어텐션의 병렬 검색 세트 수다. 이 값들은 파라미터 총량을 결정하는 설계 변수이자, 다음 장 이후에 다룰 캐시 크기와 계산량 셈의 재료다. 지금 외울 필요는 없다. 이런 이름의 값들이 있고, 그것이 곧 비용의 좌표라는 것만 알아 두면 된다.

어텐션: 문맥을 섞는 장치

왜 문맥을 섞는 부품이 필요한가. “배가 고프다”의 배와 “배를 타고 간다”의 배는 같은 토큰이지만 뜻이 다르다. 토큰 하나만 봐서는 뜻을 정할 수 없고, 주변을 봐야 한다. 어텐션은 각 토큰이 주변 토큰들을 둘러보고, 자기에게 필요한 정보를 필요한 만큼 가져와 자기 벡터에 섞는 장치다. 층마다 이 둘러보기가 반복되면서 벡터에는 점점 문맥이 스며든다.

둘러보는 방식을 비유 하나로 고정해 두자. 이 비유는 책 전체에서 계속 쓴다. 각 토큰은 어텐션 층에서 세 개의 벡터로 변환된다. 키(Key)는 그 토큰이 내건 문패다. 나는 이런 정보를 가진 토큰이라고 알리는 표지다. 값(Value)은 그 문패 뒤에 실제로 들어 있는 내용물이다. 그리고 질의(Query)는 각 토큰이 들고 다니는 검색어다. 나에게 지금 이런 정보가 필요하다는 요청서다. 어텐션의 계산은 한 토큰의 검색어를 앞선 토큰들의 문패와 일일이 대조해서, 잘 맞는 집일수록 높은 비중을 주고, 그 비중대로 내용물들을 섞어 오는 일이다. “배가 고프다”라면 뒤쪽의 고프다 토큰이 자기 검색어를 앞서 나온 배의 문패와 대조하고, 그 내용물을 자기 표현에 반영한다. 앞에 놓인 배의 벡터가 미래의 고프다를 미리 보고 다시 쓰이는 것이 아니고, 뒤에 도착한 토큰들이 앞선 토큰들의 문패와 내용물을 참조하면서 지금까지 이어진 문맥의 의미를 자기 표현에 축적해 가는 것이다.

이 비유에서 두 가지를 챙겨 두면 다음 장이 편해진다. 첫째, 문패와 내용물, 즉 키와 값은 각 토큰이 한 번 만들면 그 층에서는 변하지 않는 값이라는 점이다. 문맥에 새 토큰이 추가된다고 해서 기존 토큰의 문패를 다시 쓸 필요는 없다. 둘째, 새로 도착한 토큰이 해야 하는 일은 자기 검색어를 만들고, 이미 걸려 있는 문패들을 읽는 일이라는 점이다. 문패가 많이 걸려 있을수록, 즉 문맥이 길수록 읽을 것이 많아진다. 이 두 성질이 3장에서 각각 KV 캐시의 존재 이유와 그 비용의 정체로 다시 등장한다.

하나 더, 어텐션에는 방향이 있다. 이 책이 다루는 생성형 언어 모델의 어텐션은 인과적이다. 각 토큰은 자기 자신과 자기보다 앞에 온 토큰들만 둘러볼 수 있고, 뒤에 올 토큰은 볼 수 없다. 다음 토큰을 예측하는 기계가 정답을 미리 훔쳐보지 못하게 하는 장치이며, 이 방향성 덕분에 앞 토큰들의 처리 결과는 뒤에 무엇이 오든 영향을 받지 않는다.

문맥 창이 무한할 수 없는 이유도 이 그림에서 바로 나온다. 문맥의 토큰이 늘어날수록 걸리는 문패의 수가 늘어나고, 새 토큰이 해야 하는 대조의 양과 보관해야 하는 문패·내용물의 양이 함께 늘어난다. 요컨대 문맥은 공짜로 길어지지 않는다. 긴 문맥의 대가가 정확히 어떤 형태로 청구되는지는 다음 장과 긴 문맥을 다루는 장에서 셈으로 확인하게 된다. 앞에서 계산한 것을 저장해 두고 재사용할 수 있다는 발상은 바로 이 성질 위에 서 있다.

실제 모델의 어텐션은 이 둘러보기를 한 벌만 하지 않고 여러 벌로 병렬 수행한다. 검색어와 문패의 세트를 여러 개 두어 서로 다른 관계 패턴에 반응할 가능성을 열어 두는 구조로, 일부 세트에서 문법적·위치적 패턴이 관찰되기도 하지만 각 세트의 역할이 사람이 붙일 만한 기능 하나로 깔끔하게 나뉘는 것은 아니다. 각 세트가 실제로 무엇을 좇는지는 학습이 정하는 일이라 사람이 지정하지 않으며, 들여다보면 해석이 어려운 세트도 많다. 이것을 멀티헤드라고 부르는데, 표준적인 멀티헤드 방식에서는 세트가 여러 벌인 만큼 문패와 내용물도 여러 벌 저장하게 되어, 뒤에서 캐시의 크기를 셈하거나 그 크기를 줄이는 구조 변형을 다룰 때 이 사실이 다시 소환된다. 지금은 이름과 함께 한 가지만 기억하자. 둘러보기의 벌 수 역시 비용의 좌표다.

출력: 다음 토큰의 확률

마지막 층을 빠져나온 벡터는 이제 출구를 만난다. 출구에서는 이 벡터를 어휘 목록 전체에 대한 점수로 변환한다. 어휘가 십만 개라면 십만 개의 점수가 나오고, 이 점수를 확률의 형태로 정리하면 다음 토큰 후보들의 확률 분포가 된다. “대한민국의 수도는” 다음이라면 서울에 해당하는 토큰이 압도적인 확률을 받고, 나머지 토큰들이 잔여 확률을 나눠 갖는 식이다.

분포가 나왔으면 하나를 골라야 한다. 가장 확률 높은 토큰만 고르는 방식은 결정적이지만 답이 늘 같고 문장이 단조로워지기 쉽다. 그래서 생성형 작업에서는 분포에서 추첨하듯 뽑는 샘플링이 널리 쓰이고, 온도라는 손잡이로 추첨의 과감함을 조절한다. 반면 정확성과 재현성을 중시하는 작업에서는 최고 확률만 고르거나 후보를 강하게 제한하기도 한다. 온도를 낮추면 높은 확률 쪽으로 쏠려 보수적이 되고, 높이면 낮은 확률의 후보에게도 기회가 가서 다양해진다. 같은 질문에 다른 답이 나오는 것은 오류가 아니고 이 추첨의 자연스러운 결과다.

출구가 확률 분포라는 사실은 이 기계의 성격에 관해 많은 것을 말해 준다. 이 기계는 사실을 조회해서 답하는 장치가 아니고, 지금까지의 문맥에 가장 그럴듯하게 이어질 토큰을 계산하는 장치다. 그럴듯함과 사실은 자주 겹치지만 늘 겹치지는 않으며, 겹치지 않는 지점에서 그럴듯하지만 틀린 출력이 나올 수 있다. 이 책은 그 품질 문제 자체를 다루는 책은 아니지만, 서빙을 다루는 입장에서도 이 성격은 알아 둘 필요가 있다. 어떤 최적화도 이 확률 기계라는 본성을 바꾸지 않으며, 반대로 정밀도를 깎는 종류의 최적화는 이 분포를 미세하게 건드릴 수 있다. 1장에서 예고한 품질의 층을 건드리는 지점이 정확히 여기다.

그리고 여기서, 이 기계의 가장 중요한 성질이 모습을 드러낸다. 기본적인 자기회귀 디코딩에서 한 번의 생성 걸음이 내놓는 것은 다음 한 토큰이다. 문장을 만들려면 뽑힌 토큰을 입력 끝에 붙이고, 기계를 다시 돌려 그다음 토큰을 뽑고, 또 붙이고 또 돌리는 반복이 필요하다. 한 번의 통과는 한 조각만 내놓는다. 열 단어짜리 답이라면 통과가 십수 번, 천 자짜리 답이라면 수백 번이다. 새 토큰을 하나 더 예측할 때마다 새로운 입력 위치 하나가 임베딩에서 마지막 층과 출구까지의 전체 경로를 통과한다는 뜻이다. 다만 앞선 토큰들의 계산까지 전부 처음부터 반복하는 것은 아니고, 그 낭비를 막는 장치가 다음 장에서 만날 KV 캐시다. 이 반복 구조가 정확히 무엇을 의미하는지, 왜 그것이 이 책 전체의 출발점인 병목을 낳는지가 다음 장의 이야기다.

이 장을 나가며

여기까지 왔으면 이 기계의 부품 목록이 손에 들어온 셈이다. 언어 모델에 관한 설명에서 토큰, 파라미터, 임베딩, 층, 어텐션, 확률 분포라는 말이 나올 때 각 부품이 전체 경로의 어디에 놓이는지 위치를 짚을 수 있고, 모델 크기라는 말이 저장과 계산의 양쪽 비용을 동시에 뜻한다는 것을 안다.

세 가지만 확인하고 넘어가자. 토큰은 왜 글자도 단어도 아닌 어중간한 단위로 설계되는가. 키와 값과 질의는 각각 비유로 무엇이며, 문맥이 길어질 때 늘어나는 일은 무엇인가. 이 기계가 한 번의 통과로 내놓는 것은 무엇이고, 문장은 어떻게 만들어지는가. 마지막 물음의 답 속에 다음 장이 통째로 들어 있다. 한 번에 한 조각씩만 나오는 출구, 그 반복이 기계의 다른 모든 성질과 만나 무엇을 낳는지가 이제부터의 이야기다. 이제 이 기계가 실제로 응답 하나를 만들 때 무슨 일이 벌어지는지, 추론의 두 단계를 열어 보자.

입력 텍스트가 토크나이저, 임베딩과 위치 정보, 어텐션과 MLP 블록의 반복, 어휘 점수를 거쳐 다음 토큰의 확률 분포로 이어진다.

입력 텍스트가 토크나이저, 임베딩과 위치 정보, 어텐션과 MLP 블록의 반복, 어휘 점수를 거쳐 다음 토큰의 확률 분포로 이어진다.

그림 2-1. 토큰이 모델을 통과하는 길


이 장에서 함께 다루는 질문

어텐션에 방향이 있다는 말은 무슨 뜻인가요?

생성형 언어 모델의 어텐션은 인과적입니다. 각 토큰은 자기 자신과 자기보다 앞에 온 토큰들만 둘러볼 수 있고 뒤에 올 토큰은 볼 수 없습니다. 이 방향성 덕분에 앞 토큰들의 처리 결과는 뒤에 무엇이 오든 영향을 받지 않습니다.

문맥 창은 왜 무한할 수 없나요?

문맥의 토큰이 늘어날수록 새 토큰이 대조해야 하는 양과 보관해야 하는 키와 값의 양이 함께 늘어나기 때문입니다. 문맥은 공짜로 길어지지 않고, 그 대가가 어떤 형태로 청구되는지는 캐시를 다루는 장에서 셈으로 확인합니다.

같은 질문에 다른 답이 나오는 것은 오류인가요?

출구가 확률 분포이고 거기서 추첨하듯 뽑기 때문에 생기는 자연스러운 결과입니다. 온도를 낮추면 높은 확률 쪽으로 쏠려 보수적이 되고, 높이면 낮은 확률의 후보에게도 기회가 가서 다양해집니다.

한 번의 통과로 답 하나가 나오나요?

기본적인 자기회귀 디코딩에서 한 번의 생성 걸음이 내놓는 것은 다음 한 토큰입니다. 뽑힌 토큰을 입력 끝에 붙이고 기계를 다시 돌리는 반복이 필요합니다. 천 자짜리 답이라면 통과가 수백 번입니다.

EPUB으로 소장하기

전체 내용과 부록을 EPUB으로 읽고 소장할 수 있습니다.

9,900원

이 장이 실린 책

LLM 추론과 서빙의 구조와 원리

이 책의 목차 보기

같은 분야의 다른 책

이 글 공유하기

X 스레드 네이버 카카오톡

최종 수정일 2026년 9월 3일

이 콘텐츠는 저자가 기획하고 AI 도구를 집필·정리 과정에 활용했습니다. 구성, 사실 확인, 표현, 최종 판단과 출판 책임은 저자와 보이드로그에 있습니다.