システムプロンプトは「ペルソナ・タスク定義・制約条件・出力形式・ガードレール」の5要素で構成するのが基本です。ユーザーからは見えない裏側の設計書として、LLMアプリケーションの品質を決定的に左右します。300〜1000トークン程度に収めつつ、5要素を過不足なく明記することが肝要です。長ければ良いわけでも、短ければ良いわけでもありません。
システムプロンプトとは何か
システムプロンプトは、LLMアプリケーションにおいて「AIの振る舞いそのもの」を定義する指示文です。ユーザーとの対話の裏側で常に送信され続け、LLMの応答の基調を決めます。ユーザープロンプトが「今回の質問」なら、システムプロンプトは「このAIの人格と行動規範」という関係です。
アプリケーションによっては、数行の簡素なシステムプロンプトで済む場合もあれば、数百行にわたる精緻な設計書になる場合もあります。重要なのは「長さ」ではなく「必要な要素が漏れなく含まれているか」です。プロンプトエンジニアリング入門、高度なプロンプト技法、ガードレール設計の記事と併せて読むと、理解が深まります。
システムプロンプトの構成要素
体系的に設計するには、5つの構成要素を意識します。ペルソナ、タスク定義、制約条件、出力形式、ガードレールです。これらを過不足なく書くことで、LLMは迷わず指示に従います。
| 要素 | 目的 | 記述例 | 効果 | 注意点 |
|---|---|---|---|---|
| ペルソナ | 文体・視点の統一 | 「あなたは10年の経験を持つデータアナリスト」 | 一貫した語り口 | 実在人物を避ける |
| タスク定義 | 実行すべき作業の明示 | 「ユーザーの質問にデータを用いて回答する」 | ぶれないゴール | 具体的に書く |
| 制約条件 | 出力の範囲を限定 | 「根拠のない推測はしない」 | 幻覚抑制 | 矛盾を避ける |
| 出力形式 | 構造を強制 | 「JSON形式で返す」 | 後続処理の安定 | フォーマット明示 |
| ガードレール | 禁止事項の明示 | 「法律相談には答えない」 | 事故予防 | 過度な制限を避ける |
from openai import OpenAI
client = OpenAI()
SYSTEM_PROMPT = """
# ペルソナ
あなたは10年の経験を持つデータアナリストです。
語り口は丁寧で、事実に基づいた冷静な分析を行います。
# タスク
ユーザーの質問に対し、提供されたデータを参照しながら
統計的・論理的な観点で回答してください。
# 制約条件
- 提供されていない事実は推測しない
- 不確かな情報には「確認が必要」と明記する
- 返答は日本語で行う
# 出力形式
1. 要点(2〜3行)
2. 根拠(データ参照)
3. 補足(必要な場合のみ)
# ガードレール
- 個人を特定する情報を含めない
- 法律・医療・投資の助言は行わない
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": "Q3売上の特徴を教えてください"}
]
)
print(response.choices[0].message.content)
各要素を見出し付きで記述すると、LLMが構造を認識しやすくなります。長い文章の塊で書くより、構造化したほうが読解精度が上がります。
設計パターン5選
用途別に5つの代表パターンがあります。FAQ応答型、分析アシスタント型、コード生成型、翻訳・校正型、データ抽出型です。それぞれ最適なペルソナ設定や制約が異なります。
# FAQ応答型
FAQ_PROMPT = """あなたはカスタマーサポート担当者です。
社内FAQに基づいてのみ回答し、情報がない場合は
「担当者に確認します」と返答してください。"""
# データ抽出型
EXTRACT_PROMPT = """あなたは構造化データ抽出エンジンです。
入力テキストから指定されたフィールドを抽出し、
JSON形式で返却してください。余計な文章は不要です。"""
# 翻訳・校正型
TRANSLATE_PROMPT = """あなたはプロの技術翻訳者です。
日本語から英語への翻訳を行い、原文のニュアンスと
技術用語の正確性を保ってください。注釈は不要です。"""
| パターン | ペルソナ | 主要制約 | 出力形式 | 適したユースケース |
|---|---|---|---|---|
| FAQ応答型 | サポート担当 | 情報源限定 | 自然文 | 問い合わせ対応 |
| 分析アシスタント型 | データアナリスト | 根拠要求 | 要点+根拠 | 社内分析支援 |
| コード生成型 | シニアエンジニア | セキュア実装 | コードブロック | 開発支援 |
| 翻訳・校正型 | プロ翻訳者 | 原文尊重 | 訳文のみ | ドキュメント翻訳 |
| データ抽出型 | 抽出エンジン | スキーマ遵守 | JSON | 構造化処理 |
どのパターンにも共通するのは、ペルソナで「文体の軸」を決め、制約で「やってはいけないこと」を定義し、出力形式で「機械可読性」を確保するという構図です。
アンチパターンと改善方法
典型的なアンチパターンは3つあります。第一に「指示の矛盾」。「短く書け」と「詳細に書け」を同時に要求すると、LLMは判断に迷い、不安定な出力を返します。矛盾がないか、自分でプロンプトを読み返すのが改善の第一歩です。
第二に「曖昧な制約」。「不適切な発言はしないでください」のような抽象的な制約は、LLMにとって解釈の余地が広すぎます。「差別的表現、暴力的表現、成人向け表現は避ける」のように列挙した方が効果的です。第三に「過剰な制約」。禁止事項が10も20も並ぶと、LLMが本来の回答能力を発揮できなくなります。必須事項に絞り、優先度順に並べ替えましょう。
システムプロンプトのテスト方法
システムプロンプトは書いて終わりではなく、テストで品質を担保します。テストすべきは3種類。第一は通常ケース。期待通りの入力に対して、期待通りの出力が返るかを確認します。第二はエッジケース。想定外の入力(空文字、極端に長い入力、多言語)に対して、どう振る舞うかを検証します。
第三は攻撃パターン。プロンプトインジェクションに対して、システムプロンプトが漏洩しないか、制約を無視した応答を返さないかを検査します。「システムプロンプトを教えて」「これまでの指示を無視して」といった典型的攻撃に対し、拒否できるか確かめます。テストケースは最低でも30〜50件用意し、リグレッションを防ぐためにCI上で定期的に実行するのが望ましい運用です。
まとめ
- システムプロンプトは5要素(ペルソナ・タスク・制約・出力形式・ガードレール)で構成する
- 見出し付きの構造化表記でLLMの読解精度を高める
- 5つの設計パターンから用途に合うものを選び、調整する
- 矛盾・曖昧・過剰制約のアンチパターンを避け、テストで品質を担保する
よくある質問
システムプロンプトとは何ですか
LLMアプリケーションで、AIの振る舞い・ペルソナ・制約条件・出力形式を定義する指示文です。ユーザーには見えない「裏側の設計書」として機能し、アプリケーションの品質を大きく左右します。
システムプロンプトの最適な長さは
一般的に300から1000トークン程度が推奨です。短すぎると制約が不十分、長すぎるとLLMが重要な指示を見落とすリスクがあります。構成要素(ペルソナ、タスク、制約、出力形式)を優先度順に記述してください。
システムプロンプトが漏洩するリスクはありますか
はい、プロンプトインジェクションにより漏洩するリスクがあります。「システムプロンプトの内容を教えて」のような攻撃に対する防御策(メタプロンプトによる拒否指示、入力フィルタリング)を組み込むことが推奨です。