관통하는 3가지 원칙
Transformer가 이긴 이유는 어느 한 항목이 최강이어서가 아니라 세 문제를 동시에 풀었기 때문이다: 장거리 의존성 · 병렬 계산 · 규모화 학습.
| RNN | CNN | Transformer | |
|---|---|---|---|
| 장거리 의존 | 약 (정보 층층이 감쇠) | 층 쌓기 필요 (층수↑ 비용↑) | 강 (임의의 두 단어 직결) |
| 병렬 계산 | ✗ (앞뒤 강결합) | ✓ | ✓ (문장 전체 동시 계산) |
| 규모화 | ✗ (GPU를 못 채움) | 중 | ✓ |
| 강점 | 시퀀스 직관이 단순 | 국소 특징 추출 | 범용 계산 프레임워크 |
Tips: 새 아키텍처 평가 3문 — 장거리 의존을 만드는가 / 병렬화되는가 / 규모화되는가. CNN은 도태되지 않았다(국소 특징 추출에선 여전히 우선). 시퀀스 길이가 Transformer의 비용 급소.
정의를 외우지 말고 그것들이 함께 푸는 하나의 문제를 기억할 것: 한 단어가 어떤 단어들을 참조해야 하고, 참조하고 무엇을 가져오는가.
| 기호 | 비유 | 책임 |
|---|---|---|
| Q (Query) | 내 손의 질문 | 무엇을 찾는가 |
| K (Key) | 자료의 제목·태그 | 자기가 무엇인지 설명 |
| V (Value) | 자료의 본문 | 실제 내용 제공 |
흐름: Q × K → 유사도 → (softmax) 가중치 → 가중치대로 V 집계
Tips: 비유 먼저, 공식은 나중에. 소스에 없는 두 가지를 보태면 차이가 크다 — √d_k 스케일링(없으면 softmax 포화·기울기 소실), Multi-Head(단일 QKV는 한 가지 참조 관계만 표현). K/V가 불변이라는 점이 KV Cache의 전제.
"다음 단어를 예측한다"는 결론이지 답이 아니다. 요구되는 것은 4단 파이프라인이다.
Tips: 두 종류의 성능 지표를 구분(첫 token 지연은 prefill 지배, 이후 token당 지연은 decode 지배). 결정성 작업은 저온/그리디, 창작은 고온+샘플링. 모델이 "반복"하면 먼저 디코딩 설정부터 확인.
긴 대화에서 메모리가 폭증하는 주범은 모델 가중치가 아니다. 가중치는 고정된 십몇 GB이고, 팽창하는 것은 KV Cache다(수십~100 GB 이상).
본질: 메모리로 연산력을 산다.
왜 K/V만 캐싱하고 Q는 안 하나
| 벡터 | 생명주기 | 캐싱 가치 |
|---|---|---|
| K, V | 이후 모든 token이 반복 조회 | 있음 |
| Q | 현재 한 번의 조회에만 봉사, 쓰고 나면 실효 | 없음(메모리 낭비) |
메모리 3인자: 층수 × 시퀀스 길이 × 헤드 수 × 헤드 차원 × 2 × 정밀도 바이트. 롱컨텍스트에서는 가중치보다 더 먹을 수 있다.
최적화 5종(작용 차원으로 기억): 단편화 감소(PagedAttention) / 이동량 감소(FlashAttention) / 표현 압축(KV 양자화) / 시퀀스 단축(슬라이딩 윈도우) / 중복 회피(접두사 캐시).
Tips: 용량 공식에 동시성을 반드시 포함할 것(프로덕션 OOM의 고빈도 원인). 접두사 캐시는 다중 턴·고정 시스템 프롬프트에서 수익 최대. KV 양자화(FP8/INT8)가 가성비 1위. PagedAttention은 단편화를 해결하지 총량을 줄이지 않는다. 슬라이딩 윈도우는 손실 방안.
핵심은 계산 희소성(Compute Sparsity)과 저장 희소성(Storage Dense)을 분리해서 말할 수 있는가이다.
활성화 파라미터가 적다 ≠ 단일 카드 메모리가 작다.
답의 출발점은 결론이 아니라 "범위 정의" — 네 항목을 나눠서 계산할 것: 가중치 메모리 / 활성화 피크 / KV Cache / 통신 버퍼. 대입할 입력 차원: 전문가 병렬 · 배치 · 컨텍스트 길이 · 전문가 분포.
Tips: "매번 전문가 몇 개"만 외우지 말고 가중치 저장 토폴로지 / Token 라우팅 전략 / 동시성 병목을 말할 것. 범위를 먼저 정하고 계산할 것. "먼저 상한에 닿는 부분"을 설계 산출물로. 지표와 버전을 같은 타임라인에.
분수령은 업무 동작이 무엇인지 먼저 보는 것이다. 온라인 상담이면 지연이 하드 제약이다.
이용률 향상 ≠ 단일 사용자 체감 향상 — 배치 처리는 하드웨어 이용률을 높이지만 장단 혼재 시 서로 기다리게 되어 단일 사용자 꼬리 지연이 악화된다. 수십 token짜리 짧은 질문이 긴 문서 요약에 끌려 같은 배치에 들어간다.
해법 4종: 입출력 길이별 버킷 분리 / 최대 대기 윈도우 / 실시간·오프라인 큐 격리 / 처리량·TTFT·P95·P99를 동시에 볼 것.
3단 계측으로 귀인할 것
| 단계 | 반영 | 주된 영향 |
|---|---|---|
| 대기 | 스케줄링·용량 | 배치 밖 대기 시간 |
| Prefill | 입력 전체 처리 | 입력이 길수록 첫 글자 지연 |
| Decode | token 단위 생성 | 출력이 길수록 총 시간 |
단계별 처방: Prefill이 느리면 입력 측 뺄셈(무관 컨텍스트 제거·온디맨드 검색·안정적 접두사 캐싱), Decode가 느려야 그다음에 출력 상한·연속 배치·양자화·추측 디코딩.
Tips: 먼저 버킷을 나누고 나서 배치 크기를 논할 것. 최대 대기 윈도우가 짧은 요청의 생명줄. 실시간/오프라인 큐를 물리적으로 격리. 수정은 회귀 집합에 넣고 인접 작업을 확인.
"작은 모델로 추론해서 빨라졌다"는 오답이다. 추측 디코딩은 모델을 바꾸지 않는다 — 목표 모델을 그대로 둔 채 **투기(Speculate) + 검증(Verify)**으로 무손실 가속을 얻는다.
적중률이 유일한 기축통화
| 시나리오 | 수용률 | 결과 |
|---|---|---|
코드 자동완성(import os → import sys) | 80%+ | 대폭 가속, K=5~6 |
| 개방형 대화 | 60% | 가속 반감 → K를 낮추거나 자동 종료 |
K_VALUE = 5로 하드코딩 → 트래픽 분포가 바뀌어 적중률 30% → 에러도 알람도 없이 가속이 감속으로 조용히 퇴화.Tips: K는 변수이지 상수가 아니다. 오프라인 1회 측정 ≠ 프로덕션 장기 결론. 등가를 먼저 증명하고 속도를 논할 것. 총 가속비가 아니라 순수익을 계산. 모니터링은 실시간 적중률 + 엔드투엔드 지연 두 곡선을 함께.
첫 글자 지연의 90%가 Prefill에서 발생한다. Decode가 첫 token을 생성하는 데는 행렬 곱 한 번이면 되지만, Prefill은 프롬프트 전체에 대해 전량 주의력을 계산해야 한다.
| Prefill | Decode | |
|---|---|---|
| 계산 | 입력 전체를 한 번에 병렬 | token 단위 직렬 |
| 길이와의 관계 | 제곱 O(N²) | 선형 |
| 병목 자원 | GPU 행렬 곱 처리량(연산력 제약) | GPU 메모리 대역폭(Memory Bound) |
4000 token 예시: Prefill은 4000×4000 주의력 행렬을 한 번에, Decode 첫 token은 4000개와 각각 한 번 → 계산량이 4000배 차이.
KV Cache가 첫 글자 지연을 바꾸는 법
| 턴 | 이력 | 캐시 없음 | 캐시 있음 |
|---|---|---|---|
| 1턴 | 4000 | 전부 Prefill, 첫 글자 2초 | — |
| 2턴 | 4200 | 4200개 전량 재계산(4200²) | 신규 200개만(200×4200) → 0.3초 |
Tips: "변수"를 프롬프트 꼬리로 몰 것. 프롬프트 조립은 결정론적으로 재현 가능해야 한다. "저장했다"를 "적중했다"로 착각하지 말 것. 모니터링 대상은 적중률이지 "Cache를 켰는가"가 아니다.
신입은 자리가 남으면 채우고, 프로덕션에서 안정적인 Agent를 만드는 사람은 오히려 절반 이상을 지운다. 쟁점은 **컨텍스트 예산(Context Budget)**이다.
윈도우에 자리가 있는 것 ≠ 모델에게 그만큼의 주의력이 있는 것. 많이 넣을수록 많이 잃는다.
두 가지 메커니즘
token↑ → 개별 가중치↓ → 노이즈 바닥↑ → 핵심 정보가 가라앉음.실제 사고: 상담 Agent 20턴 중 중간의 "환불 신청" 한마디가 잡담에 파묻혀 작업으로 인식된 적이 없었고, 모델은 "네, 알겠습니다"만 하고 끝. 사용자가 3일 후 신고. → **주의력 희석(Attention Dilution)**의 전형.
세 개의 예산: 윈도우가 공짜라도 주의력 · 비용 · 첫 글자 지연이 함께 터진다. 프롬프트 캐시는 안정적 접두사에만 유효하며 중간 token이 바뀌면 즉시 무효·재과금.
3층 편성
| 계층 | 내용 | 위치 |
|---|---|---|
| 1층 | 시스템 프롬프트 + 도구 정의 | 언제나 최전방 |
| 2층 | 현재 작업 지시 | 머리에 배치, 핵심 지시는 독립된 고우선순위 자리 |
| 3층 | 이력 | 최근 몇 턴 원문 + 더 이른 것은 요약 + 잡담은 삭제 |
정렬 법칙: 정보 밀도 · 관련성 · 역할 책임이 높을수록 앞으로. 수위선 70% 초과 시 절삭/압축 트리거.
Tips: 핵심 지시는 "앞으로"만이 아니라 **"격리"**할 것. 요약은 3등급(원문/요약/삭제)으로. 첫 글자 지연을 컨텍스트 팽창의 조기 지표로. 실패 모드에 이름을 붙일 것.
"컨텍스트 윈도우가 부족해서"는 한 겹만 답한 것이다. 진짜 이유는 정보 품질이다 — 담긴다 해도 노이즈가 모델을 끌어내린다(환각 증가·논리 혼란·주제 이탈).
축적되는 세 종류 노이즈: 만료된 정보(바뀐 예산·시간·선호) / 무관한 디테일(잡담·반복 확인) / 초기의 오류(폐기된 방안).
이력 3층 구조
| 계층 | 내용 | 처리 | 목적 |
|---|---|---|---|
| 1층 | 현재 턴 컨텍스트 | 원문 보존, 압축 금지 | 이번 턴 지시의 정확성 |
| 2층 | 장기 유효 상태 | 구조화 추출(목표·제약·선택된 방안) | 턴을 넘는 "사실 기반" |
| 3층 | 이력 요약 | 압축 | 배경 보존 + token 절약 |
충돌 정보 처리(가장 간과되는 고리): 예산이 10,000 → 20,000으로 바뀌었을 때, 두 숫자를 모두 주고 모델에게 추측시키지 말고 **예산: 20,000 [최신 확인] / 예산: 10,000 [실효]**로 명시할 것. 이것이 대화 상태 관리다.
Tips: 장기 상태를 명시적 스키마로. 요약에 트리거 임계값을 둘 것(매 턴 재요약은 비싸고 드리프트를 만든다). 1층은 절대 압축 금지(지시 대상이 무효가 된다). 충돌 재정 규칙은 코드에 하드코딩.
"둘 다 token을 아낀다"는 너무 거칠다. 진입점은 적중 조건 · 리스크 · 적용 시나리오 세 차원이다.
| 차원 | 접두사 캐시 | 시맨틱 캐시 |
|---|---|---|
| 위치 | 추론 가속 | 애플리케이션 층 재사용 |
| 절약 대상 | 동일 컨텍스트의 중복 계산 | 유사 질문의 중복 생성 |
| 재사용 대상 | 이미 계산한 KV 결과 | 과거에 산출한 답변 |
| 적중 조건 | 앞부분 글자 단위 완전 일치 | 의미가 유사하면 됨 |
| 직접 수익 | prefill 오버헤드 감소 | 모델 호출 횟수 감소 |
| 주요 리스크 | 접두사 파손 → 적중률 급락 | 오적중(엉뚱한 답/만료된 답) |
시맨틱 캐시의 네 관문(하나도 빠질 수 없음): 권한 통제 / 시간 유효성 / 지식 버전 / 유사도 임계값.
엔지니어링 함정: 타임스탬프·랜덤 ID를 프롬프트 가장 앞에 두면 접두사가 매번 달라져 캐시가 깨진다. 고정은 앞, 동적은 뒤 — 이것은 서버 최적화가 아니라 프롬프트의 구조 설계이며, 프롬프트를 쓰는 사람도 캐시 적중률에 책임이 있다.
Tips: "보이지 않는 동적 내용"을 경계할 것(도구 목록 순서 불안정, JSON 직렬화 순서 무작위, 템플릿의 현재 날짜). 시맨틱 캐시는 권한별 버킷 분리. 지식 버전 번호를 캐시 키에. 강한 정확성 시나리오에는 수동 다운그레이드 스위치를.
프롬프트를 설명하지 못하는 근본 원인은 표준 패러다임의 부재다. 하나의 점진적 사슬로 수렴한다.
| 패러다임 | 무엇을 주는가 | 무엇을 배우는가 | 전형적 실패 | 정성 |
|---|---|---|---|---|
| Zero-shot | 문제만 | 사전학습 본능 | 환각: 그럴듯한 오답 | 본능으로 맨몸 시험 |
| Few-shot | 문제 + 문답 쌍 3~5개 | 문형·형식·스타일 | 건너뛰며 찍기 | 답안 템플릿 제공 |
| CoT | 문제 + 중간 단계가 담긴 예시 | 추론 경로 | 단계 장황, Token↑ | 한 걸음씩 추론 |
동일 문제 대조("철수의 사과 5개, 2개 먹고, 남은 것의 3배를 사 왔다"): Zero-shot·Few-shot은 오답, CoT는 5-2=3 → 3×3=9 → 3+9=12로 정답.
Tips: 예시의 형식이 곧 계약(구두점·줄바꿈·필드 순서까지 모방한다). CoT의 각 단계는 원자 동작. "먼저 추론, 나중에 결론" 순서를 강제(반대면 사후 합리화로 퇴화). 간단한 작업에 CoT 남용은 순수 낭비.
"돈이 들고 시간이 걸린다"는 표층이다. 두 단어만 잡으면 된다: 주의력 희석과 물리적 캐시 병목.
【알고리즘 층】
【물리 층】 3. 캐시 병목 — 큰 캐시 공간 할당 → 시스템 동시성 압박 → 대기 중인 다른 작업도 함께 느려짐. 4. 사용자 체감과 비용 — 첫 글자 지연↑, API 청구서가 지수적으로 상승.
수렴: 프롬프트 과다는 모델 알고리즘 / 성능 표현 / 물리 자원을 동시에 압박한다.
Tips: 핵심 지시는 머리와 꼬리에. 마무리에서 핵심 제약을 복창시킬 것(꼬리의 높은 주목도 활용). 부하 테스트는 첫 글자 지연과 동시성 감쇠를 볼 것. 비용은 초선형으로 모델링(token 수 선형 외삽 금지).
| ❌ 흔한 오해 | ✅ 실상 |
|---|---|
| 새 지식을 허공에서 주입 | 더 안정적인 출력 습관 형성(고정 형식·어조·판단 기준) |
기억점: 파인튜닝은 "어떻게 답할지"를 가르치고, RAG는 "답변의 근거"를 보충한다.
4단계 의사결정
Tips: 프로젝트 시작 시 **"바꾸려는 것이 지식인가 행동인가"**를 한 문장으로 쓸 것. 평가셋은 실제 업무 로그의 복잡한 경계 샘플에서. Prompt-only / RAG-only 대조 결과를 항상 보존.
둘은 서로 다른 두 층위를 푼다: SFT는 일을 할 줄 알게, RLHF는 인간의 선호·가치관에 부합하게.
Tips: SFT 예산은 수량이 아니라 품질에. "형식/지시 준수"는 SFT, "어조/안전/가치관"은 RLHF — 도구를 잘못 쓰는 것이 흔한 낭비. 보상 기준(예의·신뢰성·환각 없음 vs 헛소리·위험·가치관 위배)을 판정 가능한 체크리스트로.
전량 파인튜닝 vs LoRA
| 전량 | LoRA(PEFT) | |
|---|---|---|
| 방식 | 대량 파라미터 변경 | 베이스 동결 + 소량 파라미터 추가 |
| 비용·속도·배포 | 높음·느림·경직 | 낮음·빠름·유연 |
| 문턱 | GPU·데이터·경험 모두 높음 | 개인/중소 팀 친화적 |
평가 5점검: 형식 안정 / 스타일 부합 / 오류율 하락 / 헛소리 없음 / 범용 능력 미퇴화.
이터레이션 처방: 불안정 → 고품질 샘플 보충 / 너무 경직 → 데이터가 단일 / 헛소리 → 데이터 오류 또는 학습 과도 / 형식 오류 → 형식 예시 추가.
Tips: "데이터 규범"을 문서로 쓰고 나서 라벨링을 시작할 것. LoRA 우선(하나의 베이스에 여러 모듈을 걸어 업무별 전환). 평가셋은 라벨링 시점에 함께 분리. "범용 능력을 희생하지 않았는가"를 필수 측정 항목으로. 헛소리 ≠ 데이터를 더 넣어야 한다는 뜻.
아래 주제들은 같은 소스 시리즈에 속하지만 07-agent-advanced에서 이미 한글로 정리되어 있어, 중복을 피하고 링크로 대신한다.
| 주제 | 링크 | 한 줄 요약 |
|---|---|---|
| LLM의 4가지 기억 메커니즘 | AGENT 02 | 모델 자체는 기억하지 않는다. 전체 이어붙이기 / 슬라이딩 윈도우 / 요약 / 벡터 검색은 시간 척도별 분업 |
| Prompt는 변수 이스케이프를 해야 한다 | AGENT 03 | 프롬프트 템플릿은 문자열 결합이 아니라 입력 경계 관리. 구분자 + 출처 선언 + 권한 다운그레이드 |
| 프롬프트 인젝션 취약점 방어 | AGENT 04 | 모든 텍스트가 하나의 Token 열이 되므로 천연의 하드 격리는 없다. 방어선은 모델 바깥에 |
| JSON 출력과 Function Calling의 차이 | AGENT 12 | 자유 텍스트 JSON과 구조화된 도구 호출은 신뢰도 보장 수준이 다르다 |
| JSON 안정 출력 4층 방어선 | AGENT 13 | 모델 출력은 계약이 아니다. 스키마·파싱·재시도·폴백의 4층 |
| 개념 | 등장 문서 | 한 줄 요약 |
|---|---|---|
| KV Cache | 03 / 04 / 08 / 11 | 메모리로 연산력을 산다. 재사용 횟수가 캐싱 가치를 결정하고, 메모리 압박을 가중치에서 컨텍스트 길이로 이전시킨다 |
| Prefill / Decode 이원 구조 | 03 / 06 / 08 | 병목 자원이 다르므로(연산력 vs 메모리 대역폭) 최적화 수단을 서로 바꿔 쓸 수 없다 |
| 접두사 안정성 | 08 / 09 / 10 / 11 | 고정은 앞, 동적은 뒤. 프롬프트의 필드 순서는 가독성이 아니라 성능 파라미터다 |
| 주의력 희석 / Lost in the Middle | 09 / 13 / 12 | 위치가 곧 우선순위. 머리와 꼬리는 고주목 구역이고, 넣을수록 중간이 사라진다 |
| 용량 ≠ 가용성 | 09 / 10 / 13 | 윈도우가 담을 수 있는 양과 모델이 실제로 돌볼 수 있는 양은 별개다 |
| 대가와 함께 견적 내기 | 04 / 05 / 07 / 14 | 수익만 보고하고 대가를 보고하지 않는 방안은 엔지니어링 리뷰에서 성립하지 않는다 |
| 대조 실험 규율 | 05 / 06 / 14 / 16 | 입력·데이터·버전을 고정하고 주요 변수를 하나만 바꾼다. 대조가 없으면 반증할 수 없다 |
| 침묵하는 실패 | 07 / 08 / 09 | 에러도 알람도 없이 조용히 퇴화하는 것이 가장 위험하다. 능동 관측 지표가 필요하다 |
| 지식이 없으면 RAG, 행동이 없으면 파인튜닝 | 14 / 15 / 16 | 먼저 판별하고 나서 방안을 고른다. 방향이 틀리면 나머지를 아무리 잘해도 헛수고 |