
终于有了一种专为 AI 打造的数据格式 TOON(Token-Oriented Object Notation)。它结合了 YAML 和 CSV 的优点,对 JSON 格式的数据进行了压缩,既省空间,又易于理解,尤其适合做为 LLM 的输入。
为什么需要 TOON
现在 AI 越来越强,能看懂的数据也越来越多,但用 JSON 传数据其实很浪费 Token。每个花括号、引号、逗号都要算在内,光是结构就能占掉不少篇幅。TOON 的聪明之处在于,用缩进代替大部分结构符号,数组用类似 CSV 的风格一行一行排列,把字段名提到表头,这样一来,数据的核心内容被最大程度地保留,重复的杂项被压缩、去除。
JSON
{
"context": {
"task": "Our favorite hikes together",
"location": "Boulder",
"season": "spring_2025"
},
"friends": ["ana", "luis", "sam"],
"hikes": [
{
"id": 1,
"name": "Blue Lake Trail",
"distanceKm": 7.5,
"elevationGain": 320,
"companion": "ana",
"wasSunny": true
},
{
"id": 2,
"name": "Ridge Overlook",
"distanceKm": 9.2,
"elevationGain": 540,
"companion": "luis",
"wasSunny": false
},
{
"id": 3,
"name": "Wildflower Loop",
"distanceKm": 5.1,
"elevationGain": 180,
"companion": "sam",
"wasSunny": true
}
]
}
YAML
context:
task: Our favorite hikes together
location: Boulder
season: spring_2025
friends:
- ana
- luis
- sam
hikes:
- id: 1
name: Blue Lake Trail
distanceKm: 7.5
elevationGain: 320
companion: ana
wasSunny: true
- id: 2
name: Ridge Overlook
distanceKm: 9.2
elevationGain: 540
companion: luis
wasSunny: false
- id: 3
name: Wildflower Loop
distanceKm: 5.1
elevationGain: 180
companion: sam
wasSunny: true
TOON
context:
task: Our favorite hikes together
location: Boulder
season: spring_2025
friends[3]: ana,luis,sam
hikes[3]{id,name,distanceKm,elevationGain,companion,wasSunny}:
1,Blue Lake Trail,7.5,320,ana,true
2,Ridge Overlook,9.2,540,luis,false
3,Wildflower Loop,5.1,180,sam,true
不同格式的准确率和 Token 成本
TOON ████████████████████ 26.9 │ 73.9% acc │ 2,744 tokens JSON compact █████████████████░░░ 22.9 │ 70.7% acc │ 3,081 tokens YAML ██████████████░░░░░░ 18.6 │ 69.0% acc │ 3,719 tokens JSON ███████████░░░░░░░░░ 15.3 │ 69.7% acc │ 4,545 tokens XML ██████████░░░░░░░░░░ 13.0 │ 67.1% acc │ 5,167 tokens
在 4 个 LLM 上对 209 个数据检索问题的准确率
claude-haiku-4-5-20251001 → TOON ████████████░░░░░░░░ 59.8% (125/209) JSON ███████████░░░░░░░░░ 57.4% (120/209) YAML ███████████░░░░░░░░░ 56.0% (117/209) XML ███████████░░░░░░░░░ 55.5% (116/209) JSON compact ███████████░░░░░░░░░ 55.0% (115/209) CSV ██████████░░░░░░░░░░ 50.5% (55/109) gemini-2.5-flash → TOON ██████████████████░░ 87.6% (183/209) CSV █████████████████░░░ 86.2% (94/109) JSON compact ████████████████░░░░ 82.3% (172/209) YAML ████████████████░░░░ 79.4% (166/209) XML ████████████████░░░░ 79.4% (166/209) JSON ███████████████░░░░░ 77.0% (161/209) gpt-5-nano → TOON ██████████████████░░ 90.9% (190/209) JSON compact ██████████████████░░ 90.9% (190/209) JSON ██████████████████░░ 89.0% (186/209) CSV ██████████████████░░ 89.0% (97/109) YAML █████████████████░░░ 87.1% (182/209) XML ████████████████░░░░ 80.9% (169/209) grok-4-fast-non-reasoning → TOON ███████████░░░░░░░░░ 57.4% (120/209) JSON ███████████░░░░░░░░░ 55.5% (116/209) JSON compact ███████████░░░░░░░░░ 54.5% (114/209) YAML ███████████░░░░░░░░░ 53.6% (112/209) XML ███████████░░░░░░░░░ 52.6% (110/209) CSV ██████████░░░░░░░░░░ 52.3% (57/109)
TOON 适合什么场景
最适合用来表示 “表格状” 的数据,像员工名单、商品列表、时间序列这些,每一行都是结构一致的对象。如果你的数据本来就很规整,TOON 就能最大程度节省 Token。官方的测试里,经常能比 JSON 少掉 30-60% 的长度。
TOON 的实现细节
- 支持缩进和不同分隔符(逗号、Tab、竖线),能进一步压缩体积
- 字符串只有在必须时才加引号,省掉大量标点
- 提供 TypeScript 库和命令行工具,支持一键格式转换,能够轻松和 JSON 格式进行切换
- 支持 “key folding”,能够把一层一层的嵌套字段折叠成一行,比如 data.metadata.items[2]: a,b,让数据更紧凑
更重要的是,LLM 更喜欢结构简单明的数据,对 TOON 数据的理解更精准,不容易出错。
当然,并不是所有情况下 TOON 都比 JSON 好。比如数据结构很深、每个对象的字段都不一样,这种情况还得老老实实用 JSON。
Github:github.com/toon-format/toon
