형식 문서는 장난감 예시를 좋아합니다 — 세 개의 행, 가짜 이름, 다섯 개의 열. 구문을 배우기에는 충분하지만, 실제로 일에서 다루는 형태를 형식이 처리하는지 알려주지 않습니다. 이 문서는 장난감을 건너뜁니다. 아래는 실제 백엔드 개발에서 끊임없이 나타나는 데이터 패턴들입니다 — 제품 카탈로그, 감사 로그, 지표 테이블, 설정 객체, 금융 트랜잭션 — JSON과 TOON을 나란히 보여주므로 정확히 무엇을 절약하고 있는지, TOON이 어디서 자신의 역할을 하는지 볼 수 있습니다. 모든 데이터는 현실적입니다; foo, bar, 또는 placeholder 이름은 없습니다. 형식 자체에 대한 배경은 TOON 구문 가이드를 참조하세요.
전자상거래 제품 카탈로그
제품 배열은 아마도 개발자들이 LLM에 보내는 가장 흔한 것일 것입니다 — "이 항목들을 분류해주세요", "각 카테고리에서 가장 저렴한 것을 찾아주세요", "$50 이상의 품절 항목을 표시해주세요". 다음은 JSON에서의 현실적인 카탈로그 슬라이스입니다:
[
{"id":"PRD-1041","name":"Logitech MX Master 3S","sku":"LOG-MX3S-GRY","price":99.99,"inStock":true,"category":"Peripherals"},
{"id":"PRD-1042","name":"Samsung 970 EVO Plus 1TB","sku":"SAM-970P-1TB","price":89.99,"inStock":true,"category":"Storage"},
{"id":"PRD-1043","name":"Keychron K2 Pro","sku":"KEY-K2P-BLK","price":119.99,"inStock":false,"category":"Peripherals"},
{"id":"PRD-1044","name":"Elgato Stream Deck MK.2","sku":"ELG-SD-MK2","price":149.99,"inStock":true,"category":"Streaming"},
{"id":"PRD-1045","name":"WD Blue 2TB HDD","sku":"WD-BLU-2TB","price":54.99,"inStock":true,"category":"Storage"},
{"id":"PRD-1046","name":"Razer DeathAdder V3","sku":"RZR-DAV3-BLK","price":69.99,"inStock":true,"category":"Peripherals"},
{"id":"PRD-1047","name":"Focusrite Scarlett Solo","sku":"FOC-SC-SOLO","price":119.99,"inStock":false,"category":"Audio"}
]이제 동일한 카탈로그를 TOON으로. 열 헤더가 한 번 선언됩니다; 각 행은 값만입니다:
products[7]{id,name,sku,price,inStock,category}:
PRD-1041,Logitech MX Master 3S,LOG-MX3S-GRY,99.99,true,Peripherals
PRD-1042,Samsung 970 EVO Plus 1TB,SAM-970P-1TB,89.99,true,Storage
PRD-1043,Keychron K2 Pro,KEY-K2P-BLK,119.99,false,Peripherals
PRD-1044,Elgato Stream Deck MK.2,ELG-SD-MK2,149.99,true,Streaming
PRD-1045,WD Blue 2TB HDD,WD-BLU-2TB,54.99,true,Storage
PRD-1046,Razer DeathAdder V3,RZR-DAV3-BLK,69.99,true,Peripherals
PRD-1047,Focusrite Scarlett Solo,FOC-SC-SOLO,119.99,false,Audio사용자 활동 / 감사 로그
감사 로그는 "이 사용자가 지난 한 시간 동안 무엇을 했는지 요약해주세요" 또는 "의심스러운 액세스 패턴을 표시해주세요"와 같은 프롬프트와 함께 LLM에 제공할 정확한 종류의 데이터입니다. 대용량이고 반복적이며 모든 행에서 열 이름이 동일합니다. 감사 추적은 또한 JSON으로 붙여넣을 때 컨텍스트 창을 가장 먼저 날려버리는 것이기도 합니다. 다음은 TOON에서의 현실적인 9행 로그입니다:
auditLog[9]{userId,action,resourceId,resourceType,timestamp,ip}:
U-8821,LOGIN,,session,2024-11-14T08:02:11Z,203.0.113.47
U-8821,VIEW,DOC-4490,document,2024-11-14T08:03:44Z,203.0.113.47
U-8821,DOWNLOAD,DOC-4490,document,2024-11-14T08:03:51Z,203.0.113.47
U-8821,VIEW,DOC-4491,document,2024-11-14T08:05:02Z,203.0.113.47
U-8821,EDIT,DOC-4491,document,2024-11-14T08:07:39Z,203.0.113.47
U-8821,SHARE,DOC-4491,document,2024-11-14T08:08:12Z,203.0.113.47
U-8821,VIEW,USR-0055,user_profile,2024-11-14T08:09:58Z,203.0.113.47
U-8821,VIEW,USR-0056,user_profile,2024-11-14T08:10:03Z,203.0.113.47
U-8821,LOGOUT,,session,2024-11-14T08:11:22Z,203.0.113.47동등한 JSON은 모든 아홉 행에 "userId", "action", "resourceId", "resourceType", "timestamp", "ip"를 반복합니다 — 여섯 필드 이름에 대해 54개의 키 반복. TOON에서는 정확히 한 번 나타납니다. 수백 개의 항목이 있는 감사 로그의 경우, 이것이 데이터가 프롬프트에 맞는지 아닌지의 차이입니다.
API 속도 제한 / 지표 데이터
운영 지표 — 지연 시간 백분위수, 오류율, 처리량 — 은 TOON에 또 다른 자연스러운 맞춤입니다. 데이터는 숫자 중심이고 완벽하게 표 형식입니다. "p99 지연 시간이 500ms를 초과하는 엔드포인트는 어디인가요?" 또는 "오류율이 증가하는 추세는 어디인가요?"를 묻기 위해 이것을 LLM에 보낼 수 있습니다. 이것은 Node.js 지표 파이프라인이나 Prometheus 스크래프에서 나오는 전형적인 형태의 데이터입니다:
apiMetrics[8]{endpoint,method,p50ms,p99ms,errorRate,callsPerDay}:
/api/v2/products,GET,42,118,0.002,84200
/api/v2/products/:id,GET,38,95,0.001,31500
/api/v2/orders,POST,210,880,0.015,4800
/api/v2/orders/:id,GET,55,201,0.003,19200
/api/v2/cart,PUT,95,430,0.008,22100
/api/v2/search,GET,310,1240,0.021,61000
/api/v2/users/:id,GET,29,88,0.001,9700
/api/v2/checkout,POST,540,2100,0.034,3200LLM은 컨텍스트 오버헤드 없이 이 테이블에 대한 질문에 즉시 답할 수 있습니다. /api/v2/search와 /api/v2/checkout 모두 높은 p99와 높은 오류율로 두드러집니다 — 데이터를 깔끔하게 제시할 때 LLM이 즉시 표면화할 수 있는 정확한 종류의 패턴입니다.
중첩 설정 객체
TOON은 표 형식 데이터 이상을 처리합니다. 구조화된 객체 — 앱의 런타임 설정에서 발견하는 종류 — 의 경우, TOON은 중첩 구조를 가진 인라인 객체 표기법을 사용합니다. 직렬화 형식 TOML이나 YAML의 대응이라고 생각하되, 더 간결합니다. 다음은 서버 설정, 데이터베이스 설정, 기능 플래그를 보여주는 현실적인 앱 설정입니다:
{
"server": {
"host": "0.0.0.0",
"port": 8080,
"tlsEnabled": true,
"requestTimeoutMs": 30000
},
"database": {
"host": "db.internal.example.com",
"port": 5432,
"name": "commerce_prod",
"poolSize": 20,
"sslRequired": true
},
"features": {
"newCheckoutFlow": true,
"recommendationEngine": false,
"darkMode": true,
"betaDashboard": false
}
}TOON 객체 표기법의 동일한 설정 — 키는 따옴표 없음, 중첩은 인라인 중괄호 사용:
{
server:{host:0.0.0.0,port:8080,tlsEnabled:true,requestTimeoutMs:30000},
database:{host:db.internal.example.com,port:5432,name:commerce_prod,poolSize:20,sslRequired:true},
features:{newCheckoutFlow:true,recommendationEngine:false,darkMode:true,betaDashboard:false}
}database 블록에서 host:db.internal.example.com은 그대로 괜찮습니다 — 값에 쉼표나 콜론이 없기 때문에 따옴표가 필요하지 않습니다. 값이 포함하는 경우, 이중 따옴표로 묶으세요: dsn:"host:5432,sslmode=require".금융 트랜잭션
금융 데이터는 또 다른 고가치 LLM 사용 사례입니다: 사기 감지 힌트, 조정 확인, 분류. 문자열 ID, 숫자 금액, 통화 코드, 상태 열거형, 타임스탬프의 혼합은 TOON의 표 형식 형식에 깔끔하게 맵핑됩니다. 다음은 현실적인 트랜잭션 슬라이스입니다:
transactions[9]{txId,amount,currency,from,to,status,timestamp}:
TXN-88201,1250.00,GBP,ACC-1041,ACC-2209,settled,2024-11-14T09:15:00Z
TXN-88202,89.99,USD,ACC-3301,ACC-0047,settled,2024-11-14T09:16:34Z
TXN-88203,4500.00,EUR,ACC-2001,ACC-5512,pending,2024-11-14T09:18:02Z
TXN-88204,22.50,USD,ACC-0099,ACC-3301,settled,2024-11-14T09:21:47Z
TXN-88205,750.00,GBP,ACC-5512,ACC-1041,failed,2024-11-14T09:25:10Z
TXN-88206,12000.00,USD,ACC-7700,ACC-2001,pending,2024-11-14T09:28:55Z
TXN-88207,310.00,EUR,ACC-1041,ACC-0099,settled,2024-11-14T09:31:22Z
TXN-88208,55.00,USD,ACC-3301,ACC-7700,settled,2024-11-14T09:33:40Z
TXN-88209,8900.00,GBP,ACC-2209,ACC-5512,flagged,2024-11-14T09:37:15Z"£5,000 이상이거나 상태가 flagged 또는 failed인 트랜잭션을 표시해주세요"와 함께 이것을 프롬프트에 붙여넣으면 모델은 몇 초 안에 답할 것입니다. TOON 표현은 대부분의 모델에서 컨텍스트 제한에 걸리지 않고 단일 프롬프트에 수백 행을 편안하게 맞출 수 있을 만큼 압축적입니다.
하나의 문서에서 표 형식 및 객체 데이터 결합
JSON도 CSV도 깔끔하게 처리하지 못하는 것이 있습니다: 동일한 페이로드에 메타데이터 헤더(단일 설정 객체)와 데이터 테이블 모두를 가진 문서. 상단에 컨텍스트 블록이 있는 보고서를 생각해보세요 — 누가 생성했는지, 어느 기간을 커버하는지, 어떤 필터가 적용되었는지 — 뒤에 실제 데이터 행이 따릅니다. JSON에서는 "meta" 키와 "rows" 키를 가진 봉투 객체로 모든 것을 감싸야 하며, 이는 중첩 레이어를 하나 더 추가합니다. CSV는 전혀 할 수 없습니다. TOON은 이것을 기본으로 처리합니다:
{report:weekly_sales,generatedAt:2024-11-14T10:00:00Z,region:EMEA,currency:EUR,generatedBy:analytics-service}
salesByRep[6]{repId,repName,deals,revenue,avgDealSize,quota}:
REP-101,Marta Kowalski,14,84200.00,6014.28,75000
REP-102,James Okafor,11,61500.00,5590.90,75000
REP-103,Yuki Tanaka,18,102400.00,5688.88,90000
REP-104,Sofia Andersen,9,47800.00,5311.11,75000
REP-105,Liam Byrne,16,93100.00,5818.75,90000
REP-106,Priya Nair,21,118600.00,5647.61,100000첫 번째 줄은 TOON 객체 — 보고서 메타데이터입니다. 빈 줄은 이어지는 표 형식 섹션과 구분합니다. @toon-format/toon의 단일 decode() 호출로 둘 다 반환합니다. "할당량을 달성할 것으로 예상되는 담당자는 누구인가요?"와 같은 질문과 함께 이 전체 문서를 LLM에 보낼 수 있으며, 필요한 모든 것이 있습니다: 보고서 컨텍스트 및 데이터, 하나의 압축 페이로드로.
npm 패키지 사용
이러한 예시들은 모두 프로그래밍 방식으로 인코딩하고 디코딩할 수 있습니다. @toon-format/toon 패키지가 참조 구현입니다. 어떤 Node.js 또는 브라우저 프로젝트에도 설치하세요:
npm install @toon-format/toon그런 다음 어떤 LLM API에 보내기 전에 데이터를 인코딩하고, 돌아오는 길에 응답을 디코딩하세요:
import { encode, decode } from '@toon-format/toon';
const transactions = [
{ txId: 'TXN-88201', amount: 1250.00, currency: 'GBP', from: 'ACC-1041', to: 'ACC-2209', status: 'settled', timestamp: '2024-11-14T09:15:00Z' },
{ txId: 'TXN-88202', amount: 89.99, currency: 'USD', from: 'ACC-3301', to: 'ACC-0047', status: 'settled', timestamp: '2024-11-14T09:16:34Z' },
// ...more rows
];
// Compact TOON string — send this to your LLM prompt
const toonPayload = encode(transactions);
// When the LLM returns TOON, decode back to a JS array
const decoded = decode(toonPayload);
console.log(decoded[0].status); // "settled"마무리
위의 패턴들 — 제품 카탈로그, 감사 로그, 지표 테이블, 설정 객체, 금융 데이터, 혼합 헤더+테이블 문서 — 은 개발자들이 실제로 LLM에 보내는 구조화된 데이터의 대부분을 커버합니다. TOON은 이것들을 모두 잘 처리하며, 모든 경우에 토큰 절약이 상당합니다. 핵심 규칙은 간단합니다: JSON은 모든 행에 키 이름을 반복합니다; TOON은 그렇지 않습니다. LLM 컨텍스트 창에 들어가는 표 형식 데이터 직렬화의 경우, 그 반복은 순수한 낭비입니다.
기존 JSON을 TOON으로 변환하려면 JSON to TOON 변환기를 사용하세요. LLM이 TOON을 반환한 후 반대 방향으로 가려면 TOON to JSON 변환기를 사용하세요. TOON Formatter는 TOON 문자열을 정리하고 검증하며, TOON Validator는 파이프라인에 도달하기 전에 구문 오류를 잡습니다. npm 패키지 @toon-format/toon은 두 줄의 코드로 인코딩과 디코딩을 처리합니다 — 위의 모든 예시가 기본으로 작동합니다.