フォーマットのドキュメントはおもちゃの例が好きです — 3行、架空の名前、5列。構文を学ぶには良いですが、実際の作業で扱う形状をフォーマットが処理できるかどうかはわかりません。この記事ではおもちゃを省きます。以下に、実際のバックエンド開発で常に出てくるデータパターンを示します — 製品カタログ、監査ログ、メトリクステーブル、設定オブジェクト、金融トランザクション — JSONとTOONを並べて示すことで、正確に何を節約しているか、TOONが存在意義を発揮するところがわかります。すべてのデータは現実的で、foo、bar、プレースホルダー名は一切ありません。フォーマット自体の背景については、TOON構文ガイドを参照してください。

eコマース製品カタログ

製品配列はおそらく開発者がLLMに送る最も一般的なものです — "これらのアイテムを分類して"、"各カテゴリで最安値を見つけて"、"$50以上の値段で在庫切れのものにフラグを立てて"。こちらはJSONでの現実的なカタログの抜粋です:

json
[
  {"id":"PRD-1041","name":"Logitech MX Master 3S","sku":"LOG-MX3S-GRY","price":99.99,"inStock":true,"category":"Peripherals"},
  {"id":"PRD-1042","name":"Samsung 970 EVO Plus 1TB","sku":"SAM-970P-1TB","price":89.99,"inStock":true,"category":"Storage"},
  {"id":"PRD-1043","name":"Keychron K2 Pro","sku":"KEY-K2P-BLK","price":119.99,"inStock":false,"category":"Peripherals"},
  {"id":"PRD-1044","name":"Elgato Stream Deck MK.2","sku":"ELG-SD-MK2","price":149.99,"inStock":true,"category":"Streaming"},
  {"id":"PRD-1045","name":"WD Blue 2TB HDD","sku":"WD-BLU-2TB","price":54.99,"inStock":true,"category":"Storage"},
  {"id":"PRD-1046","name":"Razer DeathAdder V3","sku":"RZR-DAV3-BLK","price":69.99,"inStock":true,"category":"Peripherals"},
  {"id":"PRD-1047","name":"Focusrite Scarlett Solo","sku":"FOC-SC-SOLO","price":119.99,"inStock":false,"category":"Audio"}
]

TOONで同じカタログ。列ヘッダーは一度だけ宣言されます;各行には値のみが含まれます:

text
products[7]{id,name,sku,price,inStock,category}:
  PRD-1041,Logitech MX Master 3S,LOG-MX3S-GRY,99.99,true,Peripherals
  PRD-1042,Samsung 970 EVO Plus 1TB,SAM-970P-1TB,89.99,true,Storage
  PRD-1043,Keychron K2 Pro,KEY-K2P-BLK,119.99,false,Peripherals
  PRD-1044,Elgato Stream Deck MK.2,ELG-SD-MK2,149.99,true,Streaming
  PRD-1045,WD Blue 2TB HDD,WD-BLU-2TB,54.99,true,Storage
  PRD-1046,Razer DeathAdder V3,RZR-DAV3-BLK,69.99,true,Peripherals
  PRD-1047,Focusrite Scarlett Solo,FOC-SC-SOLO,119.99,false,Audio
TOONの6つの列ヘッダーは正確に一度だけ書かれます。JSONでは各行に繰り返されます。行3の時点でヘッダーはすでにトークン節約でコストを回収しています —200行のカタログでは違いは劇的です。OpenAIトークナイザーを使って自分のデータでの節約を確認してください。

ユーザーアクティビティ/監査ログ

監査ログはまさに「このユーザーが最後の1時間で何をしたか要約して」や「疑わしいアクセスパターンにフラグを立てて」といったプロンプトでLLMに供給するデータです。高ボリュームで繰り返しが多く、列名はすべての行で同一です。監査トレイルは、JSONとして貼り付けるとコンテキストウィンドウを最初に爆発させるものでもあります。TOONでの現実的な9行のログ:

text
auditLog[9]{userId,action,resourceId,resourceType,timestamp,ip}:
  U-8821,LOGIN,,session,2024-11-14T08:02:11Z,203.0.113.47
  U-8821,VIEW,DOC-4490,document,2024-11-14T08:03:44Z,203.0.113.47
  U-8821,DOWNLOAD,DOC-4490,document,2024-11-14T08:03:51Z,203.0.113.47
  U-8821,VIEW,DOC-4491,document,2024-11-14T08:05:02Z,203.0.113.47
  U-8821,EDIT,DOC-4491,document,2024-11-14T08:07:39Z,203.0.113.47
  U-8821,SHARE,DOC-4491,document,2024-11-14T08:08:12Z,203.0.113.47
  U-8821,VIEW,USR-0055,user_profile,2024-11-14T08:09:58Z,203.0.113.47
  U-8821,VIEW,USR-0056,user_profile,2024-11-14T08:10:03Z,203.0.113.47
  U-8821,LOGOUT,,session,2024-11-14T08:11:22Z,203.0.113.47

