Toon 是一个怎样的结构 在LLM友好型上优越Json ?

TOON(全称 Token-Oriented Object Notation,面向 Token 的对象表示法)是一种专门为 LLM(大语言模型) 输入设计的紧凑、人类可读的结构化数据格式。

它本质上是 JSON 的“LLM 专用压缩变体”,目标就是在保持几乎相同数据表达能力的前提下,大幅减少 token 消耗(通常 30%–60%,极端表格数据可更高),同时让模型更容易正确解析和理解结构。

TOON 的核心结构特点(与 JSON 对比)

方面JSONTOON为什么对 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 友好性上的主要优势总结

  1. Token 节省最显著:30%–60%(表格数据最高可达 70%+)
  2. 解析更稳定:显式 [N] + 一次性表头 → 模型不容易数错行数或字段对不上
  3. 准确率往往更高:多个评测显示 TOON 比 JSON 检索/抽取准确率高 3–10 个百分点
  4. 提示词写起来更清晰:结构噪声少,模型“看”得更舒服
  5. 几乎无损:保留了完整的 JSON 数据模型(object、array、number、string、bool、null)

局限性与适用场景

最适合:

  • RAG / Agent 中喂给模型的大量结构化数据(尤其是表格、日志、数据库查询结果、商品列表、用户行为序列等同构数组)
  • Token 预算紧张的长上下文场景
  • 成本敏感的生产环境

不太适合:

  • 高度异构、深度嵌套、字段经常变化的数据
  • 需要前后端通用、永久存储的场景(TOON 目前主要作为“LLM 输入中间层”)
  • 对人类长期可读性要求极高的配置文件

一句话总结:

TOON ≈ “把 JSON 改写成最适合 LLM tokenizer 的样子”
它不试图取代 JSON,而是作为一种高性价比的输入表示层,在 2025–2026 年的 LLM 工程中越来越常见,尤其在成本优化和长上下文场景里。

官网与实现:github.com/toon-format/
目前已经有 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%
TOON30–60%74–87%大部分场景高 3–8 个百分点
YAML10–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 贵
长上下文极致省 tokenTOON + 压缩提示主流方案

你的感觉没有错——对人类来说 TOON 的阅读体验确实变差了,它牺牲了一部分“直观性”换来了对模型更友好的布局。

但在当前阶段(tokenizer 还远没到完美、context 仍然贵),省下来的 token 总量带来的收益 > 模型多看几眼表头带来的微小负担,所以社区和生产环境里 TOON 正在快速被接受,尤其在 RAG、Agent、批量结构化抽取这些场景。

如果未来 tokenizer 能把结构理解得更好(比如原生支持 schema),或者 context 成本再降 10 倍,这个权衡可能会再次翻转。


收录于知乎专栏「计算机基础」· 查看知乎原文