インストラクトフォーマット
インストラクトフォーマットは、クリーンなメッセージ配列がプロンプト文字列にどうレンダリングされるかを定義します。ファイルシステムやコード実行にアクセスできないサンドボックス化された Handlebars テンプレートを使用します。
フォーマットマネージャー
組み込みのフォーマットマネージャーがインストラクトフォーマットを所有します。フォーマットは分離された環境でレンダリングされる Handlebars テンプレートです: テンプレートは content、role、name のみを受け取り、文書化されたヘルパーのみが利用可能です。テンプレートは Node.js アクセス、ファイルシステムアクセス、任意コードを実行する手段を一切持ちません。
フォーマットは次のものを記述します:
- system、user、assistant、tool テンプレート;
- BOS と EOS トークン;
- メッセージセパレーター;
- 特殊トークン。
組み込みフォーマット
NeoTavern には以下のフォーマットが同梱されています:
- ChatML —
<|im_start|>/<|im_end|>ロールブロック。 - Llama 3 — ロールタグ付き
<|begin_of_text|>。 - Alpaca — 指示と応答のブロック。
- Mistral —
[INST]/[/INST]ブロック。 - Command-R —
<|START_OF_TURN_TOKEN|>ブロック。 - カスタムフォーマット — ユーザー定義のテンプレート。アクティブフォーマットとして選択可能です。
レンダリングまでのクリーンなメッセージ配列
レンダリングステージまで、パイプラインはロール(system、user、assistant、tool)を持つ構造化されたメッセージ配列のみを扱います。マクロが解決され、ロアブックとメモリが挿入され、コンテキストシフティングが超過分を除去し、プラグインインターセプターがこの配列を変更します。レンダリングはレンダリングステージで正確に 1 回行われるため、アダプターがプロンプトを 2 度再フォーマットすることはありません。
最終出力
レンダリングステージは次の 2 つのシェイプのいずれかを生成します:
- 文字列 — レンダリングされたプロンプト。テキスト補完プロバイダーに送信され、診断に使用されます。
- 構造化 JSON —
GenerationMessage[]配列。ロールタグ付きメッセージを受け入れるチャットプロバイダーに送信されます。
モードは serializeAsText で選択されます: テキストアダプター(text-completion、novelai、ai-horde、koboldai)は常にレンダリングされたインストラクトプロンプトを単一の user メッセージとして受け取り、チャットアダプター(openai-compatible、anthropic)は構造化された配列を受け取ります。
マクロ
{{user}}、{{char}}、カスタム変数は最終レンダリングの前に解決されます。マクロがテンプレートエンジン自体の内部で展開されることは決してないため、テンプレートファイルは純粋なマークアップのままです。
カスタムフォーマットとプリセット
アクティブなカスタムフォーマットは AppSettings.instructFormat に保存されます。設定されている場合、クリーンなメッセージ配列は単一の文字列にレンダリングされ、フォーマットの停止文字列がリクエストの停止シーケンスになります。null の場合、ネイティブの構造化シリアライゼーションが使用されます。
フォーマットはバージョン管理された JSON プリセットとしてインポート・エクスポートされます:
importInstructFormat()はプリセットがアクティブになる前に検証します;exportInstructFormat()は JSON セーフで区切られた値を生成します;- プリセットはバージョンを保持するため、古いエクスポートはインポート時に移行できます。
関連情報
- レンダリングがステージ順序のどこにあるかはパイプラインステージ。
- レンダリングされたコンテキストのカウント方法はトークナイゼーション。
- アダプターがシリアライズされた出力をどう消費するかはプロバイダー。