新数据格式 TOON 相比 JSON 显著降低 LLM 调用成本,对成本敏感的生产应用有直接的经济价值。
一种全新的数据格式,帮助开发者节省 30%~60% 的 LLM token 成本
如果你一直在使用 Large Language Model,可能已经注意到一个问题:向 AI 输入数据并不是免费的。通过 API 传递的每个 JSON 对象都会消耗 token,而这些 token 很快就会累积成一笔可观的成本。于是,TOON(Token-Oriented Object Notation,面向 Token 的对象表示法)应运而生。这是一种专门为解决该问题而设计的新型序列化格式。
先来看一个实际示例。假设你正在构建一个应用,需要将员工数据发送给 LLM 进行分析:
{
"users": [
{ "id": 1, "name": "Alice", "role": "admin", "salary": 75000 },
{ "id": 2, "name": "Bob", "role": "user", "salary": 65000 },
{ "id": 3, "name": "Charlie", "role": "user", "salary": 70000 }
]
}
这段 JSON 会消耗 257 个 token。现在看看使用 TOON 表示的相同数据:
users[3]{id,name,role,salary}:
1,Alice,admin,75000
2,Bob,user,65000
3,Charlie,user,70000
只需要 166 个 token,减少了 35%。对于这个小例子来说,节省的成本可能显得微不足道。但如果将规模扩大到数百次 API 调用和数千条记录,成本就会得到实实在在的降低。
TOON 借鉴了现有格式中最优秀的设计理念,并针对 LLM 的使用方式进行了优化。
TOON 背后的核心理念很简单:当你拥有由结构一致的对象组成的数组时——字段相同、类型相同——为什么还要为每个对象重复一遍键名?
JSON 的方式(重复冗余):
[
{ "sku": "A1", "qty": 2, "price": 9.99 },
{ "sku": "B2", "qty": 1, "price": 14.50 }
]
TOON 的方式(更加高效):
[2]{sku,qty,price}:
A1,2,9.99
B2,1,14.5
schema 只需在 {sku,qty,price} 这个头部声明一次,后续每一行只包含类似 CSV 的值。这正是 TOON 最具优势的场景。
TOON 只会在确实有必要时为字符串添加引号:
hello world → 不需要引号(字符串内部包含空格没有问题)
hello 👋 world → 不需要引号(Unicode 是安全的)
"hello, world" → 需要引号(包含逗号分隔符)
" padded " → 需要引号(包含前导或尾随空格)
这种最小化引号的方式既能节省 token,又能确保数据含义明确,不会产生歧义。
与 YAML 类似,TOON 使用缩进而不是花括号表示嵌套结构:
{
"user": {
"id": 123,
"profile": {
"name": "Ada"
}
}
}
user:
id: 123
profile:
name: Ada
格式更简洁、更易读,消耗的 token 也更少。
TOON 会在方括号中包含数组长度([N]),这实际上有助于 LLM 理解并验证数据结构:
tags[3]: admin,ops,dev
当 LLM 生成或解析结构化数据时,这类显式元数据可以减少解析错误。
TOON 项目针对不同的数据类型和 LLM 模型进行了全面的基准测试。以下是他们的发现。
最适合 TOON 的场景是什么?答案是结构统一的表格数据,也就是大量采用一致 schema 的记录。JSON 键名重复得越多,TOON 能够实现的优化就越明显。
不过,如果 LLM 无法理解这种格式,那么 token 效率再高也没有意义。基准测试使用 4 种不同的模型——GPT-5 Nano、Claude Haiku、Gemini Flash 和 Grok——完成了 154 道数据检索题:
Token 减少量:46.3%
TOON 不仅能够节省 token,实际上还能提高 LLM 的准确率。其显式结构,包括数组长度和字段声明,可以帮助模型更可靠地解析和验证数据。
TOON 并不是为了在所有场景中取代 JSON。你可以把它看作一款专门解决特定问题的工具。
适合使用 TOON 的场景:
❌ 以下场景继续使用 JSON:
正如 TOON 文档所说:“在程序中使用 JSON,在将数据输入 LLM 时转换为 TOON。”
TOON 已经以 npm package 的形式提供,并配备了一套简单的 API:
import { encode, decode } from '@toon-format/toon'
const data = {
items: [
{ sku: 'A1', qty: 2, price: 9.99 },
{ sku: 'B2', qty: 1, price: 14.5 }
]
}
// Convert to TOON
const toon = encode(data)
console.log(toon)
// items[2]{sku,qty,price}:
// A1,2,9.99
// B2,1,14.5
// Convert back to JSON
const restored = decode(toon)
此外,它还提供了一个 CLI 工具,可以快速完成格式转换:
# Encode JSON to TOON
npx @toon-format/cli data.json -o data.toon
# Decode TOON to JSON
npx @toon-format/cli data.toon -o data.json
# Show token savings
npx @toon-format/cli data.json --stats
为了进一步提高 token 效率,你还可以使用制表符或竖线代替逗号作为分隔符:
// Tab-separated (often more token-efficient)
encode(data, { delimiter: '\t' })
// Pipe-separated
encode(data, { delimiter: '|' })
尽管 TOON 还相对较新,但社区已经开始为多种编程语言构建实现:
该项目维护了一套完整的规范和一致性测试套件,以确保不同实现之间保持兼容。
TOON 代表着数据格式设计思路的一次转变。几十年来,我们一直在针对人类可读性和机器互操作性进行优化。如今,随着 LLM 开始消费海量的结构化数据,我们需要针对 token 效率和 AI 理解能力进行优化的数据格式。
TOON 会取代 JSON 吗?不会。但在向 LLM 输入结构化数据这一特定场景中,它提供了极具吸引力的优势:
如果你正在构建需要消费大量结构化数据的 AI 应用,TOON 值得研究。你的 token 预算会感谢你的。
TOON GitHub 仓库
交互式 Tokenization Playground
你在自己的项目中尝试过 TOON 吗?节省了多少 token?欢迎在评论区分享你的经验。
部分评论可能只有登录后的访客才能看到。请登录以查看全部评论。
如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。