
LLM(OpenAI, Anthropic 등)을 API로 사용하다 보면, 같은 프롬프트를 다시 보내도 응답은 매번 달라지는데 비용은 줄어들고 속도는 빨라지는 현상을 경험해본 적이 있을 것입니다.
그 핵심에는 바로 프롬프트 캐싱(Prompt Caching) 이라는 기술이 있습니다.
이 글에서는 프롬프트 캐싱이 단순히 “응답을 저장해 재사용하는 것”이 아니라, LLM 내부 구조(토크나이저, 임베딩, 트랜스포머, 어텐션) 와 어떻게 맞물려 작동하는지, 그리고 정확히 어떤 데이터(K, V)가 캐시되는지를 단계별로 설명합니다.
이를 통해 왜 입력 토큰 비용이 최대 10배까지 저렴해지고, 응답 지연(latency)이 크게 줄어드는지 이해할 수 있도록 정리합니다.
프롬프트 캐싱이 주목받는 이유
프롬프트 캐싱은 단순한 비용 절감 기법을 넘어, LLM 서비스 품질을 좌우하는 핵심 요소입니다.
- 입력 토큰 비용 최대 10배 절감
- 긴 프롬프트일수록 응답 시작 시간(Time-to-first-token) 대폭 감소
- 대규모 컨텍스트(수만 토큰)를 다루는 서비스에서 체감 성능 개선
실제 테스트 결과에서도 프롬프트 길이가 길어질수록 캐싱 여부에 따라 응답 시작 시간이 크게 차이 나는 것을 확인할 수 있습니다.
이 때문에 프롬프트 캐싱은 대화형 AI, 문서 분석, 코드 리뷰와 같이 긴 컨텍스트를 반복 사용하는 서비스에서 특히 중요합니다.
LLM은 어떻게 동작하는가
프롬프트 캐싱을 이해하려면 LLM이 텍스트를 처리하는 기본 구조를 먼저 살펴봐야 합니다.
LLM의 처리 흐름은 크게 다음 네 단계로 나눌 수 있습니다.
- Tokenizer: 텍스트를 토큰이라는 숫자 단위로 분해
- Embedding: 토큰을 의미를 가진 벡터로 변환
- Transformer (Attention): 토큰 간의 관계와 중요도를 계산
- Output: 다음 토큰을 예측하여 출력
이 중 프롬프트 캐싱이 실제로 발생하는 지점은 Transformer 내부의 Attention 단계입니다.
Tokenizer: 텍스트는 어떻게 숫자가 되는가
LLM은 텍스트 자체를 이해하지 못합니다.
대신 문장을 잘게 쪼개어 토큰(Token) 이라는 숫자 ID로 변환합니다.
예를 들어 다음 문장은,
Check out ngrok.ai
아래와 같이 토큰화됩니다.
- "Check"
- " out"
- " ng"
- "rok"
- ".ai"
각 토큰은 고유한 정수 ID를 가지며, 같은 문장은 항상 같은 토큰 시퀀스로 변환됩니다.
또한 토큰은 대소문자를 구분하는데, 이는 의미 차이를 반영하기 위함입니다.
Embedding: 숫자에 의미를 입히는 단계
토큰은 단순한 숫자이기 때문에, LLM은 이를 그대로 사용할 수 없습니다.
그래서 각 토큰은 임베딩(Embedding) 이라는 고차원 벡터로 변환됩니다.
- 임베딩은 수천에서 수만 차원의 벡터
- 의미, 문맥, 뉘앙스가 공간상의 위치로 표현됨
- 학습 과정에서 비슷한 의미의 토큰은 가까운 위치로 이동
즉, 임베딩은 LLM이 단어와 문장의 의미적 유사성을 계산할 수 있도록 만드는 핵심 표현 방식입니다.
Transformer와 Attention의 역할
Transformer의 핵심은 Attention 메커니즘입니다.
Attention은 문장 안에서 각 토큰이 다음 토큰을 생성하는 데 얼마나 중요한지를 계산합니다.
예를 들어 문장이 다음과 같다고 가정해보겠습니다.
Mary had a little
모델은 다음 토큰을 생성할 때,
- Mary는 얼마나 중요한지
- had는 얼마나 중요한지
- a는 얼마나 중요한지
를 수치화하여 가중치로 계산합니다.
이 과정에서 생성되는 핵심 데이터가 바로 K(Key) 와 V(Value) 행렬입니다.
프롬프트 캐싱의 핵심: 무엇을 저장하는가
프롬프트 캐싱에 대해 가장 흔한 오해는 다음과 같습니다.
- 응답 결과를 저장해 다시 사용한다
- 같은 프롬프트면 같은 답을 돌려준다
하지만 실제로 캐싱되는 것은 응답이 아니라 Attention 계산의 중간 결과입니다.
정확히 말하면, 캐시되는 데이터는 다음 두 가지입니다.
- K(Key) 행렬
- V(Value) 행렬
이 두 행렬은 토큰 임베딩과 학습된 가중치(WK, WV)를 곱해 생성되며, 한 번 계산되면 변하지 않습니다.
왜 K와 V를 캐시하면 효율적인가
LLM은 토큰을 하나 생성할 때마다 기존 프롬프트 전체를 다시 계산하는 구조를 가지고 있습니다.
하지만 이미 계산이 끝난 이전 토큰들의 K, V 값은 다시 계산할 필요가 없습니다.
따라서 프롬프트 캐싱은 다음 방식으로 동작합니다.
- 이전 토큰들의 K, V는 캐시에 저장
- 새로 추가된 토큰에 대해서만 계산 수행
이 방식은 일반적으로 KV 캐싱이라고 불립니다.
프롬프트 캐싱으로 얻는 효과
계산량 감소
전체 프롬프트를 매번 다시 계산하지 않아도 되기 때문에 연산량이 크게 줄어듭니다.
응답 속도 개선
특히 긴 프롬프트일수록 응답 시작 시간이 눈에 띄게 빨라집니다.
비용 절감
불필요한 입력 토큰 계산이 줄어들어 API 사용 비용이 크게 감소합니다.
OpenAI와 Anthropic의 캐싱 방식 차이
입력된 정보 기준으로 보면, 두 회사는 캐싱을 다르게 접근합니다.
OpenAI
- 캐싱을 자동으로 처리
- 사용자가 캐싱 여부를 직접 제어하지 않음
- 상황에 따라 캐시 히트율이 달라질 수 있음
Anthropic
- 사용자가 캐싱 여부와 유지 시간을 명시적으로 지정 가능
- 추가 비용이 발생하지만 캐시 재사용률이 높음
- 긴 컨텍스트와 안정적인 지연 시간이 중요한 서비스에 적합
Temperature를 변경해도 캐싱이 유지되는 이유
Temperature, top_p, top_k 같은 파라미터는 출력 토큰을 선택하는 마지막 단계에만 영향을 줍니다.
이는 Attention 계산 이후 단계이기 때문에, K와 V 캐시에는 영향을 주지 않습니다.
즉, 프롬프트 캐싱을 유지한 상태에서도 출력의 다양성은 자유롭게 조절할 수 있습니다.
프롬프트 캐싱은 단순한 비용 절감 기능이 아니라, LLM 내부 구조를 이해했을 때 비로소 보이는 정교한 최적화 기법입니다.
핵심 정리
- 프롬프트 캐싱은 응답이 아닌 KV(Key, Value) 캐싱
- Attention 계산 결과를 재사용해 연산량 감소
- 비용 절감과 응답 속도 개선을 동시에 달성
기대되는 점
앞으로 LLM 서비스가 더 긴 컨텍스트와 복잡한 요청을 다루게 될수록,
프롬프트 캐싱은 선택이 아닌 기본 인프라 기술로 자리 잡을 가능성이 큽니다.
LLM 기술은 아직 발전 중이지만, 프롬프트 캐싱은 우리가 이미 LLM을 얼마나 효율적으로 운영할 수 있는 단계에 와 있는지를 보여주는 대표적인 사례라고 할 수 있습니다.
Prompt caching: 10x cheaper LLM tokens, but how? | ngrok blog
A far more detailed explanation of prompt caching than anyone asked for.
ngrok.com

'인공지능' 카테고리의 다른 글
| ARC-AGI의 50% 벽을 넘다 - Poetiq과 GPT-5.2가 보여준 테스트 시점 추론의 진짜 힘 (0) | 2025.12.24 |
|---|---|
| 엔비디아 범용 게임 에이전트 ‘나이트로젠(NitroGen)’ 공개 - 게임을 넘어 로봇 공학까지 확장되는 체화 AI의 가능성 (0) | 2025.12.23 |
| 메타의 ‘SAM 오디오’란? 원하는 소리만 정확히 분리하는 차세대 AI 오디오 모델 (0) | 2025.12.23 |
| 2025년 AI 엔지니어링 트렌드 총정리: 에이전트, MCP, 그리고 바이브 코딩의 등장 (0) | 2025.12.23 |
| MiniMax M2.1 공개: 루빅스 큐 시뮬레이터까지 구현한 실전형 오픈소스 AI 코딩 모델 (0) | 2025.12.23 |