フォーマットのドキュメントはおもちゃの例が好きです — 3行、架空の名前、5列。構文を学ぶには良いですが、実際の作業で扱う形状をフォーマットが処理できるかどうかはわかりません。この記事ではおもちゃを省きます。以下に、実際のバックエンド開発で常に出てくるデータパターンを示します — 製品カタログ、監査ログ、メトリクステーブル、設定オブジェクト、金融トランザクション — JSONとTOONを並べて示すことで、正確に何を節約しているか、TOONが存在意義を発揮するところがわかります。すべてのデータは現実的で、foo、bar、プレースホルダー名は一切ありません。フォーマット自体の背景については、TOON構文ガイドを参照してください。
eコマース製品カタログ
製品配列はおそらく開発者がLLMに送る最も一般的なものです — "これらのアイテムを分類して"、"各カテゴリで最安値を見つけて"、"$50以上の値段で在庫切れのものにフラグを立てて"。こちらは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で同じカタログ。列ヘッダーは一度だけ宣言されます;各行には値のみが含まれます:
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ユーザーアクティビティ/監査ログ
監査ログはまさに「このユーザーが最後の1時間で何をしたか要約して」や「疑わしいアクセスパターンにフラグを立てて」といったプロンプトでLLMに供給するデータです。高ボリュームで繰り返しが多く、列名はすべての行で同一です。監査トレイルは、JSONとして貼り付けるとコンテキストウィンドウを最初に爆発させるものでもあります。TOONでの現実的な9行のログ:
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スクレイプから出てくるデータの形状です:
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,3200LLMはコンテキストのオーバーヘッドなしにこのテーブルについての質問に即座に答えられます。/api/v2/searchと/api/v2/checkoutの両方が高いp99と高いエラーレートで目立っていることに注目してください —データを清潔に提示したときにLLMが即座に表面化できるパターンそのものです。
ネストされた設定オブジェクト
TOONは表形式データ以上のものを処理します。構造化オブジェクト — アプリのランタイム設定に見られる種類のもの — には、TOONはネストされた構造を持つインラインオブジェクト表記を使用します。TOMLやYAMLのようなシリアライゼーション形式の対応物と考えてください、ただしより軽量です。サーバー設定、データベース設定、フィーチャーフラグを示す現実的なアプリ設定:
{
"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オブジェクト表記での同じ設定 — キーは引用符なし、ネストはインラインの波括弧を使用:
{
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}
}databaseブロックでは、host:db.internal.example.comはそのまま問題ありません —値にはどちらも含まれていないので引用符は不要です。値にカンマやコロンが含まれる場合は、ダブルクォートで囲んでください:dsn:"host:5432,sslmode=require"。金融トランザクション
金融データはもう一つの高価値LLMユースケースです:不正検出のヒント、照合チェック、分類。文字列ID、数値金額、通貨コード、ステータス列挙型、タイムスタンプの組み合わせはTOONの表形式フォーマットにきれいにマッピングされます。現実的なトランザクションの抜粋:
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はネイティブにこれを処理します:
{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つのコンパクトなペイロードに含まれています。
npmパッケージの使用
これらの例はすべてプログラム的にエンコードおよびデコードできます。@toon-format/toonパッケージが参照実装です。任意のNode.jsまたはブラウザプロジェクトにインストールしてください:
npm install @toon-format/toonLLM APIに送信する前にデータをエンコードし、戻る際にレスポンスをデコードしてください:
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行のコードでエンコードとデコードを処理します — 上記の例はすべてすぐに動作します。