문장을 맞히는 기계
스마트폰으로 메시지를 쓰다가 '오늘 저녁에'라고 입력하면 키보드는 자연스럽게 다음 말을 제안합니다. '뭐 해?', '만날까?', '비 온대' 같은 후보가 떠오릅니다. 우리는 이것을 자동완성이라고 부르지만, 그 안에는 언어 모델의 가장 기본적인 아이디어가 들어 있습니다.
언어 모델은 간단히 말해 문장의 다음 요소를 확률적으로 예측하는 모델입니다. 여기서 요소는 단어일 수도 있고, 글자일 수도 있고, 더 작은 조각인 토큰일 수도 있습니다. 지금은 토큰을 '텍스트를 모델이 처리하기 좋게 나눈 조각' 정도로 이해하면 충분합니다. 토큰화는 뒤에서 자세히 다룹니다.
예를 들어 다음 문장이 있다고 해보겠습니다.
오늘 점심은 김치찌개를 먹었다.
언어 모델은 이 문장을 한 번에 통째로 이해하는 존재라기보다, 앞부분을 보고 다음에 무엇이 올 가능성이 높은지 차례로 계산하는 모델에 가깝습니다.
오늘 → 점심은 → 김치찌개를 → 먹었다 → .
'오늘' 다음에는 '아침', '점심', '저녁', '날씨' 같은 말이 올 수 있습니다. 그중 어떤 말이 가장 자연스러운지는 모델이 이전에 본 많은 문장의 패턴에 따라 달라집니다. 언어 모델은 이 가능성을 숫자로 표현합니다. 즉, '오늘' 다음에 '점심은'이 올 확률, '오늘 점심은' 다음에 '김치찌개를'이 올 확률을 계산합니다.
이 관점에서 보면 언어 모델은 마법 상자가 아닙니다. 말을 이해하는 듯 보이지만, 가장 밑바닥에서는 다음에 올 말의 확률 분포를 예측하는 계산기입니다. LLM도 이 흐름 위에 있습니다. 다만 규모가 훨씬 크고, 학습한 데이터가 방대하며, 문맥을 다루는 방식이 훨씬 정교할 뿐입니다.

