본문으로 건너뛰기

"Cost Efficiency" 태그 — 3개 게시물

비용 최적화, 효율성 관련 글

모든 태그 보기

rtk-ai

· 약 2분
최재훈
LEAD (AI Research Engineer), Brain Crew

TL;DR

Claude Code 사용 시 context token을 압축하는 오픈소스 도구인 rtk-ai를 소개합니다. AI 코딩 어시스턴트를 활용할 때 불필요하게 많은 토큰이 소비되는 문제를 해결하여 비용 효율성을 높일 수 있습니다. 특히 대규모 코드베이스를 다루는 Research Engineer들에게 API 비용 절감과 성능 개선에 유용한 도구입니다.

Key Takeaways

  • Context Token 압축: Claude Code와 같은 AI 코딩 어시스턴트 사용 시 전송되는 컨텍스트 토큰을 압축하여 API 비용을 절감할 수 있습니다.
  • 비용 최적화: 대규모 코드베이스나 긴 대화 세션에서 누적되는 토큰 비용을 효과적으로 관리할 수 있어, 반복적인 실험이 많은 연구 환경에서 특히 유용합니다.
  • 오픈소스 접근성: 오픈소스로 제공되어 자체 환경에 맞게 커스터마이징하거나 내부 시스템과 통합할 수 있습니다.

상세 내용

rtk-ai란?

rtk-ai는 Claude Code와 같은 AI 코딩 어시스턴트를 사용할 때 발생하는 context token 소비를 최적화하기 위한 오픈소스 도구입니다. AI 모델에 코드 컨텍스트를 전달할 때, 불필요하거나 중복된 정보를 압축하여 전송함으로써 토큰 사용량을 줄이는 것이 핵심 기능입니다.

왜 Context Token 압축이 필요한가?

AI Research Engineer들이 Claude Code와 같은 도구를 활용할 때 다음과 같은 상황에서 토큰 비용이 급증할 수 있습니다:

  • 대규모 코드베이스: 전체 프로젝트 구조를 컨텍스트로 전달할 때
  • 반복적인 쿼리: 비슷한 코드 블록을 여러 번 참조할 때
  • 긴 대화 세션: 이전 대화 히스토리가 누적될 때
  • 모델 실험: 다양한 프롬프트와 코드 변형을 테스트할 때

이러한 시나리오에서 토큰 압축은 실질적인 비용 절감으로 이어집니다.

활용 시나리오

연구 코드 개발: 실험적인 모델 구현 시 반복적으로 코드를 수정하고 AI 어시스턴트와 대화하는 과정에서 비용을 절감할 수 있습니다.

코드 리뷰 및 리팩토링: 대규모 코드베이스의 특정 부분을 분석하거나 개선할 때, 필요한 컨텍스트만 효율적으로 전달할 수 있습니다.

문서화 및 설명 생성: 복잡한 연구 코드에 대한 문서를 AI로 생성할 때, 관련 코드만 선별적으로 압축하여 전달할 수 있습니다.

오픈소스의 장점

rtk-ai가 오픈소스로 제공됨에 따라 다음과 같은 이점이 있습니다:

  • 투명성: 토큰 압축 로직을 직접 확인하고 검증할 수 있습니다
  • 커스터마이징: 특정 프로젝트나 팀의 니즈에 맞게 수정 가능합니다
  • 통합 용이성: 기존 개발 워크플로우나 CI/CD 파이프라인에 통합할 수 있습니다
  • 커뮤니티 기여: 개선 사항을 공유하고 다른 사용자들의 피드백을 받을 수 있습니다

도입 시 고려사항

rtk-ai를 프로젝트에 도입할 때는 다음을 고려해야 합니다:

  • 압축으로 인해 손실되는 컨텍스트 정보가 있는지 확인
  • 특정 코드 패턴이나 프로젝트 구조에 최적화된 압축 설정
  • 팀원들의 워크플로우와의 호환성
  • 압축 효과와 실제 비용 절감 효과 측정

References

  • rtk-ai (오픈소스 프로젝트) - 원본 문서 참조

프롬프트 캐싱(Prompt Caching) 전략

· 약 8분
김태한
AI Research Engineer, Brain Crew

TL;DR

