요청을 보내면 1초 뒤 터미널에 답변이 찍히기 시작합니다. 한꺼번에 나타나지 않고 정말로 한 조각씩 찍혀 나옵니다. 마치 누군가 지금 바로 타이핑하고 있는 것처럼 말입니다. 그 전에 화면에 Thinking이 한동안 떠 있을 때도 있는데, 그러면 답변은 눈에 띄게 늦게 오지만 그만큼 더 쓸모 있습니다.
이 모든 것은 하나의 메커니즘에서 나온 결과입니다. 대형 언어 모델이 어떻게 작동하는지 살펴보겠습니다. 여러분의 텍스트로 무엇을 하는지, 그 길이를 무엇으로 재는지, 지식은 어디서 오는지, 그리고 모델이 생각하는 그 몇 초 동안 무슨 일이 일어나는지까지 차례로 봅니다. 이 가운데 Enter를 누르는 데 필요한 사실은 하나도 없습니다. 하지만 모두 합치면 답변에서 무엇을 기대하게 되는지가 꽤 달라집니다.

이 글은 일부러 단순화했습니다. 그래야 빨리 읽히고, 지금 여러분 화면에서 무슨 일이 일어나는지라는 질문에 답할 수 있습니다. 정밀한 분석은 여기에 없고, 있을 수도 없습니다. 트랜스포머 블록 하나만 다뤄도 별도의 글 한 편이 필요합니다.
언어 모델은 다음에 올 내용을 가늠합니다
대상부터 짚고 가겠습니다. 대형 언어 모델, 줄여서 LLM(large language model)은 창과 버튼이 달린 프로그램도 아니고 채팅도 아닙니다. 호출해서 쓰는 메커니즘입니다. 대화 텍스트를 넘기면 그 뒤에 이어질 내용을 돌려줍니다. Claude Code, 웹 채팅, 에디터의 자동 완성 제안은 모두 이런 호출을 감싼 겉포장이고, 포장 방식은 제각각입니다.
그런데 모델이 할 줄 아는 일은 하나뿐입니다. 텍스트의 앞부분을 보고 어떤 이어짐이 더 그럴 법한지 가늠하는 것입니다. 정답을 찾는 것이 아니라 확률을 매기는 것이고, 그것도 후보 하나가 아니라 자기 어휘 사전에 있는 모든 후보에 대해 매깁니다.
짧은 문장으로 확인해 보면 가장 쉽습니다. 소리 내어 이어 말해 보세요. "커피에 넣는 건..." 가장 먼저 떠오르는 것은 "설탕", 그다음은 "우유"입니다. 반면 "인터넷"은 문법적으로 아무 문제가 없는데도 전혀 들어맞지 않습니다. 여러분은 이것을 순식간에, 별생각 없이 가늠했습니다. 모델도 똑같은 일을 하되, 형식을 갖춰 끝까지 해냅니다. 사전 전체를 훑으면서 후보마다 숫자를 매깁니다.
다이어그램에 무엇이 없는지 눈여겨보세요. 정답으로 표시된 후보는 하나도 없습니다. 더 그럴 법한 이어짐과 덜 그럴 법한 이어짐이 있을 뿐입니다. 그리고 이 숫자는 그런 단어 조합이 텍스트에 몇 번 나왔는지 세어서 얻은 것이 아닙니다. 그건 훨씬 단순한 전혀 다른 기술의 방식이었고, 지금의 모델이 나오기 한참 전에 버려졌습니다. 확률은 학습하는 동안 모델 안에 자리 잡은 패턴으로 계산합니다. 그래서 여러분보다 먼저 아무도 쓴 적 없는 문장에 대해서도 확률이 나옵니다.
LLM이 채팅 및 에이전트와 다른 점
이 세 단어는 흔히 같은 뜻처럼 쓰이지만, 실제로는 시스템의 서로 다른 계층을 가리킵니다.
- LLM - 언어 모델 그 자체입니다. 컨텍스트를 받아 다음 메시지를 생성합니다.
- 채팅 - LLM을 둘러싼 인터페이스이자 프로그램입니다. 대화 기록을 보관하고, 요청을 조립해 모델에 보내고, 응답을 보여 줍니다.
- 에이전트 - 목표와 작업 루프, 도구를 갖춘 LLM입니다. 애플리케이션에 파일 읽기, 검색, 테스트 실행을 요청하고, 그 결과를 보고 다음 단계를 고를 수 있습니다.
짧게 정리하면, LLM은 해법을 제안하고, 채팅은 대화를 꾸리고, 에이전트는 모델의 판단을 바깥 세계의 행동과 연결합니다.
단어가 아니라 토큰
앞의 다이어그램에는 한 가지 단서가 붙습니다. 단어를 통째로 그린 것은 보기 쉽게 하려는 것일 뿐입니다. 실제로 모델은 텍스트를 토큰, 즉 자기 어휘 사전에 있는 조각으로 쪼갭니다. 토큰은 단어 전체일 수도, 단어 일부일 수도, 문장 부호일 수도 있습니다. 공백은 보통 뒤따르는 토큰 안으로 들어가 버려서 따로 한 단위로 세지 않습니다.
사전은 미리, 방대한 텍스트 모음을 가지고 조금씩 만들어 갑니다. 알고리즘이 자주 나오는 문자 나열을 찾아 더 큰 조각으로 붙여 나가는 방식입니다. 자주 나온 것일수록 자기만의 토큰을 얻습니다. 그래서 완성된 사전에는 온전한 단어와 단어 부스러기가 뒤섞여 있습니다.
사전의 토큰마다 고유 번호가 있고, 모델 안으로 들어갈 때 텍스트는 이미 숫자입니다. 먼저 문자열을 조각으로 자르고, 각 조각을 번호로 바꿉니다. 답변을 다시 읽을 수 있는 텍스트로 되돌릴 때도 같은 사전을 씁니다.
여기서 기억해 둘 것이 두 가지 있습니다. 첫째, 모델 계열마다 사전이 달라서 같은 문자열도 서로 다르게 자릅니다. "토큰 하나는 대략 단어의 4분의 3" 같은 어림셈은 영어에 대한 거친 기준일 뿐, 그 이상은 아닙니다. 둘째, 학습 텍스트에 적게 등장한 언어일수록 더 잘게 쪼개집니다. 영어 단어 하나가 토큰 하나에 들어가는 자리에서 한국어 단어는 두세 개로 쪼개지는 일이 흔합니다.
이건 읽는 것보다 한 번 직접 보는 편이 쉽습니다. The Tokenizer Playground를 열고 평소에 쓰는 요청 두어 개를 붙여 넣은 뒤, 같은 내용을 영어로도 넣어 보세요. 문자열이 어떤 조각으로 갈라지고 몇 개가 나오는지 바로 보입니다. 단서는 하나입니다. 그곳의 토크나이저는 특정 모델의 것이라, 여러분이 쓰는 모델에서는 분할이 다를 것입니다. 정확한 숫자가 아니라 현상 자체를 보러 가는 곳입니다.
여기서 뜻밖의 실용적인 결론이 나옵니다. 모델은 글자가 아니라 조각을 보기 때문에, 글자에 관한 질문은 의미에 관한 질문보다 눈에 띄게 서툽니다. 긴 단어에 "가"가 몇 번 들어 있는지 세어 달라고 하면 틀린 답이 나와도 이상하지 않습니다. 과제가 어려워서가 아니라, 그 단어가 조각 두 개로 모델에 도착했고 모델에게는 그 조각 속 개별 글자가 따로 존재하지 않기 때문입니다.
토큰으로 답변이 만들어지는 과정
이제 메커니즘 전체를 맞춰 보면 생각보다 단순합니다. 모델이 후보를 가늠하고, 그중 하나가 골라져 텍스트 끝에 붙습니다. 그러고 나면 모든 것이 처음부터 다시 시작됩니다. 텍스트는 그대로인데, 토큰 하나만큼 길어졌을 뿐입니다.
완성된 답변은 어디에 보관되어 있던 것도, 어디서 꺼내 온 것도 아닙니다. 답변에 든 토큰 수만큼의 단계를 거쳐 조립된 것입니다. 끝나는 것도 타이머 때문이 아닙니다. 어느 순간 "여기서 끝"이라는 뜻의 특수 토큰이 가장 그럴 법한 이어짐이 되고, 그때 생성이 멈춥니다.
같은 그림에서 세부 사항이 하나 더 나옵니다. 모델은 이미 쓴 것을 지울 수 없습니다. 텍스트에 들어간 토큰은 그대로 남아 이후 모든 단계의 조건에 들어갑니다. 스스로 바로잡는 방법은 대화 중인 사람과 똑같습니다. 다음 문장으로 고치는 것입니다.
그리고 많은 사람이 놀라는 결론이 있습니다. 같은 질문을 두 번 하면 서로 다른 두 답변이 나올 수 있습니다. 매 단계에서 꼭 가장 확률 높은 후보가 뽑히는 것은 아니고, 한 토큰만 갈라져도 그 뒤에 오는 모든 것이 따라서 달라집니다. 대개는 표현만 바뀌지만, 가끔은 제안하는 해법 자체가 바뀝니다.
Claude Code 창에 답변이 차오르듯 나타나는 모습은 로딩 표시가 아니라 생성 단계 그 자체입니다. 모델은 토큰을 고르는 대로 내보내고, 프로그램은 받자마자 화면에 출력합니다. 그래서 긴 답변은 잠시 멈췄다가 통째로 뜨는 게 아니라 조금씩 나타납니다.
모델을 왜 "대형"이라고 부를까
"대형"이라는 말은 어딘가에 저장된 파일의 용량을 뜻하지 않습니다. 그 뒤에는 전혀 다른 두 가지 규모가 있고, 둘 다 있는 그대로 그려 보는 것이 좋습니다.
첫째는 모델이 학습하면서 거쳐 간 텍스트의 양입니다. 책, 기사, 문서, 포럼, 코드가 사람이 몇 번을 다시 살아도 다 읽지 못할 만큼 들어갑니다. 둘째는 파라미터의 수입니다. 파라미터는 모델 안에 있는 숫자 하나, 학습하는 동안 조정된 설정값 하나를 말합니다. 이런 것이 수십억 개입니다. 오픈 모델은 이 숫자를 아예 이름에 넣습니다. 7B, 14B, 70B에서 B는 billion, 즉 10억입니다.
여기서부터가 착각하기 쉬운 대목입니다. 파라미터 수는 품질 순위가 아닙니다. 결과에는 모델이 학습한 데이터, 모델의 구조, 어떤 작업에 맞춰 다듬었는지, 어딘가에 올라가도록 얼마나 압축했는지가 모두 영향을 줍니다. 특정 작업에서는 작은 모델이 큰 모델을 충분히 앞지를 수 있습니다. 이름에 붙은 큰 숫자만으로는 아무것도 보장되지 않습니다.
그리고 이런 규모에서는 저절로 생겨나는 듯한 것이 하나 더 있습니다. 실패한 테스트에 관한 문장을 매끄럽게 이어 가려면, 어떤 단어들이 보통 나란히 오는지 아는 것만으로는 부족합니다. 테스트가 어떻게 돌아가는지도 파악해야 합니다. 모델은 단어를 맞히도록 학습했는데, 그러는 사이 그 단어들이 설명하는 내용까지 파라미터에 자리 잡았습니다. 메커니즘은 한 걸음도 바뀌지 않았는데 뭔가를 아는 듯한 느낌이 드는 이유가 여기에 있습니다.
모델의 지식은 어디서 오는가
출처는 딱 두 가지이고, 둘을 헷갈리면 대가가 큽니다.
첫째는 파라미터입니다. 학습하면서 익힌 패턴이 여기에 자리 잡았습니다. 기록마다 출처가 붙어 있는 카드 목록 같은 것이 아닙니다. 지식은 수많은 숫자에 흩어져 있어서, 거기서 정확한 인용을 꺼낼 수 없습니다. 그래서 모델은 거의 맞는 것을 내놓을 수 있습니다. 형식도 맞고 이름도 낯익은데, 구체적인 세부 하나가 틀린 식입니다.
둘째는 지금 이 순간 대화에 들어 있는 것입니다. 여러분의 요청, 그 전에 오간 모든 말, 열어 둔 파일의 내용, 실행한 명령의 출력이 여기에 속합니다. 이 출처는 정확하지만 수명이 짧습니다. 파라미터로 옮겨 가지 않고, 다음 대화는 이 내용을 전혀 모릅니다.
메모리 파일, 찾아낸 문서, 외부 서비스의 응답처럼 따로 출처라고 부르고 싶은 나머지는 모두 같은 길로 들어옵니다. 먼저 대화에 들어가고, 그다음에야 답변에 영향을 줍니다. 모델에게는 프로젝트나 인터넷으로 통하는 자기만의 문이 없습니다.
첫 번째 출처에는 날짜가 있고, 그 날짜에는 이름이 있습니다. 바로 knowledge cutoff입니다. 모델의 내장 지식이 대체로 어느 시점까지 유효한지 알려 주는 기준점입니다. 이 날짜 이후에 나온 라이브러리에 대해 모델이 아는 것은 현재 대화에 넣어 준 만큼뿐입니다.
여기서는 날짜보다 단서가 더 중요합니다. cutoff는 그날 이전의 일은 모델이 전부 알고 이후의 일은 전혀 모른다는 뜻이 아닙니다. 그 기간 안에도 빈틈이 있습니다. 어떤 주제는 텍스트가 적었고, 어떤 곳에서는 텍스트끼리 서로 어긋났고, 어떤 것은 아예 학습 데이터에 들어가지 못했습니다. 날짜는 위쪽 경계를 정할 뿐, 그 아래가 빠짐없이 채워져 있다고 약속하지는 않습니다.
작지만 쓸모 있는 이야기도 하나 덧붙입니다. cutoff를 모델에게 직접 물어보는 것은 별로 좋은 방법이 아닙니다. 모델은 이 질문에도 생성으로, 즉 그럴듯한 답을 골라서 대답합니다. 정확한 날짜는 해당 버전의 문서에 나와 있고, 같은 계열의 이웃 모델끼리도 얼마든지 다를 수 있습니다.
Thinking이 무엇을 의미하는가
화면에 Thinking이 떴다고 해서 모델이 무슨 다른 의식 상태로 넘어간 것은 아닙니다. 답하기 전에 생각할 자리를 받았을 뿐입니다. 기술적으로는 완전히 같은 생성입니다. 모델은 먼저 자기용 초안을 씁니다. 과제를 뜯어보고, 선택지를 저울질하고, 스스로와 논쟁도 합니다. 그런 다음에야 최종 텍스트를 내놓습니다. 얼마나 오래 생각할지는 요즘 모델이 상당 부분 스스로 정합니다. 간단한 질문이면 초안이 짧거나 아예 없고, 얽힌 질문이면 길어집니다.
이게 왜 필요한지는 예를 보면 알 수 있습니다. 에이전트가 실패하는 테스트의 원인을 찾고 있습니다. 처음 떠오른 그럴듯한 설명은 외부 서비스 클라이언트를 가리키지만, 옆의 테스트와 오류 메시지는 다른 이야기를 합니다. 문제는 데이터 파싱에 있습니다. 여유가 있으면 모델은 수정을 제안하기 전에 이 모순을 알아채고 방향을 틀 수 있습니다. 이득은 추론이 길다는 데 있는 것이 아니라, 검토가 다음 단계를 바꿨다는 데 있습니다.
사실 첫 번째 설명이 틀린 경우는 드물지 않습니다. 그럴듯하긴 한데, 애초에 그럴듯함이 바로 메커니즘이 그것을 고른 기준이었으니까요.
이제 추가 추론이 언제 본전을 뽑는지 보겠습니다. 추론에는 시간이 들고, 사소한 일마다 켤 이유는 없습니다.
| 보통은 빠른 답변으로 충분 | 추론할 여유를 주는 편이 좋음 |
|---|---|
| 화면에 있는 코드 조각이 무슨 일을 하는지 설명 | 여러 파일이 얽혀 있을 때 테스트 실패 원인 찾기 |
| 오타나 서식 고치기 | 두 해법을 각각의 제약까지 함께 비교 |
| 방금 건넨 텍스트 요약 | 단계끼리 서로 의존하는 리팩터링 계획 세우기 |
기준은 간단합니다. 과제에 갈림길과 의존 관계가 많을수록 모델에게 생각할 여유를 주는 편이 유리합니다. 변수 이름 바꾸기라면 그에 대한 추론을 읽는 것보다 결과물을 바로 확인하는 쪽이 빠릅니다.
그리고 솔직히 말해 둘 한계가 있습니다. 화면에 보이는 추론은 내부에서 일어난 일을 정확히 기록한 것이 아닙니다. 읽는 사람을 위해 정리한 요약인 경우가 많습니다. 길고 짜임새 있는 추론 사슬도 잘못된 전제에서 자라날 수 있고, 그럴수록 실제보다 더 믿음직해 보입니다. 반대 경우도 있습니다. 답은 이미 찾았는데 모델이 계속 의심하고, 제자리를 맴돌다 스스로 헷갈리는 것입니다. 이것에는 이름도 있습니다. overthinking입니다.
더 오래 생각해 달라는 부탁은 약한 지렛대입니다. 초안이 길다고 그 자체로 나아지는 것은 없습니다. 훨씬 잘 통하는 것은 분명한 목표, 명시한 제약, 그리고 과제가 해결됐다고 판단할 수 있는 뚜렷한 기준입니다. 그래야 모델이 자기 추론에서 무엇을 점검할지가 생깁니다.
모델이 할 수 없는 것
목록은 짧습니다. 실제 작업에서 부딪혀 알게 되기보다 미리 알아 두는 편이 낫습니다.
- 사실이 맞다고 보장하기. 메커니즘은 그럴 법한 이어짐을 고를 뿐, 주장을 출처와 대조하지 않습니다. 지어냈지만 그럴듯한 세부 내용을 환각이라고 부릅니다.
- 표현에 흔들리지 않기. 단어 순서를 바꾸거나 단서를 하나 덧붙이면 답변이 달라집니다. 결국 그 자리 앞에 놓인 텍스트가 모든 것을 정하기 때문입니다.
- 스스로 새로운 것 배우기. 외부 출처 없이는 내장 지식이 갱신되지 않습니다. 어제 나온 라이브러리 릴리스에 대해 모델이 아는 것은 누군가 보여 준 내용뿐입니다.
- 토씨 하나 안 틀리고 반복하기. 같은 요청이라도 결과가 다를 수 있고, 이는 오류가 아니라 메커니즘의 성질입니다.
- 학습 텍스트의 편향에서 벗어나기. 거기서 한쪽으로 치우치게 다뤄졌거나 아예 다뤄지지 않은 것은 답변에도 그대로 드러납니다.
모델을 둘러싸고 생겨난 거의 모든 것은 이 목록의 어느 한 항목에 대한 대응입니다. 검색과 문서 활용은 내장 지식이 낡기 때문에 등장했습니다. 도구와 에이전트는 모델 혼자서는 말하는 것밖에 못 하기 때문에 등장했습니다.
에이전트의 동작에서 이것으로 설명되는 것
이 메커니즘에서 비롯된 모습은 Claude Code 화면에서 바로 확인할 수 있습니다.
- 답변이 조금씩 찍혀 나오는 것은 실제로 그렇게 만들어지기 때문입니다. 연출이 아니라 과정입니다.
- 같은 요청 두 개에 서로 다른 답이 나왔다면, 원래 그런 것입니다. 생성은 글자 그대로 되풀이되지 않습니다. 앞서 받은 결과가 필요하면 다시 묻기보다 이미 받은 답으로 돌아가는 편이 확실합니다.
- Thinking은 초안을 쓸 자리를 줄 뿐, 정답을 보장하지는 않습니다. 여러 단계로 된 과제를 풀 때는 본전을 뽑지만, 변수 이름 바꾸기에서는 오히려 방해가 될 때가 많습니다.
- 에이전트가 파일을 읽기 전까지 그 파일에 관한 답변은 일반적인 패턴에 기대고 있습니다. 대화에 들어온 것은 무엇이든 파라미터에 자리 잡은 것보다 무게가 큽니다.
- 라이브러리의 최신 버전에 대해 모델은 기본적으로 아는 것이 적고, 이를 메우는 가장 쉬운 방법은 문서를 대화에 넣어 주는 것입니다.
- 답변이 엉뚱한 방향으로 흘러가면 같은 말로 요청을 되풀이하기보다 빠진 정보를 더해 주는 편이 효과적입니다. 메커니즘은 답변 앞에 놓인 텍스트로 움직이지, 끈질기게 조르는 것으로 움직이지 않습니다.
메커니즘을 안다고 모델이 실제보다 못해 보이는 것은 아닙니다. 그저 무엇을 기대해야 할지 알려 줄 뿐입니다. 보증서가 딸린 참고서가 아니라, 여러분이 첫머리를 건네면 이어 쓰는 아주 뛰어난 텍스트 이어 쓰기 장치라는 것을요.
영상: 같은 원리를 그림으로
3Blue1Brown 채널에 핵심을 한눈에 들어오는 애니메이션 하나로 묶은 짧은 영상이 있습니다. 토큰, 다음 단어의 확률, 어텐션, 그리고 모델의 파라미터가 애초에 어디서 오는지까지 다룹니다. 제목은 Large Language Models explained briefly입니다.
원본은 영어지만 번역된 오디오 트랙이 여러 개 있고, 플레이어 설정에서 바꿀 수 있습니다. 원하는 언어의 트랙이 없다면 YouTube 사이트에서 직접 영상을 열어 보세요. 웹 플레이어 쪽이 선택지가 더 많습니다.
이 채널에는 이 영상 말고도 볼 것이 많습니다. 신경망, 트랜스포머, 어텐션을 다룬 시리즈가 통째로 있습니다. 같은 개념을 더 자세히, 수학까지 곁들여 설명합니다. 이 글을 읽고 나서 "무슨 일이 일어나는지"가 아니라 "이게 대체 왜 되는지"가 궁금해졌다면, 거기서 시작하면 됩니다.
GO TO FULL VERSION