문장의 확률을 계산한다는 것
언어 모델이 다음 요소를 예측한다는 말은 결국 문장 전체의 확률을 계산할 수 있다는 뜻이기도 합니다. 조금 이상하게 들릴 수 있습니다. 문장에 확률이 있다니요. 하지만 다음 두 문장을 비교해보면 직관적으로 이해할 수 있습니다.
나는 아침에 커피를 마셨다.
커피를 아침에 나는 마셨다.
두 문장은 의미를 어느 정도 전달할 수 있지만, 첫 번째 문장이 훨씬 자연스럽습니다. 언어 모델은 이런 자연스러움을 확률로 다룹니다. 자연스러운 문장은 대체로 높은 확률을 받고, 어색한 문장은 낮은 확률을 받습니다.
문장 전체의 확률은 다음처럼 생각할 수 있습니다.
P(문장) = P(첫 번째 토큰) × P(두 번째 토큰 | 첫 번째 토큰) × P(세 번째 토큰 | 앞의 토큰들) × ...
기호가 조금 낯설어도 의미는 단순합니다. '앞에서 무엇이 나왔는가'를 조건으로 '다음에 무엇이 나올 가능성이 있는가'를 계속 곱해가는 것입니다.
예를 들어 '나는 밥을' 다음에 올 말을 예측한다고 해보겠습니다.
| 후보 | 직관적인 가능성 |
|---|---|
| 먹었다 | 높음 |
| 지었다 | 상황에 따라 가능 |
| 달린다 | 낮음 |
| 파랗다 | 매우 낮음 |
언어 모델은 이런 후보들에 점수를 매깁니다. 그리고 가장 높은 점수를 받은 토큰을 선택하거나, 높은 점수를 받은 후보들 중 하나를 뽑아 문장을 이어갑니다. 그래서 같은 질문을 해도 답변이 조금씩 달라질 수 있습니다. 모델이 항상 하나의 정답만 고르는 것이 아니라, 확률적으로 그럴듯한 다음 토큰을 선택하기 때문입니다.
여기서 중요한 점이 있습니다. 언어 모델은 기본적으로 '참인지 거짓인지'를 직접 판정하는 기계가 아닙니다. 언어 모델의 기본 임무는 그럴듯한 다음 토큰을 예측하는 것입니다. 물론 큰 모델은 학습 과정에서 수많은 지식과 패턴을 흡수하기 때문에 사실 질문에도 답할 수 있습니다. 하지만 그 능력 역시 언어 모델링이라는 기본 구조 위에서 나타납니다. 이 점을 이해하면 나중에 환각, RAG, 도구 사용을 훨씬 정확하게 이해할 수 있습니다.
모든 문제를 다음 말 예측으로 바꾸기
언어 모델의 재미있는 점은 여러 작업을 '다음에 올 텍스트를 예측하는 문제'로 바꿀 수 있다는 데 있습니다. 처음에는 자동완성처럼 단순해 보이지만, 조금만 형식을 바꾸면 번역, 요약, 질의응답도 같은 틀 안으로 들어옵니다.
영어 문장을 한국어로 번역한다고 생각해봅시다.
Translate into Korean: I like coffee.
이 입력 뒤에 자연스럽게 이어질 텍스트는 무엇일까요?
나는 커피를 좋아한다.
번역 모델은 영어 문장을 보고 한국어 문장을 '생성'합니다. 겉으로는 번역이지만, 모델 입장에서는 주어진 문맥 다음에 올 적절한 토큰을 차례로 예측하는 일입니다.
요약도 마찬가지입니다. 긴 문서 뒤에 '위 내용을 세 문장으로 요약하면'이라는 지시가 붙으면, 모델은 그 뒤에 이어질 요약문을 생성합니다. 질의응답도 같습니다. 질문과 참고 문맥이 주어지면, 그 다음에 올 답변을 예측합니다.
다시 말해 많은 자연어 처리 작업은 다음과 같은 형태로 바뀔 수 있습니다.
입력 문맥을 준다.
원하는 작업을 말로 지시한다.
그 뒤에 이어질 가장 적절한 텍스트를 생성한다.
이 단순한 변환이 LLM 시대의 중요한 전환점입니다. 예전에는 번역 모델, 요약 모델, 감정 분석 모델, 질의응답 모델을 따로 만드는 경우가 많았습니다. 하지만 큰 언어 모델은 다양한 작업을 텍스트 입력과 텍스트 출력의 문제로 통합합니다. '모든 것을 말로 설명하고, 말로 답하게 한다'는 방식입니다.
이것이 ChatGPT 같은 모델이 여러 일을 하는 것처럼 보이는 이유 중 하나입니다. 모델이 각각의 기능을 버튼처럼 따로 가지고 있다기보다, 많은 작업을 언어 생성 문제로 받아들이고 처리합니다.
언어 모델의 가장 단순한 조상, N-gram
LLM을 이해하려면 아주 단순한 언어 모델부터 보는 것이 좋습니다. 대표적인 출발점이 N-gram 언어 모델입니다. N-gram은 연속된 N개의 요소를 뜻합니다. 요소는 보통 단어라고 생각하면 됩니다.
예를 들어 문장 '나는 오늘 커피를 마셨다'를 단어 단위로 나누면 다음과 같습니다.
나는 / 오늘 / 커피를 / 마셨다
여기서 2개씩 묶으면 bigram입니다.
나는 오늘, 오늘 커피를, 커피를 마셨다
3개씩 묶으면 trigram입니다.
나는 오늘 커피를, 오늘 커피를 마셨다
N-gram 언어 모델의 원리는 간단합니다. 앞의 N-1개 단어를 보고 다음 단어를 예측합니다. bigram 모델은 바로 앞 단어 하나만 보고 다음 단어를 예측합니다. trigram 모델은 앞 단어 두 개를 봅니다.
예를 들어 bigram 모델은 '커피를' 다음에 무엇이 자주 나왔는지 세어봅니다.
커피를 마셨다
커피를 샀다
커피를 내렸다
학습 데이터에서 '커피를' 다음에 '마셨다'가 가장 자주 나왔다면, 모델은 '커피를' 다음 단어로 '마셨다'에 높은 확률을 줍니다. 이 방식은 놀랄 만큼 직관적입니다. 많은 문장을 모아두고, 어떤 단어 뒤에 어떤 단어가 자주 왔는지 세는 것입니다.
하지만 곧 한계가 드러납니다.
철수는 영희에게 책을 빌려주었고, 며칠 뒤 영희는 그것을 다시 ___
빈칸에 들어갈 말은 '돌려주었다'가 자연스럽습니다. 그런데 이 판단을 하려면 앞부분의 '책을 빌려주었고'라는 정보를 기억해야 합니다. 바로 앞의 두세 단어만 보고는 충분하지 않을 수 있습니다. N-gram 모델은 가까운 단어의 패턴은 잘 잡지만, 멀리 떨어진 문맥을 이해하기 어렵습니다.
또 다른 문제도 있습니다. N이 커질수록 가능한 조합이 폭발적으로 많아집니다. 한국어 단어가 수만 개만 되어도 5개 단어 조합은 상상하기 어려울 정도로 많습니다. 학습 데이터에서 한 번도 보지 못한 조합이 계속 등장합니다. 이것을 희소성 문제라고 부릅니다. 데이터가 아무리 많아도 가능한 문장의 조합은 훨씬 더 많기 때문에, 단순히 세는 방식만으로는 언어를 충분히 다루기 어렵습니다.
순서를 따라 읽는 RNN
N-gram 모델의 한계를 넘기 위해 등장한 중요한 흐름이 신경망 언어 모델입니다. 신경망은 데이터를 통해 패턴을 학습하는 계산 구조입니다. 여기서는 단어 사이의 관계를 사람이 직접 표로 세는 대신, 모델이 숫자 벡터와 가중치를 이용해 패턴을 배운다고 이해하면 됩니다.
그중 한동안 많이 쓰였던 구조가 RNN, 즉 순환 신경망입니다. RNN은 문장을 앞에서부터 차례로 읽습니다. 단어를 하나씩 입력받으면서 지금까지 본 내용을 내부 상태에 누적합니다.
예를 들어 다음 문장을 읽는다고 해보겠습니다.
나는 어제 도서관에서 재미있는 책을 발견했다.
RNN은 '나는'을 읽고 내부 상태를 갱신합니다. 그다음 '어제'를 읽고 다시 갱신합니다. 이어서 '도서관에서', '재미있는', '책을'을 읽으며 문맥 정보를 조금씩 쌓아갑니다. 마지막에 '발견했다'를 예측할 때는 앞에서 누적한 정보를 사용합니다.
이 방식은 N-gram보다 훨씬 유연합니다. 바로 앞 몇 단어만 보는 것이 아니라, 이론적으로는 문장 앞부분 전체의 정보를 내부 상태에 담을 수 있기 때문입니다. 언어는 순서가 중요합니다. '개가 사람을 물었다'와 '사람이 개를 물었다'는 단어는 비슷하지만 의미는 완전히 다릅니다. RNN은 단어가 등장한 순서를 따라 문맥을 쌓기 때문에 이런 순서 정보를 다루기에 적합해 보였습니다.
하지만 실제로는 긴 문장을 다룰 때 어려움이 있었습니다. 문장이 길어질수록 앞쪽 정보가 뒤쪽까지 온전히 전달되기 어렵습니다. 긴 복도 끝에서 누군가 작은 목소리로 말하면, 반대편 끝에서는 잘 들리지 않는 것과 비슷합니다. RNN의 내부 상태는 계속 갱신되는데, 이 과정에서 오래된 정보가 희미해질 수 있습니다.
이를 완화하기 위해 LSTM, GRU 같은 발전된 구조가 등장했습니다. 이들은 중요한 정보를 더 오래 보존하도록 설계되었습니다. 실제로 많은 문제에서 좋은 성능을 냈고, Transformer가 대중화되기 전까지 번역, 음성 인식, 문장 생성 등 여러 분야에서 널리 쓰였습니다.
그럼에도 근본적인 제약은 남았습니다. RNN은 기본적으로 문장을 순서대로 처리합니다. 첫 단어를 처리하고, 둘째 단어를 처리하고, 셋째 단어를 처리합니다. 이 방식은 자연스럽지만, 매우 긴 텍스트를 빠르게 학습시키기에는 불리합니다. 앞부분과 뒷부분의 관계를 직접 연결하는 것도 쉽지 않습니다.
Transformer 이전의 답답함
Transformer가 등장하기 전의 언어 모델은 분명히 발전하고 있었지만, 몇 가지 답답한 문제를 안고 있었습니다.
첫째, 긴 문맥을 안정적으로 다루기 어려웠습니다. N-gram은 애초에 가까운 단어만 봅니다. RNN은 더 긴 문맥을 다룰 수 있지만, 문장이 길어지면 앞쪽 정보가 약해지기 쉽습니다.
둘째, 학습을 크게 확장하기 어려웠습니다. RNN은 순서대로 계산해야 하므로 병렬 처리에 제약이 있었습니다. 병렬 처리는 여러 계산을 동시에 수행하는 방식입니다. 대규모 데이터와 큰 모델을 학습시키려면 병렬 처리가 매우 중요합니다. 계산을 한 줄로 길게 세워 처리하면, 아무리 좋은 장비가 있어도 속도가 제한됩니다.
셋째, 멀리 떨어진 단어 사이의 관계를 직접 포착하기 어려웠습니다. 예를 들어 긴 문서의 첫 문단에서 소개한 인물이 마지막 문단에서 다시 등장할 수 있습니다. 사람은 그 연결을 자연스럽게 떠올리지만, 오래된 모델 구조는 이런 장거리 의존성을 안정적으로 다루는 데 약했습니다.
이 답답함 속에서 등장한 핵심 아이디어가 Attention입니다. Attention은 말 그대로 '어디를 봐야 하는가'를 모델이 학습하게 만드는 방식입니다. 문장을 왼쪽에서 오른쪽으로만 힘겹게 읽는 대신, 현재 단어를 이해하는 데 필요한 다른 단어들을 직접 참고할 수 있게 합니다.
예를 들어 '그녀는 컵을 테이블 위에 올려놓았다. 그것은 하얀색이었다'라는 문장에서 '그것'이 무엇을 가리키는지 판단하려면 앞의 '컵'을 봐야 합니다. Attention은 이런 연결을 모델 내부에서 점수로 계산합니다. 현재 위치에서 어떤 단어를 더 중요하게 볼지 정하는 것입니다.
Transformer는 이 Attention 아이디어를 중심에 놓고 설계된 구조입니다. 그리고 GPT는 Transformer의 한 계열입니다. 따라서 앞으로 우리가 배울 토큰화, 임베딩, Attention, Transformer, GPT는 서로 따로 떨어진 개념이 아닙니다. 모두 언어 모델이 다음 토큰을 더 잘 예측하도록 발전해온 흐름 안에 있습니다.
LLM은 확률 모델의 연장선에 있다
LLM이라는 단어를 들으면 거대한 데이터센터, 수천억 개의 매개변수, 사람처럼 말하는 챗봇이 먼저 떠오를 수 있습니다. 하지만 시작점은 단순합니다.
앞의 문맥이 주어졌을 때, 다음 토큰은 무엇일까?
이 질문을 아주 작은 규모로 풀면 문자 단위 bigram 모델이 됩니다. 조금 더 정교하게 풀면 신경망 언어 모델이 됩니다. 긴 문맥과 복잡한 관계를 더 잘 다루도록 발전시키면 Transformer 기반 언어 모델이 됩니다. 그리고 거대한 데이터와 계산 자원, 정교한 학습 절차를 결합하면 오늘날의 LLM에 가까워집니다.
중요한 것은 LLM을 갑자기 하늘에서 떨어진 기술로 보지 않는 것입니다. LLM은 언어 모델의 오랜 흐름 위에 서 있습니다. N-gram이 '자주 나온 다음 단어'를 세었다면, 현대 LLM은 거대한 신경망을 이용해 훨씬 복잡한 문맥과 의미의 패턴을 학습합니다. 하지만 밑바닥의 질문은 여전히 이어집니다. 다음에 무엇이 와야 자연스러운가?
그래서 LLM을 이해하는 첫걸음은 거창한 인공지능 철학이 아니라, 문장의 확률을 이해하는 데서 시작합니다. 모델은 문장을 토큰의 시퀀스로 보고, 앞의 토큰들을 바탕으로 다음 토큰의 확률을 계산합니다. 이 과정을 반복하면 문장이 생성됩니다. 문장이 쌓이면 답변이 되고, 답변이 쌓이면 대화처럼 보입니다.
물론 이것만으로 모든 것을 설명할 수는 없습니다. 큰 모델은 단순 자동완성을 넘어 추론처럼 보이는 행동, 코드 작성, 요약, 번역, 계획 수립까지 수행합니다. 하지만 그 능력 역시 언어 모델링이라는 기본 엔진 위에서 나타납니다. 엔진을 이해하면, 모델이 잘하는 일과 약한 일을 더 냉정하게 볼 수 있습니다.
작은 예측이 문장이 되는 순간
언어 모델의 작동을 조금 더 생생하게 상상해봅시다. 모델에게 다음과 같은 입력이 들어갑니다.
비가 오는 날에는 따뜻한
모델은 다음 토큰 후보에 확률을 매깁니다.
| 다음 후보 | 가능성 |
|---|---|
| 차 | 높음 |
| 국물 | 높음 |
| 옷 | 중간 |
| 비행기 | 낮음 |
모델이 '차'를 선택했다고 해보겠습니다. 이제 문맥은 바뀝니다.
비가 오는 날에는 따뜻한 차
다음에는 '를', '한', '가' 같은 후보가 떠오를 수 있습니다. 모델이 '를'을 선택합니다.
비가 오는 날에는 따뜻한 차를
이제 다음 후보는 '마시고', '준비하고', '내리고' 등이 됩니다. 이런 식으로 한 토큰씩 이어 붙이면 문장이 만들어집니다.
비가 오는 날에는 따뜻한 차를 마시고 싶다.
겉으로 보면 모델이 처음부터 완성된 생각을 품고 문장을 말한 것처럼 보입니다. 하지만 실제 생성 과정은 한 걸음씩 진행됩니다. 매 순간 현재 문맥을 보고 다음 토큰의 확률을 계산하고, 하나를 선택하고, 다시 문맥에 붙입니다.
이 과정은 사람이 글을 쓰는 방식과 비슷한 면도 있고, 전혀 다른 면도 있습니다. 사람은 경험, 의도, 감정, 목적을 가지고 문장을 씁니다. 언어 모델은 학습한 패턴과 현재 문맥을 바탕으로 다음 토큰을 계산합니다. 그래서 언어 모델을 사람처럼 대하면 편리할 때도 있지만, 제품을 만들 때는 계산 모델로 이해해야 합니다.
이 차이를 아는 개발자는 LLM을 더 잘 사용할 수 있습니다. 답변을 그냥 믿는 대신, 필요한 근거를 붙이고, 외부 문서를 검색하게 하고, 도구를 호출하게 만들 수 있습니다. 나중에 배울 RAG와 Function Calling은 바로 이 한계를 보완하는 실전 기술입니다.
다음 장으로 이어지는 질문
언어 모델은 문장을 토큰의 흐름으로 보고, 앞의 문맥을 바탕으로 다음 토큰의 확률을 예측합니다. 자동완성은 가장 직관적인 예이고, 번역, 요약, 질의응답도 이 구조로 바꿔 생각할 수 있습니다. N-gram 모델은 이전 몇 개 단어만 보고 다음 단어를 예측했고, RNN은 순서를 따라 문맥을 누적했습니다. 하지만 긴 문맥과 대규모 학습에는 한계가 있었고, 그 한계를 넘기 위해 Attention과 Transformer가 등장했습니다.
이제 한 가지 질문이 남습니다.
다음 토큰을 예측한다는 것은 실제로 어떤 계산일까?
우리가 문장을 자연스럽다고 느끼는 순간, 모델 내부에서는 수많은 후보 토큰에 확률이 매겨지고 있습니다. 다음 장에서는 바로 이 장면으로 들어갑니다. 언어 모델이 어떻게 '다음에 올 말'을 고르고, 그 작은 선택들이 어떻게 긴 답변으로 이어지는지 살펴보겠습니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.