Claudeのプロンプトテンプレートは、毎回変わらない指示と、呼び出しごとに差し替える変数を分けて書いたプロンプトです。2026年はこれを作る道具が入れ替わり、Consoleの旧Workbenchは保存機能のない「playground」になり、API 2026-10-21版ではtemperatureが使えなくなりました。この記事では、公式ベストプラクティスに沿ったテンプレートの型と実例、metapromptで草案を書かせる手順、Difyで変数が置換されない原因、品質の評価方法を、2026年11月1日時点の一次情報で説明します。
まとめ
- 型は「資料と入力をXMLタグで分ける・長い資料は先頭、質問と指示は末尾・役割はシステムプロンプト・例示は3〜5件」。公式例は変数を
{{ANNUAL_REPORT}}のように書きます。 - 旧Workbenchは2026年8月17日で終了し、後継のplaygroundはプロンプトの保存・評価・共有に対応しません。テンプレートはコードかアプリ基盤で管理します。
- API 2026-10-21版は
temperature・top_p・top_kを400で拒否します。出力のぶれはテンプレートの出力形式指定と例示で抑えます。 - 草案作りの公式導線はCookbookのmetaprompt notebookで、10月から生成モデルは
claude-sonnet-5-5です。 - Difyのワークフローは通常モードでは
{{#ノードID.変数名#}}しか置換しないため、metapromptの{$NAME}を{{faq}}に書き換えただけでは値が入りません。
Claudeのプロンプトテンプレートの基本構成
Anthropicの公式ドキュメントには、かつて「Prompt templates and variables」という単独ページがありましたが、現在はPrompting best practicesへ転送されます。テンプレートの書き方は、このページの推奨を組み合わせると決まります。
XMLタグによる指示・資料・入力の分離
公式は、指示・文脈・例・変数入力が混在するプロンプトでは、種類ごとに<instructions>、<context>、<input>のようなタグで包むと取り違えが減ると説明しています。推奨は2点で、タグ名を一貫させて中身が分かる名前にすること、文書群は<documents>の中に<document index="n">を並べるように階層を入れ子で表すことです。タグ名に「正解」はないので、社内で使う名前を1つの表にしておくと、テンプレートが増えても書き方がぶれません。
長い資料・質問・指示の配置順序
2万トークンを超えるような長い資料を渡すときは、資料をプロンプトの上部に置き、質問・指示・例をその下に書きます。公式は、特に複雑な複数文書の入力では、質問を末尾に置くとテストで回答の質が最大30%上がったと記しています(自社の入力で同じ改善幅が出る保証ではありません)。あわせて、長い資料の課題では「まず関連箇所を引用させてから答えさせる」書き方を勧めています。FAQ回答や規程の照会のように根拠が資料の中にある業務では、この2つをテンプレートに最初から組み込みます。
役割はシステムプロンプト、例示は3〜5件
役割の設定はシステムプロンプトに書き、1文でも効果があるとされています。出力例(few-shot)は、実際の用途に近く、例外ケースも含めて互いに十分違う例を3〜5件、<example>タグ(複数なら<examples>)で包んで指示と区別するのが推奨です。例の選び方と並べ方はfew shotとは?Few-shotプロンプトの例示の選び方・並べ方とAPI実装・評価手順を解説【2026年版】で詳しく扱っています。システムプロンプトのAPIでの渡し方はシステムプロンプトとは?3社APIの指定方法と書き方・禁止事項を参照してください。
問い合わせ一次回答テンプレートの実例
上の推奨から役割指定・XMLタグ・資料を先頭に置く構成・引用の先出しを取り入れた、FAQに基づく問い合わせ一次回答の最小例です(few-shotの出力例は省略しています)。システムプロンプト(system_prompt.txt)は役割と根拠の範囲だけにします。
あなたは株式会社サンプル商事の問い合わせ窓口で一次回答を書く担当者です。
回答は<documents>内のFAQに書かれている内容だけを根拠にしてください。
ユーザーメッセージ側(user_template.txt)は、資料→質問→指示の順に並べ、変数は公式例と同じ大文字の二重波括弧にしました。
<documents>
<document index="1">
<source>{{FAQ_NAME}}</source>
<document_content>
{{FAQ}}
</document_content>
</document>
</documents>
<question>
{{QUESTION}}
</question>
<instructions>
1. 質問に関係するFAQの記述を、一字一句そのまま<quotes>タグに書き出してください。
2. 該当する記述が無い場合は「担当者から改めてご連絡します」とだけ<answer>タグに書いてください。
3. 該当する記述がある場合は、それだけを根拠に3文以内の回答を<answer>タグに書いてください。
</instructions>
このテンプレートの要は、答えられないときの文面を1つに固定している点と、引用(<quotes>)と回答(<answer>)を別のタグに出させている点です。後段のプログラムは<answer>の中身だけを取り出せばよく、引用は根拠の確認に使えます。
変数を差し込むPythonスクリプト
Claude APIはテンプレートの変数を自動で置換しないので、送る前に自分で埋めます。次のスクリプトは、値の無い変数があるとKeyErrorを送出し、送信前に止まります(Python 3.9.6で実行して出力を確認)。
import re
TEMPLATE = open("user_template.txt", encoding="utf-8").read()
VAR = re.compile(r"\{\{([A-Z][A-Z0-9_]*)\}\}")
def render(template, values):
missing = set(VAR.findall(template)) - values.keys()
if missing:
raise KeyError("値が無い変数: " + ", ".join(sorted(missing)))
return VAR.sub(lambda m: str(values[m.group(1)]), template)
values = {
"FAQ_NAME": "返品FAQ_2026-10版",
"FAQ": "Q. 返品期限は? A. 商品到着後14日以内です。",
"QUESTION": "届いて10日経ちましたが返品できますか",
}
print(render(TEMPLATE, values))
try:
render(TEMPLATE, {"FAQ": "..."})
except KeyError as e:
print(e)
実行結果は次のとおりです(<instructions>部分は省略)。最終行は、FAQだけを渡した呼び出しで不足分を検出し、捕捉したKeyErrorを表示したものです。
<documents>
<document index="1">
<source>返品FAQ_2026-10版</source>
<document_content>
Q. 返品期限は? A. 商品到着後14日以内です。
</document_content>
</document>
</documents>
<question>
届いて10日経ちましたが返品できますか
</question>
'値が無い変数: FAQ_NAME, QUESTION'
組み立てたプロンプトをClaudeへ送るには、anthropicパッケージを入れて環境変数ANTHROPIC_API_KEYを設定し、次のコードを追記します。temperatureを渡していないのは、次章で説明するAPIの変更のためです。
# render.py の末尾に追記し、組み立てたプロンプトをClaudeへ送る
import anthropic
SYSTEM_PROMPT = open("system_prompt.txt", encoding="utf-8").read()
client = anthropic.Anthropic() # 環境変数 ANTHROPIC_API_KEY を読む
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=2048,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": render(TEMPLATE, values)}],
)
if response.stop_reason == "max_tokens":
raise RuntimeError("出力上限に達しました。max_tokensを見直してください。")
# 思考ブロックが先に来ることがあるため、textブロックを型で選ぶ
answer = next((b.text for b in response.content if b.type == "text"), None)
if answer is None:
raise RuntimeError("textブロックがありません。応答内容を確認してください。")
print(answer)
2026年に変わったテンプレート運用の前提
2024〜2025年の解説の多くは、Consoleのプロンプトジェネレーターで作ったテンプレートをWorkbenchに保存する手順を前提にしています。その前提は次の3つの変更で崩れました。
| 日付 | 変更 | テンプレート運用への影響 |
|---|---|---|
| 2026年8月17日 | 旧Workbench終了・prompt tools API廃止 | Consoleでの保存と自動生成APIが消えた |
| 2026年8月18日 | Workbenchを「playground」へ改称 | 試し打ち専用。保存・評価は不可 |
| 2026年10月21日 | API 2026-10-21版を公開 | temperature等を送ると400 |
旧Workbenchの終了とplaygroundへの改称
2026年7月17日のClaude Platformのリリースノートは、旧Workbench(platform.claude.com/workbench)へのアクセスを8月17日で終えると告知し、保存済みプロンプト・変数・evalsは更新版に引き継がれないと書いていました。翌18日のリリースノートで、更新版は「playground」という名前になっています。playgroundで読み込めるテンプレートは、コード実行やWeb検索といったAPI機能の見本であり、自分のテンプレートを置く場所ではありません。
Claude Help Centerのplaygroundの解説は、保存済みプロンプト、プロンプトのバージョン、evals、プロンプトの共有はplaygroundに含まれないと明記しています。作業中の下書きはブラウザに残るだけで、Anthropicのサーバーには保存されません。残したいリクエストは「code」タブからコードとして写し取る運用になります。
prompt tools API 3本の廃止
同じ7月17日の告知で、プロンプトの生成・改善・テンプレート化を担っていた実験的API(/v1/experimental/generate_prompt、/v1/experimental/improve_prompt、/v1/experimental/templatize_prompt)も、Workbenchとともに8月17日で廃止されました。削除後のリクエストはエラーを返します。10月30日までのリリースノートに再提供の告知はなく、旧「prompt generator」「prompt improver」のドキュメントもPrompting best practicesへ転送されます。
temperatureとprefillに頼らない出力の固定
2026年10月21日に公開されたAPI 2026-10-21版の移行ガイドは、temperature・top_p・top_kを送ったリクエストは既定値であっても400エラーになると定めています。Python SDK 2.0.0などの新しいSDKはこの版を既定で送ります。Claude Sonnet 5.5はモデル側でも、この3つを指定すると400エラーです。さらに4.6世代以降のClaudeは、アシスタントメッセージの書き出しを固定するprefillを受け付けません。
テンプレートに対する意味は明確です。temperature=0で出力を揃える、応答の冒頭を{で始めさせてJSONを強制する、という古いテンプレートの技法は使えません。出力形式はテンプレート本文で指定し(前掲の<answer>タグのように)、例示で形を見せ、厳密なJSONが要るなら構造化出力を使います。SDKを更新するときの書き換え手順はClaude API 2026-10-21移行ガイド:temperature廃止とSDKメジャー更新の書き換え手順【2026年10月】にまとめています。
metapromptでテンプレートの草案を作る手順
白紙から書き始めたくない場合、Anthropicのプロンプトエンジニアリング概要ページは「Prompt generator notebook」というカードで、Claude Cookbookのmetaprompt recipeを案内しています。実体はmisc/metaprompt.ipynbというノートブックで、良いプロンプトの実例を多数含む長い指示文に自分のタスクを差し込み、Claudeにそのタスク用のテンプレートを書かせます。
- ノートブックをColabで開き、最初のセルで
anthropicパッケージを入れる。 - APIキーを設定する(空欄のままなら環境変数
ANTHROPIC_API_KEYを読む)。 TASKにタスクの説明、VARIABLESに大文字の変数名を書く(空リストならClaudeが変数を選ぶ)。- タスクを変えた場合は、末尾の
VARIABLE_VALUESに試験用の値を入れる。 - Run allで実行すると、途中にテンプレートが表示され、最後に試験用モデルでそのテンプレートを試走する。
2026年10月の更新で変わった実行モデルとトークン上限
ノートブックは10月に2回更新されています。10月24日のコミット(#924)で、テンプレートを書くモデルがclaude-sonnet-4-6からclaude-sonnet-5-5に変わり、それまで呼び出しに付いていたtemperature=0が削除されました。同時にMAX_TOKENSは4096から8192に上がり、コメントには「モデルの思考もこの上限に含まれる」と書き足されています。10月29日のコミット(#940)では、試験用モデルがclaude-haiku-4-5からclaude-haiku-5-5になりました。
応答の取り出し方も変わっています。Claude 5世代は思考(adaptive thinking)が既定で動くため、応答の先頭が思考ブロックになることがあり、ノートブックはcontent[0]ではなくtype == "text"のブロックを選んで読みます。prefillが使えない代わりに、ユーザーターンの末尾で「<Inputs>ブロックから書き始めること」と指示しています。自作のプロンプト生成処理を持っている場合も、この2点は同じように直す必要があります。
出力される{$NAME}変数と角括弧のプレースホルダー
metapromptが書くテンプレートの変数は{$CUSTOMER_EMAIL}のような{$NAME}形式です。ただし試走用コードのextract_variablesは、正規表現r"{([^}]+)}"で波括弧に囲まれた部分をすべて拾うため、生成物にJSONの例など$の無い波括弧があると、それも変数として値を求められます。生成物に[Your Name]のような角括弧が混じることがありますが、ノートブックの説明では、これは人が後で埋める欄であって変数ではありません。ノートブック冒頭の注意書きは、単発の質問応答向けでマルチターンには向かないこと(このツールの対象範囲で、テンプレート全般の限界ではありません)、出力が最適である保証はないので遠慮なく直すことの2点を挙げています。草案は前章の型(資料の位置、出力タグ、答えられないときの文面)と見比べて手を入れます。
Difyへ移植するときの変数記法の変換
テンプレートを社内の業務アプリとして配る場合、入力フォームと公開機能を備えたDifyが選択肢になります。Dify自体の組み立て方はDifyワークフローの作り方と使い方|ノード選定・ループ・トリガーを実装手順で解説【2026年版】に譲り、ここではClaude向けに書いたテンプレートを載せる作業だけを扱います。
アプリ種別で変わる変数の書き方
変数の記法は、テンプレートの出どころとDifyのアプリ種別で4通りあります。
| 場所 | 変数の書き方 |
|---|---|
| Cookbookのmetaprompt | {$FAQ} |
| Anthropic公式のプロンプト例 | {{FAQ}}(表記上の慣例) |
| Difyのチャットボット等(簡易UI) | {{faq}} |
| Difyのワークフロー・チャットフロー(通常モード) | {{#ノードID.faq#}} |
注意したいのは最後の行です。DifyのLLMノードの公式ドキュメントは、変数を{{variable_name}}で参照すると説明しています。しかしDify 1.18.0が使うワークフローエンジン(graphon)のソースでは、LLMノードがプロンプトの変数を展開するconvert_templateが、{{#ノードID.変数名#}}に一致する部分だけを変数として引き、それ以外はそのまま文字列として残します。変数を抽出するVariableTemplateParserも、規則として「キーは#node_id.var1.var2#の形に限る」と定めています。{{faq}}形式を拾うのは、チャットボットなど簡易UIアプリのプロンプト用の別パーサーです。ワークフローのプロンプト欄では、手で書かずに「/」か「{」を押して変数を選ぶと、ノードID付きの参照が入ります。
{$NAME}をDifyの変数参照に変換するスクリプト
次のスクリプトは、metapromptの{$NAME}を2種類の書き方に変換し、Dify側の正規表現(ワークフロー用のgraphonと、簡易UI用のprompt_template_parser.pyから写したもの)で拾えるかを確かめます。この例は、開始ノードに小文字のfaqとquestionを定義している前提で、ノードIDにはDSLをエクスポートしたときに開始ノードのidとして出る値を入れます(例の1711528914102は架空の値)。変換できる変数名は大文字英字で始まる30文字以内の英数字とアンダースコアで、別ノードの値を使う変数は手で参照を直します。
import re
# metaprompt が書き出す {$NAME} を、Dify の変数参照に置き換える
# mode="workflow": ワークフロー/チャットフローのLLMノード用 {{#ノードID.変数名#}}
# mode="basic" : チャットボット等(簡易UI)のプロンプト用 {{変数名}}
def to_dify(template, mode="workflow", node_id="start"):
def repl(m):
name = m.group(1).lower()
if mode == "workflow":
return "{{#" + node_id + "." + name + "#}}"
return "{{" + name + "}}"
return re.sub(r"\{\$([A-Z][A-Z0-9_]{0,29})\}", repl, template)
template = """<faq>
{$FAQ}
</faq>
質問: {$QUESTION}"""
print(to_dify(template, mode="workflow", node_id="1711528914102"))
print("---")
print(to_dify(template, mode="basic"))
# Dify 側の正規表現(graphon の VariableTemplateParser と prompt_template_parser の REGEX)で拾えるか確認
WF = re.compile(r"\{\{(#[a-zA-Z0-9_]{1,50}(\.[a-zA-Z_][a-zA-Z0-9_]{0,29}){1,10}#)\}\}")
BASIC = re.compile(r"\{\{([a-zA-Z_][a-zA-Z0-9_]{0,29}|#histories#|#query#|#context#)\}\}")
print("---")
print("workflow形式をLLMノードが拾う:", [m.group(1) for m in WF.finditer(to_dify(template, "workflow", "1711528914102"))])
print("{{faq}}形式をLLMノードが拾う:", [m.group(1) for m in WF.finditer(to_dify(template, "basic"))])
print("{{faq}}形式を簡易UIが拾う:", BASIC.findall(to_dify(template, "basic")))
実行結果です(Python 3.9.6)。
<faq>
{{#1711528914102.faq#}}
</faq>
質問: {{#1711528914102.question#}}
---
<faq>
{{faq}}
</faq>
質問: {{question}}
---
workflow形式をLLMノードが拾う: ['#1711528914102.faq#', '#1711528914102.question#']
{{faq}}形式をLLMノードが拾う: []
{{faq}}形式を簡易UIが拾う: ['faq', 'question']
{{faq}}形式はワークフローのLLMノードの正規表現に1件も一致していません。この形のまま貼ると、エラーは出ずに文字列としてClaudeへ届くため、回答が資料を無視しているように見えて原因に気づきにくくなります。ループや条件分岐が要る組み立ては、LLMノードをJinja2モード(edition_type: "jinja2")に切り替えると、通常の変数置換とは別系統で処理できます。
AnthropicプラグインでClaude 5.5を選ぶときの設定
DifyからClaudeを呼ぶには公式のAnthropicモデルプラグインを入れます。2026年11月1日時点でプラグインは0.3.39で、claude-opus-5-5、claude-sonnet-5-5(10月26日追加)、claude-haiku-5-5、claude-fable-5-1が選べます。Dify本体の最新は10月23日公開の1.18.0です。
claude-sonnet-5-5の定義では、思考(Adaptive Thinking)のスイッチを切ると、プラグインはthinking.type=between_toolsを送ります(このモデルはdisabledを400で拒否するため)。応答前の思考を無効にした状態でeffortにxhighやmaxを選ぶと、プラグインがhighへ丸めます。max_tokensの既定は128000です。テンプレートを試すモデルと本番のモデルを揃えておかないと、思考の有無で出力の長さと形が変わります。プラグインが入らないときはDifyのプラグインがインストールできない原因と対処法|bad signature・依存エラー・容量【1.17.1対応】で切り分けてください。
テンプレートの品質評価の進め方
Consoleのevalsが無くなった今、テンプレートの良し悪しは自分で測る必要があります。Anthropicの評価設計のドキュメントは、先に成功基準を決め、それを測る評価を作る順番を示しています。
評価用入力セットと採点方法の事前設計
公式の設計原則は3つあります。例外ケースも含めて実際の入力の分布に近いケースを集めること、多肢選択・文字列一致・コード判定・LLM判定のように自動で採点できる形にすること、そして人手で丁寧に採点した少数より、自動採点できる多数のケースを優先することです。採点の手段は3種類で、コードでの判定が最も速く確実です。LLMによる判定は速く柔軟ですが、先に信頼性を確かめてから件数を増やします。人手の判定は柔軟で品質が高い一方、遅く高コストなので、公式は可能なら避けるよう勧めています。LLMに採点させる場合は、採点基準(ルーブリック)を具体的に書き、思考を有効にした採点モデルに理由を考えさせてから点数を出させます。
前掲の問い合わせテンプレートなら、FAQにある質問・無い質問・言い回しを変えた質問を混ぜて数十件用意し、「FAQに無い質問で定型文を返したか」は文字列一致、「引用がFAQ本文と一字一句一致しているか」はコード、「回答が引用の範囲を出ていないか」はLLM判定で測れます。指標とデータセットの組み方の全体像はLLM評価とは?指標・データセット設計・評価ツールの選び方を実装視点で解説【2026年版】を参照してください。
Difyでの比較と本番ログの見方
Difyには、テンプレートを公開前と公開後で確かめる機能があります。テキストジェネレーターのプレビューでは「Debug as Multiple Models」で最大4モデルを同時に走らせ、同じ入力に対する出力を並べて比べられます。ワークフローは実行履歴の「Tracing」でノードごとの入出力と所要時間を追え、ノード単体の直近の実行は「Last run」で確認できます。
公開後はLogsで、利用者の高評価・低評価(User Rate)と、チームの評価(Op. Rate)が会話ごとに集計されます。チャットフローとワークフローでは、エディタのPreviewやTest Runの実行はログに入らないので、公開前の試験結果は別に記録しておきます。件数が増えたら、DifyのLangfuseやOpikとの連携でトレースを外に出し、評価を回すのが現実的です。Langfuseの導入はLangfuseとは?読み方・機能・使い方とLangSmithとの違い【v4対応・2026年10月】で説明しています。
テンプレート化を見送るべき場面
テンプレート化の価値は、同じ形の入力が繰り返し来るときに生まれます。要件定義のヒアリングのように前の回答で次の質問が変わる作業では、質問順を固定した単発テンプレートだけで全工程を回す設計は避けます。役割や確認項目のような共通部分をテンプレートにし、次の質問は会話履歴から組み立てます。各変数の入力元と必須条件を定義できない段階なら、固定テンプレートの本番導入は見送り、数回の運用で毎回来る入力を見極めてから固めます。逆に、問い合わせの一次回答、定型フォーマットへの要約、レビュー観点の適用のように入力の枠が決まっている仕事は、テンプレート化と評価の効果がそのまま出ます。どの業務から手を付けるかの選定から相談したい場合は、生成AI導入支援で業務の棚卸しから支援しています。
なお、開発作業の指示をテンプレート化したいだけなら、Claude Codeのカスタムコマンドやスキルが受け皿になります。書き方はClaude Codeのカスタムコマンドの作り方|スラッシュコマンド自作とSkills統合後の書き方・引数【2026年10月】を参照してください。
よくある質問
Claudeのプロンプトジェネレーターはまだ使えますか?
Consoleのプロンプトジェネレーターと実験的なprompt tools APIは、2026年8月17日の旧Workbench終了とともに使えなくなりました。旧ドキュメントのURLはPrompting best practicesへ転送されます。公式の代わりの導線は、Claude Cookbookのmetaprompt notebookです。
Anthropic Workbenchはどこにありますか?
Workbenchは2026年8月18日に「playground」へ改称され、Claude Consoleのplatform.claude.com/playgroundで開きます。playgroundはプロンプトの保存・バージョン・評価・共有に対応しておらず、旧Workbenchに保存していたデータは引き継がれません。テンプレートはGitで管理するファイルかDifyのようなアプリ基盤に置きます。
Claudeのテンプレート変数は{{}}と{$}のどちらで書けばよいですか?
Claude APIは変数を置換しないので、どちらで書いても送る前に自分のコードで埋めます。公式のプロンプト例は{{ANNUAL_REPORT}}のような二重波括弧、metapromptは{$NAME}です。置換する仕組み(自作スクリプトかDifyか)の記法に合わせて1つに決めてください。
Difyに貼ったテンプレートで変数が置換されないのはなぜですか?
ワークフローとチャットフローのLLMノードは、通常モードでは{{#ノードID.変数名#}}形式しか置換せず、{$FAQ}や{{faq}}は文字列のままClaudeへ届きます。プロンプト欄で「/」か「{」を押して変数を挿入し直すか、前掲のスクリプトで変換してください。
Difyでプロンプトの品質を評価するにはどうしますか?
公開前はテキストジェネレーターの「Debug as Multiple Models」やワークフローのTracingで出力を比べ、公開後はLogsのUser Rate・Op. Rateを見ます。そのうえで実際の入力に近い評価ケースを数十件用意し、文字列一致やLLM判定で自動採点できる形にしておくと、テンプレートを直すたびに同じ基準で比べられます。