프롬프트 캐싱은 AI 에이전트의 비용을 최대 90% 절감하고 응답 속도를 획기적으로 개선하는 핵심 기술입니다. 접두사 매칭(Prefix Matching) 원리에 기반하여, 변하지 않는 컨텍스트는 앞에 배치하고 동적 요소는 뒤로 보내는 전략이 필수적입니다. 시스템 프롬프트에 타임스탬프를 넣거나 도구 세트를 수시로 변경하는 등 캐시를 무효화하는 안티패턴을 피하고, 캐시 히트율을 시스템 가용성만큼 중요한 지표로 모니터링해야 합니다. Claude Code 팀의 실전 경험에서 나온 5가지 골든 룰을 따르면 비용 효율성과 사용자 경험을 동시에 극대화할 수 있습니다.

Key Takeaways

  • 프롬프트 레이아웃 설계가 핵심: 전역 정적 콘텐츠 → 프로젝트 컨텍스트 → 세션 컨텍스트 → 대화 기록 순으로 계층화하여 여러 세션이 상단부 캐시를 공유하도록 설계
  • 캐시 무효화 방지 원칙: 시스템 프롬프트에 동적 정보(타임스탬프 등) 절대 삽입 금지, 모델과 도구 세트는 고정하고 서브 에이전트로 유연성 확보
  • 도구 기반 상태 관리: 프롬프트를 직접 수정하는 대신 EnterPlanMode 같은 도구 호출로 상태 전환을 구현하여 정적 프롬프트 구조 보호
  • 지연 로딩 패턴 활용: 수십 개의 도구는 스텁(Stub)으로 제공하고 ToolSearch로 필요할 때만 상세 스키마 로드하여 접두사 안정성 유지
  • 캐시 히트율을 SLA로 관리: 히트율을 시스템 가용성 수준의 KPI로 취급하고, 일정 수준 이하로 떨어지면 알람을 발생시키는 운영 체계 구축

상세 내용

왜 프롬프트 캐싱이 AI 에이전트의 생존 전략인가

현대적인 AI 에이전트는 Claude Code처럼 긴 대화 세션을 유지하고, 대규모 코드베이스를 참조하며, 반복적인 도구 호출(Tool Call)을 수행합니다. 이 과정에서 매 요청마다 수만 개의 토큰을 모델에 새로 입력하는 것은 두 가지 치명적인 문제를 야기합니다.

첫째, 비용 폭증입니다. 일반적인 입력 토큰 비용은 프로덕션 환경에서 빠르게 누적되며, 특히 장시간 세션이나 대규모 컨텍스트를 다루는 에이전트의 경우 운영 비용이 비즈니스 모델 자체를 위협할 수 있습니다.

둘째, 레이턴시 증가입니다. 모델이 입력을 처음부터 다시 처리(Prefilling)하는 시간은 사용자 경험에 직접적인 영향을 미칩니다. 특히 실시간 코딩 어시스턴트처럼 빠른 피드백이 중요한 애플리케이션에서는 몇 초의 지연도 사용 가능성을 크게 저하시킵니다.

프롬프트 캐싱(Prompt Caching)은 이전 요청에서 계산된 컨텍스트를 재사용하여 이 두 문제를 동시에 해결합니다:

  • 최대 90%의 비용 절감: 캐시된 토큰은 신규 입력 토큰 대비 대폭 할인된 가격으로 처리됩니다
  • 응답 속도 향상: Prefilling 단계를 건너뛰어 응답 시작 시간(Time to First Token)이 비약적으로 단축됩니다

접두사 매칭(Prefix Matching): 캐싱의 작동 원리

프롬프트 캐싱은 '접두사 매칭'이라는 엄격한 규칙에 따라 작동합니다. API는 요청의 시작 부분부터 특정 캐시 브레이크포인트(Breakpoint)까지의 내용이 이전 요청과 완전히 동일할 때만 캐시를 적용합니다.

여기서 "완전히 동일"이란 표현이 핵심입니다:

  • 단 하나의 문자가 다르거나
  • 공백 하나가 추가되거나
  • 도구 정의의 순서가 바뀌거나
  • JSON 키의 직렬화 순서가 달라지면

해당 지점 이후의 모든 캐시는 즉시 무효화(Invalidate)됩니다.

