대규모 언어 모델(LLM, Large Language Model)은 지금까지의 문장을 보고 다음에 올 단어로 가장 그럴듯한 것을 하나 고르고, 그것을 붙인 뒤 다시 다음 단어를 고르기를 반복하는 '다음 단어 예측기'입니다. 놀라울 만큼 유창한 답변을 내놓는 ChatGPT도 밑바닥을 들여다보면 이 단순한 반복 하나로 굴러갑니다.
한눈에 보기
- LLM은 지금까지의 문장을 보고 다음에 올 말을 확률로 하나씩 골라 이어 붙이는 '다음 단어 예측기'입니다.
- 이 단순한 아이디어가 신경망, RNN·LSTM, 트랜스포머를 거치고 규모를 키우면서 오늘의 대화형 AI가 됐습니다.
- 그럴듯함을 고르는 기계라서 틀린 내용을 자신 있게 지어내는 환각이 남으므로, 중요한 내용은 사람이 확인해야 합니다.
다음 단어를 확률로 고른다는 것
이런 상황을 떠올려 보세요. 총무팀에서 일하는데 다음 달 워크숍 안내 공지를 ChatGPT에 맡겼습니다. "워크숍 공지문 써 줘"라고 두 번 부탁하니 두 번 모두 그럴듯하지만 문장이 조금씩 다릅니다. 게다가 한 번은 알려 준 적도 없는 버스 출발 시각을 자신 있게 적어 넣었습니다. 같은 질문에 왜 답이 매번 달라질까요, 모르는 내용을 왜 아는 것처럼 쓸까요. 두 궁금증의 답은 모두 LLM이 '다음 단어를 확률로 고르는 기계'라는 한 가지 사실에서 나옵니다. 이 글은 그 기계가 어떻게 태어났는지를 따라갑니다.
여기서 '고른다'는 말은 감이나 직관이 아닙니다. 모델은 다음에 올 수 있는 모든 후보 토큰(token, AI가 글을 읽고 쓰는 조각 단위로, 보통 단어 하나보다 조금 작은 단위)마다 확률을 계산합니다. 그 확률 분포(후보마다 '다음에 올 가능성'을 매겨, 전부 더하면 1이 되는 점수표)에서 하나를 뽑아 문장에 붙이고, 늘어난 문장을 다시 입력으로 넣어 그다음 토큰의 확률을 계산합니다. 자기가 낸 출력을 다시 입력으로 삼는 이 되먹임 구조를 자기회귀(autoregressive)라고 부릅니다. 공지문이 부탁할 때마다 조금씩 다른 이유도 여기에 있습니다. 매번 확률에 따라 뽑기 때문입니다.
그렇다면 이렇게 단순한 예측기는 어떻게 태어났을까요. LLM의 탄생은 '어떻게 하면 기계가 언어의 다음 조각을 잘 맞힐 수 있을까'라는 질문을 놓고 오랫동안 이어진 시행착오의 역사입니다. 그 흐름을 따라가 보면 오늘의 LLM이 왜 지금 같은 모습이 되었는지가 자연스럽게 드러납니다.
AI, 머신러닝, 딥러닝, 그리고 생성형 AI의 자리
먼저 LLM이 기술 지형에서 어디쯤 서 있는지 짚어 두면 이야기가 편합니다. 가장 바깥에 인공지능(AI)이 있고, 그 안에 사람이 규칙을 일일이 적어 주는 대신 데이터에서 규칙을 스스로 배우는 머신러닝(machine learning)이 있습니다. 머신러닝 안에는 여러 층으로 쌓은 신경망(neural network, 숫자를 주고받는 작은 계산 단위를 층층이 엮은 계산 구조)을 쓰는 딥러닝(deep learning)이 있고, 그 딥러닝의 한 갈래로 새로운 콘텐츠를 만들어 내는 생성형 AI(Generative AI)가 놓입니다. LLM은 이 생성형 AI 가운데 언어를 다루는 대표 주자입니다.

생성형 AI가 만들어 내는 결과물은 텍스트에만 그치지 않습니다. 이미지, 코드, 음성처럼 여러 형태를 만듭니다. 그중에서도 텍스트를 생성하는 모델이 바로 언어 모델이며, 규모를 크게 키운 것이 LLM입니다. 이 구분을 머릿속에 넣어 두면 'LLM은 결국 언어에 특화된 거대한 생성형 신경망'이라는 감이 잡힙니다.

