
LLM(大規模言語モデル)を使った開発で、プロンプトのトークン数が気になったことはありませんか?JSONでデータを渡すと、どうしても冗長になりがちです。そんな課題を解決するために登場したのが「TOON(Token-Oriented Object Notation) 」という新しいデータフォーマットです。
TOONは、LLM入力用に最適化されたコンパクトで人間が読みやすいJSONの代替フォーマットで、同じデータをJSONより約40%少ないトークン数で表現できます。この記事では、TOONの基本的な概要と、なぜLLM開発者にとって有用なのかを解説します。
TOONとは?
TOON(Token-Oriented Object Notation)は、JSONのデータモデルをコンパクトで人間が読みやすい形式にエンコードする新しいフォーマットです。LLM入力用に特化しており、既存のJSONデータをそのまま置き換えられる互換性を持ちながら、トークン数を大幅に削減できます。
主な特徴
- トークン効率が高い: 混合構造のベンチマークで、JSONより約40%少ないトークンで同等の精度(74% vs 70%)を実現
- JSONデータモデル: オブジェクト、配列、プリミティブ型をJSONと同じように扱え、ロスレスな相互変換が可能
- LLMフレンドリー:
[N]による配列長の明示や{fields}によるフィールドヘッダーで、LLMがデータ構造を理解しやすい - シンプルな構文: YAMLのようなインデントベースの構造と、CSV風のテーブル形式を組み合わせた読みやすい記法
なぜTOONが必要なのか?
AIの利用コストは下がってきていますが、LLMのトークンには依然として料金がかかります。標準的なJSONは冗長でトークン消費が大きいという課題があります。
以下は、同じハイキングデータをJSON、YAML、TOONで表現した例です:
JSON(108トークン)
{
"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
}
]
}
YAML(85トークン)
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
TOON(62トークン - JSONより43%削減)
context:
task: Our favorite hikes together
location: Boulder
season: spring_2025
friends[3]: ana,luis,sam
hikes[2]{id,name,distanceKm,elevationGain,companion,wasSunny}:
1,Blue Lake Trail,7.5,320,ana,true
2,Ridge Overlook,9.2,540,luis,false
この例では、TOONがJSONに比べて43%のトークン削減を実現しています。YAMLと比較しても約27%の削減です。
注意: トークン削減効果はデータ構造に依存します。均一な配列構造では40-60%の削減が期待できますが、深くネストした構造や非均一なデータでは、JSONの方が効率的な場合もあります。詳細は後述のベンチマークセクションを参照してください。
TOONの構文の特徴
TOONは、YAMLのインデント構造とCSVのテーブル形式を組み合わせた独自の記法を採用しています。
1. テーブル形式の配列
同じ構造を持つオブジェクトの配列(uniform arrays)は、CSVのようなテーブル形式で表現します:
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
[3]: 配列の要素数を明示(LLMが構造を把握しやすい){id,name,...}: フィールド名を一度だけ宣言- 各行が1つのオブジェクトを表す
2. シンプルな配列
プリミティブ型の配列はカンマ区切りで表現:
friends[3]: ana,luis,sam
3. ネストしたオブジェクト
YAMLと同様にインデントでネスト構造を表現:
context:
task: Our favorite hikes together
location: Boulder
season: spring_2025
TOONが適しているケース
TOONは万能ではなく、データ構造によって向き不向きがあります。
TOONが効果的な場合
- 均一な構造の配列: 同じフィールドを持つオブジェクトの配列(ユーザーリスト、ログデータ、時系列データなど)
- 中規模データセット: トークン削減のメリットが大きい数百~数千行のデータ
- LLMへの入力データ: プロンプトにデータを含める場合
他の形式が適している場合
- 深くネストした非均一な構造: 複雑な設定ファイルなど(→ JSONが効率的)
- 純粋な表形式データ: フラットなテーブルのみ(→ CSVがよりコンパクト)
- レイテンシ重視: エンドツーエンドの応答速度が最優先の場合(環境によってはJSON compactが速い可能性)
実際の使い方
TypeScript/JavaScriptでの利用
npm パッケージとして提供されています:
npm install @toon-format/toon
基本的な使い方:
import { encode, decode } from '@toon-format/toon'
const data = {
users: [
{ id: 1, name: 'Alice', role: 'admin' },
{ id: 2, name: 'Bob', role: 'user' }
]
}
// JSONからTOONへ
const toonStr = encode(data)
console.log(toonStr)
// users[2]{id,name,role}:
// 1,Alice,admin
// 2,Bob,user
// TOONからJSONへ
const jsonData = decode(toonStr)
CLIツール
npxで即座に使えるCLIツールも用意されています:
# JSONをTOONに変換
npx @toon-format/cli input.json -o output.toon
# 標準入力からの変換
echo '{"name": "Ada", "role": "dev"}' | npx @toon-format/cli
# トークン削減効果を確認
npx @toon-format/cli data.json --stats
他の言語での実装
公式・コミュニティによる多言語実装が提供されています:
- 公式実装: Python、Rust、Go、.NET、Java、Julia、Dart
- コミュニティ実装: Ruby、PHP、Swift、Elixir、Clojure、C++など
詳細はGitHubリポジトリ を参照してください。
ベンチマーク結果
TOONプロジェクトでは、複数のLLMモデルを使った包括的なベンチマークを実施しています。
データ取得精度
4つのLLM(Claude Haiku、Gemini Flash、GPT-5 Nano、Grok Fast)で209個のデータ取得クエリをテストした結果:
- TOON: 73.9%の精度、2,744トークン
- JSON: 69.7%の精度、4,545トークン
- YAML: 69.0%の精度、3,719トークン
TOONはJSONより4.2ポイント高い精度を、39.6%少ないトークンで達成しています。
評価の注意点: 精度結果はデータ構造とLLMモデルによって異なります。独立したベンチマークでは異なる結果も報告されており、実際の使用環境でのテストを推奨します。
トークン効率(精度/1,000トークン)
TOON 26.9 acc%/1K tok
JSON compact 22.9 acc%/1K tok
YAML 18.6 acc%/1K tok
JSON 15.3 acc%/1K tok
XML 13.0 acc%/1K tok
エディタサポート
開発体験を向上させるため、各種エディタ対応も進んでいます:
- VS Code : TOON Language Support - シンタックスハイライト、バリデーション、変換機能
- Neovim : toon.nvim
- Tree-sitter : 主要なエディタ(Neovim、Helix 、Emacs 、Zed )で利用可能
暫定的にYAML のシンタックスハイライトを使うこともできます。
LLMでの使い方のコツ
TOONをLLMプロンプトで使う際のベストプラクティス:
- フォーマットを見せる: 説明するよりも実際のTOON形式を例示する
- コードブロックを使う:
```toonでラップして明示的に指定 - ヘッダーテンプレートを提示: LLMにTOONを生成させる場合、期待するヘッダー形式を示す
- タブ区切りを活用: さらなるトークン効率化にはタブデリミタを使用
詳細な統合ガイドは公式ドキュメント を参照してください。
まとめ
TOONは、LLM開発におけるトークン効率を大幅に改善する可能性を持った新しいデータフォーマットです。以下のような特徴があります:
- JSONより約40%少ないトークン数で同等以上の精度
- 均一な構造の配列に対して特に効果的
- JSONとの相互変換が可能でロスレス
- 多言語対応で実用的なツールエコシステム
現在、TOONフォーマットは安定しており、仕様v3.0が公開されています。プロジェクトはアクティブに開発が進められており、コミュニティによる多言語実装も充実してきています。
LLMを使った開発でトークン消費量を削減したい方、大量のデータをプロンプトに含める必要がある方は、ぜひTOONを試してみてください。