同等のJSONは9つすべての行で"userId""action""resourceId""resourceType""timestamp""ip"を繰り返します — 6つのフィールド名に54のキー繰り返し。TOONでは正確に一度だけ現れます。数百のエントリを持つ監査ログでは、データがプロンプトに収まるかどうかの違いになります。

APIレート制限/メトリクスデータ

運用メトリクス — レイテンシパーセンタイル、エラーレート、スループット — はTOONのもう一つの自然な適用先です。データは数値が多く完全に表形式です。「p99レイテンシが500ms以上のエンドポイントはどれ?」や「エラーレートはどこで上昇傾向?」を尋ねるためにLLMに送ることができます。これはNode.jsメトリクスパイプラインやPrometheusスクレイプから出てくるデータの形状です:

text
apiMetrics[8]{endpoint,method,p50ms,p99ms,errorRate,callsPerDay}:
  /api/v2/products,GET,42,118,0.002,84200
  /api/v2/products/:id,GET,38,95,0.001,31500
  /api/v2/orders,POST,210,880,0.015,4800
  /api/v2/orders/:id,GET,55,201,0.003,19200
  /api/v2/cart,PUT,95,430,0.008,22100
  /api/v2/search,GET,310,1240,0.021,61000
  /api/v2/users/:id,GET,29,88,0.001,9700
  /api/v2/checkout,POST,540,2100,0.034,3200

LLMはコンテキストのオーバーヘッドなしにこのテーブルについての質問に即座に答えられます。/api/v2/search/api/v2/checkoutの両方が高いp99と高いエラーレートで目立っていることに注目してください —データを清潔に提示したときにLLMが即座に表面化できるパターンそのものです。

ネストされた設定オブジェクト

TOONは表形式データ以上のものを処理します。構造化オブジェクト — アプリのランタイム設定に見られる種類のもの — には、TOONはネストされた構造を持つインラインオブジェクト表記を使用します。TOMLやYAMLのようなシリアライゼーション形式の対応物と考えてください、ただしより軽量です。サーバー設定、データベース設定、フィーチャーフラグを示す現実的なアプリ設定:

json
{
  "server": {
    "host": "0.0.0.0",
    "port": 8080,
    "tlsEnabled": true,
    "requestTimeoutMs": 30000
  },
  "database": {
    "host": "db.internal.example.com",
    "port": 5432,
    "name": "commerce_prod",
    "poolSize": 20,
    "sslRequired": true
  },
  "features": {
    "newCheckoutFlow": true,
    "recommendationEngine": false,
    "darkMode": true,
    "betaDashboard": false
  }
}

TOONオブジェクト表記での同じ設定 — キーは引用符なし、ネストはインラインの波括弧を使用:

text
{
  server:{host:0.0.0.0,port:8080,tlsEnabled:true,requestTimeoutMs:30000},
  database:{host:db.internal.example.com,port:5432,name:commerce_prod,poolSize:20,sslRequired:true},
  features:{newCheckoutFlow:true,recommendationEngine:false,darkMode:true,betaDashboard:false}
}
TOONのオブジェクト構文は、値にカンマやコロンが含まれない限りキーを引用符で囲みません。上記のdatabaseブロックでは、host:db.internal.example.comはそのまま問題ありません —値にはどちらも含まれていないので引用符は不要です。値にカンマやコロンが含まれる場合は、ダブルクォートで囲んでください:dsn:"host:5432,sslmode=require"

金融トランザクション

金融データはもう一つの高価値LLMユースケースです:不正検出のヒント、照合チェック、分類。文字列ID、数値金額、通貨コード、ステータス列挙型、タイムスタンプの組み合わせはTOONの表形式フォーマットにきれいにマッピングされます。現実的なトランザクションの抜粋:

text
transactions[9]{txId,amount,currency,from,to,status,timestamp}:
  TXN-88201,1250.00,GBP,ACC-1041,ACC-2209,settled,2024-11-14T09:15:00Z
  TXN-88202,89.99,USD,ACC-3301,ACC-0047,settled,2024-11-14T09:16:34Z
  TXN-88203,4500.00,EUR,ACC-2001,ACC-5512,pending,2024-11-14T09:18:02Z
  TXN-88204,22.50,USD,ACC-0099,ACC-3301,settled,2024-11-14T09:21:47Z
  TXN-88205,750.00,GBP,ACC-5512,ACC-1041,failed,2024-11-14T09:25:10Z
  TXN-88206,12000.00,USD,ACC-7700,ACC-2001,pending,2024-11-14T09:28:55Z
  TXN-88207,310.00,EUR,ACC-1041,ACC-0099,settled,2024-11-14T09:31:22Z
  TXN-88208,55.00,USD,ACC-3301,ACC-7700,settled,2024-11-14T09:33:40Z
  TXN-88209,8900.00,GBP,ACC-2209,ACC-5512,flagged,2024-11-14T09:37:15Z