문장을 숫자로 바꾸는 첫 관문, 토큰화
LLM이 언어를 다루려면 먼저 넘어야 할 벽이 있습니다. 컴퓨터는 글자를 그대로 읽지 못합니다. 컴퓨터가 다루는 것은 오직 숫자입니다. 그래서 문장을 조각으로 잘라 번호로 바꿔 넣어야 하는데, 이 과정이 토큰화(tokenization)입니다. 이때 잘라낸 조각 하나가 앞에서 말한 토큰입니다. 토큰은 단어일 수도, 단어의 일부일 수도, 때로는 글자 하나일 수도 있습니다.
왜 단어 단위가 아니라 조각 단위로 자를까요. 세상의 단어는 너무 많고 계속 새로 생깁니다. 모든 단어에 미리 번호를 매겨 둘 수는 없습니다. 그래서 자주 붙어 다니는 덩어리는 통째로 두고, 드문 표현은 잘게 쪼개는 절충을 택합니다. 예를 들어 사전에 없던 단어 'cyberpunk'가 들어와도 'cyber'와 'punk'라는 두 블록으로 조립하면 그만입니다. 정해진 수의 블록만으로 세상의 거의 모든 문장을 표현할 수 있습니다.
토큰은 사람이 정한 문법 단위가 아니라 방대한 글에서 통계적으로 잘라낸 조각입니다. 그래서 언어마다 조각나는 정도가 다릅니다. 영어는 대체로 토큰 하나가 네 글자쯤이고 영어 단어 약 0.75개에 해당합니다. 토큰 100개면 영어 단어 75개 남짓입니다. 반면 한국어는 같은 뜻을 담아도 조각이 더 잘게 납니다. 같은 문장을 여러 언어로 옮겨 비교한 연구(Petrov 외, 2023)에서는 GPT-4의 토크나이저로 셌을 때 한국어가 영어보다 약 2.4배 많은 토큰을 썼습니다. 이후 나온 GPT-4o의 토크나이저에서는 격차가 줄었지만, 한국어가 토큰을 더 쓰는 경향은 남아 있습니다.
이 차이는 실무에서 두 가지로 체감됩니다. 하나는 길이 제한입니다. 같은 분량을 넣어도 한국어가 토큰 한도에 더 빨리 닿습니다. 다른 하나는 요금입니다. 사용량만큼 과금하는 서비스에서는 한국어가 상대적으로 비싸게 계산됩니다. 궁금하다면 공개된 토크나이저(문장을 토큰으로 자르는 프로그램) 도구에 문장을 직접 넣어 보면 됩니다. 한국어와 영어 문장을 나란히 넣고 조각 수를 비교하면 '문장이 숫자 조각으로 바뀐다'는 개념이 곧바로 손에 잡힙니다. 자세한 원리는 토큰과 임베딩 글에서 다룹니다.
이름표를 좌표로: 임베딩과 의미의 지도
토큰마다 고유 번호가 붙었지만, 번호는 이름표에 지나지 않습니다. '고양이'가 5번이고 '강아지'가 8721번이라 해도, 이 두 숫자만 봐서는 둘이 얼마나 비슷한 뜻인지 알 길이 없습니다. 5와 8721은 서로 무관한 두 수일 뿐입니다. 사람은 '고양이'와 '강아지'가 가깝고 '고양이'와 '냉장고'가 멀다는 것을 압니다. 기계도 이 '가깝고 멂'을 다룰 수 있어야 문맥을 대강이라도 파악할 수 있습니다.
그 답이 임베딩(embedding, 뜻이 비슷한 말끼리 가까운 자리에 놓이도록 숫자로 바꾸는 일)입니다. 토큰 하나를 숫자 하나가 아니라 숫자 여러 개의 묶음, 곧 좌표로 바꿉니다. 이런 숫자 묶음을 벡터(vector, 숫자를 순서대로 늘어놓은 목록)라고 부릅니다. 이 좌표가 놓인 공간을 흔히 '의미의 지도'에 빗댑니다. 지도 위에서 뜻이 비슷한 토큰은 가까이 모이고, 뜻이 먼 토큰은 멀리 떨어집니다. 이렇게 하면 뜻의 거리가 곧 좌표의 거리가 됩니다.
임베딩의 힘은 좌표끼리의 계산으로 의미의 관계를 다룰 수 있다는 데 있습니다. 유명한 예로 '왕'에서 '남자'를 빼고 '여자'를 더하면 '여왕'에 가까운 좌표가 나온다는 유추가 있습니다. 뜻의 방향이 좌표의 방향으로 옮겨졌다는 증거입니다. 이 유추 예시 자체는 미콜로프 등의 word2vec(2013)에서 나왔습니다. 다만 단어를 짧은 숫자 목록으로 표현한다는 발상의 뿌리는 더 거슬러 올라가, 벤지오 등이 2003년에 제안한 신경 확률 언어 모델(A Neural Probabilistic Language Model)에 닿습니다. 단어를 좌표로 표현하고 그 위에서 다음 단어의 확률을 학습한다는 발상이 여기서 본격화됐습니다.
정리하면 토큰화가 '문장을 숫자 조각으로 쪼개는' 단계라면, 임베딩은 '그 조각에 뜻을 부여하는' 단계입니다. 이 두 관문을 지나야 비로소 신경망이 언어를 계산할 수 있는 형태로 다룹니다.
순서를 기억하려는 시도: RNN과 LSTM의 시대
RNN으로 넘어가기 전에 신경망이 배우는 방식을 잠깐 짚고 가겠습니다. 신경망은 입력을 받아 예측을 내고, 그 예측이 정답과 얼마나 다른지 오차를 잽니다. 그다음 이 오차를 출력 쪽에서 입력 쪽으로 거꾸로 전해 가며, 연결마다 붙은 숫자인 가중치를 오차가 줄어드는 방향으로 조금씩 고칩니다. 이 학습 방법을 역전파(backpropagation)라고 합니다.

