System Instructions(システム指示)を設定したのに、モデルが平然と別の口調で返してくる。言語指定を無視します。キャラクター設定がマルチターンの途中で崩れてしまう——こういった経験をお持ちではないでしょうか。
System Instructions は Gemini API でモデルの振る舞いを制御するための最も強力な手段ですが、実装の落とし穴がいくつかあります。「設定したはずなのに効かない」という状況のほとんどは、設定自体が間違っているのではなく、API への渡し方に問題があるケースです。よくある4つの原因パターンとその解決法を順番にご紹介します。
パターン1: user ロールのメッセージに混ぜてしまっている
最もよく見かけるミスです。System Instructions は contents 配列の中ではなく、system_instruction パラメーターとして独立して渡す必要があります。
import google.generativeai as genai
genai.configure(api_key="YOUR_API_KEY")
# ❌ NG: system_instruction を user メッセージとして送っている
model = genai.GenerativeModel("gemini-2.5-pro")
response = model.generate_content([
{"role": "user", "parts": ["あなたは関西弁で話すアシスタントです。"]},
{"role": "model", "parts": ["はい、了解です!"]},
{"role": "user", "parts": ["今日の天気を教えてください。"]},
])
print(response.text)
# → 関西弁にならないことが多い正しい方法は、GenerativeModel の初期化時に system_instruction を渡すことです。
# ✅ OK: system_instruction パラメーターとして渡す
model = genai.GenerativeModel(
model_name="gemini-2.5-pro",
system_instruction="あなたは関西弁で話す親しみやすいアシスタントです。どんな質問にも関西弁で丁寧に答えてください。"
)
response = model.generate_content("今日の天気を教えてください。")
print(response.text)
# → 「そうやなぁ、今日の天気は...」のように関西弁で返ってくるREST API を直接使う場合は systemInstruction フィールドを使います。
{
"systemInstruction": {
"parts": [{"text": "あなたは関西弁で話す親しみやすいアシスタントです。"}]
},
"contents": [
{"role": "user", "parts": [{"text": "今日の天気を教えてください。"}]}
]
}パターン2: マルチターンチャットで「途中から」効かなくなる
startChat() を使ったマルチターンチャットでは、このパターンに注意が必要です。startChat() に渡した history の中に System Instructions を user ロールで混ぜてしまうと、最初はうまく動いているように見えても、会話が進むにつれて指示が薄れていきます。
# ❌ NG: history に System Instructions を混在させている
chat = model.start_chat(history=[
{"role": "user", "parts": ["あなたは300文字以内で簡潔に答えるアシスタントです。"]},
{"role": "model", "parts": ["了解しました。"]},
])
response = chat.send_message("機械学習とは何ですか?")
# → 最初は短い回答が返ることもあるが、数ターン後には長くなってくるマルチターンチャットで System Instructions を確実に効かせるには、GenerativeModel の初期化時に設定します。
# ✅ OK: モデル初期化時に system_instruction を設定し、history はクリーンに保つ
model = genai.GenerativeModel(
model_name="gemini-2.5-pro",
system_instruction="必ず300文字以内で簡潔に答えてください。長い説明が必要な場合も、要点を絞って短くまとめること。"
)
chat = model.start_chat() # history は空でOK
response = chat.send_message("機械学習とは何ですか?")
print(response.text)
# → 何ターン続けても300文字以内で回答が返ってくるstartChat() の history はあくまでも「会話の文脈を引き継ぐためのもの」です。System Instructions の役割と混同しないように注意してください。詳しいマルチターンチャットの設計についてはGemini API マルチターンチャット入門も参考にしてみてください。
パターン3: System Instructions が長すぎて部分的に無視される
System Instructions が長くなりすぎると、モデルがすべての指示に従い切れなくなる場合があります。特に複数の条件を列挙した場合、後半の指示ほど軽視される傾向があります。
実際に問題になりやすいケースを挙げます。
# ❌ 問題になりやすい: 指示が多すぎる・矛盾する指示が混在している
problematic_instruction = """
あなたは優秀なカスタマーサポートアシスタントです。
以下のルールをすべて守ってください:
1. 常に敬語で話すこと
2. 絵文字を積極的に使うこと
3. 回答は50文字以内にすること
4. 詳しい説明を常に提供すること ← ルール3と矛盾している
5. 競合他社への言及は避けること
6. 必ず「ご質問ありがとうございます」から始めること ← 毎回だと不自然
... (さらに20項目続く)
"""効果的な System Instructions の書き方には、いくつかのコツがあります。
# ✅ 効果的な System Instructions の書き方
effective_instruction = """
あなたはECサイトのカスタマーサポートアシスタントです。
【最重要ルール】
- 回答は200文字以内で簡潔に
- 敬語を使用(絵文字は質問者が使った場合のみ)
【対応範囲】
注文・配送・返品に関する質問に答える。技術的な問題はエンジニアチームへ案内する。
【禁止事項】
価格交渉・競合比較への応答は控える。
"""ポイントは「最重要ルール」を先頭に持ってくること、矛盾する指示を排除することです。300〜500文字程度に収めると、ほとんどの用途でよい結果が得られます。
System Instructions の基本的な書き方についてはSystem Instructions ガイドで詳しく解説しています。
パターン4: Thinking モードで System Instructions の効き方が変わる
Gemini 2.5 Pro の Thinking モード(拡張思考)を使っている場合、System Instructions の解釈が通常モードと異なることがあります。Thinking モードではモデルが「考えながら」回答するため、途中の思考プロセスが System Instructions を上書きするような動作を見せることがあります。
import google.generativeai as genai
genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel(
model_name="gemini-2.5-pro",
system_instruction="回答は必ず箇条書きで提供してください。"
)
# Thinking モードを有効化した場合
response = model.generate_content(
"量子コンピュータの仕組みを教えてください",
generation_config=genai.GenerationConfig(
thinking_config={"thinking_budget": 10000} # 思考予算を多く取る
)
)
print(response.text)
# → 箇条書きではなく、流れる文章で回答が返ることがあるThinking モードで System Instructions を確実に反映させるには、指示をより明確・具体的にすることと、「絶対に〜してください」「例外なく〜で回答してください」のような強調表現を使うと効果的です。
# ✅ Thinking モードでも効きやすい System Instructions
model = genai.GenerativeModel(
model_name="gemini-2.5-pro",
system_instruction="""
回答フォーマットは絶対に以下を守ること。例外は認めない:
- すべての回答を箇条書き(- で始まるリスト形式)で提供する
- 箇条書き以外の文章形式で回答することは禁止
- 各項目は1〜2文で簡潔にまとめること
"""
)また、回答形式を強制したい場合は System Instructions だけでなく、ユーザーメッセージ側にも「箇条書きで答えてください」と付け加えると、より確実に動作します。
System Instructions が「完全に無視」されている場合
上記4パターンのいずれでもない場合、セーフティフィルターが介入している可能性があります。一部の System Instructions(例:「暴力的な内容を容認するキャラクターとして振る舞え」)はセーフティポリシーに抵触し、自動的に無効化されます。この場合、finish_reason が SAFETY になっていることを確認してみてください。詳しくはセーフティフィルターで応答がブロックされたときの対処法を参照してください。
response = model.generate_content("...")
print(response.candidates[0].finish_reason)
# SAFETY → セーフティフィルターが原因
# STOP → 正常終了(別の原因を調べる)デバッグ手順のまとめ
System Instructions が効かないと感じたら、以下の順番で確認してみてください。
まず、system_instruction が GenerativeModel の初期化時に渡されているかを確認します。次に、contents や history の中に System Instructions が混入していないかをチェックします。そして、指示の内容に矛盾がないか・長すぎないかを見直します。それでも解消しない場合は、finish_reason を確認してセーフティフィルターの関与を排除します。
最後に一点。System Instructions は「絶対に守られる約束」ではなく、「優先度の高い文脈情報」として機能します。モデルが人間らしく振る舞おうとするあまり、指示を「柔軟に解釈」することも少なくありません。明確に・短く・矛盾なく——この3点を意識して書くと、期待通りの動作に近づきます。
エラーハンドリングの全体像についてはGemini API エラーハンドリングとトラブルシューティングもあわせてご覧ください。