LLM Fundamentals를 실무 흐름으로 이해하기
LLM 발전사부터 Transformer 구조, 토크나이제이션, 사전학습·파인튜닝, 임베딩과 RAG, 디코딩 전략, 환각, 모델 지형도, 평가, Agent, 안전성까지 — LLM을 다루기 전에 알아야 할 모든 핵심 개념을 쉽지만 깊이 있게 정리합니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
LLM 발전사부터 Transformer 구조, 토크나이제이션, 사전학습·파인튜닝, 임베딩과 RAG, 디코딩 전략, 환각, 모델 지형도, 평가, Agent, 안전성까지 — LLM을 다루기 전에 알아야 할 모든 핵심 개념을 쉽지만 깊이 있게 정리합니다.
LLM 발전사부터 Transformer 구조, 토크나이제이션, 사전학습·파인튜닝, 임베딩과 RAG, 디코딩 전략, 환각, 모델 지형도, 평가, Agent, 안전성까지 — LLM을 다루기 전에 알아야 할 모든 핵심 개념을 쉽지만 깊이 있게 정리합니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
모델과 프롬프트만 보지 않고, 데이터 흐름, 평가, 배포 이후의 운영 지표까지 한 번에 연결해서 봅니다.
글로 읽은 내용을 머릿속에 오래 남기려면 먼저 흐름을 그림으로 잡는 편이 좋습니다. 아래 두 그림은 LLM Fundamentals를 학습할 때 계속 되돌아볼 수 있는 기준 지도입니다.
LLM Fundamentals를 처음 펼칠 때는 세부 명령보다 큰 그림이 먼저입니다. 이 섹션에서는 앞으로 배울 개념들이 어떤 문제를 풀기 위해 등장했는지부터 잡아봅니다.
| 시기 | 이정표 | 핵심 변화 |
|---|---|---|
| ~2016 | RNN / LSTM 기반 번역·언어모델 | 순서대로 처리, 장거리 의존성에 취약 |
| 2017 | Transformer 등장 ("Attention Is All You Need") | 병렬 처리 가능, Self-Attention으로 장거리 관계 포착 |
| 2018~2019 | BERT / GPT-2 | 대규모 사전학습 + 미세조정 패러다임 정착 |
| 2020 | GPT-3 | 파라미터 수를 크게 늘리며 few-shot 능력이 급격히 향상(스케일링 법칙) |
| 2022~ | ChatGPT / RLHF 정렬 | 단순 텍스트 완성을 넘어 대화·지시 이행 능력 확보 |
| 2023~ | 오픈소스 LLM 확산(LLaMA 등), 멀티모달·Agent | 누구나 로컬에서 LLM 구동, 도구 사용·에이전트로 확장 |
여기서는 Transformer 구조을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
import torch
import torch.nn.functional as F
def simple_attention(Q, K, V):
# Q, K, V: (seq_len, d_k)
scores = Q @ K.T / (K.shape[-1] ** 0.5) # 유사도 계산 + 스케일링
weights = F.softmax(scores, dim=-1) # 관련도를 확률처럼 정규화
return weights @ V # 가중합으로 문맥 정보를 섞음
seq_len, d_k = 4, 8
Q = torch.randn(seq_len, d_k)
K = torch.randn(seq_len, d_k)
V = torch.randn(seq_len, d_k)
context = simple_attention(Q, K, V)
print(context.shape) # torch.Size([4, 8]) — 각 토큰이 문맥을 반영한 벡터로 갱신됨| 구성요소 | 역할 |
|---|---|
| Self-Attention (Q·K·V) | 각 토큰이 문장 내 다른 토큰과의 관련도(가중치)를 계산해 정보를 섞음 |
| Multi-Head Attention | Attention을 여러 개 병렬로 두어 서로 다른 관점(문법, 의미 등)의 관계를 포착 |
| Feed-Forward Layer | Attention 결과를 비선형 변환해 표현력을 높임 |
| Positional Encoding | 단어의 순서 정보를 모델에 주입(Attention 자체는 순서를 모름) |
| Decoder-only (GPT류) | 이전 토큰들만 보고 다음 토큰을 예측 — 대부분의 LLM 챗봇 구조 |
여기서는 토크나이제이션을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
text = "AI Agent는 LLM 기반으로 도구를 호출합니다"
tokens = tokenizer.tokenize(text)
ids = tokenizer.encode(text)
print(tokens) # 단어가 아니라 서브워드 단위로 쪼개짐
print(len(ids)) # 토큰 개수 — 한글은 영어보다 토큰을 더 많이 소모하는 경향
print(tokenizer.decode(ids)) # 다시 원문으로 복원| 방식 | 단위 | 장단점 |
|---|---|---|
| 단어 단위 | whole word | 직관적이지만 어휘 사전이 매우 커지고 신조어에 취약 |
| 글자 단위 | character | 어휘 사전은 작지만 문장이 매우 길어져 비효율적 |
| 서브워드 (BPE 등) | subword | LLM의 표준 — 어휘 크기와 시퀀스 길이의 균형점 |
여기서는 사전학습과 파인튜닝을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
# LoRA 핵심 아이디어: 원본 가중치 W는 고정하고,
# 작은 두 행렬 A, B의 곱(저랭크 행렬)만 학습해 W에 더한다.
# W_new = W_frozen + (A @ B) * scale
#
# 원본 가중치가 4096x4096 = 1600만 파라미터라면
# LoRA는 랭크 r=8 기준 4096x8 + 8x4096 = 약 6.5만 파라미터만 학습
# -> 전체 파인튜닝 대비 메모리·저장공간을 수백 배 절약
from peft import LoraConfig, get_peft_model
config = LoraConfig(r=8, lora_alpha=16, target_modules=["q_proj", "v_proj"])
model = get_peft_model(base_model, config)
model.print_trainable_parameters() # 전체 대비 학습 파라미터 비율 확인| 단계 | 목적 | 데이터 규모 |
|---|---|---|
| 사전학습 (Pre-training) | 언어의 일반적 패턴·지식 습득 | 수천억~수조 토큰 |
| 지도 파인튜닝 (SFT) | 지시를 따르는 형태로 응답 스타일 조정 | 수만~수십만 예시 |
| RLHF (인간 피드백 강화학습) | 사람이 선호하는 답변 방향으로 강화학습 | 사람이 매긴 선호 순위 데이터 |
| DPO (직접 선호 최적화) | RLHF와 비슷한 목표를 별도 보상모델 없이 더 단순하게 달성 | 선호 순위 데이터(RLHF보다 가볍게 학습) |
| 경량 파인튜닝 (LoRA / QLoRA) | 전체 가중치 대신 소수의 추가 파라미터만 학습해 적은 자원으로 특화 | 수백~수천 예시 |
모델 크기와 양자화은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 형식/기법 | 설명 |
|---|---|
| FP16 / BF16 | 학습·추론에 흔히 쓰는 16비트 부동소수점(원본 정밀도의 절반) |
| INT8 / INT4 양자화 | 가중치를 8비트·4비트 정수로 근사해 메모리를 추가로 절반~1/4까지 절감 |
| GGUF | llama.cpp 계열에서 쓰는 양자화 모델 파일 포맷 — 로컬 CPU/GPU 추론에 널리 사용 |
| GPTQ / AWQ | 정확도 손실을 최소화하며 4비트급으로 양자화하는 대표적 알고리즘 |
Context Window와 임베딩은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 개념 | 설명 |
|---|---|
| Context Window | 한 번의 요청에 모델이 참고할 수 있는 토큰 총량(프롬프트+응답) |
| 임베딩 (Embedding) | 텍스트를 의미가 반영된 고정 길이 벡터로 변환한 것 |
| 코사인 유사도 | 두 임베딩 벡터의 방향이 얼마나 비슷한지로 의미적 유사도를 계산 |
| 벡터 검색 | 질문 임베딩과 가장 가까운 문서 임베딩을 찾아 관련 문서를 추림 |
| RAG | 벡터 검색으로 찾은 문서를 프롬프트에 포함시켜 최신·전문 지식을 보완 |
여기서는 디코딩 전략: 같은 모델도 다르게 말하는 이유을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
from openai import OpenAI
client = OpenAI()
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "짧은 시를 써줘"}],
temperature=0.9, # 높을수록 창의적·다양한 표현
top_p=0.95, # 상위 95% 확률 질량 내에서만 샘플링
)
print(resp.choices[0].message.content)| 전략/파라미터 | 설명 | 효과 |
|---|---|---|
| Greedy Decoding | 매 스텝 가장 확률 높은 토큰만 선택 | 일관되지만 반복적이고 단조로운 답변 |
| Temperature | 확률 분포를 얼마나 평평하게/뾰족하게 만들지 조절 | 낮으면 결정적, 높으면 다양하고 무작위적 |
| Top-k | 확률 상위 k개 토큰 중에서만 샘플링 | 너무 낮은 확률의 이상한 토큰 배제 |
| Top-p (nucleus) | 누적 확률이 p가 될 때까지의 토큰 후보군에서 샘플링 | 상황에 따라 후보군 크기가 유연하게 조절됨 |
| Beam Search | 여러 후보 경로를 동시에 유지하며 전체적으로 가장 그럴듯한 문장을 탐색 | 번역 등 정답이 비교적 명확한 과제에 유리 |
여기서는 프롬프트 엔지니어링 기본을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
SYSTEM_PROMPT = "당신은 정확한 사실만 답하는 어시스턴트입니다. 모르면 모른다고 답하세요."
FEW_SHOT_EXAMPLES = """
질문: 2 + 2는?
답변: 4
질문: 지구에서 가장 가까운 행성은?
답변: 금성입니다.
"""
def build_prompt(question: str) -> str:
return f"{FEW_SHOT_EXAMPLES}\n질문: {question}\n답변:"| 패턴 | 설명 | 예시 |
|---|---|---|
| Zero-shot | 예시 없이 바로 질문 | "이 리뷰의 감정을 분류해줘: ..." |
| Few-shot | 몇 개의 입력-출력 예시를 함께 제공 | 예시 2~3개 + 새 질문 |
| Chain-of-Thought (CoT) | 단계별로 생각을 풀어서 답하도록 유도 | "단계별로 생각해봐" |
| 역할 지정 (System Prompt) | 모델의 역할·제약을 대화 시작에 고정 | "당신은 코드 리뷰어입니다..." |
| ReAct (추론+행동) | 생각(Reasoning)과 도구 호출(Acting)을 번갈아 반복 | Agent가 검색 도구를 쓰며 추론을 이어가는 패턴 |
환각(Hallucination)과 LLM의 한계은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 한계 | 설명 | 완화 방법 |
|---|---|---|
| 환각 (Hallucination) | 그럴듯하지만 사실이 아닌 내용을 생성 | RAG로 근거 문서 제공, 출처 인용 요구, 낮은 temperature |
| 최신 정보 부재 | 학습 데이터 수집 시점(knowledge cutoff) 이후 정보를 모름 | 웹 검색 도구·RAG로 실시간 정보 보강 |
| 수치·연산 취약 | 큰 수의 정확한 계산이나 정밀한 카운팅에 약함 | 계산기·코드 실행 도구에 위임(Tool Use) |
| 일관성 부족 | 같은 질문도 표현을 바꾸면 다른 답을 줄 수 있음 | temperature를 낮추거나 여러 번 샘플링해 다수결 |
주요 모델 지형도: 무엇을 언제 고를까은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 구분 | 대표 모델 | 특징 |
|---|---|---|
| 폐쇄형 API | GPT (OpenAI), Claude (Anthropic), Gemini (Google) | 최고 수준 성능, 인프라 관리 불필요, 데이터가 외부로 전송됨 |
| 오픈소스/오픈웨이트 | LLaMA (Meta), Mistral, Qwen, Gemma | 자체 호스팅 가능, 파인튜닝 자유도 높음, 인프라·운영 부담은 직접 감당 |
LLM 평가와 벤치마크은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 벤치마크/방법 | 측정 대상 |
|---|---|
| MMLU | 57개 과목에 걸친 다지선다 문제로 폭넓은 지식·추론 능력 측정 |
| HumanEval | 함수 설명을 보고 실제로 동작하는 코드를 작성하는 능력 측정 |
| HellaSwag | 문맥에 자연스럽게 이어지는 문장을 고르는 상식 추론 능력 측정 |
| LLM-as-a-Judge | 다른 강력한 LLM에게 응답 품질을 채점하게 하는 평가 방식 |
| 사람 평가 (Human Eval) | 실제 사용자·전문가가 응답을 직접 비교·평가 |
Agent와 Tool Use: LLM이 행동하기 시작할 때은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 개념 | 설명 |
|---|---|
| Function/Tool Calling | 모델이 "이 도구를 이럴 때 부르면 된다"는 스키마를 보고 호출할 도구와 인자를 스스로 결정 |
| ReAct 루프 | 생각(Reasoning) → 도구 호출(Acting) → 결과 관찰(Observation)을 반복하며 목표에 접근 |
| 멀티에이전트 | 역할이 다른 여러 Agent가 협업 또는 검토하며 하나의 작업을 수행 |
| MCP (Model Context Protocol) | 모델이 외부 도구·데이터 소스와 표준화된 방식으로 연결되도록 하는 개방형 프로토콜 |
안전성과 정렬(Alignment)은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 개념 | 설명 |
|---|---|
| RLHF | 사람이 매긴 선호 순위를 보상 신호로 삼아 강화학습으로 모델을 정렬 |
| Constitutional AI | 사람의 개입을 줄이고 모델 스스로 원칙(헌법)에 따라 답변을 자기 비평·수정하도록 학습 |
| Red Teaming | 모델의 취약점·유해 응답을 의도적으로 유도해 사전에 발견하고 보완 |
| 가드레일 (Guardrails) | 입출력 필터링, 금지 주제 차단 등 애플리케이션 레벨의 안전 장치 |