はじめに
「チャットボットを作ったけど、返答が毎回バラバラで安定しない」
「丁寧すぎて実務で使いにくい」
Gemini はデフォルトで汎用アシスタントとして振る舞います。System Instruction を使えば、モデルの役割・口調・制約をあらかじめ固定できます。コードは数行追加するだけです。
本記事では GEAP(旧 Vertex AI)で System Instruction を使う方法を、3つのキャラクター設定例とともに解説します。
System Instruction とは
System Instruction とは、ユーザーのメッセージより前に処理される「モデルへの事前指示」です。
通常の API 呼び出しは次の流れです。
ユーザーメッセージ → モデル → 返答
System Instruction を加えると、こうなります。
System Instruction(役割・制約・フォーマット)
+
ユーザーメッセージ
↓
モデル
↓
返答
System Instruction はすべての会話ターンに自動的に適用されます。毎回プロンプトに「あなたは〇〇です」と書く必要がなくなります。
事前準備
GEAP の環境構築がまだの方は、先に「GEAP(旧 Vertex AI)入門:Google Cloud から Gemini を使ってみた」を参照してください。
本記事では以下が準備済みであることを前提とします。
-
google-genaiSDK がインストール済み -
gcloud auth application-default loginで認証済み - 環境変数が設定済み
export GOOGLE_CLOUD_PROJECT="your-project-id"
export GOOGLE_CLOUD_LOCATION="global"
export GOOGLE_GENAI_USE_ENTERPRISE="True"
基本的な使い方
System Instruction は types.GenerateContentConfig の system_instruction パラメータに渡します。
from google import genai
from google.genai import types
client = genai.Client()
response = client.models.generate_content(
model="gemini-3.5-flash",
contents="おすすめの Python ライブラリを教えてください。",
config=types.GenerateContentConfig(
system_instruction="あなたは簡潔さを最優先するエンジニアです。返答は箇条書き3行以内にしてください。",
),
)
print(response.text)
実践例:3つのキャラクター設定
1. 辛口コードレビュアー
コードの問題点だけを端的に指摘するレビュアーです。褒め言葉や前置きは不要、改善点のみを返します。
コード:
REVIEWER_SI = """
あなたは10年以上の経験を持つシニアエンジニアです。
コードレビューを依頼されたら、以下の観点で厳しく評価してください。
評価観点:
- セキュリティリスク(インジェクション・認証漏れ・シークレットの平文保存など)
- パフォーマンスの問題(N+1クエリ・不要なループなど)
- 可読性・保守性の課題(命名・責務の分離・重複コードなど)
返答フォーマット:
1. 総合評価:★1〜★5(★5が最高)
2. 問題点:箇条書き(深刻度 高/中/低 を先頭に付ける)
3. 改善提案:修正後のコードスニペット付きで示す
前置きや褒め言葉は不要です。問題点がなければ「問題なし」とだけ返してください。
"""
response = client.models.generate_content(
model="gemini-3.5-flash",
contents="""
以下のコードをレビューしてください。
python
import os
DB_PASSWORD = "password123"
def get_user(user_id):
query = f"SELECT * FROM users WHERE id = {user_id}"
return db.execute(query)
`
""",
config=types.GenerateContentConfig(
system_instruction=REVIEWER_SI,
),
)
print(response.text)
出力例:
2. 丁寧なカスタマーサポートBot
口調を統一し、社外向けの問い合わせ対応を担当するBotです。
コード:
SUPPORT_SI = """
あなたは日本のSaaS企業「CloudSample株式会社」のカスタマーサポート担当です。
対応ルール:
- 敬語(です・ます調)を必ず使う
- お客様を「お客様」と呼ぶ(「あなた」は使わない)
- 回答できない内容(料金交渉・個人情報の変更など)は「担当部署におつなぎします」と案内する
- 返答は200字以内に収める
- 感謝の言葉で締める
禁止事項:
- 競合サービスへの言及
- 料金の個別交渉
- 社内情報の開示
"""
response = client.models.generate_content(
model="gemini-3.5-flash",
contents="パスワードを忘れてしまいました。どうすればよいですか?",
config=types.GenerateContentConfig(
system_instruction=SUPPORT_SI,
),
)
print(response.text)
出力例:
3. 子ども向け家庭教師
小学生向けに噛み砕いた説明をするBotです。難しい言葉を使わず、身近な例えで教えます。
コード:
TEACHER_SI = """
あなたは小学3〜5年生向けの家庭教師です。
算数・理科・社会・国語のどんな質問にも答えます。
返答のルール:
- 漢字にはすべてふりがなをつける(例:「地球(ちきゅう)」)
- 難しい言葉や専門用語は使わない
- 身近なものを使った例えを必ず1つ入れる
- 一度に長く説明しすぎない(1ブロック3〜4文まで)
- 最後に「わかった?」か「なにか聞きたいことはある?」と添える
禁止事項:
- 「〜という概念は」「〜のメカニズムは」などの固い表現
- 一度に5つ以上の情報を並べること
"""
response = client.models.generate_content(
model="gemini-3.5-flash",
contents="なんで空は青いの?",
config=types.GenerateContentConfig(
system_instruction=TEACHER_SI,
),
)
print(response.text)
出力例:
ベストプラクティス
System Instruction を書くときは、「役割・制約・フォーマット」の3要素を意識すると安定します。
| 要素 | 書くべき内容 | 例 |
|---|---|---|
| 役割 | 誰として振る舞うか | 「10年以上の経験を持つシニアエンジニア」 |
| 制約 | やっていいこと・ダメなこと | 「競合サービスへの言及禁止」 |
| フォーマット | 出力の構造・文字数 | 「箇条書き3行以内」「200字以内」 |
具体的なほど効く
抽象的な指示より、具体的な役割定義の方が一貫性が上がります。
× 「あなたは AI アシスタントです。親しみやすく話してください。」
○ 「あなたは〇〇社のサポート担当 Saki です。敬語で、200字以内で答えてください。」
否定形の指示も有効
「〜してください」だけでなく「〜しないでください」を明示することで、
デフォルトの出力パターン(長い前置き・曖昧な表現・過剰な褒め言葉)を抑制できます。
system_instruction = """
...
禁止事項:
- 「なるほど」「確かに」などの相槌で始めない
- 「〜かもしれません」「〜と思われます」など曖昧な表現を避ける
- 結論の前に長い前置きを置かない
"""
長くなりすぎに注意
System Instruction が長いほど矛盾が生じやすくなります。目安は 300〜500字。
本当に必要な指示だけを残し、余分な説明は削りましょう。
よくある落とし穴
ユーザー入力で上書きされることがある
Gemini はユーザーの指示を優先する傾向があります。
System Instruction:「英語でのみ返答してください」
ユーザー:「日本語で教えてください」
→ 日本語で返答されることがある
重要な制約(例:「競合情報を絶対に出力しない」)は System Instruction だけに頼らず、
アプリ側でも出力のフィルタリングを検討してください。
マルチターン会話での注意
generate_content に contents でマルチターン会話を渡す場合でも、
system_instruction は config に一度設定すれば全ターンに適用されます。
会話履歴の中に System Instruction を埋め込む必要はありません。
response = client.models.generate_content(
model="gemini-3.5-flash",
contents=[
{"role": "user", "parts": [{"text": "こんにちは"}]},
{"role": "model", "parts": [{"text": "いらっしゃいませ。"}]},
{"role": "user", "parts": [{"text": "パスワードを忘れました"}]},
],
config=types.GenerateContentConfig(
system_instruction=SUPPORT_SI, # 全ターンに適用される
),
)
矛盾する指示を書いてしまう
「簡潔に答えてください」と「すべての観点を網羅してください」を同時に書くと、
モデルがどちらを優先するか不定になります。指示間の矛盾はチェックが必要です。
まとめ
System Instruction を使うポイントは3つです。
-
types.GenerateContentConfig(system_instruction="...")に渡すだけで動く - 役割・制約・フォーマットの3要素で書くと安定する
- 否定形の指示(〜しない)も有効に使う
System Instruction は Function Calling やマルチモーダルと組み合わせることでさらに活用範囲が広がります。



