
TOON 是一種為大語言模型(LLM, Large Language Models)輸入、交換結構化資料所設計的輕量格式,全名「Token-Oriented Object Notation」。根據其 GitHub 說明,其目的是:「JSON for LLMs at half the token cost」——也就是說,在與大型語言模型互動時,希望將資料格式化後以更少的 token 傳送,同時維持可讀性與結構。
它結合了 YAML 的縮排(indentation)結構與 CSV/表格資料的簡潔性,特別適合「一組物件、欄位固定」這類情境(如:一筆筆相同欄位的記錄)使用。
為什麼要用 TOON?
在與大型語言模型(如 GPT 類型)互動時,所傳送的 prompt/資料中的 token 數量直接影響成本與效能。使用傳統的 JSON 表達往往包含許多重複鍵、括號、引號等語法符號,在 token 計算上並不經濟。TOON 透過以下特性降低 token 數量:
-
移除多餘的括號、大部份引號、重複鍵名稱。
-
對於陣列中的大量類似物件,採用「欄位宣告一次、然後列出每列值」的表格格式(tabular)來避免每個物件重複鍵名稱。
-
明確指出陣列長度(如
users[3])或欄位清單(如{id,name,role}),這對 LLM 在理解資料結構、維持一致性上有幫助。 -
支援可調的分隔符(例如 comma, tab, pipe)以進一步降低 token 用量。
多項 benchmark 顯示,在一些典型資料集中,使用 TOON 比使用 JSON 可節省約 30-60% 的 token 數量。
基本語法與用法
以下是 TOON 常用的語法規則與範例,讓您理解如何從物件/陣列轉為 TOON 格式:
物件 (Object)
當您有一個簡單物件,如:
{
"id": 123,
"name": "Ada",
"active": true
}
使用 TOON 可以表示為:
id: 123
name: Ada
active: true
當物件中嵌套另一個物件時:
{
"user": {
"id": 123,
"name": "Ada"
}
}
TOON 表示為:
user:
id: 123
name: Ada
(縮排兩個空格為一層)
原始陣列 (Primitive Array)
當某欄位為純原始值陣列(例如字串陣列):
{
"tags": ["admin", "ops", "dev"]
}
TOON 可以為:
tags[3]: admin,ops,dev
其中 [3] 表示陣列長度為 3,接著用逗號分隔值。
物件陣列 – 表格格式 (Tabular Array of Objects)
當陣列裡每個元素都是結構一致的物件(都包含相同欄位,且欄位值都是原始類型),TOON 提供一種更有效率的寫法。例如:
{
"items": [
{ "sku": "A1", "qty": 2, "price": 9.99 },
{ "sku": "B2", "qty": 1, "price": 14.5 }
]
}
TOON 表示為:
items[2]{sku,qty,price}:
A1,2,9.99
B2,1,14.5
解讀方式:
-
items[2]表示陣列有 2 筆。 -
{sku,qty,price}表示每筆物件具有這三個欄位,且按照這個順序。 -
接著每一列列出對應欄位值,用逗號分隔。
混合或非一致陣列 (Mixed / Non-Uniform Arrays)
如果陣列成員結構不一致(有原始值、有物件、有陣列),就無法用上表格格式了,而採用「列表 (list)」格式。例如:
{
"items": [1, { "a": 1 }, "text"]
}
TOON 為:
items[3]:
- 1
- a: 1
name: First
- text
這裡每個結構不同,所以採用每行以 - 開頭的 list format。
空物件與空陣列
-
空物件
{}→ 在 TOON 中表示為「(無輸出)」或只輸出父鍵並換行。GitHub -
空陣列例如:
{ "items": [] }
TOON 為:
items[0]:
表示陣列長度為 0。
引號與轉義規則
TOON 只在必要時使用引號以節省 token。舉例:
-
如果字串內含逗號、制表符、管線符、冒號、引號、反斜線、控制字符、或前導/尾隨空格,就需要用引號。
-
鍵 (key) 當包含空格、逗號、冒號、括號、數字純字串等情況也需用引號。
選項:分隔符與長度標記
-
delimiter:預設用逗號,分隔陣列值。也可選用\t(tab)或|(pipe),在特定模型中能進一步節省 token。 -
lengthMarker:設定為'#'可讓陣列長度標記變為[#N],以強調這是長度而非索引。
在實務中的應用情境
以下為幾個適合使用 TOON 的場景,可視為參考:
-
當您需要將大量「欄位一致的記錄」傳給 LLM,例如資料分析報表、使用者清單、商品清單、時間序列等。TOON 可大幅減少 token 數。
-
在 prompt 中直接嵌入資料時,使用 TOON 可使輸入更精簡,讓模型集中在資料與任務上,而不是大量重複的格式語法。
-
當您希望模型輸出或回傳資料時,也可以要求模型以 TOON 格式輸出:例如「請以 TOON 格式輸出符合條件的記錄」,搭配明確的欄位表頭,有助於模型輸出結構正確。
-
當您對資料結構較固定(每筆記錄有相同欄位、且欄位值為原始類型)時,TOON 的表格格式優勢最大;反之若資料高度巢狀、欄位不一致、或混合型態,則其優勢可能下降。
限制與注意事項
雖然 TOON 很有潛力,但也有一些需注意之處,避免誤用或期待過高:
-
TOON 並非萬用格式:若資料高度巢狀、多層物件或陣列、欄位不一致,或很多非原始值(例如物件中還有物件/陣列),TOON 可能會退回至較冗長的 list 格式,這時節省效果會變小甚至不如 JSON。
-
雖然 TOON 在模型閱讀資料時效果很好,但並非設計為 API 傳輸格式或長期儲存格式;它是為 LLM 類場景「token 效率」優化,而不是取代 JSON 等格式。
-
不同模型與 tokenizer 對 token 計算不同:TOON 的節省效果在 README 中是基於特定 tokenizer(如 GPT-style 的 cl100k/o200k)測試的,實際使用時需視您所用模型而定。
-
編碼與解析工具尚在成長階段:雖然該專案提供 TypeScript/JavaScript 的實作,亦有其他語言移植版,但您在生產環境使用前應確認穩定性與相容性。
小結
TOON 是一種為了在 LLM 應用中,提升資料格式效率、降低 token 使用量所設計的格式。特別適合「大量結構一致的記錄」情境,並擁有簡潔、易讀的語法。江員如果您在設計與 LLM 互動的系統、或在 prompt 中需傳輸大量資料,TOON 是值得考慮的選項。當然,在使用前也要確認資料結構是否符合其優勢場景,並確認解析/生成工具的可用性。
概念來自:toon