언어는 순서가 생명입니다. '개가 사람을 물었다'와 '사람이 개를 물었다'는 같은 단어를 담고도 뜻이 완전히 다릅니다. 초기 신경망 언어 모델은 앞뒤 순서를 다루려고 순환신경망(RNN, Recurrent Neural Network)을 도입했습니다. RNN은 문장을 한 단어씩 읽으면서 지금까지 읽은 내용을 메모 한 장에 덮어써 가는 방식입니다. 미콜로프 등의 RNN 언어 모델 연구가 보여 주었듯, RNN은 지금까지 읽은 내용을 하나의 '상태'로 요약해 두고 다음 단어를 예측할 때 그 상태를 이어받습니다. 단어를 하나씩 흘려 넣으면서 기억을 쌓아 가는 구조입니다.
그런데 RNN에는 고질병이 있었습니다. 문장이 길어지면 앞쪽 정보가 뒤로 갈수록 흐려집니다. 역전파 과정에서 '어느 숫자를 얼마나 고칠지' 알려 주는 오차 신호가 여러 단계를 거치며 점점 작아지거나 커지는 현상, 곧 기울기 소실과 폭발 탓입니다. '오늘 아침에 …(긴 서술)… 그래서 나는'까지 왔을 때 맨 앞의 '아침'을 이미 잊어버리는 식입니다.
이 한계를 완화한 것이 장단기 기억(LSTM, Long Short-Term Memory)입니다. 1997년 호흐라이터와 슈미트후버가 제안한 LSTM은 정보를 저장할지, 잊을지, 내보낼지를 조절하는 여러 개의 문(gate) 구조를 두었습니다. 이 문들이 중요한 정보는 오래 붙들고 불필요한 정보는 흘려보내면서, 긴 문맥을 이전보다 훨씬 안정적으로 나릅니다.
LSTM은 시퀀스 투 시퀀스(Sequence to Sequence, 문장 하나를 받아 다른 문장 하나로 바꿔 내는 구조)와 결합하며 기계 번역 같은 과제에서 큰 성과를 냈습니다. 한 문장을 상태로 압축한 뒤 그 상태로부터 다른 언어의 문장을 한 단어씩 생성하는 방식입니다. 다만 이 계열의 모델에는 여전히 근본적인 제약이 있었습니다. 단어를 순서대로 하나씩 처리해야 하므로 여러 계산을 동시에 나눠 돌리는 병렬화가 어렵고, 문장 전체를 좁은 상태 하나에 밀어 넣다 보니 긴 문맥에서는 정보가 병목에 걸렸습니다.
판을 바꾼 한 편의 논문: 트랜스포머와 어텐션
2017년 '어텐션이 전부다(Attention Is All You Need)'라는 논문이 판을 뒤집었습니다. 이 논문은 RNN의 순환 구조를 아예 걷어내고, 어텐션(attention, 문장 속 각 단어가 다른 단어를 얼마나 참고할지 점수를 매기는 계산)만으로 문장을 처리하는 트랜스포머(Transformer)를 제안했습니다. 이후 등장한 거의 모든 대규모 언어 모델이 이 구조를 뼈대로 삼습니다. LLM의 탄생을 이야기할 때 가장 결정적인 전환점입니다.
어텐션의 핵심 발상은 이렇습니다. 어떤 단어의 뜻을 정할 때, 문장 안의 다른 모든 단어를 한꺼번에 둘러보고 그중 어디에 더 '주목'할지를 정합니다. 예를 들어 '그 은행에서 돈을 찾았다'의 '은행'은 '돈'이라는 단어에 강하게 주목하며 금융기관이라는 뜻으로 굳습니다. RNN처럼 앞에서부터 차례로 기억을 넘겨받는 대신, 모든 위치가 서로를 직접 참조합니다. 이를 자기어텐션(self-attention)이라고 합니다.
이 구조 덕분에 두 가지 문제가 한꺼번에 풀렸습니다. 첫째, 멀리 떨어진 단어끼리도 곧바로 연결되므로 긴 문맥에서 정보가 흐려지는 문제가 크게 줄었습니다. 둘째, 단어를 하나씩 순서대로 처리할 필요가 없어 계산을 대규모로 병렬화할 수 있게 됐습니다. 병렬화가 가능해졌다는 점이 특히 중요합니다. 훨씬 많은 데이터로 훨씬 큰 모델을 현실적인 시간 안에 학습할 길이 열렸기 때문입니다.
트랜스포머는 단어의 순서 정보를 위치 인코딩(positional encoding, 각 토큰이 문장에서 몇 번째인지를 숫자로 적어 붙이는 장치)으로 따로 넣어 줍니다. 순환 구조를 버린 대가로 순서 개념을 명시적으로 보태 준 것입니다. 토큰화로 자르고, 임베딩으로 좌표를 얻고, 어텐션으로 서로 주목하게 한 뒤, 다음 토큰의 확률을 계산하는 오늘날 LLM의 골격이 바로 이 논문에서 완성됐습니다. 구조를 더 자세히 보려면 트랜스포머 글을 보면 됩니다.
다음 단어를 실제로 '고르는' 방법: 확률 분포와 디코딩
어텐션을 거친 모델은 마지막에 '다음에 올 토큰'의 확률 분포를 내놓습니다. 어휘집에 있는 수만 개의 토큰마다 점수를 매기고, 이를 소프트맥스(softmax, 점수들을 모두 더해 1이 되는 확률로 바꿔 주는 계산)에 넣어 확률로 바꿉니다. 예를 들어 '오늘 날씨가 참' 다음에 '좋다'가 0.6, '맑다'가 0.2, '흐리다'가 0.05 하는 식으로 막대그래프가 그려집니다.
여기서 '고른다'가 실제로 벌어집니다. 이 분포에서 토큰을 골라내는 과정을 디코딩(decoding)이라고 합니다. 가장 확률이 높은 토큰만 늘 고르면 답이 안전하지만 단조롭습니다. 그래서 디코딩 설정으로 선택의 성격을 조절합니다. 대표적으로 온도(temperature), 상위 k개(top-k), 누적 확률 상위(top-p)가 있습니다. 온도를 낮추면 분포가 뾰족해져 뻔하지만 일관된 답이 나오고, 높이면 분포가 평평해져 답이 다양해지는 대신 엉뚱해질 위험이 커집니다.
| 고르는 방식 | 하는 일 | 값을 올리면 |
|---|---|---|
| temperature | 확률 분포의 뾰족함 조절 | 무작위성·다양성 증가 |
| top-k | 상위 k개 후보만 남기고 추출 | 후보 폭 넓어짐 |
| top-p | 누적 확률 p까지의 후보만 남김 | 상황에 따라 후보 수 유동적 |
| 그리디(greedy) | 매번 최고 확률만 선택 | 해당 없음(설정값이 없는 방식) |
이렇게 고른 토큰을 문장 끝에 붙이고, 늘어난 문장을 다시 입력에 넣어 그다음 토큰을 고릅니다. 앞에서 말한 자기회귀 루프입니다. 토큰화 → 임베딩 → 어텐션 → 확률분포 → 선택, 그리고 다시 처음으로. 이 다섯 정거장이 하나의 고리로 맞물려 도는 것이 LLM이 글을 써 내려가는 방식입니다. 설정값을 작업에 맞게 고르는 요령은 프롬프트 엔지니어링 글에서 다룹니다.
온도를 0으로 두면 매번 완전히 똑같은 답이 나온다고 믿기 쉽지만 그렇지 않습니다. 가장 높은 확률만 고르는 방식에 가까워져 재현성이 높아지는 것은 맞습니다. 다만 서버는 여러 사람의 요청을 한데 묶어 계산하는데, 그때그때 몰린 요청 수에 따라 묶음 크기와 계산 순서가 달라집니다. 그 탓에 확률 값에 아주 작은 차이가 생기고, 그 차이로 다른 토큰이 뽑히기도 합니다(Thinking Machines Lab, 2025). 앞의 공지문 장면처럼 같은 부탁에 답이 조금씩 달라지는 것은 고장이 아니라 이 구조의 성질입니다.
규모가 만든 도약: 스케일링과 few-shot 능력
트랜스포머가 뼈대를 놓았다면, LLM을 오늘의 모습으로 키운 결정적 요인은 '규모'입니다. 모델의 파라미터(parameter, 모델이 학습하며 조정하는 숫자로, 모델의 지식이 담기는 곳) 수, 학습 데이터의 양, 계산 자원을 함께 키우면 성능이 예측 가능한 방식으로 좋아진다는 관찰이 있습니다. 이를 정리한 것이 신경망 언어 모델의 스케일링 법칙(Scaling Laws)입니다. 규모를 키우는 투자가 왜 합리적인지에 이론적 근거를 준 연구입니다.
규모를 충분히 키우자 예상 밖의 능력이 나타났습니다. GPT-3를 소개한 논문 '언어 모델은 퓨샷 학습기다(Language Models are Few-Shot Learners)'는, 따로 재학습하지 않고 프롬프트(prompt, AI에게 건네는 지시문과 자료)에 예시 몇 개만 보여 줘도 새로운 과제를 곧잘 해내는 현상을 보고했습니다. 예시를 아예 주지 않는 제로샷(zero-shot), 몇 개만 주는 퓨샷(few-shot)만으로도 번역, 요약, 질의응답을 해낸 것입니다. 세대별로 무엇이 달라졌는지는 GPT 발전사 글에서 이어 볼 수 있습니다.
사전학습에서 정렬까지: 원본 모델이 대화 상대가 되기까지

