Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新

Dec 17, 2025 - 日記

TOON - LLMプロンプトのトークン数を削減する新しいデータフォーマット

toon-format-introduction cover image

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

エディタサポート

開発体験を向上させるため、各種エディタ対応も進んでいます:

暫定的にYAML のシンタックスハイライトを使うこともできます。

LLMでの使い方のコツ

TOONをLLMプロンプトで使う際のベストプラクティス:

  1. フォーマットを見せる: 説明するよりも実際のTOON形式を例示する
  2. コードブロックを使う: ```toonでラップして明示的に指定
  3. ヘッダーテンプレートを提示: LLMにTOONを生成させる場合、期待するヘッダー形式を示す
  4. タブ区切りを活用: さらなるトークン効率化にはタブデリミタを使用

詳細な統合ガイドは公式ドキュメント を参照してください。

まとめ

TOONは、LLM開発におけるトークン効率を大幅に改善する可能性を持った新しいデータフォーマットです。以下のような特徴があります:

  • JSONより約40%少ないトークン数で同等以上の精度
  • 均一な構造の配列に対して特に効果的
  • JSONとの相互変換が可能でロスレス
  • 多言語対応で実用的なツールエコシステム

現在、TOONフォーマットは安定しており、仕様v3.0が公開されています。プロジェクトはアクティブに開発が進められており、コミュニティによる多言語実装も充実してきています。

LLMを使った開発でトークン消費量を削減したい方、大量のデータをプロンプトに含める必要がある方は、ぜひTOONを試してみてください。

参考リンク