プロンプトテンプレートとは、空欄のあるプロンプトです。固定部分には、ある種類のタスクで良い答えを得るためにわかったことがすべて入っています。役割、形式、制約です。空欄には毎回変わるものが入ります。トピック、言語、作業対象のテキストです。空欄を3つ埋めるほうがプロンプトを書くより早く、答えの質と形もそろいます。
下のテンプレートは、どんなプログラミングの概念でもあなたのレベルに合わせて説明します。入力欄に自分の値を入れ、パートをオフにしてそれぞれが何を担っているかを確かめてから、コピーするかチャットアプリで開いてください。
考え方:クロージャとは、外側の関数の実行が終わったあとでも、自分が作られた場所の変数を覚えている関数のことです。
例:
function makeCounter() {
let count = 0;
return function () {
count += 1; // still sees count from makeCounter
return count;
};
}
const next = makeCounter();
console.log(next()); // 1
console.log(next()); // 2
よくある間違い:2つのカウンターが1つの合計を共有すると思いこむこと。makeCounter() を呼ぶたびに新しい count が作られるので、カウンターはそれぞれ自分の値を持ちます。
良いテンプレートの条件
テンプレートの質は元になったプロンプトの質で決まるので、固定部分は、すでに実行して満足したプロンプトにしてください。役に立つテンプレートと、平凡な答えを早く出すだけのフォームを分けるのは、3つの選択です。
変わるところだけを空欄にする。 答えを常に300字以内にしたいなら、300 を固定部分に書いてください。空欄の1つ1つは、使うたびにもう一度決めなければならない判断です。空欄が10個あるテンプレートは、プロンプトを新しく書くより埋めるのに時間がかかります。
すべての空欄にわかりやすい名前と妥当なデフォルトを付ける。 {{既に知っていること}} なら何を入力すればよいかがわかりますが、{{x}} ではわかりません。デフォルトは期待される値の種類を示し、何も入力せずに一度テンプレートを実行することもできます。
1つの仕事に1つのテンプレート。 空欄しだいで概念の説明も、コードレビューも、クイズの作成もするテンプレートは、3つの別々のテンプレートより3つともうまくできません。固定部分が具体的なほど、形式と基準について多くを語れます。
プロンプトの書き方の6つの要素は、固定部分のチェックリストとして役立ちます。役割、タスク、コンテキスト、入力、形式、制約。空欄はたいていタスク、コンテキスト、入力の中に入ります。
プロンプトテンプレートの例
次の3つは、よくある日常の仕事をカバーしています。それぞれに埋める名前付きの欄があります。すぐ使えるプロンプトをもっと見たいなら、プロンプト例を参照してください。
def median(numbers: list[float]) -> float:
if not numbers:
raise ValueError("median() needs at least one number")
ordered = sorted(numbers)
middle = len(ordered) // 2
if len(ordered) % 2 == 1:
return ordered[middle]
return (ordered[middle - 1] + ordered[middle]) / 2
# median([3, 1, 2]) returns 2
# median([4, 1, 3, 2]) returns 2.5
# median([]) raises ValueError
お声がけいただきありがとうございます。思い出していただけてうれしいです!あいにく14日は都合がつきません。代わりに来月の日程ではいかがでしょうか。そのときはぜひプロジェクトについてお話しさせてください。
よろしくお願いします。 [あなたの名前]
貼り付けた文章をタグで囲んでいるのには理由があります。埋めたテキストに指示のように見える文が含まれていることがあり、区切り文字があれば、モデルがテンプレートの指示と作業対象の素材を取り違えずに済みます。
自分用のテンプレートの作り方
- うまくいったプロンプトから始める。答えが正しく出た会話を選び、プロンプトの最終版を集めます。フォローアップのメッセージで足さなければならなかった修正も含めてください。その修正こそが最も価値のある部分で、最初の版が間違えたことを直しているからです。
- 次に変わるところに印を付ける。プロンプトを読み、次に使うときに書き換える言葉すべてに下線を引きます。たいていは2〜4か所です。主題、読み手、長さ、貼り付ける入力などです。
- それぞれを名前付きの空欄に置き換える。空欄は使うツールが期待する形で書きます。手で貼り付けるプロンプトなら
[読み手]、コードなら{audience}のようにします。 - 3通りの埋め方で試す。典型的なケースを1つ、とても短いかとても長い入力を1つ、珍しいケースを1つ使います。どれかが失敗するなら、固定部分がまだ最初の使い方について何かを前提にしています。プロンプトの反復改善で説明しているように、一度に1文ずつ変えてください。
- 見つけられる場所に保存する。メモのファイル、テキスト展開ツール、スニペット管理ツールなど、どれでもかまいません。探さないと見つからないテンプレートは、そのうち使われなくなります。
コードの中のテンプレート
プログラムの中では、テンプレートは名前付きのフィールドを持つ文字列です。Python の str.format() でそれを埋めます。
SUMMARY_TEMPLATE = """Summarize the text inside the <text> tags for {audience}.
Use at most {bullets} bullet points and lead with any action the reader must take.
<text>
{text}
</text>"""
with open("notes.txt", encoding="utf-8") as f:
meeting_notes = f.read()
prompt = SUMMARY_TEMPLATE.format(
audience="a manager who has two minutes",
bullets=3,
text=meeting_notes,
)
str.format() では、テンプレート内のそのまま出したい波括弧をすべて2つ重ねる({{ と }})必要があり、テンプレートに JSON の例を含めるときに問題になります。meeting_notes の中のコードのように、渡す値の中の波括弧はエスケープ不要です。AI アプリを作るためのライブラリには独自のテンプレートクラスを持つものもありますが、やっていることは、フォーマット文字列にいくつかの機能を足したものと同じです。
値がユーザーから来る場合、テンプレートはその人のテキストをモデルに送ることを忘れないでください。区切り文字の中に入れ、悪意のある入力に悪用されうるツールやデータをモデルに与えないでください。
テンプレートかシステムプロンプトか
テンプレートとシステムプロンプトは、別々の問題を解決します。システムプロンプトには、会話やアプリのすべてのメッセージに適用されるルールを入れます。ペルソナ、トーン、アシスタントが絶対にしてはいけないことなどです。テンプレートには、空欄のある1つのタスクを入れます。アプリではよく両方を使います。基本ルールを決める固定のシステムプロンプトと、各ユーザーメッセージを組み立てるテンプレートです。
よくある質問
プロンプトテンプレートとは何ですか?
プロンプトテンプレートとは、使うたびに変わる部分を [トピック] や {language} のようなプレースホルダーにした、再利用できるプロンプトです。固定部分にはすでに試した指示が入っていて、毎回ゼロからプロンプトを書く代わりに空欄を埋めて使います。
自分用のプロンプトテンプレートはどう作ればいいですか?
すでに良い答えが得られたプロンプトから始めます。次に使うときに変える言葉に印を付け、それぞれを名前付きの空欄に置き換え、珍しいケースを1つ含む3通りの埋め方でテンプレートを試します。最初の答えを良くした指示は、そのまま残してください。
プロンプトテンプレートはどこに保存すればいいですか?
すぐにコピーできる場所ならどこでもかまいません。メモのファイル、テキスト展開ツール、スニペット管理ツールなどです。チャットアプリにも、カスタム指示やプロジェクトの指示のように繰り返し使うテキストを置く場所がありますが、そこは空欄のある1回きりのタスクより、すべてのメッセージに適用されるルールに向いています。
Python でプロンプトテンプレートを使うには?
テンプレートを名前付きのフィールドを持つ文字列として保存し、str.format() や f 文字列で埋めます。str.format() では、テンプレートに JSON の例を含める場合のように、そのまま出したい波括弧は2つ重ねて({{ と }})書きます。ユーザーが入力したテキストは、指示と分かれるよう区切り文字の中に入れてください。