대규모 언어 모델(LLM)은 입력 텍스트(프롬프트)를 토큰 단위로 분리해 순차적으로 계산합니다.
하지만 동일한 시스템 프롬프트를 여러 번 사용하는 경우,
모델은 매번 같은 문장을 처음부터 다시 계산합니다.
예를 들어 다음과 같은 두 요청을 생각해봅시다.
요청 1: [당신은 친절한 챗봇입니다.] + [오늘 날씨 어때?]
요청 2: [당신은 친절한 챗봇입니다.] + [내일 날씨 어때?]
캐싱이 없으면 두 요청 모두 ‘당신은 친절한 챗봇입니다.’ 부분을 매번 다시 계산해야 합니다.
이때 반복 계산을 막기 위해 사용하는 개념이 바로 Prefix입니다.
Prefix는 여러 API 요청에 걸쳐 절대 변하지 않는 프롬프트의 고정된 앞부분을 의미합니다.
프롬프트 캐싱(Prompt Caching)은 이 Prefix의 계산 결과를 저장해두고,
다음 요청 시 재사용하는 기능입니다.
[Prefix] 당신은 친절한 챗봇입니다. 항상 한국어로 답해주세요.
[Suffix] 오늘 날씨 어때?
이 과정을 통해 응답 속도는 빨라지고, API 비용은 절감됩니다.
<PROMPT_CACHING>
당신은 전문 번역가입니다.
다음 텍스트를 영어로 번역해주세요.
</PROMPT_CACHING>
"대한민국의 수도는 서울입니다."
여기서 <PROMPT_CACHING> 영역은 캐시될 Prefix입니다.
이후 문장만 바뀌어도 번역 지시문은 다시 계산되지 않습니다.
very_long_prompt = """
당신은 매우 친절한 AI 어시스턴트입니다.
당신의 임무는 주어진 질문에 대해 친절하게 답변하는 것입니다.
<WANT_TO_CACHE_HERE>
#참고:
**Prompt Caching**
Model prompts often contain repetitive content...
</WANT_TO_CACHE_HERE>
#Question:
{}
"""
Static Prefix:
<WANT_TO_CACHE_HERE> 영역Dynamic Suffix:
{}에 사용자 질문 삽입프롬프트 캐시는 내부적으로 KV 캐시(Key/Value Cache) 기술을 이용합니다.
하지만 두 개념은 적용 범위가 다릅니다.
| 구분 | KV 캐시 | 프롬프트 캐시 |
|---|---|---|
| 작동 범위 | 단일 요청 내 | 여러 요청 간 |
| 저장 대상 | 이전 토큰의 Key/Value 행렬 | Prefix의 계산 결과(KV 상태 포함) |
| 유효 기간 | 요청 종료 시 삭제 | 일정 시간 동안 유지 (수분~수시간) |
| 위치 | 모델 내부 | API 서비스 레벨 |
즉, 프롬프트 캐시는 “KV 캐시를 여러 요청 간에 재활용”하도록 확장한 기술입니다.
프롬프트 캐싱은 단순히 비용을 아끼는 기술이 아닙니다.
LLM을 서비스에 통합할 때 응답 지연을 줄이고 효율을 극대화하는 핵심 전략입니다.