출력 token을 줄이면 전체 비용은 얼마나 줄까
이 접근을 이해하려면 LLM의 과금에서 입력과 출력, cache와 추가 tool 호출을 분리해야 합니다.
LLM은 텍스트를 tokenizer의 subword 단위로 처리합니다. “I would be happy to help” 같은 서두가 업무 결과에 필요 없다면 반복 호출에서 출력량을 늘립니다. 다만 언어와 tokenizer마다 분할이 다르고, 긴 code review에서는 서두보다 code, 근거가 대부분이므로 예시 문구의 token 수를 전체 절감률로 일반화하면 안 됩니다.
Caveman 방식은 짧은 응답 지시와 모드별 system prompt를 이용하는 아이디어로 읽을 수 있습니다. 이것이 실제 proxy 기능과 검증기를 어느 범위까지 제공하는지는 선택한 저장소 version의 code로 확인해야 하며, 아래 숫자는 재현 없이 성능 보장으로 사용해서는 안 됩니다.
| 지표 (Metrics) | Native Claude Code (기존 방식) | Caveman (Ultra Mode 적용 시) | 아키텍처적 이점 (Impact) |
|---|
| 출력 형태 | “Sure! The issue is caused by your auth middleware… Here is the fix:” | “Bug in auth middleware. Token expiry use < not <=. Fix:” | 군더더기 없는 직관성 확보 |
| 사용 token | 업무, model별 기준값 | 더 짧아질 수 있음 | 실제 API usage로 비교 |
| 응답 지연 | model, queue, 출력 길이에 좌우 | 출력 decoding 구간이 줄 수 있음 | p50, p95를 같은 조건에서 측정 |
| 정보 보존 | 설명과 근거를 포함 | 중요한 조건도 생략할 수 있음 | 정답, code, error를 외부 검증 |
짧은 자연어가 가능한 업무가 있지만 시스템의 정보가 항상 code에만 있는 것은 아닙니다. 전제, 위험, 예외 조건과 결정 이유는 자연어에 있을 수 있습니다. 압축 목표는 글자 수 최소화가 아니라 다음 단계가 필요한 정보를 잃지 않는 것입니다.
아래 코드는 출력 지시와 간단한 code fence 검사를 보여 주는 의사 코드이며 실제 프로젝트 API나 충분한 무결성 검증기로 간주해서는 안 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| import re
from typing import Dict
class CavemanInterceptor:
"""
현업 파이프라인에 이식 가능한 Caveman 기반 LLM 프록시 로직
"""
def __init__(self, target_llm_client, mode: str = "Ultra"):
self.client = target_llm_client
# 3가지 핵심 모드로 토큰 다이어트 강도 조절
self.instructions: Dict[str, str] = {
"Lite": "Remove greetings. Keep sentences short.",
"Normal": "Use telegraphic style. Omit filler words.",
"Ultra": "Respond like a smart caveman. Nouns, verbs, code only. NO filler. Say what need saying. Then stop."
}
self.base_safeguard = "CRITICAL: Keep all code blocks, technical terms, and error messages EXACTLY unchanged."
self.system_prompt = f"{self.instructions[mode]} {self.base_safeguard}"
def invoke(self, user_prompt: str) -> str:
# 1. 원시인 모드 시스템 프롬프트 합성 (Prompt Injection)
payload = self._build_payload(user_prompt, self.system_prompt)
# 2. LLM 추론 요청 (이 과정에서 생성 토큰 수가 극단적으로 줄어듦)
raw_response = self.client.generate(payload)
# 3. 출력 무결성 검증 (코드 블록 훼손 방어)
if not self._verify_technical_substance(raw_response):
# 극단적 압축으로 인해 마크다운이나 코드가 깨졌을 경우의 Fallback 로직
raise SerializationError("Caveman accidentally smashed the code block!")
return raw_response
def _verify_technical_substance(self, text: str) -> bool:
# 마크다운 틱(```)이 정상적으로 닫혔는지 검증하는 최소한의 안전장치
code_blocks = re.findall(r'```(.*?)```', text, re.DOTALL)
return len(text.split('```')) % 2 != 0
|
이 의사 코드의 fence 개수 검사는 Markdown 구분자가 닫혔는지만 볼 뿐 code 내용이 원문과 같은지는 확인하지 못합니다. “기술 용어와 error를 바꾸지 말라”는 prompt도 model 행동을 보장하는 security boundary가 아닙니다. 기대 code, error 문자열을 별도로 비교하고 구조화된 schema, compiler와 test를 통과시켜야 합니다.
짧은 답이 실패하면 무조건 긴 답으로 다시 묻는 fallback도 비용을 두 번 쓸 수 있습니다. 먼저 요구 output을 JSON field나 code patch처럼 구체적으로 정의하고, 필수 field가 없을 때만 제한적으로 재시도합니다. prompt mode, 재시도 사유와 최종 token을 기록해야 겉으로 짧아진 첫 응답 뒤의 숨은 비용을 볼 수 있습니다.