プロンプトは依頼書です。モデルはあなたが書いたものしか読まないので、モデルに必要な事実も、あなたの好みも、すべてそこに書かれていなければなりません。答えがありきたりなものになったとき、その原因はほぼ必ず、プロンプトの書き方がまずかったことではなく、プロンプトに書かれていなかったことにあります。
役に立つプロンプトの多くは、同じ6つの要素でできています。下のブロックには6つすべてが入っています。要素をオフにしてそれがない場合のプロンプトを確かめ、自分の使う言語を入れてから、ChatGPT や Claude で開いて比べてみてください。
age = 30
print("Age: " + age)エラー:TypeError: can only concatenate str (not "int") to str意味:+ は2つの文字列をつなげることも、2つの数を足すこともできますが、文字列と数をつなげることはできません。Python はどちらのつもりかを推測しないので、そこで止まります。
原因:"Age: " は文字列で、age には数の 30 が入っています。この行は、その2つを + でくっつけるよう Python に頼んでいます。
直したコード:先に str() で数を文字列に変えます。
age = 30
print("Age: " + str(age))
これで Age: 30 と表示されます。
6つの要素
役割は、誰の視点と判断で答えるかをモデルに伝えます。「初心者向けの辛抱強い講師」と「本番コードをレビューするシニアエンジニア」では、同じ質問にまったく違う答えが返ります。役割が特に役立つのは、それが読み手と基準を暗に示すときです。効く場面と効かない場面はロールプロンプティングを参照してください。
タスクは、何をするかを述べる1文です。動詞から始めます。説明する、書き直す、比較する、列挙する、直す、要約する。タスクを1文で書けないなら、そのプロンプトにはおそらくタスクが2つ入っていて、たいていどちらか一方の答えが薄くなります。
コンテキストは、モデルが推測できないすべてのことです。あなたが誰か、すでに何を知っているか、結果を何に使うか、すでに何を試したか。例の中では「クラスと例外はまだ習っていません」という一文が、モデルが try と except を使って答えるのを防いでいます。
入力は作業の素材です。コード、メール、表、エラー。丸ごと貼り付けてください。コードの要約は「そのコードが何をしていると自分が思っているか」の説明にすぎず、バグはたいていその2つのすき間に潜んでいます。
形式は、答えの見た目を指定します。リスト、表、見出し付きの3パート、JSON、1行だけ。指定がないとモデルが形を選び、チャットモデルは長いものを選びがちです。答えをプログラムが読む場合は、構造化出力でさらに踏み込めます。
制約は守るべき範囲です。長さ、使う語彙、避けること、変えてはいけないこと。「短く」という形容詞より「200字以内」という数字のほうがよく効きます。「短い」の意味は読み手によって違い、モデルもその読み手の1人だからです。
あいまいなプロンプトと具体的なプロンプト
同じ依頼を2通りに書いてみました。タブを切り替えて返答を比べてください。
Python で書いたシンプルな並べ替え関数です:
def sort_list(items):
return sorted(items)
sort_list([3, 1, 2]) のように呼び出すと [1, 2, 3] が返ります。
あいまいなプロンプトは、誰も聞いていない質問への正しい答えを受け取りました。言語、データ、並び順、入力を書き換えてよいかをモデルは推測するしかなく、毎回いちばんよくあるケースを選びました。具体的なプロンプトは4つすべてに先に答えていたので、推測する余地が残っていませんでした。
プロンプトを良くするコツ
- タスクは早めに書き、長い素材のあとでもう一度書く。 短いプロンプトならタスクを先頭に置くと、続く背景情報が目的を持って読まれます。長い文書を貼り付けるときは、文書を先に置いて質問を最後に書き、重要な制約もそこで繰り返します。そうすると、モデルが書きはじめる位置のすぐ近くに指示が来ます。
- 避けることだけでなく、することを書く。 「12歳にもわかるやさしい日本語で書いて」はモデルに目標を与えます。「専門的すぎないように」は1つの方向を禁じるだけで、残りは開いたままです。
- 指示と素材を分ける。 メールやファイルを貼り付けるときは、どこから始まりどこで終わるかを示し、中の一文をモデルが指示と取り違えないようにします。方法は区切り文字と XML タグで扱っています。
- 形式が特殊なら出力の例を1つ見せる。 形を段落で説明するより、例を見せるほうが早く伝わります。これが Few-shot プロンプティングです。
- チャットの中ではなく、プロンプトそのものを直す。 最初の答えが違っていたら、足りないコンテキストや制約を見つけてプロンプトを直し、もう一度実行します。修正のやりとりを重ねても結果は出ますが、手元に残るのは結果だけで、再利用できるプロンプトは残りません。
送信前のチェックリスト
- 動詞で始まる1文でタスクを言えるか?
- 初対面の人が読んでも、答えが誰向けか、私がすでに何を知っているかがわかるか?
- 素材の説明ではなく、実物を貼り付けたか?
- 答えの長さと形を指定したか?
- 答えが変えてはいけないもの、使ってはいけないものはあるか?
5つすべてに「はい」と答えられても完璧な返答が保証されるわけではありませんが、「いいえ」があれば、それが悪い返答のいちばんありがちな原因です。
よくある質問
良い AI プロンプトの条件は何ですか?
良いプロンプトは、タスクを1文で明確に述べ、モデルが推測できないコンテキスト(あなたが誰か、すでに何を知っているか、結果を何に使うか)を伝え、作業の素材を含め、答えの形(長さ、構成、トーン)を指定しています。弱いプロンプトの多くは、言い回しではなくコンテキストと形式でつまずいています。
プロンプトはどれくらいの長さにすべきですか?
仕事に必要なだけの長さで、それ以上は不要です。1行で答えられる質問なら1行で十分です。特定の読み手、入力、出力の形があるタスクなら、たいてい4〜8文になります。同じ指示を3回言い直すだけの長さは役に立ちませんが、足りないコンテキストを補う長さは役に立ちます。
ChatGPT や Claude には丁寧に話しかけるべきですか?
丁寧な言葉づかいは、良くも悪くもあまり影響しません。答えを変えるのは情報です。目的、読み手、制約、そして欲しい出力の例です。あなたのプロジェクトを見たことのない有能な同僚に仕事を頼むつもりで書いてください。
プロンプトを書くためのテンプレート(型)はありますか?
安定して使える順番は、役割、タスク、コンテキスト、入力、形式、制約です。すべてのプロンプトに6つとも必要なわけではありません。まずタスクを書き、モデルが推測できないコンテキストを足し、最初の答えが長すぎる、あいまいすぎる、形が違うといったときに形式と制約を加えます。穴埋め式の再利用できる版はプロンプトテンプレートを参照してください。
同じプロンプトなのに毎回違う答えが返るのはなぜですか?
チャットモデルは次の単語を確率分布からサンプリングして選ぶため、2回の実行で結果が変わることがあります。プロンプトを具体的にすると良い答えの幅が狭まり、実行ごとの差が小さくなります。サンプリングのランダムさは temperature という設定で調整します。