LLM이란 실제로 무엇인가?
LLM은 하나의 함수입니다. 텍스트가 들어가면 다음 토큰에 대한 확률 분포가 나옵니다. 생성은 이 함수를 루프로 도는 것입니다. 토큰을 하나 샘플링하고, 이어 붙이고, 전체를 다시 입력하고, 반복합니다. 스톱 토큰이나 길이 제한이 걸릴 때까지. 챗 앱부터 코딩 에이전트까지, 그 위에 지어진 모든 제품은 이 루프를 감싼 오케스트레이션입니다.
모델 파일 자체는 두 가집니다. 수십억 개의 부동소수점 가중치(파라미터)와 이들을 조합하는 고정된 계산 그래프(transformer 내부 참고). 그 안에 데이터베이스도 없고, 규칙 엔진도 없고, 스크래치 메모리도 없습니다. 추론 시점에 가중치는 고정되어 있습니다. 대화 중에 모델이 "기억"하는 것은 전부 프롬프트 창에 들어 있는 텍스트일 뿐입니다.
핵심 루프
생성 엔진 전체의 의사 코드입니다. 어느 벤더가 내놓든 이보다 깊은 것은 없습니다:
tokens = tokenize(prompt)
while not done and len(tokens) < max_context:
probs = model(tokens) # 순전파 한 번
next = sample(probs, temperature)
tokens.append(next)
stream_to_user(next)
if next == stop_token:
done = True
이 루프에서 두 개의 노브가 일상적 동작을 지배하며, 둘 다 가중치 안에 있지 않습니다. temperature(샘플링이 얼마나 대담한가)와 최대 컨텍스트(대화가 얼마나 들어가는가)입니다. 둘 다 엔진이 적용하는 런타임 설정입니다(엔진 파라미터 참고).
가중치의 실체
"7B" 모델은 7,000,000,000개의 float 파라미터입니다. 저장 크기는 정밀도에만 의존하고 영리함과는 무관합니다:
| 정밀도 | 파라미터당 바이트 | 7B 모델 크기 |
|---|---|---|
| FP16 (네이티브) | 2 | ~14 GB |
| 8비트 양자화 | ~1 | ~7 GB |
| 4비트 양자화 | ~0.55 | ~4 GB |
같은 가중치를 더 거친 저장으로 옮긴 것입니다. 작은 품질 손실을 큰 메모리 절약과 맞바꾸는 거래입니다(양자화 참고). 파라미터 수 자체는 학습 시점에 고정되며, 모델을 사용해도 절대 변하지 않습니다.
스케일 사다리
파라미터 수는 무엇이 언제 도착했는지 알려주는 거칠지만 정직한 잣대입니다:
| 세대 | 파라미터 | 시기 | 가능했던 것 |
|---|---|---|---|
| GPT-2 | 125M–1.5B | 2019 | 일관된 문단, 취약한 사실성 |
| GPT-3 | 175B | 2020 | 퓨샷 프롬프팅이 작동하기 시작 |
| 작지만 좋은 모델 (Phi-3, Qwen 3B) | 3–4B | 2024 | 실제로 쓸 만한 가벼운 어시스턴트 |
| 오픈 7B (Mistral, Llama 2) | 7B | 2023 | 소비자 GPU 한 장으로 견고한 챗과 코드 |
| 오픈 70B급 | 70B | 2023+ | 프론티어에 근접하는 추론; 2×24 GB 필요 |
| 오픈 프론티어 덴스 (Llama 3.1) | 405B | 2024 | 프론티어급 오픈 가중치, 멀티 GPU |
| MoE 프론티어 | 총 100B–600B+, 활성 10–40B | 2024+ | 합리적인 서빙 비용으로 최고 수준의 출력 |
각 단계는 대략 직전 단계의 10배이며, 각 단계는 한 단계 아래에서는 애초에 나올 수 없던 동작을 가능하게 합니다. "비슷하지만 조금 나은" 수준이 아닙니다. 스케일이 기술을 추가했고, 포장이 그것을 쓸 수 있게 만들었습니다.
세션 사이에 기억은 없습니다
모델은 상태가 없습니다. 상태는 대화에 삽니다. 당신과 모델이 만들어낸 토큰의 실행 중인 창이 곧 상태입니다. 탭을 닫으면 사라지고, 새 챗을 시작하면 모델은 당신이 존재하는지도 모릅니다. 모든 "기억" 기능은 오래된 텍스트를 새 프롬프트에 다시 주입하는 래퍼입니다.
실용적 결론: 창에 남아 있는 것이 모델이 지금 아는 전부입니다. 긴 대화는 창이 차면 자기 시작 부분을 조용히 잘라냅니다. 모델은 빠진 텍스트를 "알아채지" 못합니다(토큰 참고).
유창함은 정확함이 아닙니다
학습 목표는 그럴듯한 이어쓰기이지 진실이 아닙니다. 뼈아픈 지점들:
- 모델은 자신만만하고 형식이 갖춰진 거짓을 만들어냅니다. 환각(hallucination)은 다음 토큰 예측의 속성이지, 누군가 고치는 걸 깜빡한 버그가 아닙니다.
- 유창함은 형편없는 진실 신호입니다. 틀린 답은 맞은 답과 똑같이 잘 읽힙니다.
- 캘리브레이션은 불안정합니다. "확신이 얼마나 되지?"라고 물으면 지어낸 숫자가 나오기 십상입니다.
- 흔한 사실은 신뢰할 만합니다. 학습 데이터에 수백만 번 등장했기 때문입니다. 롱테일 사실은 매끄럽게 퇴화해 자신만만한 픽션이 됩니다.
- 모델은 순종 쪽으로 기웁니다. 정답에 반박하면 물러설 수 있습니다. 정확성과 자신감은 다른 축입니다.
- 강제로 검증 가능한 출력(채울 필드가 있는 JSON, 객관식)이 모델에게 자기 성찰을 부탁하는 것보다 낫습니다.
지식은 학습 시점에 고정됩니다
모델이 아는 모든 것은 학습될 때 굳어졌습니다. 컷오프 날짜가 있으며, 아무리 대화해도 가중치는 갱신되지 않습니다. 새로운 사실에는 컨텍스트에 텍스트를 넣어주는 것(검색)이나 새 학습이 필요합니다(학습 참고). 모델은 사실의 출처를 밝힐 수도 없습니다. 코퍼스에 대한 색인이 있는 게 아니라 가중치에 남은 코퍼스의 메아리만 있을 뿐입니다.
능력은 고르게 오지 않습니다
스케일은 기술을 매끄럽게 더해주지 않습니다:
- ~3B 미만: 자동완성, 추출, 분류는 준수. 다단계 추론은 대부분 실패.
- 7–9B: 신뢰할 만한 지시 이행, 쓸 만한 코드. 산수와 긴 연쇄는 여전히 흔들립니다.
- 30B+: 계획, 뉘앙스, 더 어려운 코드 — 늦게, 그리고 어느 정도 갑자기 도착합니다.
- MoE는 사다리를 복잡하게 만듭니다. 총 파라미터가 아니라 활성 파라미터로 판단하세요.
그러니 "클수록 좋다"는 평균적으로는 참이고 세부에서는 오해를 부릅니다. 어떤 과제는 일찍 정체되고, 어떤 과제는 늦게 켜집니다. 감이 아니라 당신 과제로 벤치마크하세요(모델 선택 참고).
제품은 그 루프를 감싼 것입니다
LLM 제품을 쓰면 대략 이런 일이 벌어집니다:
- 당신의 텍스트가 토큰화됩니다.
- 시스템 프롬프트, 도구 정의, 검색된 문서, 챗 기록이 하나의 프롬프트로 이어 붙여집니다.
- 모델이 위의 루프를 돌며 토큰을 스트리밍합니다.
- 래퍼 코드가 출력을 파싱하고, 도구를 호출하고, 결과를 되먹이고, 다시 프롬프트합니다.
- UI가 마크다운을 렌더링하고 그것을 대화라 부릅니다.
1, 2, 4, 5단계는 모델이 아닙니다. 모델이 고정된 창을 가진 상태 없는 텍스트-입력/텍스트-출력 함수라는 사실을 체화하고 나면, 이 가이드의 나머지는 장부 정리입니다. 창이 얼마나 크가(토큰), 루프가 얼마나 빠른가(프리필 대 디코드), 어디서 도는가(하드웨어 개요), 어떻게 조종하는가(프롬프팅).
관련: 토큰 · transformer 내부 · 파라미터 · 학습