これを「£5,000を超えるトランザクション、またはflaggedまたはfailedステータスのものにフラグを立てて」というプロンプトに貼り付けると、モデルは秒単位で答えます。TOON表現は十分コンパクトなので、ほとんどのモデルのコンテキスト制限に到達することなく単一のプロンプトに数百行を快適に収めることができます。

1つのドキュメントで表形式とオブジェクトデータを組み合わせる

JSONもCSVもきれいに処理できないもの:同じペイロードにメタデータヘッダー(単一の設定オブジェクト)とデータテーブルの両方があるドキュメント。上部にコンテキストブロック — 誰が生成したか、どの期間をカバーするか、どのフィルターが適用されたか — の後に実際のデータ行が続くレポートを考えてください。JSONでは"meta"キーと"rows"キーを持つエンベロープオブジェクトですべてをラップする必要があり、別のネストレベルが追加されます。CSVは全くできません。TOONはネイティブにこれを処理します:

text
{report:weekly_sales,generatedAt:2024-11-14T10:00:00Z,region:EMEA,currency:EUR,generatedBy:analytics-service}

salesByRep[6]{repId,repName,deals,revenue,avgDealSize,quota}:
  REP-101,Marta Kowalski,14,84200.00,6014.28,75000
  REP-102,James Okafor,11,61500.00,5590.90,75000
  REP-103,Yuki Tanaka,18,102400.00,5688.88,90000
  REP-104,Sofia Andersen,9,47800.00,5311.11,75000
  REP-105,Liam Byrne,16,93100.00,5818.75,90000
  REP-106,Priya Nair,21,118600.00,5647.61,100000

最初の行はTOONオブジェクト — レポートのメタデータです。空行で続く表形式セクションと区切られています。@toon-format/toonからの単一のdecode()呼び出しで両方が返されます。「どの営業担当者がクォータを達成する軌道にいますか?」という質問でこのドキュメント全体をLLMに送ることができ、レポートコンテキストデータの両方が1つのコンパクトなペイロードに含まれています。

この混合フォーマットはLLMパイプラインで特に強力です。ネストされたキーを持つJSONエンベロープを構築する代わりに、フラットなヘッダーオブジェクト+名前付きテーブルを書きます。モデルは自然に読み取り、生成するコードは些細なものです。JSON to TOONコンバーターを使って既存のJSONペイロードを変換するか、TOONフォーマッターで手書きのTOONをクリーンアップして検証してください。

npmパッケージの使用

これらの例はすべてプログラム的にエンコードおよびデコードできます。@toon-format/toonパッケージが参照実装です。任意のNode.jsまたはブラウザプロジェクトにインストールしてください:

bash
npm install @toon-format/toon

LLM APIに送信する前にデータをエンコードし、戻る際にレスポンスをデコードしてください:

ts
import { encode, decode } from '@toon-format/toon';

const transactions = [
  { txId: 'TXN-88201', amount: 1250.00, currency: 'GBP', from: 'ACC-1041', to: 'ACC-2209', status: 'settled', timestamp: '2024-11-14T09:15:00Z' },
  { txId: 'TXN-88202', amount: 89.99,   currency: 'USD', from: 'ACC-3301', to: 'ACC-0047', status: 'settled', timestamp: '2024-11-14T09:16:34Z' },
  // ...more rows
];

// Compact TOON string — send this to your LLM prompt
const toonPayload = encode(transactions);

// When the LLM returns TOON, decode back to a JS array
const decoded = decode(toonPayload);
console.log(decoded[0].status); // "settled"

まとめ

上記のパターン — 製品カタログ、監査ログ、メトリクステーブル、設定オブジェクト、金融データ、ヘッダー+テーブルの混合ドキュメント — は、開発者が実際にLLMに送る構造化データの大部分をカバーしています。TOONはすべてをよく処理し、トークン節約はいずれの場合も重要です。核となるルールはシンプルです:JSONは各行でキー名を繰り返します;TOONはしません。LLMコンテキストウィンドウに入る表形式データのシリアライゼーションでは、その繰り返しは純粋な無駄です。

既存のJSONをTOONに変換するには、JSON to TOONコンバーターを使用してください。LLMがTOONを返した後に逆方向に行くには、TOON to JSONコンバーターを使用してください。TOONフォーマッターはTOON文字列をクリーンアップして検証し、TOONバリデーターはパイプラインに到達する前に構文エラーをキャッチします。npmパッケージ@toon-format/toonは2行のコードでエンコードとデコードを処理します — 上記の例はすべてすぐに動作します。