システムプロンプトとは
System Prompt
会話の冒頭でLLMに与える、応答全体の振る舞いや役割を規定する特別な指示
ひとことで言うと
会話の最初にAIへ渡す、AIの振る舞い方を決める指示文。
概要
システムプロンプトとは、チャット形式のLLMに対して、会話の冒頭で与えるモデルの役割・振る舞い・制約などを規定する特別な指示。 ユーザーが入力する通常のメッセージ(ユーザープロンプト)とは区別して扱われ、多くの実装ではユーザーの指示よりも優先度が高く設定される。 口調やペルソナの指定、回答してはいけない話題の制限、出力フォーマットの指定など、対話全体を通じて一貫させたい振る舞いを定義するために使われる。 強力な指示であっても絶対的な制約ではなく、巧妙なユーザー入力によってシステムプロンプトの制約を回避しようとするプロンプトインジェクションのリスクも存在する。 APIを使ったアプリケーション開発では、システムプロンプトの内容がそのままサービスの挙動設計に直結するため、詳細な指示を作り込んで製品ごとの人格や制約を定義することが多い。
背景
チャット形式のLLMアプリケーションでは、ユーザーが入力する内容によらず一貫した振る舞いや制約をモデルに守らせる必要がある。 この要件に応えるため、通常の対話メッセージとは別に、開発者が設定する特別な役割の指示としてシステムプロンプトが導入された。
歴史
2023年3月: OpenAIがChat Completions APIを公開し、system/user/assistantという役割ごとにメッセージを分けるチャット形式を導入。 このsystemロールが、現在のシステムプロンプトという概念の起点となった。
アーキテクチャ
チャットAPIでは、メッセージ列が役割(system/user/assistant等)ごとにラベル付けされ、システムロールのメッセージが会話の先頭に配置される。 モデルはこの構造を指示追従の訓練(instruction tuning)を通じて認識しており、システムロールの内容を他のメッセージより優先して扱うよう調整されている。
ワークフロー
開発者がアプリケーションの目的に応じてシステムプロンプトの文面を設計 → APIリクエストのメッセージ列先頭にsystemロールとして配置 → ユーザーメッセージを後続で送信 → モデルがシステムプロンプトを優先しつつ応答を生成。
コード例
システムプロンプトを指定してチャットAPIを呼び出す
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "あなたは丁寧な日本語で回答するカスタマーサポート担当です。"},
{"role": "user", "content": "注文をキャンセルしたいです。"},
],
)
print(response.choices[0].message.content)利点
- アプリケーション全体で一貫したモデルの振る舞いを設定できる
- ユーザーの入力によらず、開発者が意図した制約や役割を保ちやすい
- ペルソナ・口調・出力フォーマットなどをコードを変更せず文面だけで調整できる
欠点
- 巧妙なユーザー入力によって指示が無視・上書きされてしまう場合がある(プロンプトインジェクション)
- モデルやAPIによってシステムプロンプトの優先度・扱いが異なり、移植性は低くなりやすい
- 長大なシステムプロンプトはコンテキストウィンドウを消費し、トークンコストを増加させる
比較
- プロンプト — システムプロンプトは、プロンプト全体のうちモデルの振る舞いを規定する特別な部分
- プロンプトエンジニアリング — システムプロンプトの設計は、プロンプトエンジニアリングの重要な対象の1つ
- プロンプトインジェクション — プロンプトインジェクションは、システムプロンプトによる制約を回避・上書きしようとする攻撃としてよく用いられる
関連用語
よくある質問
システムプロンプトは絶対に守られる?
いいえ。 優先度は高く設定されるが、悪意あるユーザー入力によって無視・上書きされる「プロンプトインジェクション」のリスクがあり、完全な強制力は保証されない。
システムプロンプトの内容はユーザーから見える?
通常はユーザーに表示されないが、絶対に秘匿できるわけではない。 巧妙な質問によってシステムプロンプトの内容を引き出させる「プロンプトリーク」が試みられることもあり、機密情報を含めないよう設計するのが望ましい。
参考文献
- DocumentationOpenAI Model Spec