プロンプトテンプレート(プロンプトテンプレート)
LLMへの入力プロンプトを再利用可能な雛形として定義したもの。変数プレースホルダーを含み、実行時に動的な値を埋め込んで完成したプロンプトを生成する。
プロンプトテンプレートとは
プロンプトテンプレートとは、LLM(大規模言語モデル)に送信するプロンプトを再利用可能な雛形(テンプレート)として定義する設計パターンです。固定部分(指示文・フォーマット指定・制約条件)と可変部分(ユーザー入力・コンテキスト・パラメータ)を分離し、実行時に変数を埋め込んで完成したプロンプトを生成します。
なぜプロンプトテンプレートが必要か
LLMアプリケーションでは、同じ構造のプロンプトを異なる入力で繰り返し使用します。テンプレート化せずに毎回プロンプトを文字列連結で構築すると、以下の問題が発生します。
| 問題 | テンプレートなし | テンプレートあり |
|---|---|---|
| 保守性 | プロンプト変更時に全箇所修正 | テンプレート1箇所修正で完了 |
| 一貫性 | 開発者ごとにプロンプトがばらつく | 統一されたフォーマット |
| テスト容易性 | 入力と指示が混在し検証困難 | テンプレート単体でテスト可能 |
| バージョン管理 | diff が読みにくい | テンプレートファイルとして管理 |
| セキュリティ | インジェクション対策が散在 | テンプレートレベルでサニタイズ |
テンプレートの基本構造
プロンプトテンプレートは一般的に以下の要素で構成されます。
システムプロンプト部
モデルの役割・振る舞い・制約条件を定義する固定部分です。「あなたは〇〇の専門家です」「回答はJSON形式で返してください」などの指示を記述します。
ユーザープロンプト部
実際のタスク指示と変数プレースホルダーを含む部分です。{user_query}、{context}、{language} などのプレースホルダーが実行時に具体的な値に置換されます。
Few-shot例示部(オプション)
入力と期待出力のペアを数例含め、モデルに応答パターンを学習させる部分です。テンプレートに組み込むことで、一貫した出力フォーマットを保証します。
主要フレームワークでの実装
LangChain
LangChain の PromptTemplate は最も広く使われているテンプレートライブラリです。ChatPromptTemplate はメッセージロール(system/human/ai)を構造化して管理できます。
LlamaIndex
LlamaIndex では PromptTemplate クラスがRAGパイプラインのクエリテンプレートとして機能します。検索結果のコンテキストを自動挿入する {context_str} 変数が組み込まれています。
Jinja2ベース
Python の Jinja2 テンプレートエンジンを直接使用するアプローチも一般的です。条件分岐({% if %})やループ({% for %})が使えるため、複雑なプロンプト構築に適しています。Anthropic の公式ドキュメントでも Jinja2 形式が推奨されています。
Handlebarsベース
JavaScript/TypeScript エコシステムでは Handlebars テンプレートが使われます。Semantic Kernel(Microsoft)はHandlebars形式のプロンプトテンプレートをネイティブサポートしています。
テンプレート設計のベストプラクティス
変数の命名規則
変数名は snake_case で意味が明確な名前を使用します。{input} や {text} のような汎用名は避け、{customer_inquiry} や {product_description} のように用途を明示します。
デフォルト値の設定
オプショナルな変数にはデフォルト値を設定し、未指定時でもテンプレートが破綻しないようにします。言語指定の変数なら {language:日本語} のようにフォールバック値を定義します。
出力フォーマット指定
テンプレートの末尾に期待する出力形式を明示します。JSON Schema、Markdown構造、CSV形式など、後続処理でパースしやすいフォーマットを指定することで、出力の安定性が向上します。
プロンプトインジェクション対策
ユーザー入力を埋め込む変数は、XMLタグやデリミタで明確に区切ります。<user_input>{query}</user_input> のように構造化することで、ユーザー入力がシステムプロンプトの指示を上書きするインジェクション攻撃を緩和できます。
テンプレートの管理と運用
テンプレートはアプリケーションコードから分離し、専用ファイル(.txt、.j2、.yaml)として管理するのが推奨です。Git でバージョン管理し、変更履歴を追跡可能にします。大規模プロジェクトではテンプレートレジストリ(LangSmith Hub、Humanloop等)を利用してチーム間で共有・評価します。
FAQ
Q1: プロンプトテンプレートとプロンプトエンジニアリングの違いは?
A1: プロンプトエンジニアリングは効果的なプロンプトを設計する技法全般を指し、プロンプトテンプレートはその成果物を再利用可能な形式で実装する手段です。エンジニアリングが「何を書くか」、テンプレートが「どう管理するか」に焦点を置きます。
Q2: テンプレートはハードコードとファイル管理のどちらが良いですか?
A2: ファイル管理を推奨します。コードからの分離により、プロンプトの変更がコードレビュー不要になり、非エンジニアのプロンプト担当者も編集可能になります。YAML/JSON形式なら変数のスキーマ定義も含められます。
Q3: テンプレートのテスト方法は?
A3: 代表的な入力パターン(正常系・エッジケース・悪意のある入力)でテンプレートを展開し、LLMの出力が期待フォーマットに準拠しているかを自動検証します。LangSmithやPromptfooなどのツールがテンプレートの回帰テストをサポートしています。