为什么Toon比Json在LLM上更高效?
Toon 是一个怎样的结构 在LLM友好型上优越Json ?
TOON(全称 Token-Oriented Object Notation,面向 Token 的对象表示法)是一种专门为 LLM(大语言模型) 输入设计的紧凑、人类可读的结构化数据格式。
它本质上是 JSON 的“LLM 专用压缩变体”,目标就是在保持几乎相同数据表达能力的前提下,大幅减少 token 消耗(通常 30%–60%,极端表格数据可更高),同时让模型更容易正确解析和理解结构。
TOON 的核心结构特点(与 JSON 对比)
| 方面 | JSON | TOON | 为什么对 LLM 更友好? |
|---|---|---|---|
| 对象(嵌套结构) | 用 {}、:、" 包裹 | 用 缩进 + 冒号(类似 YAML) | 减少括号、引号、冒号的重复 token |
| 数组(列表) | 每个元素都要 {key:value,...} | 表头只写一次 + 纯值多行(类似 CSV) | 同构对象数组省掉 70%+ 的重复键名 |
| 数组长度声明 | 无(模型要自己数) | 显式 [N] 前缀 | 防止模型数错或幻觉边界 |
| 字段名 | 每个对象重复写 | 只在表头写一次 {field1,field2,...} | 极大减少 token,尤其大数据量时 |
| 分隔符 | , 和 : | 更灵活(空格、制表符、自定义分隔符) | 减少标点符号 token |
| 字符串引号 | 强制用 " 包裹 | 大多数情况下可省略(除特殊字符) | 省掉海量引号 token |
| 嵌套深度 | 支持,但符号爆炸 | 支持,但深层会变“像 YAML” | 适中深度仍很省 token |
| 异构数组 | 友好 | 不太友好(建议结构一致) | 设计偏向“表格型同构数据” |
典型 TOON 示例(对比 JSON)
JSON 示例(约 45–55 token):
[
{"name": "Alice", "age": 28, "city": "Beijing"},
{"name": "Bob", "age": 34, "city": "Shanghai"},
{"name": "Carol", "age": 25, "city": "Guangzhou"}
]
等价 TOON(约 20–28 token):
[3] ← 显式长度
{name,age,city} ← 表头只写一次
Alice 28 Beijing
Bob 34 Shanghai
Carol 25 Guangzhou
嵌套例子(TOON):
user
name: Xiao Ming
age: 27
address
city: Hong Kong
street: Nathan Road
orders [3]
{item,price}
iPhone16 8999 HKD
AirPods 1299 HKD
Case 299 HKD
TOON 在 LLM 友好性上的主要优势总结
- Token 节省最显著:30%–60%(表格数据最高可达 70%+)
- 解析更稳定:显式
[N]+ 一次性表头 → 模型不容易数错行数或字段对不上 - 准确率往往更高:多个评测显示 TOON 比 JSON 检索/抽取准确率高 3–10 个百分点
- 提示词写起来更清晰:结构噪声少,模型“看”得更舒服
- 几乎无损:保留了完整的 JSON 数据模型(object、array、number、string、bool、null)
局限性与适用场景
最适合:
- RAG / Agent 中喂给模型的大量结构化数据(尤其是表格、日志、数据库查询结果、商品列表、用户行为序列等同构数组)
- Token 预算紧张的长上下文场景
- 成本敏感的生产环境
不太适合:
- 高度异构、深度嵌套、字段经常变化的数据
- 需要前后端通用、永久存储的场景(TOON 目前主要作为“LLM 输入中间层”)
- 对人类长期可读性要求极高的配置文件
一句话总结:
TOON ≈ “把 JSON 改写成最适合 LLM tokenizer 的样子”
它不试图取代 JSON,而是作为一种高性价比的输入表示层,在 2025–2026 年的 LLM 工程中越来越常见,尤其在成本优化和长上下文场景里。
官网与实现:https://github.com/toon-format/toon
目前已经有 Python、TypeScript、Java 等多种语言的转换器。
我认为这种格式的阅读难度高于 JSON,尽管它通过压缩字段实现了 token 节省,但模型的解析与理解效率难道不会降低吗?在我看来,这种设计需要模型在计算每个 token 时,都反复对照头部的结构信息,如同人类思考时会产生额外的认知负担。那么,优先控制总 token 消耗,是否真的是更优的算力节省方案?
你的疑问非常合理,这是当前结构化数据格式在LLM时代最核心的权衡点之一:
“人类阅读时的直观难度” vs “模型处理时的实际计算成本”
1. LLM 并不像人类那样“逐 token 去对照表头”
人类看 TOON 时确实需要:
- 先找到最上面的 {field1,field2,…} 表头
- 然后每读一行,就要把列位置和表头对应起来
- 脑子里要一直“记着”第几列是什么
这个过程对人来说确实更费脑(尤其数据量大、列多、滚动屏幕时)。
但 LLM 的“阅读”机制完全不同:
- Transformer 在 attention 机制下,对整段上下文是并行处理的
- 表头那一行(通常只占 5–15 个 token)会被反复 attend 到每一行的每个位置
- 所以模型在处理第 500 行数据时,并不需要“重新回忆”表头,它在计算第 500 行第一个 token 时,表头就已经通过 self-attention 强烈影响到了那个位置的 hidden state
- 这和人类必须“线性阅读、短期记忆保持”的方式是本质不同的
简单说:对模型而言,表头远距离的“重复引用成本”非常低,几乎可以视为“免费全局变量”。
2. 实际基准里 TOON 的准确率反而经常更高(而不是更低)
多个独立测试(2025–2026 年初的报告)显示:
| 格式 | 平均 token 节省 | 结构抽取/检索准确率(典型值) | 备注 |
|---|---|---|---|
| JSON | 基准 | 69–83% | |
| TOON | 30–60% | 74–87% | 大部分场景高 3–8 个百分点 |
| YAML | 10–35% | 接近 JSON 或略低 | 缩进敏感 |
| XML | 负节省 | 较高(但 token 爆炸) |
为什么准确率反而上升?主流解释有三点:
- 噪声显著减少:少了很多
{ "key":、},、"等无信息 token,模型的注意力更集中在有意义的内容上 - 显式长度 [N]:极大降低了“数错了行数/漏掉最后几行”的经典错误
- 表格般的规整性:同构数组的列对齐对 attention 非常友好(模型容易学到“垂直对齐 = 同字段”这种模式)
所以虽然人类觉得“更费脑”,但对当前主流 tokenizer + Transformer 来说,TOON 往往是认知负荷更低的格式。
3. Token 总量才是目前最贵的资源(而非单 token 的计算复杂度)
现在主流计费和延迟瓶颈是:
- 输入 token 数量(直接乘以价格)
- KV cache 占用(和 token 数正相关)
- 生成时的总计算量(也和上下文长度强相关)
而 单个 token 的 forward pass 成本 在现代硬件上差别非常小(基本可以忽略)。
所以即使 TOON 让模型“稍微多 attend 几次表头”,但因为总 token 少了 40%,整体算力消耗和延迟通常还是明显下降的。
极端例子:
- JSON 喂 8000 token 数据 → 要跑 8000 token 的 attention
- TOON 喂 4200 token 同等信息 → 只跑 4200 token 的 attention
- 即使每 token 多花 5% 的计算,也远比少跑 3800 个 token 划算
4. 总结:权衡的当前结论(2026 年初视角)
| 优先级目标 | 推荐格式 | 为什么 |
|---|---|---|
| 最低 token 成本 + 较高准确率 | TOON(同构表格数据) | 当前性价比最高 |
| 最高人类调试友好度 | JSON / YAML | 开发阶段首选 |
| 最高解析鲁棒性(异构) | XML / JSON | 但 token 贵 |
| 长上下文极致省 token | TOON + 压缩提示 | 主流方案 |
你的感觉没有错——对人类来说 TOON 的阅读体验确实变差了,它牺牲了一部分“直观性”换来了对模型更友好的布局。
但在当前阶段(tokenizer 还远没到完美、context 仍然贵),省下来的 token 总量带来的收益 > 模型多看几眼表头带来的微小负担,所以社区和生产环境里 TOON 正在快速被接受,尤其在 RAG、Agent、批量结构化抽取这些场景。
如果未来 tokenizer 能把结构理解得更好(比如原生支持 schema),或者 context 成本再降 10 倍,这个权衡可能会再次翻转。
收录于知乎专栏「计算机基础」· 查看知乎原文