이러한 특성 때문에 캐싱 전략의 핵심 원칙이 도출됩니다:

"변하지 않는 것은 앞으로, 자주 변하는 것은 뒤로"

이 원칙을 지키지 않으면 캐시가 지속적으로 깨지면서 오히려 캐시 생성 비용만 발생하여 역효과가 납니다.

프롬프트 레이아웃의 4계층 구조

Claude Code 팀이 실전에서 검증한 최적의 프롬프트 구조는 변경 빈도에 따라 다음과 같이 4계층으로 구성됩니다:

1. 전역 정적 컨텐츠 (Static System Prompt & Tools)

  • 모든 사용자, 모든 세션에서 공통으로 사용되는 시스템 지침
  • 기본 도구(Tool) 정의 세트
  • 가장 변경이 적고, 가장 많은 세션이 공유하는 레이어

2. 프로젝트 컨텍스트 (Project-specific Context)

  • 특정 프로젝트의 코딩 규칙이나 아키텍처 가이드
  • CLAUDE.md 같은 프로젝트 설정 파일
  • 프로젝트 내 모든 세션이 공유

3. 세션 컨텍스트 (Session Context)

  • 현재 사용자 세션의 고유 정보
  • 작업 중인 파일 목록이나 초기 상태
  • 한 세션 내에서는 안정적으로 유지

4. 대화 기록 (Conversation Messages)

  • 실시간으로 추가되는 사용자-모델 간 메시지
  • 가장 빈번하게 변경되는 레이어

이 순서를 엄격히 지켜야 여러 사용자와 세션이 상위 레이어의 캐시를 효과적으로 공유하여 전체 시스템의 캐시 히트율(Hit Rate)을 극대화할 수 있습니다.

캐시 무효화를 방지하는 5가지 골든 룰

1. 시스템 프롬프트에 동적 정보 삽입 금지

가장 흔한 실수는 시스템 프롬프트에 타임스탬프를 포함하는 것입니다:

❌ 나쁜 예:
You are a helpful assistant. Current time: 2024-02-20 14:32:15

이렇게 하면 매분마다 캐시가 무효화되어 캐싱의 효과가 완전히 사라집니다.

✅ 좋은 예:
시스템 프롬프트: You are a helpful assistant.
최신 사용자 메시지: [현재 시각: 2024-02-20 14:32:15] 사용자 질문...

날짜, 시간, 세션 ID 같은 동적 정보는 반드시 대화의 최신 메시지나 별도의 시스템 메시지로 전달하여 상단부의 정적 접두사를 보호해야 합니다.

2. 모델 및 도구 세트 고정

모델 전환의 함정 비용을 절감하려고 대화 중간에 claude-opus-4claude-haiku-3.5로 모델을 바꾸면 캐시를 처음부터 다시 쌓아야 하므로 오히려 더 많은 비용이 발생할 수 있습니다.

해결책: 주요 에이전트는 고성능 모델로 고정하고, 비용 최적화가 필요한 서브 태스크는 별도의 서브 에이전트(Sub-agent)로 분리하여 각각 최적의 모델을 사용하게 합니다.

도구 세트의 안정성 특정 상황에만 도구를 노출하려고 도구 정의를 동적으로 추가/제거하면 캐시가 지속적으로 깨집니다.

해결책: 모든 가능한 도구를 항상 정의해두고, 시스템 지침이나 컨텍스트를 통해 "지금은 이 도구만 사용하라"고 모델을 가이드합니다. 모델은 충분히 똑똑해서 이런 지침을 잘 따릅니다.

3. 상태 전환을 도구로 구현하기 (Plan Mode 사례)

사용자가 "계획 모드"에 진입할 때 시스템 프롬프트를 수정하는 대신, 다음과 같이 도구를 활용합니다:

# ❌ 나쁜 예: 프롬프트 직접 수정
system_prompt = base_prompt + "\n\nYou are now in plan mode..."

# ✅ 좋은 예: 도구 호출로 상태 전환
tools = [
{
"name": "EnterPlanMode",
"description": "Switch to planning mode for high-level design"
}
]

# 모델이 EnterPlanMode를 호출하면
# tool_result로 상태 메시지 반환
tool_result = {
"type": "system",
"content": "Now in plan mode. Focus on architecture..."
}

모델은 도구 호출 결과로 전달된 시스템 메시지를 통해 현재 상태를 인식하고, 정적 프롬프트는 전혀 변경되지 않아 캐시가 유지됩니다.

4. 도구 검색(Tool Search)과 지연 로딩(Deferred Loading)

수십 개의 도구를 모두 정의하면 초기 컨텍스트가 너무 커져 비용이 증가합니다. 하지만 도구를 제거하면 캐시가 깨지는 딜레마가 발생합니다.

해결책: 스텁(Stub) + 지연 로딩 패턴

# 초기에는 이름과 간단한 설명만 제공
tools = [
{"name": "ToolA", "description": "Brief description"},
{"name": "ToolB", "description": "Brief description"},
# ... 수십 개
{"name": "ToolSearch", "description": "Get detailed schema for a tool"}
]

# 모델이 ToolSearch("ToolA")를 호출하면
# 그때 상세 스키마를 반환
detailed_schema = {
"name": "ToolA",
"parameters": {...}, # 상세 파라미터 정보
"examples": [...]
}

이 패턴을 사용하면 도구 목록 자체는 안정적으로 유지되어 접두사 캐시가 보존되면서도, 필요한 순간에만 상세 정보를 로드하여 초기 컨텍스트 크기를 최소화할 수 있습니다.

5. 캐시 세이프 포킹(Cache-safe Forking)

대화가 길어져 컨텍스트 윈도우가 가득 차면 요약(Compaction)이 필요합니다. 이때 새로운 빈 세션을 만들어 요약하면 기존 캐시를 전혀 활용하지 못합니다.

최적화된 요약 전략:

# ❌ 비효율적: 새 세션으로 요약
new_request = {
"system": system_prompt,
"messages": [{"role": "user", "content": "Summarize this: " + full_history}]
}

# ✅ 효율적: 기존 컨텍스트 유지 + 요약 요청 추가
fork_request = {
"system": system_prompt, # 캐시됨
"tools": tools, # 캐시됨
"messages": [
...existing_messages, # 캐시됨
{"role": "user", "content": "Summarize the conversation so far"}
]
}

기존 대화의 모든 컨텍스트를 그대로 포함한 채 마지막에 요약 요청만 추가하면, 이전 계산량을 100% 재사용하면서 요약본만 새로 생성할 수 있습니다. 이를 "캐시 세이프 포킹"이라고 부르며, Claude Code 팀이 실전에서 검증한 강력한 패턴입니다.

운영 및 모니터링: 캐시 히트율을 SLA처럼 관리하기

Claude Code 팀은 프롬프트 캐시 히트율을 시스템 가용성(Uptime)과 동등한 수준의 핵심 지표로 관리한다고 밝혔습니다.

모니터링 전략:

  • 캐시 히트율 대시보드: 실시간으로 히트율을 추적하고 시각화
  • 알람 설정: 히트율이 기준치(예: 85%) 이하로 떨어지면 즉시 경고 발생
  • 장애 대응: 히트율 급락을 서비스 장애와 동일하게 취급하여 긴급 조사

비결정성(Non-determinism) 제거: 캐시가 예상치 못하게 깨지는 가장 흔한 원인은 직렬화(Serialization) 과정의 비결정성입니다.

# ❌ 문제 있는 코드: Dictionary 순서가 랜덤
tools = {
"tool_a": {...},
"tool_b": {...}
}
json_str = json.dumps(tools) # 순서가 매번 달라질 수 있음

# ✅ 안전한 코드: 순서 명시적 보장
tools = OrderedDict([
("tool_a", {...}),
("tool_b", {...})
])
json_str = json.dumps(tools, sort_keys=True)

Python의 일반 dict, Java의 HashMap 등은 삽입 순서를 보장하지 않거나 버전에 따라 동작이 다를 수 있습니다. 캐시 안정성을 위해서는 항상 순서를 명시적으로 제어해야 합니다.

Claude Code의 실전 활용

Claude Code는 터미널, IDE(VS Code, JetBrains), 데스크톱 앱, 웹 브라우저 등 다양한 환경에서 동작하는 AI 코딩 어시스턴트입니다. 전체 코드베이스를 이해하고, 여러 파일을 동시에 편집하며, 개발 도구와 통합되어 작동합니다.

이러한 복잡한 멀티턴 상호작용에서 프롬프트 캐싱은 선택이 아닌 필수입니다. Claude Code 팀이 공유한 전략들은 실제 프로덕션 환경에서 수십만 세션을 처리하며 검증된 베스트 프랙티스입니다.

설치 및 시작:

# macOS, Linux, WSL
curl -fsSL https://claude.ai/install.sh | bash

# 프로젝트에서 실행
cd your-project
claude

Claude Code는 Native Install 방식으로 설치하면 자동 업데이트가 활성화되어 최신 기능과 보안 패치를 자동으로 받을 수 있습니다.

결론: 설계 단계부터 캐시를 고려하라

프롬프트 캐싱은 단순히 비용을 줄이는 최적화 기법이 아닙니다. 이것은 다음을 결정짓는 핵심 설계 원칙입니다:

  • 사용자 경험: 응답 속도가 빠른 에이전트는 사용자 만족도와 리텐션을 크게 향상시킵니다
  • 비즈니스 모델: 90%의 비용 절감은 수익성과 확장성을 직접적으로 개선합니다
  • 시스템 안정성: 캐시 히트율을 SLA로 관리하면 예측 가능한 운영이 가능합니다

AI 에이전트를 개발할 때 프로토타입 단계부터 프롬프트 레이아웃을 캐시 친화적으로 설계하는 것이 현대적인 AI 엔지니어링의 표준입니다. 나중에 리팩토링하려면 훨씬 큰 비용이 들기 때문입니다.

Claude Code 팀의 5가지 골든 룰을 따르고, 캐시 히트율을 핵심 지표로 모니터링하면, 비용 효율적이면서도 뛰어난 사용자 경험을 제공하는 AI 에이전트를 구축할 수 있습니다.

References

Is TOON really saving you tokens?

· 약 4분
최재훈
LEAD (AI Research Engineer), Brain Crew

TL;DR

TOON(Token-Oriented Object Notation)은 LLM 프롬프트의 토큰 효율성을 높이는 포맷이지만, 만능 솔루션은 아닙니다. 평면적(flat)이고 균일한 데이터에서는 JSON 대비 30-60% 토큰을 절약하지만, 깊게 중첩된(deeply nested) 데이터에서는 오히려 비효율적일 수 있습니다. 실제 벤치마크에서 flat 데이터는 35% 절약, nested 데이터는 오히려 9% 더 많은 토큰을 소비했습니다. 프로덕션 환경에서는 데이터 구조에 따라 포맷을 전략적으로 선택해야 합니다.

Key Takeaways

  • 데이터 구조가 효율성을 결정: Flat/tabular 데이터에서는 TOON이 JSON 대비 35% 이상 토큰을 절약하지만, 깊게 중첩된 구조에서는 indentation overhead로 인해 오히려 더 많은 토큰을 소비할 수 있음
  • 전처리 전략의 중요성: JSON을 TOON으로 단순 변환하는 것보다 "flatten → TOON 변환" 파이프라인이 더 효과적이며, 이를 통해 토큰 절약과 LLM 이해도를 동시에 개선 가능
  • 프로덕션 비용 최적화: 포맷 선택은 API 비용, 레이턴시, 모델 컨텍스트 용량에 직접적인 영향을 미치므로, 데이터 스키마 분석을 통한 포맷 결정이 필수
  • 스키마 일관성이 핵심: TOON은 일관된 스키마를 가진 반복적인 구조에서 가장 효과적이며, 이는 정확도(accuracy) 향상에도 기여
  • 하이브리드 접근: JSON과 TOON을 경쟁 관계가 아닌 상호 보완적 도구로 활용하여, 데이터 형태에 따라 최적의 포맷을 선택하는 것이 실용적 전략

상세 내용

TOON이란 무엇인가?

TOON(Token-Oriented Object Notation)은 LLM 프롬프트를 위해 설계된 컴팩트하고 스키마 인식형 데이터 포맷입니다. JSON의 가독성은 유지하면서도 토큰 효율성을 극대화하려는 시도로, 특히 LLM API 비용 절감과 컨텍스트 윈도우 최적화를 목표로 합니다.

