システムプロンプトとは、会話が始まる前に AI モデルが受け取る指示のまとまりで、そのあとのすべてのメッセージに適用されます。モデルの役割、読み手、ルール、答えのデフォルトの形式を決めるので、メッセージのたびに繰り返す必要がありません。プロンプトを書くのはユーザーで、システムプロンプトはそのすべてに対するモデルの答え方を形づくります。
どのチャットアプリもすでにシステムプロンプトを使っています。ChatGPT、Claude、Gemini を開いたとき、モデルはすでに提供元の企業からの指示を持っていますが、チャット画面にはそれが表示されません。開発者がモデルの上にアプリを作るとき、汎用のモデルをプログラミング講師やサポートアシスタント、コミットメッセージの作成係に変えるのがシステムプロンプトです。
システムプロンプトの役割
チャットにおけるモデルの入力には構造があります。最初にシステムプロンプトがあり、そのあとにユーザーとアシスタントのメッセージが交互に並ぶ会話が続きます。システムプロンプトはやりとり全体の上に置かれるので、チャットがどれだけ長くなっても、返答のたびにモデルの目の前にあります。
この位置にあるので、常に守られるべきことを置く場所として適しています。モデルが誰に向けて話しているか、何をしてよくて何をしてはいけないか、答えはデフォルトでどんな形にすべきか。また、両者が矛盾したとき、モデルはユーザーメッセージよりシステムプロンプトを重く扱うよう学習されています。ただしそれは傾向であって、鍵ではありません。しつこいユーザーはときにモデルをシステムプロンプトから引き離せるので、システムプロンプトを唯一の安全策にしてはいけません。
システムプロンプトとユーザーメッセージ
| システムプロンプト | ユーザーメッセージ | |
|---|---|---|
| 誰が書くか | 開発者、またはアプリの設定で自分が | 自分がチャット欄に |
| 範囲 | 会話全体 | 1つの依頼 |
| よくある内容 | 役割、読み手、ルール、事実、デフォルトの形式 | タスクとその素材 |
| 変わる頻度 | まれ | 毎ターン |
| 矛盾したときの重み | たいてい高い | たいてい低い |
便利な見分け方があります。ある文がチャットのすべてのメッセージに当てはまるなら、それはシステムプロンプトに属します。今回の依頼についての文なら、ユーザーメッセージに属します。「200字以内で答えて」はどちらにも置けますが、「下のメールを要約して」は必ずユーザーメッセージです。
システムプロンプトを設定する場所
API では、システムプロンプトは独立した入力です。OpenAI の Python ライブラリでは、リストの最初のメッセージにロール system を付けて渡します。OpenAI のドキュメントでは、新しいモデルでの同じ種類の指示を developer メッセージとも呼んでいます。
from openai import OpenAI
client = OpenAI()
MODEL = "your-model-id" # e.g. from your provider's model list
response = client.chat.completions.create(
model=MODEL,
messages=[
{"role": "system", "content": "You are a patient Python tutor. Give hints, not full solutions."},
{"role": "user", "content": "Why does my loop stop at 9?"},
],
)
print(response.choices[0].message.content)
Anthropic の Python ライブラリでは、トップレベルの system パラメータで渡し、messages のリストには会話だけを入れます。
import anthropic
client = anthropic.Anthropic()
MODEL = "your-model-id" # e.g. from your provider's model list
message = client.messages.create(
model=MODEL,
max_tokens=500,
system="You are a patient Python tutor. Give hints, not full solutions.",
messages=[{"role": "user", "content": "Why does my loop stop at 9?"}],
)
print(message.content[0].text)
Google の Gemini API ではシステム指示(system instruction)と呼ばれます。名前は違っても考え方は同じです。
チャットアプリでは、生の system フィールドは使えません。アプリがすでに自分のものを持っているからです。代わりに、アプリがあなたの代わりに組み込んでくれる常設の指示を書き足す場所があります。ChatGPT ではカスタム指示、プロジェクトの指示、カスタム GPT の指示です。Claude ではプロジェクトの指示とプロフィールの設定です。Gemini では Gem の指示です。各アプリがあなたの文章を自社の指示とどう組み合わせているかは完全には公開されていませんが、実際にはアプリと共有するシステムプロンプトのようにふるまいます。
システムプロンプトに書くこと
- 役割と読み手。 「あなたはプログラミングを始めて1か月目の学生を教える講師です」と書けば、すべての答えの語彙とレベルが決まります。役割で何が変わり何が変わらないかはロールプロンプティングで扱っています。
- 毎ターン守るルール。 モデルが必ずすること、絶対にしないこと。完全な解答ではなくヒントを出す、製品についての質問だけに答える、ユーザーの言語で返答する、などです。
- わからないときにどうするか。 「下の事実に答えがなければ、わからないと言ってください」は、漠然とした「正確に答えて」よりも、でっち上げの答えを防ぐ効果があります。
- モデルに必要な事実。 製品の詳細、ポリシー、今日の日付、ユーザーのプラン。モデルは学習データからあなたのアプリについての質問には答えられません。
- デフォルトの形式。 長さ、構成、コードブロックを使うかどうか。出力をプログラムが読むなら正確な形を示してください。構造化出力を参照してください。
書かないほうがいいこと
秘密の情報。 システムプロンプトは非公開ではありません。ユーザーはモデルに指示を繰り返すよう頼んだり、だましてそうさせたりでき、モデルは確実には断りません。API キー、パスワード、公開されたら困るものはここに書いてはいけません。システムプロンプトは、いつかユーザーが読むかもしれない文章として扱ってください。指示がどう上書きされるかはプロンプトインジェクションを参照してください。
1通分のタスク。 システムプロンプトに「この記事を要約して」と書いてしまうと、チャットの2通目のメッセージには行き場がありません。
重複したルールの山。 別々の時期に書いた20個のルールは互いに矛盾しがちで、モデルはどれを優先するか推測するしかありません。ルールをまとめ、重複を削り、2つがぶつかりうるときは優先順位を書いてください。
水増し。 システムプロンプトはリクエストのたびに送り直され、モデルのコンテキストウィンドウを消費します。不要な段落は、毎ターンそのコストを払うことになります。
システムプロンプトの例
1つ目の例は製品のアシスタントです。システムプロンプトで範囲と長さ、答えられない質問へのルールを決め、モデルに必要な事実も渡しています。タブを切り替えて別のメッセージを送ってみてください。同じシステムプロンプトが3つの返答すべてを形づくっています。
取引一覧からその買い物を開き、分割をタップします。次に食料品と日用品の2つのカテゴリを選び、それぞれの金額を入力してください。
2つ目の例は、チャットアプリのカスタム指示やプロジェクトの指示に書くような文章です。あなた自身と、どんな答えが欲しいかを説明しているので、すべてのチャットがそこから始まります。
import { readFile } from "node:fs/promises";
const config = JSON.parse(await readFile("config.json", "utf8"));
エンコーディングを渡すと readFile は文字列を返し、それを JSON.parse がオブジェクトに変換します。トップレベルの await は ES モジュール(package.json に "type": "module" がある、または .mts ファイル)でしか動かないので、それ以外では async 関数で包んでください。ファイルが存在しない、または壊れている可能性があるなら try/catch を追加してください。
システムプロンプトがなければ、「JSON ファイルはどうやって読み込みますか?」のような短い質問では言語をモデルが推測するしかなく、返答は Python や素の JavaScript で書かれ、JSON とは何かという段落まで付いてくることがよくあります。システムプロンプトがあれば、返答は正しい言語とランタイムを選び、基本の説明を省き、頼んだ形に従います。
同じ構成は、どんなアシスタントを作るときにも使えます。誰のためのものか、ルール、わからないときにどうするか、必要な事実、答えの形式。一度書いたら、ふつうの質問、範囲外の質問、ルールを破らせようとする質問の3つで試し、3つの返答がすべて望みどおりになるまで調整してください。
よくある質問
システムプロンプトとは何ですか?
システムプロンプトとは、会話が始まる前に AI モデルに与えられる指示のまとまりで、そのあとのすべてのメッセージに適用されます。たいていは役割、読み手、ルール、答えのデフォルトの形式を決めます。API では独立した system フィールドやメッセージになり、チャットアプリではカスタム指示やプロジェクトの指示が同じ役割を果たします。
システムプロンプトとユーザープロンプトの違いは何ですか?
システムプロンプトは会話全体に対する常設の指示で、ふつうは開発者が書くか、設定で一度だけ決めます。ユーザープロンプトは1つのことを頼む1通のメッセージです。両者が矛盾したとき、モデルはシステムプロンプトを重く扱うように学習されていますが、これは傾向であって保証ではありません。
ChatGPT、Claude、Gemini でシステムプロンプトを設定できますか?
生の system フィールドは触れませんが、それに近いことはできます。ChatGPT にはカスタム指示、プロジェクトの指示、カスタム GPT の指示があります。Claude にはプロジェクトの指示とプロフィールの設定があります。Gemini には Gem の指示があります。アプリはそこに書いた内容を自社のシステム指示と組み合わせ、あなたのチャットに適用します。
ユーザーはシステムプロンプトを見たり引き出したりできますか?
多くの場合できます。ユーザーはモデルに指示を繰り返すよう頼んだり、だましてそうさせたりでき、モデルはそれを確実に秘密にはしておけません。パスワード、API キー、社外秘の情報をシステムプロンプトに入れてはいけませんし、システムプロンプトをセキュリティの境界として頼ってもいけません。
システムプロンプトはどれくらいの長さにすべきですか?
すべてのメッセージに当てはまることを書ききれる長さで、それ以上は不要です。個人用なら3〜4文で十分です。製品用のシステムプロンプトは、役割、ルール、事実、出力形式を含めて1ページほどになることがよくあります。すべての語がリクエストのたびに送られるので、毎回トークンのコストもかかります。