자기회귀는 대형 모델이 글을 생성할 때 쓰는 기본 방식입니다. 이미 나타난 토큰을 바탕으로 다음에 올 가능성이 가장 높은 토큰을 예측하고, 새로 생성한 토큰을 입력 끝에 이어 붙인 뒤 다시 다음을 예측하는 순환을, 종료 표시가 나오거나 길이 상한에 닿을 때까지 반복합니다. 채팅에서 답변이 한 단어씩 튀어나오는 것은 이 단계별 디코딩 과정이 겉으로 드러난 모습이지, 따로 만들어 낸 효과가 아닙니다.
토큰을 하나씩 앞으로 밀어 나간다
여기서 토큰은 모델의 눈으로 본 문자 단위로 대략 이해할 수 있습니다. 한 글자일 수도 있고, 단어의 일부나 문장부호의 조합일 수도 있습니다. 각 단계에서 모델이 마주하는 것은 그때까지의 전체 맥락이며, 판단은 단 하나뿐입니다. 다음에 올 가능성이 가장 높은 토큰은 무엇인가 하는 것입니다. 그것이 선택되면 맥락은 그만큼 길어지고, 다음 판단은 더 길어진 새 맥락 위에 세워집니다. 앞 문장에서 단어 하나만 바꿔도 뒤의 흐름이 달라질 수 있습니다. 각 단계의 근거에 그전의 모든 선택이 포함되기 때문입니다.
훈련할 때는 전문과 대조할 수 있고, 생성할 때는 앞으로 나아갈 수밖에 없다
훈련과 생성은 다른 일입니다. 훈련할 때는 완전한 원문이 이미 놓여 있어, 모델은 한 문장 전체를 동시에 보며 각 위치에서 다음 토큰이 무엇이어야 하는지를 병렬로 연습할 수 있습니다. 답을 보며 대조하는 것과 비슷합니다. 생성할 때는 준비된 뒷부분이 없습니다. 하나를 만들고, 이어 붙이고, 다음을 만드는 수밖에 없어 순차적으로 진행해야 합니다. 긴 답변이 느린 주된 이유가 여기에 있습니다. 단순히 기계가 빠르지 않아서가 아니라, 이 생성 방식은 구조상 뒤의 토큰을 미리 계산할 수 없고 앞의 결과가 확정되기를 기다려야 하기 때문입니다.
입력은 한 번에 다 읽을 수 있지만, 출력은 한 단계씩 나와야 한다
질문할 때 당신이 입력한 긴 글은 모델이 한 번에 다 읽어 병렬로 처리할 수 있어, 긴 프롬프트가 보통 글자 수에 비례해 대기 시간을 늘리지는 않습니다. 답변은 다릅니다. 출력에 토큰이 몇 개 포함되는지, 그 개수만큼의 디코딩 단계를 거쳐야 하고, 각 단계마다 계산을 다시 해야 합니다. 답변이 길수록 단계가 많아지고 당연히 시간도 더 걸립니다. 같은 질문이라도 짧은 답은 빨리 돌아오고 긴 답은 다 써낼 때까지 기다려야 하는 이유도 여기에 있습니다. 병목은 대부분 입력 쪽이 아니라 출력 쪽에 있습니다.
모든 생성 모델이 이렇지는 않으며, 세 가지 오해도 구분해야 한다
자기회귀는 현재 주류 채팅형 대형 모델이 선택한 방식일 뿐, 내용을 생성하는 유일한 경로는 아닙니다. 확산형 텍스트 모델은 흐릿한 상태에서 점차 잡음을 제거하며 전체를 다듬고, 마스크형 모델은 빈칸 채우기처럼 내용의 일부를 먼저 가린 뒤 채워 넣습니다. 둘 다 왼쪽에서 오른쪽으로 하나씩 짜내는 방식에 기대지 않습니다. 흔한 오해는 세 가지입니다. 첫째, 모델이 문단 전체를 먼저 다 생각한 뒤에 쳐 낸다고 여기는 것입니다. 실제로는 전체 완성 원고가 없고, 뒷부분은 늘 앞부분의 영향을 받으며, 이것이 쓸수록 점점 어긋나는 이유 중 하나이기도 합니다. 둘째, 한 단어씩 나오는 출력을 일부러 만든 타이핑 효과라고 여기는 것입니다. 실제로 화면의 스트리밍 표시는 디코딩 과정을 그대로 동기화해 보여 주는 것뿐입니다. 셋째, 샘플링을 또 다른 생성 방식이라고 여기는 것입니다. 온도 같은 파라미터는 각 단계에서 후보 토큰 중 어느 것을 고를지에만 영향을 줄 뿐, 자기회귀 자체의 순환을 바꾸지는 않습니다.