카페 단골은 '늘 마시던 걸로'라는 한마디면 된다. 그런데 AI는 왜 매번 대화 전체를 처음부터 다시 읽을까 — 그리고 프롬프트 캐시는 어떻게 그 낭비를 10분의 1 가격으로 줄일까? 독서 노트, 도미노, 냉장고, 기차 네 가지 비유와 일러스트로 KV 캐시의 원리를 바닥부터 그려 본다. 왜 '접두사'만 적중하는지, 왜 캐시 쓰기는 비싸고 읽기는 싼지, 왜 1시간이 지나면 증발하는지 — 그림으로 이해하면 /rewind와 /compact 중 뭘 눌러야 할지가 저절로 보인다.
코어닷투데이2026-08-3021분
들어가며: "늘 마시던 걸로"의 과학
단골 카페에 들어선다. 바리스타가 눈을 마주치고 웃는다. "늘 드시던 걸로?" — 끝. 주문에 걸린 시간 2초.
처음 간 카페라면 이야기가 다르다. "아이스로 주시고요, 샷은 하나 빼고, 우유는 오트로, 시럽은 반만, 얼음은 적게…" 매번 이 설명을 처음부터 반복해야 한다면, 커피 한 잔 마시는 일이 꽤 피곤할 것이다.
놀랍게도 LLM API는 오랫동안 '단골'이라는 개념이 없는 카페였다. 열 번째 대화 턴을 보낼 때도 서버는 앞의 아홉 턴을 처음부터 다시 읽었다. 우리 눈에는 이어지는 대화지만, 서버에게는 매번 처음 보는 문서였다.
프롬프트 캐시는 이 카페에 '단골 장부'를 도입한 것이다. 한 번 읽은 부분은 계산값을 보관해 두고, 다음에 같은 부분이 오면 읽는 시늉만 하고 건너뛴다. 그 대가로 가격은 10분의 1이 된다.
이 글은 그 장부가 어떻게 생겼고(독서 노트), 왜 앞부분만 유효하며(도미노), 왜 1시간 만에 버려지는지(냉장고)를 일러스트로 하나씩 그려 본다. 다 읽고 나면 Claude Code에서 /rewind를 누를지 /compact를 누를지, 모델은 언제 바꿔야 하는지가 원리에서 저절로 나온다.
1장. 기억 없는 카페 — AI는 매번 처음 읽는다
↓
2장. 독서 노트 — K와 V, 캐시에 저장되는 것의 정체
↓
3장. 도미노의 법칙 — 왜 '접두사'만 적중하나
↓
4장. 냉장고와 타이머 — 쓰기 2배, 읽기 0.1배, 수명 1시간
↓
5장. 실전 — Claude Code에서 캐시 지키기
1장. 기억 없는 카페 — AI는 매번 처음 읽는다
먼저 오해 하나를 걷어내자. 챗봇과 대화할 때 우리는 AI가 대화를 "기억하고 있다"고 느낀다. 하지만 LLM API의 실제 동작은 이렇다.
턴 1
앱이 서버로 보내는 것: [내 첫 질문]. 모델이 읽는 양: 질문 하나.
턴 2
앱이 보내는 것: [첫 질문 + 첫 답변 + 두 번째 질문]. 모델은 이 전체를 처음부터 읽는다.
턴 10
앱이 보내는 것: 지금까지의 대화 전부 + 새 질문. 모델은 또, 전부, 처음부터 읽는다.
모델 자체는 요청과 요청 사이에 아무것도 저장하지 않는다. "기억"처럼 보이는 것은 앱이 매번 대화 이력 전체를 다시 보내 주기 때문에 생기는 착시다. 마치 금붕어 기억력의 바리스타에게 매번 주문 내역서 전체를 처음부터 낭독해 주는 것과 같다.
이 구조의 문제는 명백하다. 대화가 길어질수록 매 턴 다시 읽는 양이 늘고, 그 비용이 차곡차곡 쌓인다. 10턴짜리 대화에서 서버가 읽은 총량은 대화 길이의 열 배 가까이 된다. 읽기(프리필)는 GPU 연산이고, GPU 연산은 돈이다.
그런데 잠깐. 어제 읽은 페이지를 오늘 또 읽는다면, 어제 정리해 둔 노트를 다시 쓰면 되지 않나? 바로 그 노트가 다음 장의 주인공이다.
2장. 독서 노트 — K와 V, 캐시에 저장되는 것의 정체
트랜스포머가 글을 "읽는다"는 것은 정확히 무엇을 하는 걸까. 비유로 가 보자.
로봇이 책을 읽는다. 단어 하나를 읽을 때마다 로봇은 포스트잇 두 장을 쓴다.
한 장에는 "나를 이렇게 찾아라" — 이 단어가 어떤 종류의 정보를 담고 있는지 알려주는 색인표. 이것이 키(Key)다.
다른 한 장에는 "내가 가진 내용" — 이 단어가 문맥 속에서 실제로 담고 있는 의미의 요약. 이것이 밸류(Value)다.
그리고 새 단어를 읽을 때마다 로봇은 질문(Query) 을 하나 들고, 지금까지 벽에 붙여 둔 모든 키를 훑으며 "내 질문과 관련 있는 노트가 어디 있지?"를 찾아, 관련도가 높은 밸류들을 모아 새 단어의 의미를 완성한다. 이 과정이 그 유명한 어텐션(Attention)이다.
중요한 건 이 지점이다. 한 번 만든 노트는, 앞의 글이 바뀌지 않는 한 다시 만들 필요가 없다. 같은 프롬프트가 또 들어오면 노트 만들기(비싼 행렬 연산)를 건너뛰고, 붙여 둔 노트를 그대로 재사용하면 된다.
이 "붙여 둔 노트 묶음"이 바로 KV 캐시다. 사실 KV 캐시는 원래 한 요청 안에서 답을 한 토큰씩 생성할 때 앞 토큰들의 노트를 재사용하는 장치로 쓰였다. 프롬프트 캐싱의 아이디어는 소박하다 — "그 노트를 요청이 끝나도 버리지 말고, 다음 요청에서도 쓰자."
말은 쉽지만 걸림돌이 있었다. 노트가 어마어마하게 크다. 토큰 하나마다, 모델의 모든 층(layer)마다 키와 밸류 벡터가 생긴다. 대형 모델에서 수십만 토큰의 대화라면 KV 캐시가 기가바이트 단위로 불어난다. 이 노트를 서버 메모리에 어떻게 쌓아 둘 것인가가 문제였고, 2023년 UC 버클리의 vLLM 팀이 「PagedAttention」(SOSP 2023)에서 운영체제의 가상 메모리처럼 노트를 페이지 단위로 잘라 관리하는 방법을 내놓으면서 판이 바뀌었다. 여러 요청이 같은 접두사의 노트를 공유하는 것도 가능해졌다. 2024년 8월 Anthropic이 "캐시 읽기 최대 90% 절감"을 내걸고 프롬프트 캐싱을 출시한 것은 이 기반 위에서였다.
📚
문제
같은 대화 이력을 턴마다 처음부터 다시 읽는다. 읽기는 GPU 연산 = 돈.
🗒️
해결
읽으며 만든 독서 노트(K·V)를 요청이 끝나도 보관하고, 같은 접두사가 오면 노트를 재사용한다 = KV 캐시.
💸
결과
캐시에서 읽는 토큰은 입력 정가의 0.1배. 단골 손님의 "늘 마시던 걸로"가 가능해진다.
3장. 도미노의 법칙 — 왜 '접두사'만 적중하나
여기가 캐시 이해의 심장부다. 그리고 캐시에 관한 거의 모든 실무 규칙이 이 한 장에서 나온다.
로봇의 독서 노트에는 결정적인 성질이 하나 있다. 단어 N의 노트는 단어 1부터 N-1까지 전부를 반영해 만들어진다. 어텐션이 "지금까지의 모든 노트를 훑어서" 새 노트를 만들기 때문이다. 같은 단어라도 앞 문맥이 다르면 노트 내용이 완전히 달라진다 — "배가 아프다"의 '배'와 "배가 항구에 들어온다"의 '배'는 다른 노트를 갖는다.
한 가지 짚어 둘 것: /model이 캐시를 깨는 이유는 표면적으로는 "설정이 바뀌어서"가 아니라 더 근본적이다. 독서 노트는 그 모델의 두뇌로 쓴 노트다. 다른 모델은 같은 문장을 읽어도 완전히 다른 내부 표현(노트)을 만든다. A 모델의 노트를 B 모델에게 줘 봐야 읽을 수 없는 암호일 뿐이다. 그래서 캐시는 모델별로 따로 존재하고, 모델을 바꾸면 새 모델 입장에서 대화 전체가 '처음 보는 글'이 된다.
4장. 냉장고와 타이머 — 쓰기 2배, 읽기 0.1배, 수명 1시간
노트를 재사용하면 연산은 공짜에 가깝다. 그런데 왜 0배가 아니라 0.1배일까? 그리고 캐시 쓰기는 왜 오히려 정가보다 비쌀까(최대 2배)? 답은 캐시가 연산을 아끼는 대신 메모리를 쓰는 거래이기 때문이다.
냉장고를 상상하자. 서버의 GPU 메모리(와 그 주변 스토리지)는 크고 비싼 업소용 냉장고다.
캐시 쓰기가 비싼 이유(최대 2배): 노트를 만들 뿐 아니라 냉장고 자리를 잡고 보관을 시작해야 한다. 자릿세 선불이다. 대신 토큰당 딱 한 번만 낸다.
캐시 읽기가 0.1배인 이유(0이 아니라): 연산은 건너뛰지만, 냉장고에서 노트를 꺼내 GPU 앞까지 나르는 일(메모리 대역폭)과 보관 자체의 비용은 남는다. 그 운반비가 0.1배다.
수명이 있는 이유(구독 1시간, API 키 5분): 냉장고는 유한하고, 모든 손님의 노트를 영원히 보관할 수 없다. 한동안 안 오는 손님의 노트는 버려서 자리를 비운다. 구독 플랜은 1시간, API 키는 5분 뒤에 노트가 증발한다.
이 세 가지 숫자를 한 줄에 놓으면 캐시의 손익분기가 보인다.
캐시 읽기 (적중)
0.1×
입력 정가 (미스)
1.0×
캐시 쓰기 (최초 1회)
최대 2.0×
쓰기가 2배라도, 그 토큰을 두 턴 이상 다시 만나면 이미 이득이다(2.0 + 0.1 < 1.0 + 1.0). 대화형 코딩 세션은 같은 접두사를 수십 번씩 다시 만나므로, 캐시는 거의 항상 압도적으로 남는 장사다. 반대로 다시 만나지 못하면 — 즉 캐시를 깨거나, 1시간 넘게 자리를 비우면 — 선불로 낸 자릿세만 날린다.
그래서 실무 규칙 두 개가 자동으로 따라 나온다.
자리를 비우기 전엔 /compact. 어차피 타이머가 노트를 증발시킬 거라면, 증발 전에 대화를 요약해 작게 만들어 두는 게 낫다. 돌아와서 다시 만들 노트가 15만 토큰이 아니라 2만 토큰이 된다.
모델·effort는 세션 시작 직후에. 노트를 잔뜩 쌓아 놓고 맨 앞 설정을 바꾸면 도미노 전체가 쓰러진다. 아직 노트가 없을 때 바꾸는 건 공짜다.
5장. 실전 — Claude Code에서 캐시 지키기
원리는 끝났다. 이제 아침에 터미널을 열고 나서의 순서로 정리하자.
세션 시작
첫 프롬프트를 치기 전에 /model 과 /effort 를 정한다. 지금은 뭘 바꿔도 공짜다 — 노트가 아직 없으니까.
작업 중
파일은 @멘션으로 뒤에 붙인다. 방향을 잘못 잡았으면 /compact 가 아니라 /rewind — 뒤를 잘라내는 건 도미노를 건드리지 않는다.
자리 비우기 전
1시간 넘게 비울 것 같으면 /compact. 타이머에 증발할 노트라면, 증발 전에 작게 만들어 둔다.
작업이 바뀌면
/clear 로 새 기차를 출발시킨다. 어차피 새로 쌓을 노트, 지난 작업의 노트를 실어 나를 이유가 없다.
마지막으로, 캐시는 '아끼는 기술'이면서 동시에 '대화형 에이전트를 가능하게 만든 기술'이라는 점을 기억해 두자. 매 턴 대화 전체를 정가로 재프리필해야 한다면, 수백 턴짜리 코딩 세션의 비용과 지연은 감당이 안 됐을 것이다. 우리가 Claude Code와 하루 종일 자연스럽게 주고받을 수 있는 것은, 보이지 않는 곳에서 냉장고 가득 독서 노트가 관리되고 있기 때문이다.
캐시가 세션 비용 전체에서 차지하는 위치 — 모델 선택, 세션 길이, 사고 수준과의 관계 — 는 자매편 클로드 코드 세션 경제학에서 시뮬레이터와 함께 다뤘다. 이 글로 원리를 잡았다면, 그 글에서 지갑을 잡으면 된다.
이 글 전체를 네 컷으로
☕ 단골 장부AI는 원래 매번 처음 읽는다 — 캐시가 '단골'을 만든다
🗒️ 독서 노트읽으며 만든 K·V 노트를 버리지 않고 보관 = KV 캐시
🁢 도미노노트는 앞 문맥에 의존 — 앞을 바꾸면 뒤 전부 무효, 뒤에 붙이면 안전
🧊 냉장고쓰기 2배(자릿세) · 읽기 0.1배(운반비) · 1시간 타이머(자리 회수)
참고 자료
Vaswani et al., "Attention Is All You Need", NeurIPS 2017 — 어텐션과 K·Q·V의 원형
Kwon et al., "Efficient Memory Management for Large Language Model Serving with PagedAttention", SOSP 2023 — KV 캐시의 페이지 관리와 접두사 공유
Anthropic, "Prompt caching with Claude", 2024.8 — 캐시 읽기 90% 절감, 쓰기 프리미엄
Lydia Hallie, "Maximizing the value of your Claude Code sessions", Anthropic, 2026.8 — 캐시를 깨는 행동 목록과 세션 운용 수칙