본문 바로가기

인공지능

프롬프트 캐싱(Prompt Caching)이란 무엇인가? - LLM 응답 속도는 빨라지고 비용은 10배 줄어드는 이유

728x90
반응형
728x170

LLM(OpenAI, Anthropic 등)을 API로 사용하다 보면, 같은 프롬프트를 다시 보내도 응답은 매번 달라지는데 비용은 줄어들고 속도는 빨라지는 현상을 경험해본 적이 있을 것입니다.
그 핵심에는 바로 프롬프트 캐싱(Prompt Caching) 이라는 기술이 있습니다.

이 글에서는 프롬프트 캐싱이 단순히 “응답을 저장해 재사용하는 것”이 아니라, LLM 내부 구조(토크나이저, 임베딩, 트랜스포머, 어텐션) 와 어떻게 맞물려 작동하는지, 그리고 정확히 어떤 데이터(K, V)가 캐시되는지를 단계별로 설명합니다.
이를 통해 왜 입력 토큰 비용이 최대 10배까지 저렴해지고, 응답 지연(latency)이 크게 줄어드는지 이해할 수 있도록 정리합니다.

반응형

프롬프트 캐싱이 주목받는 이유

프롬프트 캐싱은 단순한 비용 절감 기법을 넘어, LLM 서비스 품질을 좌우하는 핵심 요소입니다.

  • 입력 토큰 비용 최대 10배 절감
  • 긴 프롬프트일수록 응답 시작 시간(Time-to-first-token) 대폭 감소
  • 대규모 컨텍스트(수만 토큰)를 다루는 서비스에서 체감 성능 개선

실제 테스트 결과에서도 프롬프트 길이가 길어질수록 캐싱 여부에 따라 응답 시작 시간이 크게 차이 나는 것을 확인할 수 있습니다.
이 때문에 프롬프트 캐싱은 대화형 AI, 문서 분석, 코드 리뷰와 같이 긴 컨텍스트를 반복 사용하는 서비스에서 특히 중요합니다.


LLM은 어떻게 동작하는가

프롬프트 캐싱을 이해하려면 LLM이 텍스트를 처리하는 기본 구조를 먼저 살펴봐야 합니다.
LLM의 처리 흐름은 크게 다음 네 단계로 나눌 수 있습니다.

  1. Tokenizer: 텍스트를 토큰이라는 숫자 단위로 분해
  2. Embedding: 토큰을 의미를 가진 벡터로 변환
  3. Transformer (Attention): 토큰 간의 관계와 중요도를 계산
  4. 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 캐시에는 영향을 주지 않습니다.

즉, 프롬프트 캐싱을 유지한 상태에서도 출력의 다양성은 자유롭게 조절할 수 있습니다.


728x90

프롬프트 캐싱은 단순한 비용 절감 기능이 아니라, LLM 내부 구조를 이해했을 때 비로소 보이는 정교한 최적화 기법입니다.

핵심 정리

  • 프롬프트 캐싱은 응답이 아닌 KV(Key, Value) 캐싱
  • Attention 계산 결과를 재사용해 연산량 감소
  • 비용 절감과 응답 속도 개선을 동시에 달성

기대되는 점

앞으로 LLM 서비스가 더 긴 컨텍스트와 복잡한 요청을 다루게 될수록,
프롬프트 캐싱은 선택이 아닌 기본 인프라 기술로 자리 잡을 가능성이 큽니다.

LLM 기술은 아직 발전 중이지만, 프롬프트 캐싱은 우리가 이미 LLM을 얼마나 효율적으로 운영할 수 있는 단계에 와 있는지를 보여주는 대표적인 사례라고 할 수 있습니다.

300x250

https://ngrok.com/blog/prompt-caching?fbclid=IwY2xjawO3fr1leHRuA2FlbQIxMABicmlkETFGa0dsQjFlWXp0bDlYeTdjc3J0YwZhcHBfaWQQMjIyMDM5MTc4ODIwMDg5MgABHvJYYZ4S5QLhrq-7GzurORKEk0RvkIZZIn68OqTfeu3V49LlgQNAyQ4d8t1D_aem_RKAf-QZuCyB-C3iH2FhfRA

 

Prompt caching: 10x cheaper LLM tokens, but how? | ngrok blog

A far more detailed explanation of prompt caching than anyone asked for.

ngrok.com

728x90
반응형
그리드형