3. LLM은 어떻게 답을 만들까
3. LLM은 어떻게 답을 만들까

그럴듯한 답은 어떻게 탄생할까
LLM을 처음 써 보면 신기한 순간이 자주 찾아옵니다. 내가 질문을 던지면, 마치 뜻을 다 이해한 것처럼 또박또박 답을 내놓기 때문입니다. 그래서 많은 사람이 속으로 이렇게 묻습니다. "이 모델은 정말 생각을 하는 걸까?"
결론부터 말하면, LLM은 사람처럼 머릿속에서 의미를 곱씹으며 생각하는 방식과는 다르게 움직입니다. 대신 지금까지 들어온 문맥을 바탕으로, 다음에 어떤 토큰이 오면 가장 자연스러운지 매우 빠르게 계산합니다. 그리고 그 계산을 한 번 하고 끝내는 것이 아니라, 토큰을 하나 뽑고, 또 그다음 토큰을 뽑고, 다시 그다음을 뽑는 식으로 반복합니다.
겉으로 보면 한 번에 문장을 통째로 만들어 내는 것처럼 보이지만, 실제로는 작은 선택이 쌓여서 긴 답이 됩니다. 비유하자면, 소설가가 한 페이지를 머릿속에서 완성해 적는 느낌이라기보다, 아주 똑똑한 자동완성이 매 순간 "지금 여기에는 이 표현이 가장 어울린다"를 이어 가는 모습에 가깝습니다.
이 장에서는 바로 그 과정을 들여다봅니다. 특히 로컬 LLM을 다룰 때 자주 듣게 될 다섯 가지 핵심, 트랜스포머, 다음 토큰 예측, 컨텍스트, KV 캐시, 추론 과정을 차근차근 이해해 보겠습니다.
먼저 큰 그림부터: 답변은 한 번에 나오지 않는다
사용자가 채팅창에 질문을 입력하면, 모델 안에서는 대략 이런 흐름이 일어납니다.
입력 문장을 토큰 단위로 나눕니다.
지금까지의 문맥을 보고 각 토큰이 서로 어떤 관계인지 계산합니다.
다음에 올 가능성이 높은 토큰 후보를 고릅니다.
그중 하나를 선택해 출력합니다.
방금 만든 토큰까지 포함해 다시 같은 과정을 반복합니다.
이 다섯 줄이 LLM의 답변 생성 과정을 거의 설명해 줍니다. 어려워 보일 수 있지만, 핵심은 단순합니다. 앞에서 나온 내용을 참고해, 다음 한 조각을 계속 붙여 나간다는 것입니다.
예를 들어 사용자가 "비 오는 날 먹기 좋은 음식 추천해 줘"라고 입력했다고 해 봅시다. 모델은 이 문장을 읽은 뒤, 답변의 첫 토큰으로 "비"나 "이럴"이나 "따뜻한"처럼 여러 후보를 떠올릴 수 있습니다. 그중 현재 문맥에 가장 잘 맞는 것을 하나 고르고, 그다음 토큰을 다시 예측합니다. 이렇게 이어 가다 보면 "비 오는 날에는 따뜻한 국물 요리나 전이 잘 어울립니다" 같은 문장이 만들어집니다.
중요한 점은 모델이 처음부터 이 문장 전체를 한꺼번에 들고 있는 것이 아니라, 바로 직전까지 완성된 문장을 발판 삼아 한 걸음씩 나아간다는 사실입니다.
다음 토큰 예측이란 무엇인가
LLM의 심장을 한 문장으로 말하면 이것입니다.
LLM은 다음 토큰을 예측하는 기계다.
이 말은 너무 단순해서 오히려 실감이 안 날 수 있습니다. 하지만 실제로는 이 단순한 규칙이 엄청난 힘을 발휘합니다.
사람도 대화를 할 때 어느 정도는 다음 말을 예측합니다. 누군가 "오늘 날씨가 너무…"라고 말하면 "덥다", "춥다", "좋다" 같은 말이 이어질 가능성을 떠올릴 수 있습니다. LLM도 비슷합니다. 다만 사람처럼 감각적으로 떠올리는 것이 아니라, 학습 때 익힌 수많은 언어 패턴을 바탕으로 각 후보가 나올 확률을 계산합니다.
예를 들어 문장이 이렇게 시작한다고 해 봅시다.
"대한민국의 수도는"
이 다음에는 "서울"이 올 가능성이 매우 높습니다. 반면 "고양이"가 올 가능성은 훨씬 낮습니다. 모델은 이런 가능성을 숫자로 계산한 뒤, 높은 쪽을 선택합니다.
그런데 여기서 흥미로운 점이 있습니다. LLM은 단순히 상식 문제만 푸는 기계가 아닙니다. 이야기를 이어 쓰거나, 이메일을 정중하게 고치거나, 코드 예시를 만드는 것도 결국은 문맥에 맞는 다음 토큰을 고르는 일로 바꿔 생각할 수 있습니다.
즉, 요약도 다음 토큰 예측이고, 번역도 다음 토큰 예측이고, 설명문 작성도 다음 토큰 예측입니다. 겉으로는 여러 능력처럼 보이지만, 내부의 기본 엔진은 하나입니다.
그런데 왜 이렇게 말이 자연스러울까
여기서 초보자가 가장 궁금해하는 지점이 나옵니다. "다음 토큰만 고른다면서, 왜 답이 이렇게 그럴듯하지?"
이유는 간단하면서도 강력합니다. 언어에서 자연스러움은 앞뒤 맥락과의 연결에서 나오기 때문입니다.
사람이 쓴 글도 사실은 이전 문장과 다음 문장의 관계로 읽힙니다. 문장이 자연스럽다는 것은 단어 하나하나가 고급스럽기 때문만이 아니라, 앞에서 한 말과 뒤에서 이어지는 말이 잘 맞아떨어지기 때문입니다. LLM은 이 연결 패턴을 엄청나게 많이 학습했습니다.
예를 들어 설명문에서는 정의를 먼저 말하고 예시를 들 가능성이 높고, 친절한 안내문에서는 명령조보다 부드러운 표현이 자주 쓰이며, 코드 설명에서는 원인과 결과가 짝을 이룹니다. 모델은 이런 흐름을 수없이 본 덕분에 꽤 자연스러운 문장을 만들어 냅니다.
다시 말해, LLM이 그럴듯하게 말하는 이유는 마법 같은 이해력 때문만이 아니라, 언어의 흐름을 매우 정교하게 흉내 낼 수 있기 때문입니다.
컨텍스트: 모델이 지금 참고하는 작업대
LLM을 이해할 때 반드시 알아야 할 단어가 컨텍스트(context)입니다. 우리말로는 보통 문맥이라고 부릅니다.
컨텍스트는 모델이 답을 만들 때 지금 눈앞에 펼쳐 놓고 참고하는 정보 묶음입니다. 사용자의 질문만 들어 있는 것이 아니라, 그 앞의 대화, 시스템 지시문, 예시 답변, 방금까지 모델이 생성한 내용도 함께 포함될 수 있습니다.
쉽게 말해 컨텍스트는 모델의 현재 작업대입니다. 작업대 위에 올라온 재료를 보고 답을 만드는 것이지, 세상 모든 정보를 그 순간에 자유롭게 꺼내 보는 것은 아닙니다.
예를 들어 같은 질문이라도 앞에 어떤 문맥이 붙느냐에 따라 답이 달라집니다.
"사과를 설명해 줘"라는 요청만 있으면 과일 이야기를 할 수도 있습니다. 하지만 바로 앞 대화에서 "애플의 신제품 발표를 봤어"라고 했다면, 이번에는 회사나 제품 이야기를 할 가능성이 커집니다. 즉, 모델은 단어 자체만 보는 것이 아니라 앞뒤 맥락 속에서 의미를 해석합니다.
로컬 LLM을 쓸 때 이 개념이 중요한 이유는 아주 분명합니다. 문맥이 길어질수록 모델이 더 많은 내용을 참고할 수 있지만, 그만큼 메모리와 계산량도 늘어납니다. 그래서 나중에 모델을 실행할 때는 "긴 대화를 잘 기억하게 할 것인가"와 "속도를 빠르게 유지할 것인가" 사이에서 균형을 잡아야 합니다.
컨텍스트는 기억과 비슷하지만, 사람의 기억과는 다르다
초보자는 종종 이렇게 생각합니다. "아, 컨텍스트는 모델의 기억이구나." 절반은 맞고 절반은 다릅니다.
맞는 이유는, 모델이 현재 답변을 만들 때 실제로 참고하는 정보가 컨텍스트이기 때문입니다. 앞 대화가 컨텍스트에 들어 있으면 모델은 그 내용을 이어서 말할 수 있습니다.
하지만 사람의 장기 기억과는 다릅니다. 사람은 오랜 시간에 걸쳐 중요한 내용을 머릿속에 압축해 남기지만, LLM은 기본적으로 현재 창 안에 들어온 토큰 범위를 중심으로 계산합니다. 컨텍스트 창에서 밀려난 예전 대화는 직접 참고하기 어려워집니다.
그래서 아주 긴 대화를 하다 보면 모델이 예전 약속을 잊어버리는 것처럼 보일 때가 있습니다. 사실은 "완전히 기억 상실"이라기보다, 현재 작업대에서 그 내용이 멀어졌기 때문이라고 이해하는 편이 더 정확합니다.
트랜스포머: LLM의 핵심 설계도
이제 LLM 내부 구조의 대표 선수인 트랜스포머(Transformer)를 만나 볼 차례입니다.
이 이름은 자주 들리지만, 처음엔 조금 겁이 날 수 있습니다. 이름만 보면 거대한 로봇 같지만, 초보자에게 필요한 핵심은 훨씬 간단합니다.
트랜스포머는 문장 안의 각 토큰이 서로 어떤 관련이 있는지 잘 살피도록 만든 구조입니다.
예를 들어 이런 문장을 봅시다.
"민수는 우산을 들고 나갔다. 하늘이 흐렸기 때문이다."
여기서 "그 때문이다"의 "그"가 정확히 무엇을 가리키는지 이해하려면 앞 문장을 참고해야 합니다. 또 "우산"이라는 단어는 "하늘이 흐렸다", "비가 올 것 같다" 같은 표현과 관계를 맺습니다. 자연어는 이렇게 멀리 떨어진 단어끼리도 연결됩니다.
예전 방식의 모델은 긴 문장에서 이런 연결을 다루는 데 불편함이 있었습니다. 하지만 트랜스포머는 문장 전체에서 어떤 단어가 어떤 단어를 중요하게 봐야 하는지 계산하는 데 강한 구조입니다. 그래서 긴 문장, 복잡한 문맥, 여러 의미 관계를 비교적 잘 처리할 수 있습니다.
초보자 눈높이에서는 이렇게 기억하면 충분합니다.
트랜스포머는 문장을 왼쪽에서 오른쪽으로 무작정 읽기만 하는 것이 아니라, 현재 토큰을 이해할 때 문맥 속 다른 토큰들을 폭넓게 참조할 수 있게 만든 설계입니다.
어텐션: 어디를 더 주의 깊게 볼까
트랜스포머를 설명할 때 빠지지 않는 단어가 어텐션(attention)입니다. 한국어로는 주의 메커니즘 정도로 이해하면 됩니다.
이름 그대로, 모델이 문장을 처리할 때 지금 이 토큰을 이해하려면 앞의 어떤 토큰들을 더 중요하게 봐야 할까를 계산하는 장치입니다.
예를 들어 "철수는 영희에게 책을 빌려주었다. 그녀는 고맙다고 말했다."라는 문장에서 "그녀"가 누구를 가리키는지 보려면 모델은 앞부분의 "영희"에 주목해야 할 가능성이 큽니다. 반면 "책"이라는 단어는 여기서 상대적으로 덜 중요할 수 있습니다.
어텐션을 사람식으로 비유하면, 긴 문장을 읽을 때 형광펜으로 중요한 부분을 순간순간 표시하는 일과 비슷합니다. 다만 사람은 감각적으로 표시하지만, 모델은 수치 계산으로 표시합니다.
이 어텐션 덕분에 LLM은 단순히 앞 단어 하나만 보고 다음 말을 정하는 것이 아니라, 문장 전체에서 필요한 단서를 골라 보며 다음 토큰을 예측할 수 있습니다.
트랜스포머를 너무 어렵게 볼 필요는 없다
트랜스포머를 처음 배울 때 수식과 도표를 만나면 갑자기 머리가 무거워질 수 있습니다. 하지만 로컬 LLM을 잘 활용하는 데 꼭 필요한 수준은 그보다 단순합니다.
우리가 꼭 잡아야 할 핵심은 세 가지입니다.
트랜스포머는 토큰 사이의 관계를 잘 본다.
어텐션은 지금 중요한 문맥이 무엇인지 골라 본다.
그래서 LLM은 앞뒤 맥락에 맞는 자연스러운 답을 만들 수 있다.
이 세 줄만 이해해도 충분히 큰 진전을 이룬 것입니다. 이후 장에서 모델 크기나 속도, 문맥 길이, 메모리 사용량을 이야기할 때도 이 구조를 바탕으로 생각하면 훨씬 수월합니다.
추론은 실제 답을 생성하는 순간이다
이제 추론(inference)을 더 구체적으로 들여다보겠습니다. 이전 장에서 추론은 학습과 다른 단계라고 배웠습니다. 여기서는 "실제로 무슨 일이 일어나는가"에 집중해 보겠습니다.
추론은 이미 학습이 끝난 모델이, 사용자의 입력을 받아 지금 이 순간 답을 생성하는 과정입니다. 우리가 Ollama로 모델을 실행하고, Open WebUI에서 질문을 던지고, 답변이 한 줄씩 나타나는 바로 그 순간이 추론입니다.
이 과정을 순서대로 풀어 보면 다음과 같습니다.
1단계: 입력을 토큰으로 바꾼다
사람이 보기에는 문장이나 질문이지만, 모델은 바로 글자를 이해하지 않습니다. 먼저 입력을 토큰으로 나눕니다. 이 토큰들은 모델이 계산하기 좋은 형태의 조각입니다.
예를 들어 "초보자도 알기 쉽게 설명해 줘"라는 문장은 내부적으로 몇 개의 토큰으로 쪼개져 처리됩니다. 한국어는 특히 조사와 어미, 단어 조합의 특성 때문에 생각보다 더 잘게 나뉘기도 합니다.
2단계: 각 토큰을 숫자 표현으로 바꾼다
모델은 텍스트를 그대로 다루는 것이 아니라 숫자로 다룹니다. 그래서 토큰을 내부의 숫자 벡터로 바꿉니다. 쉽게 말하면, "단어 조각"을 모델이 계산할 수 있는 "숫자 좌표"로 바꾸는 것입니다.
이 단계부터는 사람 눈에는 보이지 않지만, 모델에게는 매우 중요한 준비 운동입니다.
3단계: 트랜스포머가 문맥 관계를 계산한다
이제 트랜스포머가 등장합니다. 각 토큰이 서로 어떤 관련이 있는지, 지금 어떤 단어를 중요하게 봐야 하는지, 앞부분의 어떤 표현이 현재 의미 해석에 영향을 주는지를 계산합니다.
여기서 어텐션이 큰 역할을 합니다. 지금 만들어야 할 답의 방향에 맞춰, 문맥 속 중요한 부분에 더 무게를 두게 됩니다.
4단계: 다음 토큰 후보들의 점수를 계산한다
문맥 계산이 끝나면 모델은 "다음에는 어떤 토큰이 오면 좋을까?"를 평가합니다. 이때 여러 후보가 생기고, 각 후보마다 점수나 확률 같은 값이 붙습니다.
예를 들어 "LLM은" 다음에 "대규모", "언어", "생각한다", "자동차" 같은 후보가 있을 수 있는데, 현재 문맥에 맞는 후보가 더 높은 점수를 받습니다.
5단계: 하나를 선택해 출력한다
후보 중에서 하나를 고릅니다. 가장 높은 것을 그대로 고를 수도 있고, 약간의 다양성을 주기 위해 확률적으로 고를 수도 있습니다. 그래서 같은 질문에 답이 조금씩 달라질 수 있습니다.
초보자 관점에서는 이렇게 이해하면 됩니다. 모델은 무작위로 아무 말이나 하는 것이 아니라, 가능성이 높은 후보들 중에서 하나를 선택합니다.
6단계: 방금 만든 토큰을 문맥에 붙이고 반복한다
이제 끝이 아닙니다. 방금 출력한 토큰도 새로운 문맥의 일부가 됩니다. 그 상태에서 다시 다음 토큰을 예측합니다. 이 반복이 매우 빠르게 이어지면서, 우리 눈에는 한 문장 전체가 자연스럽게 흘러나오는 것처럼 보입니다.
결국 답변 하나는 한 번의 거대한 점프가 아니라, 아주 작은 예측의 연속으로 만들어집니다.
답변이 한 글자씩 나오는 것처럼 보이는 이유
로컬 LLM을 직접 실행해 보면 답변이 줄줄 흘러나오는 모습을 보게 됩니다. 마치 사람이 타이핑하는 것처럼 보이기도 합니다.
이것은 실제로 모델이 사람처럼 자판을 치고 있어서가 아니라, 토큰을 순서대로 생성하고 있기 때문입니다. 어떤 환경에서는 이 토큰이 단어처럼 보이고, 어떤 환경에서는 단어 조각처럼 보일 수 있습니다. 그래서 출력이 아주 부드럽게 이어질 때도 있고, 살짝 끊겨 보일 때도 있습니다.
이 특징은 로컬 환경에서 특히 체감이 큽니다. 내 컴퓨터의 CPU, GPU, 메모리 성능에 따라 토큰 생성 속도가 달라지기 때문입니다. 나중에 모델을 바꿨을 때 "왜 어떤 모델은 더 느리지?" 같은 질문이 생기면, 지금 배운 이 생성 방식을 떠올리면 이해가 쉬워집니다.
KV 캐시: 왜 이전 계산을 다시 하지 않을까
이제 로컬 LLM에서 아주 중요한 개념인 KV 캐시(Key-Value Cache)를 살펴보겠습니다.
이 이름은 처음 들으면 정말 어렵습니다. 하지만 역할 자체는 꽤 직관적입니다. 한마디로 말하면, 이미 계산한 문맥 정보를 저장해 두었다가 다음 토큰을 만들 때 다시 활용하는 장치입니다.
비유를 하나 들어 보겠습니다. 긴 문서를 읽으며 요약문을 쓰고 있다고 합시다. 매 문장을 쓸 때마다 앞에서 읽은 10페이지를 처음부터 다시 정독한다면 너무 느릴 것입니다. 대신 중요한 내용을 메모해 두고, 다음 문장을 쓸 때 그 메모를 참고하면 훨씬 빠르겠지요. KV 캐시는 바로 그런 메모장과 비슷합니다.
모델이 첫 번째 토큰, 두 번째 토큰, 세 번째 토큰을 만들 때마다 문맥에 대한 여러 계산이 일어납니다. 그런데 다음 토큰을 만들 때마다 예전 부분을 전부 처음부터 다시 계산하면 시간이 엄청 걸립니다. 그래서 모델은 이전 토큰들에서 얻은 핵심 정보를 캐시에 저장해 두고, 새 토큰이 들어왔을 때 그 저장된 값을 활용합니다.
이 덕분에 긴 답변도 훨씬 효율적으로 생성할 수 있습니다.
KV 캐시를 쉽게 이해하는 비유
KV 캐시를 이해하는 가장 쉬운 방법은 "대화 중간 메모"라고 생각하는 것입니다.
사용자가 이미 말한 내용의 핵심 흔적을 저장해 둡니다.
다음 토큰을 계산할 때 그 흔적을 다시 참고합니다.
덕분에 처음부터 전부 재계산하지 않아도 됩니다.
이때 중요한 것은, KV 캐시는 모델의 영구 기억이 아니라는 점입니다. 세션이 끝나거나 문맥이 바뀌면 함께 사라질 수 있습니다. 즉, 오래 보관하는 지식 창고라기보다 지금 대화를 빠르게 이어 가기 위한 임시 작업 메모에 가깝습니다.
왜 로컬 LLM에서 KV 캐시가 중요할까
클라우드 서비스만 쓸 때는 KV 캐시를 몰라도 큰 불편이 없습니다. 하지만 로컬 LLM을 다루면 이야기가 달라집니다. 이 개념은 속도와 메모리에 직접 연결되기 때문입니다.
답변이 길어지고 대화가 길어질수록 저장해야 할 캐시도 늘어납니다. 즉, KV 캐시는 속도를 올려 주는 고마운 존재이지만, 동시에 메모리를 차지합니다. 그래서 로컬 환경에서는 다음과 같은 일이 벌어집니다.
문맥이 길수록 KV 캐시가 커질 수 있습니다.
캐시가 커질수록 메모리 부담이 늘어날 수 있습니다.
메모리가 부족하면 속도가 떨어지거나 실행이 버거워질 수 있습니다.
바로 이 이유 때문에 나중에 모델 실행 실습을 할 때 "문맥 길이", "메모리 사용량", "응답 속도"가 늘 함께 따라다닙니다. 단순히 모델 파일 크기만 보면 안 되고, 실행 중에 쌓이는 작업 메모까지 생각해야 한다는 뜻입니다.
컨텍스트와 KV 캐시는 어떻게 다를까
이 둘은 비슷해 보여서 자주 헷갈립니다. 하지만 역할은 조금 다릅니다.
컨텍스트는 모델이 무엇을 참고할 것인가에 관한 개념입니다. 지금 대화에서 어떤 내용이 작업대 위에 올라와 있는지를 뜻합니다.
KV 캐시는 그 컨텍스트를 바탕으로 계산한 결과를 어떻게 효율적으로 재사용할 것인가에 관한 장치입니다.
즉, 컨텍스트가 요리 재료라면 KV 캐시는 손질해 둔 재료 메모나 중간 준비물에 가깝습니다. 둘 다 중요하지만, 하나는 내용이고 다른 하나는 계산 효율입니다.
모델은 정말 이해하는 걸까
이쯤 되면 다시 처음 질문으로 돌아가고 싶어집니다. "그래서 LLM은 이해를 하는 걸까, 아니면 흉내만 내는 걸까?"
이 질문에는 한 줄로 끝나는 답이 없습니다. 다만 초보자에게 실용적인 관점은 분명합니다.
LLM은 사람처럼 세상을 체험하며 이해하지는 않습니다. 대신 방대한 언어 패턴을 학습해, 문맥에 맞는 표현과 구조를 매우 능숙하게 생성합니다. 그래서 설명이 자연스럽고, 문답이 이어지고, 요약과 번역과 정리가 가능한 것입니다.
중요한 것은 철학적 결론보다 실용적인 이해입니다. 모델이 "정말 생각하느냐"를 따지기 전에, 어떤 방식으로 답을 만드는지를 알면 모델의 장점과 한계를 더 잘 다룰 수 있습니다.
예를 들어 다음과 같은 판단이 쉬워집니다.
왜 긴 문서에서는 문맥 설계가 중요한지
왜 질문을 조금만 바꿔도 답이 달라지는지
왜 모델이 틀린 말도 그럴듯하게 할 수 있는지
왜 속도와 메모리 문제가 로컬 환경에서 크게 느껴지는지
원리를 알면 신비감은 조금 줄어들지만, 대신 다루는 실력은 훨씬 올라갑니다.
같은 질문인데 답이 달라지는 이유
LLM을 쓰다 보면 "분명 같은 질문을 했는데 조금 다른 답이 나오네?"라는 경험을 하게 됩니다. 이것도 지금까지 배운 원리로 설명할 수 있습니다.
첫째, 문맥이 조금만 달라도 다음 토큰 예측 결과가 달라질 수 있습니다. 앞 대화 한 줄, 말투 한 줄, 역할 지시 한 줄이 전체 답변의 방향을 바꿉니다.
둘째, 모델이 다음 토큰을 고를 때 항상 기계처럼 한 후보만 고정해서 뽑는 것은 아닙니다. 상황에 따라 여러 가능성 중 하나를 선택할 수 있습니다.
셋째, 작은 차이가 뒤로 갈수록 커질 수 있습니다. 첫 문장 한 토큰이 달라지면, 그 다음 문장의 선택도 달라지고, 결국 답 전체가 달라질 수 있습니다.
즉, LLM의 답변은 정답 하나를 꺼내는 계산기라기보다, 문맥 안에서 가능성이 높은 언어 흐름을 만들어 가는 생성기에 가깝습니다.
초보자가 꼭 기억할 핵심 오해 바로잡기
여기서 자주 생기는 오해 몇 가지를 정리해 보겠습니다.
첫째, LLM은 문장을 통째로 외워서 꺼내는 기계가 아닙니다. 물론 학습 데이터의 흔적이 영향을 주지만, 보통은 현재 문맥과 학습된 패턴을 바탕으로 새 문장을 생성합니다.
둘째, LLM은 답을 만들 때 사실 여부만 따지는 기계가 아닙니다. 기본 임무는 문맥에 어울리는 다음 토큰 생성입니다. 그래서 틀린 말도 그럴듯하게 할 수 있습니다.
셋째, LLM은 무한히 기억하지 않습니다. 컨텍스트 창 안에 들어온 내용 중심으로 계산하므로, 긴 대화에서는 앞부분이 밀려날 수 있습니다.
넷째, 로컬 LLM의 성능은 모델 크기만으로 결정되지 않습니다. 문맥 길이, KV 캐시, 메모리, CPU와 GPU 환경도 큰 영향을 줍니다.
이 네 가지를 기억해 두면, 뒤에서 로컬 실행 환경을 다룰 때 훨씬 덜 헷갈립니다.
한 장면으로 보는 전체 과정
이제 모든 개념을 하나의 장면으로 묶어 봅시다.
당신이 Open WebUI 채팅창에 이렇게 입력합니다.
"LLM을 초보자도 이해하게 비유로 설명해 줘."
그러면 모델은 이 문장을 토큰으로 나누고, 숫자로 바꾼 뒤, 트랜스포머 구조를 통해 문맥 관계를 계산합니다. 어텐션은 "초보자", "비유", "설명" 같은 핵심 신호에 주목합니다. 그 결과 다음 토큰 후보들을 계산하고, 가장 알맞은 표현을 하나 고릅니다. 예를 들어 "LLM은", "마치", "아주" 같은 식으로 시작할 수 있습니다.
그리고 방금 만든 토큰을 문맥에 붙여 다시 계산합니다. 이때 앞에서 계산한 정보는 KV 캐시에 저장되어 있어, 매번 처음부터 전부 다시 읽지 않아도 됩니다. 이 반복이 이어지면서 "LLM은 마치 엄청나게 많은 글을 읽고 문장의 흐름을 익힌 자동완성 작가와 비슷합니다" 같은 답이 만들어집니다.
우리가 보기에는 한 번에 생성된 자연스러운 문단이지만, 내부에서는 문맥 참조, 다음 토큰 선택, 캐시 재사용이 쉼 없이 반복되고 있었던 것입니다.
로컬 LLM 활용에 왜 이 원리가 중요할까
이 장의 내용은 단지 이론 공부를 위한 것이 아닙니다. 앞으로 로컬 LLM을 직접 돌릴 때, 지금 이해한 원리가 계속 실전 판단의 기준이 됩니다.
예를 들어 모델 선택을 할 때는 "파라미터가 큰가"만 보는 것이 아니라, 내 컴퓨터에서 문맥을 얼마나 길게 처리할 수 있는지, 속도가 얼마나 나오는지, 메모리가 버틸 수 있는지를 함께 생각해야 합니다.
또 프롬프트를 작성할 때는 모델이 사람처럼 마음을 읽는다고 기대하기보다, 현재 컨텍스트에 필요한 단서를 분명하게 넣어 줘야 원하는 답에 가까워집니다.
마찬가지로 품질 문제를 볼 때도 "왜 엉뚱한 답이 나왔지?"를 막연히 느끼기보다, 문맥이 부족했는지, 질문이 애매했는지, 모델이 다음 토큰 예측에서 다른 방향으로 흘렀는지 생각해 볼 수 있습니다.
결국 원리를 아는 사람은 모델을 덜 신비롭게 보지만, 더 정확하게 다룹니다.
초보자를 위한 한 번 더 정리
이 장의 핵심을 아주 짧게 묶어 보겠습니다.
LLM은 답을 통째로 떠올리는 것이 아니라, 다음 토큰을 하나씩 예측하며 문장을 생성합니다. 이때 컨텍스트는 현재 참고하는 작업대이고, 트랜스포머는 문장 안 토큰들의 관계를 살피는 핵심 구조입니다. 그 안의 어텐션은 지금 중요한 부분에 집중하게 도와줍니다. 그리고 KV 캐시는 이전 계산을 저장해 두어 다음 토큰 생성 속도를 높여 줍니다. 우리가 실제로 질문을 던지고 답을 받는 전체 과정이 바로 추론입니다.
이제 우리는 "LLM이 뭔가요?"를 넘어서, "LLM은 왜 저렇게 말하나요?"에 답할 수 있게 되었습니다.
다음 장으로 이어서
지금까지는 답변이 만들어지는 내부 원리를 살펴봤습니다. 다음 장에서는 시선을 조금 넓혀, 온디바이스와 로컬 LLM이 실제로 어떤 구조 위에서 돌아가는지를 살펴보겠습니다. 모델 파일은 어디에 있고, 메모리는 어떻게 쓰이며, 내 컴퓨터의 CPU와 GPU는 어떤 역할을 맡는지 이해하면, 이제 추상적인 AI가 아니라 내 장비 위에서 돌아가는 실제 시스템으로 로컬 LLM이 보이기 시작할 것입니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.