LLM 호출에서 시스템 프롬프트(system prompt)는 대부분 동일하게 반복되는 경우가 많다.
예를 들어 다음과 같은 경우입니다.
- 에이전트의 역할 정의
- 긴 정책 프롬프트
- 툴 설명
- RAG 시스템 지침
이런 프롬프트는 매 요청마다 동일하게 전달되기 때문에 토큰 비용이 반복적으로 발생한다.
이를 줄이기 위해 시스템 프롬프트에 캐시 마커(cache marker)를 붙여 동일 프롬프트 재사용 시 토큰 비용을 줄이는 구조를 구현할 수 있다.
전체 구조
캐싱 구조의 핵심 아이디어는 간단하다.
1️⃣ 시스템 프롬프트에 cache_write 플래그를 설정
2️⃣ 메시지 생성 시 cachePoint 블록을 추가
3️⃣ 동일 프롬프트 재요청 시 LLM Provider 캐시 사용
4️⃣ 응답에서 cache 생성 / 읽기 토큰을 추적

캐시 마커 구조
메시지에 cache_write=True가 설정되면
메시지 뒤에 다음 블록이 추가된다.
{
"cachePoint": {
"type": "default"
}
}
실제 메시지 구조는 다음과 같이 구성된다.
{
"role": "system",
"content": [
{
"text": "You are a helpful assistant..."
},
{
"cachePoint": {
"type": "default"
}
}
]
}
이 마커를 통해 LLM Provider가 해당 프롬프트를 캐싱할 수 있게 된다.
메시지 생성 로직
캐시 마커 삽입은 메시지 생성 단계에서 처리된다.
def _build_content_block(message):
blocks = [{"text": message.content}]
if message.cache_write:
blocks.append({
"cachePoint": {
"type": "default"
}
})
return blocks
동작 방식
- 기본 텍스트 블록 생성
- cache_write=True 여부 확인
- cachePoint 블록 추가
Bedrock 캐시 제한
AWS Bedrock은 한 요청당 최대 4개의 cache_write 블록만 허용한다.
이를 초과하면 API 오류가 발생할 수 있기 때문에
사전에 자동으로 제한하고 있는 것을 확인할 수 있다.
cache_write_block_count = 0
for message in message_list:
if message.cache_write is True:
cache_write_block_count += 1
if cache_write_block_count > 4:
message.cache_write = False
동작 방식
- 메시지를 순회하며 cache_write 개수 확인
- 4개 초과 시 자동 비활성화
이렇게 하면 Provider 제한으로 인한 오류를 방지할 수 있다.
토큰 사용량 추적
캐싱 효과를 측정하기 위해
응답에서 다음 값을 추적하는 것이 필요하다.
- cache_creation
- cache_read
이를 내부 Usage 모델로 파싱 하는 과정을 거쳤다.
usage = extract_usage_from_response(response)
cache_creation = usage.cache_creation
cache_read = usage.cache_read
이 값은 NodeFlow 상태 객체에 저장하도록 했다.
state.cache_write_token += cache_creation
state.cache_read_token += cache_read
[확인 가능한 정보]
- 캐시 생성 토큰
- 캐시 재사용 토큰
- 실제 절감 효과
캐싱 적용 대상
일반적으로 적용하는 대상은??
시스템 프롬프트
You are a helpful assistant specialized in legal analysis.
Follow the company policy and guidelines.
툴 설명
Tool: search_document
Description: search documents from knowledge base
정책 프롬프트
Always answer in Korean.
Do not generate harmful content.
이런 프롬프트는 요청마다 동일하게 반복되기 때문에 캐싱 효과가 매우 크다.
캐싱 효과
1️⃣ 토큰 비용 절감
긴 시스템 프롬프트 재사용
2️⃣ 응답 속도 개선
프롬프트 처리 비용 감소
3️⃣ 안정적인 에이전트 구조
대형 프롬프트 기반 에이전트에 특히 유리
정리
1️⃣ 시스템 프롬프트에 cache_write 마커 추가
2️⃣ 메시지 생성 시 cachePoint 블록 삽입
3️⃣ Bedrock 제한 (최대 4개) 사전 처리
4️⃣ cache_creation / cache_read 토큰 추적
이 구조를 적용하면 긴 시스템 프롬프트 기반 LLM 시스템에서 상당한 비용 절감 효과를 얻을 수 있다.🙆♀️
'Python' 카테고리의 다른 글
| SQS 장시간 작업 처리 (0) | 2025.04.18 |
|---|---|
| LLM Multi-Provider 아키텍처 설계 (Registry + Strategy 패턴) (0) | 2025.04.10 |
| Flask + LangGraph 환경에서 LLM Streaming 처리 구조 (0) | 2025.03.27 |
| Claude, GPT, Gemini 이미지 입력 방식 비교 (0) | 2024.03.01 |
| [Anaconda Prompt] 파이썬 아나콘다 & 케라스 설치 / tensorflow 설치 시 에러 (0) | 2023.03.20 |