よくある質問
TOON(Token-Oriented Object Notation)とは?
TOON(Token-Oriented Object Notation、トークン指向オブジェクト表記法)は、大規模言語モデル(LLM)アプリケーション向けに特別に設計された、コンパクトで人間が読みやすいデータシリアライゼーション形式です。ChatGPT、Claude、GeminiなどのAIモデルを使用する際のトークン消費コストの増大に対処するために作成されました。TOONは、配列内の各オブジェクトに対してプロパティ名を繰り返す従来のJSONとは異なり、ヘッダーを一度だけ定義し、データ行がコンパクトなカンマ区切り形式で続く表形式を使用します。このアプローチは、APIレスポンス、データベースレコード、または一貫したプロパティを持つオブジェクトのコレクションなど、繰り返しスキーマを持つ構造化データに特に効果的です。
なぜLLMプロンプトでJSONの代わりにTOONを使うべきですか?
大規模言語モデルを使用する際にJSONよりTOONを選ぶ理由がいくつかあります。まず、コスト削減です。OpenAIのGPT-4、AnthropicのClaude、GoogleのGeminiなどのLLM APIはトークン使用量に基づいて課金されます。TOONは構造化データのトークン消費を30-50%削減でき、API コストを直接削減します。次に、TOONはコンテキストウィンドウの制限内により多くのデータを収めるのに役立ちます。すべてのLLMには最大コンテキスト長があり、よりコンパクトな形式を使用することで、制限に達することなくプロンプトにより多くの関連データを含めることができます。
TOON形式はどのように機能しますか?
TOONは、繰り返しのJSON構造をより効率的な表形式に変換することで機能します。重要な洞察は、同じプロパティを持つオブジェクトの配列がある場合、JSONはすべてのオブジェクトに対してすべてのプロパティ名を繰り返すということです。TOONは、ヘッダー行でスキーマを一度だけ宣言し、各オブジェクトを単純なカンマ区切りの値の行として表現することで、この冗長性を排除します。
// JSON (89 characters)
[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]
// TOON (42 characters, 53% smaller)
[2](id,name):
1,Alice
2,BobTOONとJSONの主な違いは何ですか?
TOONとJSONはどちらもデータシリアライゼーション形式ですが、アプローチとユースケースに根本的な違いがあります。JSONは各オブジェクトがすべてのプロパティを明示的に命名する冗長なキーバリューペア構文を使用し、類似オブジェクトの配列では高度に冗長になります。TOONはスキーマファーストのアプローチを使用し、プロパティ名はヘッダーで一度だけ宣言され、後続の行には値のみが含まれます。両方の形式は完全な忠実度で同じデータを表現できます。情報を失うことなく相互に変換できます。
TOONでどれくらいのトークン節約が期待できますか?
TOONを使用したトークン節約はデータ構造によって異なりますが、繰り返しスキーマを持つ構造化データでは通常30%から60%の節約が見込めます。同じプロパティを共有する多くのオブジェクトを持つ配列がある場合、節約は最も劇的です。例えば、id、name、email、roleなどのプロパティを持つ100個のユーザーオブジェクトのJSON配列は、これらの4つのプロパティ名を100回繰り返します。TOONでは、これらの名前はヘッダーに一度だけ表示され、すぐに396回のプロパティ名の繰り返しを節約します。
TOON形式の基本構文は何ですか?
TOON構文は最小限でありながら表現力豊かに設計されています。基本的な構成要素は: 1)シンプルなキーバリューペアは「key: value」として別々の行に書かれ、YAMLに似ています。 2)オブジェクトの配列はヘッダー表記を使用:「arrayName[count](field1,field2,field3):」の後にデータ行が続き、各行にはヘッダーフィールドに対応するカンマ区切りの値が含まれます。 3)ネストされたオブジェクトはインデントで表現され、子プロパティは親の下にインデントされます。
// Array with schema header
products[3](id,name,price):
1,Widget,9.99
2,Gadget,19.99
3,Gizmo,29.99
// Nested object
user:
name: John Doe
age: 30
address:{city: New York, zip: 10001}TOONはどのデータ型をサポートしていますか?
TOONはJSONと同じすべてのデータ型をサポートし、変換時の完全なデータ忠実度を保証します。文字列はテキストとして表現され、カンマ、改行、先頭/末尾の空白などの特殊文字を含む場合のみ引用符が必要です。数値には整数と浮動小数点値の両方が含まれ、標準的な10進表記で表現されます。ブール値は引用符なしでリテラル「true」または「false」として書かれます。Null値は表形式では空(カンマ間の空の位置)として、またはキーバリューコンテキストではリテラル「null」として表現されます。
ChatGPT、Claude、その他のLLMでTOON形式をどのように使用しますか?
LLMでTOONを使用するのは簡単で、「説明するより見せる」アプローチに従います。最も効果的な方法は、「toon」言語識別子を使用してTOONデータをコードブロックで囲むことです。これにより、LLMが形式を認識し、正しく解析するのに役立ちます。LLMにTOON形式でデータを出力するよう求める場合は、プロンプトに期待される構造の例を提供します。LLMはパターンマッチングシステムであり、デモンストレーションした形式に自然に従います。
// LLM Prompt Example:
Here is user data in TOON format:
users[3](id,name,email):
1,Alice,[email protected]
2,Bob,[email protected]
3,Charlie,[email protected]
Please analyze this data and respond in the same TOON format.どのプログラミング言語がTOONをサポートしていますか?
TOONは多くのプログラミング言語で公式およびコミュニティ実装が利用可能で、サポートが拡大しています。公式のTypeScript/JavaScript実装(npmのtoon-format/toon)は参照実装であり、エンコード、デコード、ストリーミングAPIを提供します。Python開発者はPyPIのtoon_formatパッケージを使用できます。Rustには高性能アプリケーション用のtoon_format crateがあります。Go開発者にはバックエンドサービス用のtoon-goがあります。
いつTOONを使用すべきで、いつJSONを使用すべきですか?
TOONは特定のシナリオに最適ですが、JSONは他のシナリオでより適しています。TOONを使用する場合:1)LLMに構造化データを送信し、トークンコストを削減したい場合。2)一貫したスキーマを持つオブジェクトの配列がある場合。3)コンテキストウィンドウの制限に近づいており、より多くのデータを収める必要がある場合。JSONを使用する場合:1)人間が頻繁に編集する設定ファイルを扱っている場合。2)単一のオブジェクトまたは非常に不規則なネスト構造がある場合。3)既存のツールやシステムとの最大限の互換性が必要な場合。
TOON形式の制限は何ですか?
TOONは大きな利点を提供しますが、その制限を理解することが重要です。まず、TOONは一貫したスキーマを持つオブジェクトの配列に最適化されています。単一のオブジェクトや非常に不規則な構造では、トークン節約は最小限です。次に、TOONにはエンコードとデコードのステップが必要で、ネイティブJSON解析と比較してわずかな処理オーバーヘッドが追加されます。
LLMでTOONを使用するベストプラクティスは何ですか?
LLMを使用する際にTOONの利点を最大化するには、以下のベストプラクティスに従ってください:1)TOONに変換する前に常にJSONを検証してエンコードエラーを回避します。2)「toon」言語識別子付きのコードブロックを使用してLLMが形式を認識するのを助けます。3)複雑なスキーマの場合、システムプロンプトに小さな例を提供してモデルを準備します。4)TOON出力を期待する場合、LLMに従ってほしいヘッダーテンプレートを含めます。