システムプロンプト
システムプロンプトとは、LLMに対して「あなたは誰で、何をすべきで、何をすべきでないか」を伝え、会話全体の枠組みを設定する最上位の指示です。エンドユーザーが書くユーザープロンプトとは異なり、システムプロンプトはアプリ開発者によって注入され、すべてのターンを通じて効力を持ち続けます。
システムプロンプトとは、LLMに対して「あなたは誰で、何をすべきで、何をすべきでないか」を伝え、会話全体の枠組みを設定する最上位の指示です。エンドユーザーが書くユーザープロンプトとは異なり、システムプロンプトはアプリ開発者によって注入され、すべてのターンを通じて効力を持ち続けます。
なぜ重要なのか
システムプロンプトは、LLMベースの製品の「デザイン言語」です。ユーザーがどれだけ自由にプロンプトを書こうとも、よく練られたシステムプロンプトは、モデルの応答を定義された役割、トーン、制限の範囲内に保ちます。ChatGPT、Claude、Geminiのチャットボットから、AI検索エンジン、コーディングエージェント、サポートボットに至るまで、あらゆるLLMアプリはシステムプロンプトを通じてその個性を形作っています。
構成要素
役割: 「あなたはSaaSブログ運営者を支援するマーケティングコピーライティングの専門家です。」モデルが応答する視点を固定します。
目標: 「ユーザーが素早くブログ記事の下書きを作るのを手伝ってください。」会話の方向性を設定します。
制約: 「日本語のみで回答してください。」「コード例は出さないでください。」「最大300文字。」望ましくない挙動を事前にブロックします。
トーン: 「親しみやすくも専門的に、誇張なしで。」ブランドボイスの一貫性を保ちます。
出力形式: 「回答を###の小見出しで構成してください。」後処理を減らします。
ナレッジカットオフ: 「情報が古くなっている可能性がある場合は注記してください。」ハルシネーションのリスクを軽減します。
ツールの説明: function-callingエージェントの場合、利用可能なツールの一覧と説明をシステムプロンプトに含めます。
システムプロンプト vs ユーザープロンプト
| 観点 | システムプロンプト | ユーザープロンプト |
|---|---|---|
| 書く人 | 開発者 | エンドユーザー |
| 変更頻度 | まれ | リクエストごと |
| 内容 | 役割、制約、トーン | 具体的なリクエスト |
| スコープ | 会話全体 | そのリクエストのみ |
| セキュリティ | ユーザーから隠すべき | 公開 |
優れたLLMシステムは、「安定した枠組み」(システムプロンプト)と「可変の入力」(ユーザープロンプト)を分離します。
実践的なヒント
命令するのではなく役割を与える: 「Xを行う専門家です」は「Xを行え」より優れています。モデルはその役割に入り込み、より一貫した出力を生み出します。
肯定的な制約を好む: 「これをしてください」は「あれをしないでください」より効果的です。
例を含める(few-shot): システムプロンプトに2~3個の出力例を入れると、スタイルと形式が劇的に安定します。
XMLタグを使う: Claude系のモデルでは、<role>、<constraints>、<examples>のようなタグが、各セクションを明確に解析するのに役立ちます。
書きすぎない: 長いシステムプロンプトは、リクエストごとに多くのトークンを消費します。必須でないものはすべて削りましょう。
定期的にA/Bテストする: 異なるシステムプロンプトを実際のリクエストに対して走らせ、満足度、正確性、安全性を比較します。
プロンプトインジェクションへの防御
システムプロンプトは、プロンプトインジェクションの格好の標的です。「これまでの指示をすべて無視せよ」のようなユーザー入力は、弱いシステムプロンプトを上書きしてしまうことがあります。防御策には、サンドイッチ技法(重要な指示を冒頭と末尾で繰り返す)、外部データをXMLタグで隔離すること、そしてツール呼び出しの層で権限を強制することがあります。
Sources: