당신은 토큰을 낭비하고 있습니다. 조금이 아니라 아주 많이요.
제가 끊임없이 목격하는 프롬프트는 다음과 같습니다:
"저는 React 앱을 가지고 있고 useState 훅을 사용하고 있습니다. Props가 변경되지 않았음에도 불구하고 부모 컴포넌트가 렌더링될 때마다 제 컴포넌트가 리렌더링됩니다. 왜 이런 일이 발생하나요?"
Claude는 그런 설정이 전혀 필요하지 않습니다. Claude는 이미 React를 알고 있습니다. useState가 무엇인지도 이미 알고 있습니다. Claude에게 필요한 것은 오직 이것뿐이었습니다:
"부모 렌더링 시 컴포넌트 리렌더링 발생. Props 변경 없음. 이유가 무엇인가."
결과는 동일한 답변이었습니다. 토큰은 64%나 절약되었습니다.
델타 원칙 (The delta principle)
대부분의 프롬프트는 인간을 위해 작성됩니다. 우리는 질문을 하기 전에 맥락을 설명하고, 프레임워크의 이름을 말하며, 사물이 어떻게 작동하는지 묘사합니다. 그것이 우리가 서로 소통하는 방식입니다.
하지만 Claude는 이미 맥락을 알고 있습니다. Claude에게 필요한 유일한 것은 델타 (delta) — 즉, 새로운 정보, 구체적인 문제, 알 수 없는 부분입니다.
그 외의 모든 것은 노이즈(noise)입니다.
안전하게 제거할 수 있는 것들
Claude는 이미 다음 사항들을 알고 있습니다 — 다시 설명하지 마세요:
- 맥락으로 사용되는 프레임워크 이름 ("React 앱을 사용 중입니다", "Python을 사용하고 있습니다")
- 개념 설명 ("훅은 React의 기능으로...", "클로저란 ...할 때...")
- 스택 소개 ("제 앱은 Node, Express, MongoDB를 사용합니다")
신호(signal)를 전혀 더해주지 않는 사회적 노이즈:
- 인사말: "안녕", "도와주길 바랍니다", "미리 감사합니다"
- 허락 요청: "부탁드려도 될까요", "궁금해서 그런데"
- 완곡한 표현: "제 생각에는", "확실하지는 않지만", "아마도", "어쩌면"
- 추임새: "기본적으로", "본질적으로", "그냥", "단순히", "사실"
절대로 제거해서는 안 되는 것:
- 실제 에러, 버그 또는 문제
- 숫자, 임계값, 측정값
- 변수 이름, 함수 이름, 파일 이름
- 코드 블록 및 URL
- Claude가 듣지 않고서는 알 수 없는 모든 것
전과 후
디버깅 (Debugging):
전 (41 tokens):
"Node.js Express API를 작업 중인데 엔드포인트를 호출하려고 할 때 401 unauthorized
에러가 발생합니다. JWT 토큰을 ...
코드 리뷰 (Code review):
이전 (29 tokens):
"Could you please review this Python function and tell me if there are any issues or improvements I could make?"
...
설명 (Explanation):
이전 (19 tokens):
"I was wondering if you could explain how database connection pooling works in simple terms?"
...
복리 효과 (The compound effect)
단일 프롬프트(prompt)에서 절약되는 양은 작아 보입니다. 하지만 실제 세션 전체에 걸쳐 보면, 이는 복리로 쌓입니다.
여러 번의 대화를 주고받으며 무언가를 디버깅(debugging)하는 실제 개발 세션 20턴을 시뮬레이션한 결과는 다음과 같습니다:
| 턴 (Turn) | 장황한 표현 (tokens) | 차이 (Delta, tokens) | 절약됨 (Saved) |
|---|
| 1 | 48 | 18 | 30 |
| ... | | | |
| 단일 세션에서 531 tokens 절약. 70% 감소. | | | |
Sonnet 가격 기준 Claude API를 사용할 때, 이는 달러로 환산하면 작은 금액입니다. 하지만 API를 기반으로 서비스를 구축하고 하루에 수백 개의 세션을 실행한다면, 이는 빠르게 누적됩니다. 또한 claude.ai를 사용할 때도 입력 토큰(input tokens)이 적다는 것은 컨텍스트 노이즈(context noise)가 줄어든다는 것을 의미합니다. 즉, Claude가 더 깨끗한 신호(signal)를 처리하여 더 정확하게 응답할 수 있습니다.
세 가지 강도 레벨 (Three intensity levels)
모든 프롬프트에 초압축이 필요한 것은 아닙니다. 저는 상황에 따라 세 가지 모드를 사용합니다:
lite — 인사말만 제거하고 컨텍스트(context)는 유지 (~20% 감소)
사용 시점: 새로운 주제를 시작할 때, 세션의 첫 메시지
full — Claude가 이미 알고 있는 모든 것을 제거하고 차이점(delta)만 유지 (~60% 감소)
사용 시점: 세션 중간의 디버깅, 코드 반복 작업, 빠른 질문
ultra — 최소한의 신호(signal)로 압축 (~70% 이상 감소)
사용 시점: 원하는 바를 정확히 알고 있으며 다듬어진 표현은 상관없을 때
스킬 파일 (The skill file)
저는 이것을 Claude 스킬로 만들었습니다. 이는 Claude에게 활성화/비활성화 명령과 강도 전환 기능을 사용하여 델타 압축(delta compression)을 자동으로 적용하도록 지시하는 마크다운(markdown) 파일입니다.
→ github.com/shouvik12/delta
README에는 전체 규칙 세트, 강도별 예시, 그리고 이를 귀하의 Claude 설정에 추가하는 방법이 안내되어 있습니다.
생각해 볼 만한 한 가지
이것은 작은 최적화입니다. 하지만 그 이면에 깔린 원리는 더 거대합니다:
우리는 인간을 위해 프롬프트를 작성해 왔습니다. 우리는 설명하고, 완곡하게 표현하며, 맥락을 제공합니다. 왜냐하면 그것이 다른 사람들로부터 이해를 얻어내는 방식이기 때문입니다. 하지만 LLM (Large Language Models)에게 이러한 오버헤드 (Overhead)는 낭비일 뿐입니다. 모델은 당신이 무엇을 말하고 있는지 알고 있다는 사실을 설득당할 필요가 없습니다. 모델에게는 사회적 비계 (Social scaffolding)가 필요하지 않습니다.
그저 차이점 (Delta)만 보내세요.