1. 컨텍스트 캐싱 (Context Caching) 요약
"AI에게 교과서를 미리 읽혀두고, 시험 때는 질문만 던지는 기술"
✅ 작동의 핵심 조건: "앞부분이 똑같아야 한다" (Prefix Matching)
- 대원칙: 프롬프트의 **앞부분(접두어)**이 이전 호출과 완전히 일치할 때만 캐시가 작동합니다.
- 실무적 배치: 1. [고정] 시스템 프롬프트 (Role 부여)
- 2. [고정] 대용량 MD 파일 (매뉴얼, 코드 전체 구조)
- 3. [변동] 사용자의 현재 질문 ($Q$)
※ 주의: 질문을 문서 앞에 두면 캐싱은 매번 깨집니다.
✅ 왜 사용하는가? (3대 이점)
- 경제성: 100만 토큰 이상의 대규모 컨텍스트 사용 시 비용이 약 90% 절감됩니다.
- 속도: 문서 전체를 다시 해석하는 연산(Prefill)을 건너뛰므로 응답 속도가 즉각적입니다.
- 정확도: 정보를 조각내는 RAG와 달리, 문서 전체의 맥락을 유지하여 할루시네이션(환각)을 최소화합니다.
2. [상세 설명] 캐싱의 수학적 본체: Q, K, V
캐싱이 실제로 저장하는 것은 텍스트가 아니라, 모델이 연산을 마친 **'KV 상태(Key-Value State)'**입니다.
🔍 QKV 직관적 정의
- $Q$ (Query - 질문): 지금 막 들어온 질문의 '검색 의도'. (캐싱 불가, 매번 생성)
- $K$ (Key - 이름표): 보관된 정보들이 가진 '인덱스/특징'. (캐싱의 대상)
- $V$ (Value - 알맹이): 실제 답변에 쓰일 '의미적 정보'. (캐싱의 대상)
🏗️ 캐싱이 일어나는 공학적 과정
- 안경 ($W$) 적용: 모델의 고정된 가중치($W_K, W_V$)라는 안경으로 입력된 MD 파일($X$)을 봅니다.
- 결과물 생성: "이 내용은 로봇 팔 제어에 관한 것($K$)"이고 "구체적인 전압값은 220V($V$)"라는 벡터 결과물이 나옵니다.
- 메모리 고정: 이 $K, V$ 벡터들을 GPU 메모리에 박아둡니다. 이것이 바로 KV Cache입니다.
- 즉시 매칭: 새로운 질문($Q$)이 들어오면, 메모리에 있는 $K$들과 대조하여 필요한 $V$를 광속으로 조합해 답변합니다.
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$
교수님을 위한 한 줄 요약: "캐싱이란 위 수식에서 이미 계산이 끝난 고정값 $K$와 $V$를 메모리에 홀드(Hold)시켜서, 새로운 $Q$가 들어올 때마다 곱하기 연산만 빠르게 수행하는 최적화 기법입니다."
3. RAG vs Long-Context Caching (비교표)
| 구분 | RAG (기존 방식) | Long-Context Caching (최신 방식) |
| 비유 | 도서관에서 책 찾아오기 | 책 내용을 다 외우고 있기 |
| 데이터 양 | 무제한 (테라바이트 단위) | 수백만 토큰 (수십 권의 책/코드) |
| 준비 과정 | 벡터 DB 구축, 청킹(Chunking) | 단순히 MD 파일 업로드 후 캐싱 |
| 장점 | 유지비가 저렴함 | 맥락 이해가 완벽하고 구현이 매우 쉬움 |
| 적정 사례 | 고객센터 FAQ, 사내 위키 전체 | 특정 프로젝트 코드 리뷰, 전용 제품 매뉴얼 |
< Context Caching 방식 비교 >
1. 명시적 방식 vs 자동 방식 비교
| 구분 | 자동 캐싱 (Implicit) | 명시적 캐싱 (Explicit) |
| 제어권 | 구글 인프라가 판단 (알아서 함) | 개발자가 직접 생성 및 삭제 |
| 작동 조건 | 32k 토큰 이상 + 접두어 완전 일치 | 토큰 양에 상관없이 개발자가 지정 |
| 비용 할인 | 불확실함 (기회주의적) | 확정적 (약 90% 인풋 토큰 할인) |
| 보관 비용 | 없음 | 있음 (시간당 보관료 발생) |
2. 명시적 캐싱의 3단계 워크플로우
명시적 캐싱을 구현할 때는 단순히 텍스트를 보내는 게 아니라, **'데이터를 서버에 박아두고 주소표를 받는 과정'**이 추가됩니다.
[Step 1] 캐시 생성 및 업로드 (Create)
변하지 않는 대용량 MD 파일이나 소스 코드를 서버로 보냅니다. 이때 모델은 이 데이터를 읽고 **$K$와 $V$ 벡터(KV Cache)**를 미리 계산해둡니다.
- 이때 **TTL(Time To Live)**을 설정하여, 이 지식을 언제까지 기억할지 명시합니다.
[Step 2] 캐시 참조 ID 획득 (Reference)
서버는 계산된 KV 상태를 저장하고, 이를 가리키는 고유한 **cache_name (또는 ID)**을 개발자에게 돌려줍니다.
[Step 3] 질문 및 답변 (Inference)
이제 질문을 던질 때 대용량 텍스트를 다시 보낼 필요가 없습니다. **"아까 그 ID(cache_name)를 기반으로 대답해줘"**라고 질문($Q$)만 보냅니다.