TOON 데이터 포맷으로 LLM 비용 60% 절감하는 실전 전략
[기술 심층분석] TOON: LLM 비용을 60% 절감하는 데이터 포맷의 미학 (feat. Claude Code 실전 전략)
LLM(Large Language Model) 애플리케이션을 개발하고 운영하는 우리에게 '토큰(Token)'은 단순한 데이터 단위가 아닙니다. 그것은 곧 '청구서(Cost)'이자 '사용자 경험(Latency)'입니다.
우리가 관성적으로 사용하는 JSON은 가독성이 훌륭한 포맷입니다. 하지만 LLM의 관점에서 본다면 어떨까요? 수많은 중괄호({})와 따옴표("), 그리고 무한히 반복되는 키(Key) 값들은 마치 "과대 포장된 택배 상자"와 같습니다.
오늘은 이 포장재를 걷어내고, 데이터의 본질만 남겨 LLM의 효율을 극대화하는 TOON(Token-Oriented Object Notation) 포맷에 대해 깊이 있게 다뤄보겠습니다. 특히, 최근 화두인 Claude Code와 Agent Skills에서의 활용법도 포함했습니다.
1. TOON의 핵심 철학: "구조는 남기되, 군더더기는 뺀다"
TOON은 JSON의 표현력을 유지하면서 토큰 소모를 최소화하기 위해 고안된 직렬화(Serialization) 포맷입니다.
💡 3가지 설계 원칙
헤더 분리 (Header Separation): 객체 배열에서 반복되는 키(Key)를 상단에 단 한 번만 선언합니다. (DRY 원칙의 데이터 버전)
구두점 최소화 (Minimal Syntax): 문맥 파악에 방해되는 괄호와 따옴표를 과감히 생략합니다.
명시적 힌트 (Explicit Structure): 배열의 크기와 필드 구성을 미리 명시하여, LLM이 연산 자원을 효율적으로 배분하도록 돕습니다.
2. 10가지 실전 활용 예제 (Real-World Patterns)
TOON이 가장 빛을 발하는 순간은 "구조화된 데이터가 반복될 때"입니다. 여러분의 서비스에 바로 대입해 볼 수 있는 10가지 패턴입니다.
📂 패턴 1: RAG 기반 상품 검색 (E-commerce)
검색된 상품 수십 개를 프롬프트에 넣을 때, 가장 클래식한 절약 패턴입니다.
products[3]{id,name,price,stock_status}:
P101,GeForce RTX 4090,2800000,In Stock
P102,Ryzen 9 7950X,950000,Out of Stock
P103,Mechanical Keyboard,185000,Pre-order
📂 패턴 2: 코딩 에이전트의 파일 탐색 (DevTools)
git status나 파일 트리를 JSON으로 주면 컨텍스트가 폭발합니다. TOON은 에이전트의 기억력을 지켜줍니다.
changed_files[3]{path,status,diff_size}:
src/utils/auth.ts,modified,+15/-2
src/components/Header.tsx,modified,+5/-0
tests/auth.test.ts,added,+120
📂 패턴 3: 금융 데이터 및 주식 시세 (Finance)
초단위로 쌓이는 시계열 데이터는 TOON의 CSV 스타일 압축이 가장 효과적인 분야입니다.
ticker_history[4]{symbol,time,open,close,volume}:
AAPL,10:00,185.5,186.2,500200
AAPL,10:01,186.2,186.0,320100
TSLA,10:00,240.1,241.5,890000
TSLA,10:01,241.5,242.0,750000
📂 패턴 4: 서버 로그 분석 (Observability)
LLM에게 로그 분석을 맡길 때, 불필요한 포맷팅을 제거하면 더 긴 시간의 로그를 한 번에 검토시킬 수 있습니다.
server_logs[3]{timestamp,level,service,message}:
2024-01-08T10:00:01,INFO,payment-svc,Transaction started
2024-01-08T10:00:02,WARN,db-shard-01,Query latency > 500ms
2024-01-08T10:00:05,ERROR,payment-svc,Gateway timeout
📂 패턴 5: SQL 쿼리 결과 (Database)
자연어 질문을 SQL로 변환하는 Text-to-SQL 태스크에서, 스키마 정보나 샘플 데이터를 주입할 때 유용합니다.
table_preview[3]{user_id,signup_date,last_login,plan}:
101,2023-01-01,2024-01-07,Premium
102,2023-03-15,2023-12-20,Basic
103,2023-06-20,2024-01-08,Enterprise
📂 패턴 6: IoT 센서 데이터 스트림 (IoT)
수많은 센서에서 올라오는 반복적인 수치 데이터를 효율적으로 표현합니다.
sensor_readings[3]{device_id,location,temp,humidity,battery}:
S-01,Warehouse_A,22.5,45,98%
S-02,Warehouse_B,23.1,48,85%
S-03,Cold_Storage,4.2,30,92%
📂 패턴 7: 여행 및 일정 계획 (Scheduling)
복잡한 일정을 평탄화(Flattening)하여 전달하면 에이전트가 시간표를 짜기 훨씬 수월해집니다.
flight_options[3]{airline,flight_no,dept_time,arr_time,price}:
KE,KE081,10:00,12:30,450000
OZ,OZ102,11:30,14:00,420000
LJ,LJ205,09:00,11:20,380000
📂 패턴 8: 벡터 DB 청크 (RAG Context)
RAG 시스템에서 검색된 지식 조각(Chunks)들을 프롬프트에 병합할 때 사용합니다. 메타데이터의 반복을 줄여 본문 내용에 더 많은 토큰을 할애할 수 있습니다.
knowledge_chunks[2]{doc_id,relevance_score,content_snippet}:
doc_882,0.92,"TOON reduces overhead by header separation..."
doc_105,0.85,"JSON uses excessive brackets and quotes..."
📂 패턴 9: 인사 관리 및 조직도 (HR)
직원 명부와 같은 정형화된 데이터를 처리할 때 적합합니다.
employees[3]{emp_id,name,dept,position,join_date}:
E001,Kim Min-su,Dev,Senior Engineer,2020-03-01
E002,Lee Ji-eun,Design,UX Designer,2021-05-20
E003,Park Jun-ho,Sales,Manager,2019-11-15
📂 패턴 10: 스포츠 경기 기록 (Statistics)
선수별 스탯이나 경기 기록처럼 항목이 고정된 데이터를 요약할 때 탁월합니다.
match_stats[3]{player,goals,assists,pass_accuracy,rating}:
Son,1,1,88%,9.2
Kane,2,0,75%,8.9
Maddison,0,2,92%,8.5
3. [Special] Claude Code & Agent Skills 실전 전략
CLI 환경의 Agent(예: Claude Code)는 화면에 출력된 텍스트를 눈(Context)으로 봅니다. 여기서 TOON은 Agent의 "시야"를 넓혀주는 안경 역할을 합니다.
⚔️ 전략 1: Skill Output 압축 (Observation Diet)
Agent가 터미널 명령(ls -R, grep)이나 커스텀 툴을 실행했을 때, 결과값이 JSON으로 출력되면 Agent의 메모리(Context Window)가 순식간에 찹니다.
핵심: Tool/Skill의 반환 값을 무조건 TOON으로 변환해서 보여주십시오.
효과: Agent가 한 번에 10배 더 많은 파일이나 검색 결과를 인지하고 추론할 수 있습니다. "파일이 너무 많아서 짤렸습니다"라는 에러를 획기적으로 줄일 수 있죠.
⚔️ 전략 2: MCP (Model Context Protocol) 리소스 최적화
최근 Anthropic이 밀고 있는 MCP 서버를 구축 중이라면, resources/list나 read_resource의 반환 포맷으로 TOON을 채택하세요.
적용: IDE나 터미널에 연결된 Agent에게 프로젝트 구조 정보를 넘길 때, JSON 트리 대신 TOON 리스트를 넘기면 반응 속도가 빨라집니다.
⚔️ 전략 3: Agent의 '생각(Thinking)' 포맷팅
복잡한 작업을 수행하는 Agent에게 "계획을 세워라"고 하면 주저리주저리 말이 많습니다.
프롬프트: "계획은 반드시
plan[steps]{action,reason}형태의 TOON 포맷으로 출력하라."결과: 에이전트의 사고 과정이 구조화되고, 불필요한 서술어가 제거되어 실행 속도가 향상됩니다.
4. 바로 사용하는 구현 코드 (Implementation)
이론은 충분하니, 이제 코드에 적용할 차례입니다. 외부 의존성 없이 가볍게 사용할 수 있는 유틸리티 코드입니다.
📦 TypeScript / JavaScript
/**
* TOON Utility: Efficient Serialization for LLMs
*/
export const Toon = {
/**
* 객체 배열을 TOON 포맷으로 인코딩합니다.
*/
encode: (key: string, data: Record<string, any>[]): string => {
```javascript
if (!data || data.length === 0) return `${key}[0]:`;
// 1. 헤더 추출
const keys = Object.keys(data[0]);
const header = `{${keys.join(',')}}`;
// 2. 바디 생성 (CSV Injection 방지 및 이스케이프)
const body = data.map(item => {
const values = keys.map(k => {
let val = item[k];
if (typeof val === 'string' && /[,\\n]/.test(val)) {
val = `"${val}"`;
}
return val;
});
return ` ${values.join(',')}`;
}).join('\\n');
return `${key}[${data.length}]${header}:\\n${body}`;},
/**
TOON 포맷을 JSON 객체로 복원합니다.
*/
decode: (toonStr: string): Record<string, any>[] => {
const lines = toonStr.trim().split('\\n');
const headerMatch = lines[0].match(/(\w+)\\[(\d+)\\]\{(.*)\}:/);
if (!headerMatch) throw new Error("Invalid TOON format detected.");
const [_, keyName, count, props] = headerMatch;
const keys = props.split(',');
const result: Record<string, any>[] = [];
for (let i = 1; i < lines.length; i++) {
const values = lines[i].trim().split(',');
const obj: Record<string, any> = {};
keys.forEach((k, idx) => {
let val: any = values[idx];
if (val === 'true') val = true;
else if (val === 'false') val = false;
else if (!isNaN(Number(val))) val = Number(val);
obj[k] = val;
});
result.push(obj);
}
return result;}
};
### 🐍 Python
```python
import re
class Toon:
```javascript
@staticmethod
def dumps(key: str, data: list) -> str:
"""
List of Dictionaries를 TOON 포맷 문자열로 변환합니다.
"""
if not data:
return f"{key}[0]:"
keys = list(data[0].keys())
header = f"{{{','.join(keys)}}}"
lines = [f"{key}[{len(data)}]{header}:"]
for item in data:
values = []
for k in keys:
val = str(item.get(k, ''))
if ',' in val or '\\n' in val:
val = f'"{val}"'
values.append(val)
lines.append(" " + ",".join(values))
return "\\n".join(lines)
---
## 5. 실전 도입 전략 및 주의사항
TOON을 무턱대고 도입하기보다, 적재적소에 배치하는 전략이 필요합니다.
### 🧠 전략: Input은 TOON, Output은 JSON (하이브리드)
* 입력 (Prompting): 우리가 LLM에게 제공하는 데이터는 TOON으로 압축하십시오. 파싱 부담이 우리에게 없으므로 안전합니다.
* 출력 (Completion): LLM이 생성하는 답변은 JSON을 요청하십시오. 최신 모델이라도 생성 시의 문법 엄격성을 유지하는 데에는 JSON이 더 안정적입니다. (단, Claude Code처럼 내부 추론 과정에서는 TOON 생성을 유도해도 좋습니다.)
### ⚠️ 주의사항 (Safety Check)
1. 모델 호환성: GPT-4급 모델은 TOON을 완벽히 이해하지만, 7B 이하의 소형 로컬 모델은 낯선 포맷에 혼란을 겪을 수 있습니다. 반드시 사전 테스트가 필요합니다.
2. 특수문자 처리: 데이터 값(Value) 자체에 쉼표(`,`)가 포함된 경우, 이스케이프 처리가 되지 않으면 데이터 열(Column)이 밀리는 참사가 발생합니다. 제공된 코드의 이스케이프 로직을 반드시 확인하십시오.
---
## 🚀 맺음말 및 참고 자료
여러분, "최적화는 공짜 점심이 없다"는 말이 있지만, 데이터 포맷을 바꾸는 것만큼은 가장 적은 노력으로 가장 확실한 비용 절감 효과를 주는 '가성비 좋은 점심'에 가깝습니다.
특히 RAG나 Agent 시스템처럼 데이터 입출력이 빈번한 서비스라면, 지금 바로 TOON을 도입하여 아낀 토큰 비용을 더 가치 있는 연구 개발에 투자하면 좋을거 같습니다.
더 자세한 정보와 최신 업데이트는 아래 공식 리소스를 참고하세요.
* 📘 공식 가이드 문서: [https://toonformat.dev/](https://toonformat.dev/)
* 💻 GitHub 저장소: [https://github.com/toon-format/toon](https://github.com/toon-format/toon)