최근 TOON에 대한 관심이 급증하고 있으며, 실제로 특정 상황에서는 상당한 효율성 개선을 보여줍니다. 하지만 모든 데이터 구조에 적용 가능한 만능 솔루션은 아닙니다.

실제 벤치마크 결과

다음은 실제 테스트를 통해 측정된 토큰 사용량 비교입니다:

평면적 데이터 (Flat Data)

  • JSON: 797 tokens
  • TOON: 517 tokens
  • 결과: 35% 절약

중첩 데이터 (Nested Data)

  • JSON: 802 tokens
  • TOON: 877 tokens
  • 결과: TOON이 9% 더 많은 토큰 소비

TOON vs JSON 벤치마크 비교

왜 중첩 데이터에서 비효율적인가?

TOON의 구조적 특성상, 깊게 중첩된 데이터에서는 다음과 같은 오버헤드가 발생합니다:

  1. 인덴테이션 오버헤드: TOON은 구조를 명확하게 표현하기 위해 들여쓰기를 사용하는데, nested 구조가 깊어질수록 이로 인한 토큰 비용이 증가합니다.

  2. 구조 정보의 반복: 중첩된 객체마다 스키마 정보를 유지하려면 추가적인 메타데이터가 필요합니다.

  3. 압축 효과 감소: 평면적 데이터에서는 반복되는 키 이름을 효율적으로 압축할 수 있지만, 중첩 구조에서는 이러한 이점이 감소합니다.

반면 compact JSON은 중괄호와 쉼표만으로 구조를 표현하므로, 깊은 중첩에서도 상대적으로 일관된 오버헤드를 유지합니다.

실무 적용 전략

1. 데이터 구조 분석이 우선

TOON 도입 전에 반드시 데이터의 특성을 분석해야 합니다:

  • TOON이 유리한 경우: 테이블 형태의 데이터, 반복적인 레코드, 일관된 스키마를 가진 배열
  • JSON이 유리한 경우: 복잡한 계층 구조, 불규칙한 스키마, 깊은 중첩(3단계 이상)

2. Flatten → TOON 파이프라인

최적의 접근 방식은 다음과 같습니다:

원본 JSON → 구조 평면화(flatten) → TOON 변환 → LLM 입력

이 방법을 사용하면:

  • ✔ 토큰 사용량 최소화
  • ✔ 더 명확한 데이터 구조
  • ✔ LLM의 데이터 이해도 향상
  • ✔ API 비용 절감

3. 스키마 일관성 확보

TOON은 일관된 스키마에서 최고의 성능을 발휘합니다. 데이터 전처리 단계에서 스키마를 정규화하면 TOON의 효율성이 극대화됩니다.

프로덕션 환경에서의 임팩트

올바른 포맷 선택이 프로덕션 LLM 파이프라인에 미치는 영향:

비용 절감

  • 30-60% 토큰 절약 시 API 비용이 직접적으로 감소
  • 대규모 배치 처리에서는 월간 수천 달러의 절약 가능

레이턴시 개선

  • 더 적은 토큰 = 더 빠른 처리 속도
  • 특히 긴 컨텍스트를 다룰 때 체감 가능

모델 용량 최적화

  • 컨텍스트 윈도우 절약으로 더 많은 정보 포함 가능
  • 프롬프트 엔지니어링의 여유 공간 확보

정확도 향상

  • 평면적 구조와 명확한 스키마는 LLM의 데이터 파싱 오류를 줄임
  • 특히 structured output generation에서 효과적

하이브리드 접근의 필요성

TOON vs JSON은 경쟁이 아니라 선택의 문제입니다. 실무에서는 다음과 같은 하이브리드 전략이 효과적입니다:

  • 라우팅 로직 구현: 데이터 구조를 분석하여 자동으로 적절한 포맷 선택
  • A/B 테스트: 실제 워크로드에서 두 포맷의 성능 비교
  • 모니터링: 토큰 사용량, 응답 품질, 비용을 지속적으로 추적

TOON은 특정 상황에서 강력한 최적화 도구이지만, 맹목적 적용보다는 데이터 특성에 기반한 전략적 선택이 중요합니다.

References