LLM을 만드는 과정은 크게 세 단계로 나뉩니다. 먼저 방대한 텍스트로 다음 단어를 맞히도록 훈련하는 사전학습(pre-training)이 있습니다. 이 단계에서 모델은 언어의 폭넓은 통계와 지식을 흡수합니다. 이 단계를 마친 모델을 흔히 '기반 모델(base model)' 또는 '원본 모델'이라고 부릅니다. 기반 모델은 지식이 풍부하지만 성격이 묘합니다. 질문을 던지면 답을 하기보다 비슷한 질문을 계속 나열하거나, 문장을 그럴듯하게 이어 쓰는 데만 몰두합니다. 인터넷 문서의 통계를 학습했으니 '다음에 올 법한 텍스트'를 내놓을 뿐, 사람의 의도를 따르도록 배운 적이 없기 때문입니다.
기반 모델을 쓸 만한 조수로 바꾸는 첫 손질이 지도 파인튜닝(supervised fine-tuning, SFT)입니다. 파인튜닝(미세조정)은 이미 학습을 마친 모델에 자료를 더 넣어 다시 학습시키는 일입니다. SFT에서는 사람이 직접 작성한 '좋은 질문-좋은 답변' 쌍 수천~수만 건을 모아 다시 학습시킵니다. 이 과정에서 모델은 '지시가 들어오면 그에 맞춰 답한다'는 형식을 익힙니다. 여기까지만 해도 지시를 따르는(instruction-following) 모델이 되지만, 답변의 품질을 사람 취향에 맞게 세밀히 조율하지는 못합니다.
마지막 손질이 인간 피드백 기반 강화학습(RLHF, Reinforcement Learning from Human Feedback)입니다. 강화학습은 잘한 행동에는 점수를 더 주면서 점수가 높아지는 쪽으로 스스로 고쳐 가게 하는 학습 방식입니다. 같은 질문에 모델이 여러 답을 내놓게 하고, 사람이 어느 답이 더 나은지 순위를 매깁니다. 이 순위 데이터로 사람 대신 답변에 점수를 매겨 주는 채점용 모델인 '보상 모델(reward model)'을 따로 학습한 뒤, 원래 모델이 보상을 최대화하도록 강화학습으로 다시 조정합니다. 이 단계를 거치면 답변이 공손해지고, 위험한 요청을 거절하며, 두서없는 반복이 정리됩니다. 오늘날 우리가 대화형으로 쓰는 모델은 사실상 이 세 겹의 가공을 모두 통과한 결과물입니다.
이 두 번째와 세 번째 단계를 묶어 정렬(alignment, 모델이 사람의 의도와 가치에 맞게 행동하도록 맞추는 일)이라고 부릅니다. 핵심은 이렇습니다. 능력의 바탕은 사전학습이 만들지만, 그 능력을 '쓸 만하게' 다듬는 것은 정렬 단계입니다. 성능 좋은 기반 모델도 정렬을 잘못하면 쓰기 어려워지고, 평범한 기반 모델도 정렬을 잘하면 체감 품질이 크게 오릅니다. 강화학습 과정을 더 단순하게 만든 최근 기법은 글 끝 심화 절에서 다룹니다.
컨텍스트 창이라는 작업 기억의 한계
LLM에는 한 번에 처리할 수 있는 토큰 수의 상한이 있습니다. 이를 컨텍스트 창(context window, 모델이 한 번에 읽고 쓸 수 있는 글의 최대 길이)이라고 부릅니다. 초기 모델은 수천 토큰 안팎이었지만, 요즘은 수만에서 수십만 토큰을 다루는 모델도 나옵니다. 컨텍스트 창은 사람으로 치면 작업 기억에 해당합니다. 창 밖으로 밀려난 내용은 모델이 '잊어버린' 것과 같습니다. 긴 대화를 나누다 보면 앞서 한 말을 모델이 놓치는 이유가 여기에 있습니다.
컨텍스트를 늘리는 일은 생각보다 어렵습니다. 모든 토큰이 서로를 한 번씩 보는 어텐션의 계산량이 토큰 수의 제곱에 가깝게 늘기 때문입니다. 토큰이 두 배가 되면 계산량은 대략 네 배가 됩니다. 구체적인 기법은 글 끝 심화 절에 모았습니다.
다만 컨텍스트가 길다고 만능은 아닙니다. 실무에서는 '중간 소실(lost in the middle)' 현상이 잘 알려져 있습니다. 입력의 맨 앞과 맨 뒤에 놓인 정보는 잘 활용하지만, 한가운데 묻힌 정보는 놓치기 쉽습니다. 그래서 검색 증강 생성(RAG, 답하기 전에 관련 문서를 먼저 찾아 붙여 주는 방식) 파이프라인을 설계할 때는 중요한 근거 문서를 프롬프트의 맨 앞이나 맨 뒤에 놓는 편이 유리합니다. 컨텍스트 창은 넓힐수록 좋지만, 넓은 창을 어떻게 채우느냐가 실제 품질을 좌우합니다.
환각은 버그가 아니라 설계의 그림자
가장 흔한 오해는 LLM이 사실을 '알고' 있어서 답한다는 생각입니다. 실제로는 학습한 통계에 비추어 가장 그럴듯한 다음 토큰을 이어 붙일 뿐입니다. 그럴듯함과 정확함은 다릅니다. 그래서 자신 있게 틀린 내용을 지어내는 환각(hallucination, 사실이 아닌 내용을 그럴듯하게 지어내는 현상)이 생깁니다. 앞의 공지문에 들어간 가짜 버스 출발 시각이 바로 환각입니다. LLM은 진실 검증기가 아니라 확률적 문장 생성기라는 점을 늘 염두에 둬야 합니다.
흔히 환각을 고쳐야 할 결함으로 여기지만, 원리를 들여다보면 이 기술의 작동 방식에서 자연스럽게 따라 나오는 성질입니다. 모델은 '진실'을 저장한 데이터베이스가 아닙니다. 다음 토큰의 확률 분포를 계산해 가장 그럴듯한 이어짐을 생성할 뿐입니다. 존재하지 않는 논문 제목이나 가짜 프로그램 기능도, 통계적으로 '있을 법한' 형태라면 자신 있게 만들어 냅니다.
환각이 특히 잘 터지는 지점이 있습니다. 학습 데이터에 드물게 등장한 고유명사, 최신 사건, 정밀한 수치, 인용 출처가 대표적입니다. 모델 내부에는 이런 세부 사실을 정확히 저장할 자리가 부족하고, 부족한 부분을 통계적 그럴듯함으로 메웁니다. 사람으로 치면 반쯤 아는 이야기를 자신감 있게 매끄럽게 지어내는 상황과 비슷합니다. 문제는 모델이 '내가 모른다'는 신호를 스스로 잘 내지 못한다는 데 있습니다.
실무에서 환각을 줄이는 방법은 모델 자체를 고치는 쪽과 사용 방식을 바꾸는 쪽으로 나뉩니다. 아래 표에 대표적인 접근을 정리했습니다.
| 접근 방법 | 핵심 원리 | 한계 |
|---|---|---|
| RAG(검색 증강) | 외부 문서를 근거로 붙여 사실을 참조 | 검색 품질이 낮으면 그대로 오염 |
| 출처 인용 강제 | 근거 없는 주장을 억제 | 인용 자체를 지어낼 위험 |
| 디코딩 온도 낮추기 | 무작위성을 줄여 안전한 답 유도 | 창의성·다양성 저하 |
| 자기검증 프롬프트 | 답을 재검토하게 유도 | 계산 비용 증가, 완전 제거 불가 |
환각을 0으로 만드는 해법은 아직 없습니다. 그래서 실무에서는 관점을 바꾸는 편이 낫습니다. '모델이 절대 틀리지 않게 한다'가 아니라 '틀렸을 때 검증할 수 있는 구조를 만든다'로 말입니다. 의료·법률·금융처럼 오류 비용이 큰 영역에서는 반드시 출처를 붙이고 사람이 최종 확인하는 절차를 넣습니다. 공지문이라면 날짜와 시각, 장소만큼은 사람이 원본과 대조합니다. 환각은 이 기술의 그림자입니다. 빛을 쓰려면 그림자를 관리하는 설계가 필요합니다.
구조적 한계도 여전합니다. 학습을 마친 시점 이후의 최신 지식을 담지 못하는 문제, 학습 데이터에 스며든 편향의 문제가 대표적입니다. 이런 약점을 보완하려고 외부 지식을 검색해 붙여 주는 RAG나, 이미 학습한 모델에 특정 분야의 자료를 더 가르치는 파인튜닝이 실무에서 함께 쓰입니다.
단일 모델을 넘어: 에이전트와 도구 사용
LLM은 태생적으로 텍스트를 예측하는 장치입니다. 계산기를 두드리거나 실시간 정보를 검색하거나 파일을 저장하는 능력은 없습니다. 그래서 요즘은 모델이 "이 도구를 이 값으로 불러 달라"는 주문서를 쓰면 바깥 프로그램이 실제로 실행해 결과를 돌려주는 도구 사용(tool use)을 붙이고, 이 과정을 여러 단계로 되풀이하는 에이전트(agent)로 확장합니다. 확률적 다음 토큰 예측이라는 단순한 원리가, 이 반복 루프 안에서는 '생각하고 행동하는' 것처럼 보이는 행동으로 넓어진 것입니다. 자세한 작동과 한계는 AI 에이전트 글에서 다루고, 구현 쪽 이야기는 글 끝 심화 절에 모았습니다.
더 깊이 파고들려면
LLM의 탄생을 제대로 이해하려면 원전을 직접 읽어 보는 것이 가장 빠릅니다. 임베딩의 뿌리를 알고 싶다면 벤지오의 신경 확률 언어 모델을, 순서 처리의 진화를 보고 싶다면 미콜로프의 RNN 언어 모델과 호흐라이터의 LSTM을 권합니다. 문장 전체를 다른 문장으로 바꾸는 발상은 시퀀스 투 시퀀스 논문에서 확인할 수 있습니다.
무엇보다 트랜스포머를 제안한 '어텐션이 전부다'는 반드시 거쳐야 할 관문입니다. 오늘날 거의 모든 LLM의 뼈대가 여기서 나왔기 때문입니다. 규모가 만든 도약을 실감하려면 GPT-3 논문과 스케일링 법칙을 나란히 읽어 보면 좋습니다. 왜 큰 모델에 투자하는지, 왜 예시 몇 개만으로 새 과제를 풀어내는지가 함께 이해됩니다.
개념 사이의 연결도 놓치지 마세요. 토큰화는 임베딩으로, 임베딩은 어텐션으로, 어텐션은 확률 분포와 디코딩으로 이어집니다. 그 바깥에는 사전학습과 정렬, 그리고 프롬프트 엔지니어링, RAG, 파인튜닝 같은 활용 기법이 자리합니다. 이 지도를 머릿속에 그려 두면, 새로운 모델이나 기법이 나와도 '이것이 다섯 정거장 중 어디를 개선한 것인가'를 스스로 가늠할 수 있습니다. 그것이 LLM의 탄생사를 공부하는 진짜 이유입니다.
개발자를 위한 심화
이 부분은 직접 구현하는 개발자를 위한 내용입니다.
보상 모델 없이 정렬하기: DPO
최근에는 RLHF의 복잡한 강화학습 파이프라인을 단순화한 직접 선호 최적화(DPO, Direct Preference Optimization) 같은 기법도 널리 쓰입니다. 보상 모델을 명시적으로 만들지 않고 '이 답이 저 답보다 낫다'는 선호 데이터로 곧장 모델의 출력 경향(강화학습 용어로 정책, policy)을 조정하는 방식입니다. 어느 쪽이든 정렬의 목표는 같습니다.
긴 컨텍스트를 가능하게 한 기법
앞에서 본 제곱 비용 때문에, 1만 토큰을 처리하던 모델을 10만 토큰으로 늘리면 어텐션 비용은 100배 수준으로 불어납니다. 그래서 긴 컨텍스트는 단순히 상한선을 푼다고 되는 일이 아니라, 계산 구조 자체를 손봐야 하는 공학 문제입니다. 어텐션 행렬을 그대로 만드는 표준 구현에서는 메모리도 같은 비율로 늡니다. 이 문제를 풀려고 여러 기법이 등장했습니다. 위치 정보를 상대적으로 인코딩하는 회전 위치 임베딩(RoPE)과 그 보간(interpolation, 긴 위치 번호를 학습 때 본 범위 안으로 눌러 담는 방법)으로 학습 때보다 긴 입력에 적응시키고, 플래시어텐션(FlashAttention)으로 GPU 메모리 접근을 최적화해 실질 처리 길이를 늘립니다. 모든 토큰이 모든 토큰을 보지 않고 일부만 보게 하는 희소 어텐션(sparse attention)도 쓰입니다. 이런 기법 덕분에 긴 문서 요약이나 코드베이스 전체 분석 같은 작업이 가능해졌습니다.
토큰당 비용과 지연: 서비스에 얹으면 마주하는 현실
연구 논문에서는 잘 드러나지 않지만, LLM을 실제 서비스에 얹으면 곧바로 비용 문제와 마주칩니다. 대부분의 상용 API(프로그램끼리 정해진 방식으로 요청과 답을 주고받는 창구)는 처리한 토큰 수로 요금을 매깁니다. 입력 토큰과 출력 토큰의 단가가 다르고, 보통 출력이 더 비쌉니다. 여기서 앞서 설명한 토큰화가 다시 등장합니다. 같은 의미라도 한국어는 영어보다 토큰을 더 많이 쓰는 경향이 있어, 다국어 서비스에서는 언어별 비용 차이를 반드시 계산에 넣어야 합니다.
지연(latency, 요청하고 답이 오기까지 걸리는 시간)도 무시할 수 없습니다. LLM은 앞에서 본 자기회귀 방식으로 토큰을 하나씩 순서대로 만듭니다. 앞 토큰을 만들어야 다음 토큰을 계산할 수 있으니, 출력이 길수록 응답이 늦어집니다. 그래서 첫 토큰이 나오기까지의 시간과 토큰당 생성 속도를 나눠서 관리합니다. ChatGPT 화면에 답이 한 글자씩 흘러나오는 것도 이 때문입니다. 완성된 답을 한꺼번에 주기보다 생성되는 대로 흘려보내는 이 방식을 스트리밍(streaming)이라고 부르며, 사용자가 기다리는 느낌을 줄여 줍니다.
비용과 지연을 함께 잡는 실전 전략이 여럿 있습니다. 자주 반복되는 시스템 프롬프트(모든 대화 앞에 붙는 기본 지침)는 캐싱(한 번 계산한 결과를 저장해 두고 다시 쓰는 것)해 재사용하고, 간단한 질의는 작은 모델로, 어려운 질의만 큰 모델로 넘기는 라우팅을 씁니다. 또 불필요하게 긴 출력을 요구하지 않도록 프롬프트에서 형식과 분량을 명시합니다. 성능 좋은 모델을 고르는 것만큼이나, 토큰을 아끼고 응답을 빠르게 만드는 설계가 서비스 품질을 좌우합니다.
지연 지표와 KV 캐시
앞에서 말한 첫 토큰까지의 시간은 흔히 TTFT(time to first token)라고 부릅니다. 반복 계산을 줄이는 핵심 장치가 KV 캐시(key-value cache)입니다. 자기어텐션에서 이미 계산한 이전 토큰들의 키(key, 각 토큰이 가진 정보의 꼬리표)와 값(value, 실제로 전달할 내용) 벡터를 저장해 두고, 새 토큰을 생성할 때 재활용합니다. 이 캐시가 없으면 토큰마다 전체 문맥을 다시 계산해야 해 속도가 크게 떨어집니다. 다만 KV 캐시는 컨텍스트가 길수록 GPU 메모리를 많이 차지합니다. 긴 컨텍스트의 실질적 병목이 계산량뿐 아니라 이 캐시 메모리라는 점은 실무에서 자주 간과됩니다.
도구 사용과 에이전트, 그리고 확장
본문에서 본 도구 사용은 API 쪽에서 함수 호출(function calling)이라고도 부릅니다. 모델이 '지금은 계산기가 필요하다'고 판단하면, 정해진 형식으로 "이 도구를 이 값으로 불러 달라"는 주문서를 출력합니다. 바깥 시스템이 그 호출을 실제로 실행하고 결과를 다시 모델에게 돌려줍니다. 모델은 그 결과를 근거로 최종 답을 완성합니다. 이렇게 하면 LLM의 언어 능력과 외부 시스템의 정확성을 결합할 수 있습니다.
이 구조를 여러 단계로 확장한 것이 에이전트입니다. 에이전트는 목표를 받으면 스스로 계획을 세우고, 필요한 도구를 골라 실행하고, 결과를 보고 다음 행동을 정합니다. 추론과 행동을 번갈아 엮는 ReAct(Reasoning + Acting) 패턴이 이런 에이전트 설계의 대표적인 뼈대입니다.
최근 이 생태계를 표준화하려는 시도도 활발합니다. 모델이 외부 도구·데이터와 일관된 방식으로 연결되도록 규약을 정한 모델 컨텍스트 프로토콜(MCP, Model Context Protocol)이 대표적입니다. 표준이 자리 잡으면 서비스마다 도구 연동을 새로 짜지 않고 재사용할 수 있습니다. LLM을 하나의 완결된 두뇌로 보던 시각에서, 여러 도구를 지휘하는 조율자로 보는 시각으로 무게중심이 옮겨 가고 있다는 뜻입니다.
다만 에이전트에는 새로운 함정이 따라옵니다. 단계가 늘수록 중간에 한 번 판단을 잘못하면 오류가 뒤로 누적됩니다. 무한 루프에 빠지거나, 불필요한 도구 호출로 비용이 크게 늘기도 합니다. 게다가 외부 도구를 실행할 권한을 주는 순간 공격받을 수 있는 틈도 넓어집니다. 악의적으로 조작된 입력이 프롬프트에 섞여 들어와 의도하지 않은 행동을 일으키는 프롬프트 인젝션(prompt injection)은 특히 조심해야 합니다. 에이전트 설계는 결국 '얼마나 자유롭게 풀어 주되 어떻게 안전하게 가둘 것인가'의 균형을 잡는 일입니다.