대부분의 개발자는 데이터 형식에 대해 짧은 목록을 갖고 있습니다: API에는 JSON, 스프레드시트에는 CSV, 설정 파일에는 YAML, 레거시 시스템을 다룬다면 XML 정도입니다. 하지만 AI 툴링 공간에 조용히 자리를 잡아가는 새로운 형식이 있습니다 — TOON, 즉 Token-Oriented Object Notation입니다. 이 형식은 하나의 특정 문제를 위해 처음부터 설계되었습니다: 토큰 예산을 낭비하지 않으면서 대형 언어 모델에 구조화된 데이터를 전달하는 것입니다.
TOON이란 무엇인가요?
TOON은 Token-Oriented Object Notation의 약자입니다. 이것은 구조화된 데이터를 LLM 프롬프트나 응답에 삽입할 때 소비되는 토큰 수를 최소화하기 위해 특별히 제작된 압축 데이터 직렬화 형식입니다. JSON에서 모든 불필요한 요소를 제거한 것으로 생각하세요 — 배열에서 반복되는 키 이름, 불필요한 따옴표, 불필요한 공백 없이 — 가능한 한 적은 구문 노이즈로 신호만 남긴 형식입니다.
npm 패키지는 @toon-format/toon이며,
모든 Node.js 프로젝트나 현대적인 번들러에서
작동하는 간단한 encode / decode API를 제공합니다.
TOON 파일은 .toon 확장자를 사용합니다.
왜 JSON을 그냥 사용하지 않나요?
JSON은 대역폭이 저렴하고 파싱이 런타임에 의해 처리되는 기계 간 통신에 탁월합니다. 하지만 OpenAI API 또는 Anthropic API에 프롬프트의 일부로 데이터를 전송할 때는 모든 문자가 중요합니다 — 말 그대로. 두 API 모두 토큰당 요금을 부과하며, 토큰은 대략 4자의 영어 텍스트에 해당합니다.
100개의 사용자 레코드 테이블을 생각해보세요. JSON에서는 키 — "id",
"name", "role", "email" — 를 레코드마다 반복해야 합니다.
이는 동일한 구조 정보의 100개 복사본입니다. TOON의 표 형식 구문은 이러한 키를 한 번만 정의하고
CSV처럼 행별로 값을 나열하지만, 객체 구조는 보존됩니다. 실제 데이터셋에서 토큰 절감은
압축 JSON에 비해 40~70%에 달할 수 있습니다.
TOON 구문 한눈에 보기
TOON은 네 가지 핵심 데이터 형태를 지원합니다: 스칼라(문자열, 숫자, 불리언), 배열, 객체, 표 형식 데이터. JSON으로 작업해본 적이 있다면 스칼라와 컬렉션 구문이 익숙하게 느껴질 것입니다 — 표 형식이 TOON이 진정으로 차별화되는 부분입니다.
단순한 객체는 외부 중괄호의 공백을 제거하고, 불필요한 따옴표를 생략하며, 키-값 쌍을 쉼표로 구분합니다:
{name:Alice,age:30,role:admin}단순한 스칼라 배열은 예상대로 보입니다:
[1,2,3]이제 흥미로운 부분이 있습니다 — 표 형식 데이터. 이것이 LLM 사용 사례에서 TOON을 매력적으로 만드는 구문입니다. 배열의 모든 객체에 대해 키를 반복하는 대신, 헤더에 스키마를 한 번 선언하고 행별로 값을 나열합니다:
users[3]{id,name,role}:
1,Alice,admin
2,Bob,user
3,Charlie,editor이 블록은 3개의 사용자 객체 배열을 나타내며 — 아래 JSON과 동등하지만 — 훨씬 적은
토큰으로 표현됩니다. 헤더 users[3]{id,name,role}는 파서에게 알려줍니다: "이것은
users라는 변수이고, 3개의 행이 있으며, 각 행은 id, name, role 필드에 매핑됩니다". 행은 순수한
값이며, 키 반복이 없습니다.
[
{ "id": 1, "name": "Alice", "role": "admin" },
{ "id": 2, "name": "Bob", "role": "user" },
{ "id": 3, "name": "Charlie", "role": "editor" }
]@toon-format/toon 패키지 설치 및 사용
공식 npm 패키지는 JavaScript 값을 TOON 문자열로 인코딩하고 TOON 문자열을 JavaScript 객체와 배열로 디코딩하는 작업을 모두 처리합니다. npm 레지스트리에서 설치하세요:
npm install @toon-format/toon패키지는 두 가지 함수를 내보냅니다 — encode와 decode:
import { encode, decode } from '@toon-format/toon';
// Decode a TOON string → JavaScript value
const toonString = `users[3]{id,name,role}:
1,Alice,admin
2,Bob,user
3,Charlie,editor`;
const users = decode(toonString);
console.log(users[0].name); // "Alice"
console.log(users[1].role); // "user"
// Encode a JavaScript value → TOON string
const config = {
model: 'gpt-4o',
temperature: 0.7,
maxTokens: 1024,
stream: true
};
const toon = encode(config, { indent: 2 });
console.log(toon);
// {model:gpt-4o,temperature:0.7,maxTokens:1024,stream:true}encode()의 indent 옵션은 출력이 보기 좋게 인쇄되는지 여부를 제어합니다.
LLM 프롬프트의 경우 토큰 절약을 위해 일반적으로 압축 출력(들여쓰기 없음)이 필요합니다. 디버깅이나
사람이 읽을 수 있는 .toon 파일의 경우 { indent: 2 }를 사용하면 보기 좋게
형식화된 출력을 얻을 수 있습니다.
실제 사용 사례: LLM에 레코드 전송
사용자 활동을 요약해야 하는 제품 분석 기능을 구축하고 있다고 상상해보세요. 데이터베이스에서 최근 세션 레코드를 가져와 자연어 요약을 위해 LLM에 보내려고 합니다. TOON을 사용하면 다음과 같습니다:
import { encode } from '@toon-format/toon';
const sessions = [
{ userId: 101, action: 'login', duration: 0, page: '/dashboard' },
{ userId: 101, action: 'view_report', duration: 142, page: '/reports/q1' },
{ userId: 101, action: 'export_csv', duration: 8, page: '/reports/q1' },
{ userId: 102, action: 'login', duration: 0, page: '/dashboard' },
{ userId: 102, action: 'edit_profile', duration: 37, page: '/settings' }
];
const toonPayload = encode(sessions);
// sessions[5]{userId,action,duration,page}:
// 101,login,0,/dashboard
// 101,view_report,142,/reports/q1
// 101,export_csv,8,/reports/q1
// 102,login,0,/dashboard
// 102,edit_profile,37,/settings
const prompt = `Summarise the following user activity. Data is in TOON format.\n\n${toonPayload}`;이 5개 세션 레코드의 TOON 표현은 동등한 JSON보다 훨씬 짧습니다. JSON은 "userId",
"action", "duration", "page"를 다섯 번씩 반복합니다.
수백 개의 레코드에 걸쳐 절감 효과는 상당하며, 이는 직접적으로 더 낮은 API 비용과 더 빠른 응답 시간
(어텐션 윈도우에서 처리할 토큰이 적음)으로 이어집니다.
TOON의 주요 데이터 유형
TOON은 JavaScript 및 대부분의 다른 언어에서 이미 사용하는 기본 요소에 깔끔하게 매핑됩니다:
- 문자열 — 특수 문자가 없을 때 따옴표 없음. 쉼표, 콜론 또는 공백이 포함된 경우 이중 따옴표로 묶임.
- 숫자 — 정수와 부동소수점을 그대로 작성:
42,3.14,-7. - 불리언 —
true와false, JSON과 동일. - Null — 없거나 정의되지 않은 값에는
null로 표기. - 배열 — 짧은 목록에는 인라인 괄호 구문
[val1,val2,val3]; 객체 배열에는 표 헤더 구문. - 객체 — 단일 객체에는 중괄호 구문
{key:value,key2:value2}. - 표 형식 데이터 — 스타:
name[n]{col1,col2,...}:헤더 뒤에 쉼표로 구분된 행 — 동일한 형태의 레코드 컬렉션에 이상적.
TOON과 다른 형식 중 언제 무엇을 선택할까요
TOON은 JSON을 범용 교환 형식으로 대체하려는 것이 아닙니다. 특정 틈새를 채웁니다. 빠른 결정 가이드는 다음과 같습니다:
- JSON 사용: REST API를 구축하거나, 데이터베이스에 문서를 저장하거나, 서비스 간에 데이터를 전달할 때. JSON은 보편적으로 지원되고, 도구가 잘 갖춰져 있으며, 사람이 읽을 수 있습니다.
- TOON 사용: 구조화된 데이터가 프롬프트 또는 LLM 컨텍스트 윈도우의 일부이고 토큰 수가 중요할 때. 표 형식은 사용자 목록, 로그 항목, 제품 카탈로그, 분석 이벤트 등 레코드 행으로 작업할 때 빛을 발합니다.
- CSV 사용: 평면 표 형식 데이터만 필요하고 소비자가 CSV를 기대할 때(스프레드시트, BI 도구). CSV는 객체 중첩이 없으므로 TOON이 더 표현력이 높습니다.
- YAML 사용: 가독성과 주석이 압축성보다 더 중요한 사람이 편집하는 설정 파일.
- LLM 도구 출력에도 TOON 사용: LLM이 도구를 호출하고 구조화된 결과를 반환하는 경우, TOON으로 결과를 인코딩하면 API 호출의 입력과 출력 양쪽에서 토큰이 절약됩니다.
마무리
TOON — Token-Oriented Object Notation — 은 LLM 시대를 위해 구축된 압축 직렬화 형식입니다. JSON의 친숙한 구조(객체, 배열, 스칼라)를 유지하면서 레코드 전반에 걸친 중복 키 반복을 제거하는 표 형식 구문을 도입합니다. 결과는 동등한 JSON보다 40~70% 더 작을 수 있는 형식으로, OpenAI API, Anthropic API 또는 기타 토큰 청구 LLM 서비스와 함께 작업할 때 직접적으로 더 낮은 토큰 비용으로 이어집니다.
TOON을 직접 탐색하고 싶다면, 여기에 전체 도구 모음이 있습니다:
TOON Formatter를 사용하여 TOON 문서를 보기 좋게 인쇄하고 검사하고,
TOON Validator로 구문 오류를 잡고,
JSON to TOON 변환기로 기존 페이로드를 마이그레이션하고,
반대로 가야 할 경우 TOON to JSON 변환기를 사용하세요.
@toon-format/toon
npm 패키지는 encode와 decode를 제공하여 TOON을
Node.js 또는 브라우저 측 코드에
몇 분 안에 직접 통합할 수 있게 해줍니다.