私が運営している壁紙アプリでは、届いた画像を「夜景」「ミニマル」「動物」といったカテゴリへ振り分ける作業を Gemini に任せています。最初に書いたプロンプトは「この画像のカテゴリを答えてください」という一行でした。返ってくる答えは、ある時は「夜景」、ある時は「都市の夜の風景」と、同じ画像でも表記が揺れてしまい、そのままデータベースには入れられませんでした。
同じ Gemini モデルでも、指示の書き方ひとつで出力の安定度はまるで変わります。プロンプトエンジニアリングは、その「書き方」を整えて、欲しい形の答えを安定して引き出すための工夫です。派手な技術ではありませんが、個人開発で AI を実務に組み込むとき、いちばん費用対効果の高い投資だと私は感じています。
ここでは、私自身が壁紙分類やブログ運用の自動化で繰り返し使ってきた3つの技法 — System Instructions、Few-shot プロンプティング、Chain-of-Thought — を、実際に動くコードと、つまずいた箇所への対処とあわせてご紹介します。
System Instructions の使い方
System Instructions は、Gemini の振る舞いを会話全体にわたって制御する指示です。Google AI Studio や API で設定でき、すべてのレスポンスに一貫して適用されます。
Google AI Studio での設定
Google AI Studio の左パネルにある「System Instructions」欄にテキストを入力するだけで設定できます。モデルの役割、出力形式、禁止事項などを明記します。
API での設定
# system_instructions_example.py
# Gemini API で System Instructions を設定
import google.generativeai as genai
genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel(
model_name="gemini-2.0-flash",
system_instruction="""あなたはPythonプログラミングの専門家です。
以下のルールに従ってください:
- コード例は必ず型ヒント付きで記述する
- 初心者にもわかるように日本語でコメントを付ける
- セキュリティ上の注意点があれば必ず言及する
- 回答は簡潔に、500文字以内にまとめる"""
)
response = model.generate_content("ファイルを安全に読み込む方法を教えてください")
print(response.text)
# 期待出力:
# ファイルを安全に読み込むには `with` 文を使います。
# ```python
# from pathlib import Path
#
# def read_file_safely(file_path: str) -> str | None:
# """ファイルを安全に読み込む関数"""
# path = Path(file_path)
# if not path.exists():
# return None
# # ⚠ セキュリティ注意: パストラバーサル対策として resolve() で正規化
# resolved = path.resolve()
# return resolved.read_text(encoding="utf-8")
# ```System Instructions の効果的な書き方のポイントは、役割の明示(「あなたは〇〇の専門家です」)、出力形式の指定(「箇条書きで」「JSON形式で」)、制約条件の設定(「500文字以内」「日本語で」)の3つを含めることです。実際に壁紙分類で使うときは、ここに「カテゴリは必ず以下の12語から1つだけ選ぶ」と語彙そのものを固定して書きました。表記揺れの大半は、この一文を System Instructions に置くだけで止まりました。
Few-shot プロンプティング
Few-shot プロンプティングは、望む出力の例を数件(2〜5件)示すことで、モデルの出力パターンを誘導する手法です。新しいタスクの形式をモデルに学習させるのに有効です。
# few_shot_example.py
# Few-shot プロンプティングで感情分析の形式を指定
import google.generativeai as genai
genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel("gemini-2.0-flash")
prompt = """以下の形式でレビューの感情分析を行ってください。
## 例1
レビュー: この商品は期待以上の品質でした。発送も早く、梱包も丁寧でした。
感情: ポジティブ
スコア: 0.92
キーワード: 期待以上, 品質, 発送が早い, 丁寧
## 例2
レビュー: 届いた商品が写真と全然違った。サポートにも繋がらない。
感情: ネガティブ
スコア: 0.15
キーワード: 写真と違う, サポート繋がらない
## 例3
レビュー: 普通に使えますが、特別感はないです。値段相応かな。
感情: ニュートラル
スコア: 0.50
キーワード: 普通, 値段相応
## 分析対象
レビュー: デザインは素敵だけど、使い始めて1週間で壊れました。残念です。
"""
response = model.generate_content(prompt)
print(response.text)
# 期待出力:
# 感情: ネガティブ
# スコア: 0.25
# キーワード: デザインは素敵, 1週間で壊れた, 残念Few-shot で気をつけるべきは、例の多様性です。ポジティブ・ネガティブ・ニュートラルのように、想定される出力パターンを網羅する例を含めることで、モデルが偏った出力をするリスクを減らせます。
Few-shot で私がつまずいた点 — 例の順序とエッジケース
Few-shot は強力ですが、例の「並べ方」で結果が偏ります。私が壁紙分類で最初に用意した例は、たまたま分類しやすい典型画像ばかりを並べていました。すると Gemini は、判断に迷う画像まで自信ありげに断定する傾向を見せました。最後に置いた例のトーンや長さを、モデルが次の出力へ引きずる、いわゆる recency bias です。
対処はシンプルで、例の順序を固定しすぎないことと、迷う・曖昧なケースを必ず1つ混ぜることでした。たとえば「夜景とも都市風景とも取れる一枚」を例に含め、そこでは category: 夜景, confidence: low のように確信度を一緒に出させます。公式ドキュメントは「多様な例を入れる」とだけ書いていますが、実務では多様さを「カテゴリの幅」だけでなく「迷いの度合い」でも担保する必要がありました。私はこの一手間を入れてから、分類結果の表記揺れと過剰な断定が目に見えて減りました。
迷ったときに confidence: low を返してくれれば、後段の自動化で「人間が確認するキュー」へ自動的に振り分けられます。プロンプト設計を、単独の精度ではなく後工程までつないで考えると、こうした小さな出力項目が効いてきます。
Chain-of-Thought(思考の連鎖)
Chain-of-Thought(CoT)は、モデルに段階的な推論プロセスを明示させることで、複雑な問題の正答率を高める技法です。
# chain_of_thought_example.py
# Chain-of-Thought で段階的推論を促す
import google.generativeai as genai
genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel("gemini-2.0-flash")
# CoT なしのプロンプト(間違いやすい)
simple_prompt = "店に120個のリンゴがあります。30%を売り、残りの1/4を従業員に配りました。残りは何個?"
# CoT ありのプロンプト(ステップバイステップで推論させる)
cot_prompt = """店に120個のリンゴがあります。30%を売り、残りの1/4を従業員に配りました。残りは何個ですか?
ステップバイステップで計算してください。各ステップの途中結果も示してください。"""
response = model.generate_content(cot_prompt)
print(response.text)
# 期待出力:
# ステップ1: 最初のリンゴの数 = 120個
# ステップ2: 売った数 = 120 × 0.30 = 36個
# ステップ3: 売った後の残り = 120 - 36 = 84個
# ステップ4: 従業員に配った数 = 84 × 1/4 = 21個
# ステップ5: 最終的な残り = 84 - 21 = 63個
#
# 答え: 63個CoT は特に数学的な計算、論理的推論、複数ステップの判断が必要なタスクで威力を発揮します。「ステップバイステップで考えてください」の一文を追加するだけで正答率が向上することも多いです。ただし、最終的に欲しいのが「答えの数値だけ」のときは、推論を途中まで出させたうえで「最後の行に答えだけを answer: の形式で書く」と指定しておくと、後続のパース処理が安定します。
3つの技法の組み合わせ
実際のアプリケーションでは、これらの技法を組み合わせて使うのが効果的です。
# combined_techniques.py
# System Instructions + Few-shot + CoT の組み合わせ
import google.generativeai as genai
genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel(
model_name="gemini-2.0-flash",
system_instruction="""あなたはデータ分析の専門家です。
ユーザーから与えられたデータについて、以下の形式で分析してください:
1. まずデータの概要を述べる
2. ステップバイステップで分析する(Chain-of-Thought)
3. 最後に結論と推奨アクションを提示する
数値は必ず根拠とともに示してください。"""
)
prompt = """以下の月次売上データを分析してください。
## 分析例
データ: 1月: 100万, 2月: 120万, 3月: 90万
概要: 3ヶ月の売上データ。2月にピーク。
分析:
- 平均売上: (100+120+90)/3 = 103.3万円
- 成長率: 1→2月 +20%, 2→3月 -25%
- トレンド: 2月をピークに下降傾向
結論: 2月の成功要因を特定し、3月の下降原因を調査すべき。
## 分析対象
データ: 4月: 150万, 5月: 180万, 6月: 210万, 7月: 195万"""
response = model.generate_content(prompt)
print(response.text)役割(System Instructions)・形式(Few-shot)・推論(CoT)は、それぞれ別の問題を解いています。私はこの3つを「人格・型・思考の道筋」と捉えて、タスクのどこが不安定なのかに応じて足し引きしています。出力の語彙が揺れるなら System Instructions、構造が揺れるなら Few-shot、結論が雑なら CoT、という当たりの付け方です。
Google AI Studio でのプロンプト検証
Google AI Studio はプロンプトの試行錯誤に最適なツールです。左パネルでSystem Instructionsを設定し、チャット形式でプロンプトをテストできます。「Temperature」スライダーで出力のランダム性を調整でき、Temperature 0に近いほど一貫した出力、1に近いほど創造的な出力になります。
分析や分類タスクには Temperature 0.1〜0.3、クリエイティブな文章生成には Temperature 0.7〜0.9 が目安です。私は分類のように「揺れてほしくない」処理は 0.1 まで下げ、まず AI Studio で 20 枚ほど試してから API に組み込むようにしています。ここで例とプロンプトを詰めておくと、本番で投げ直す回数が減り、結果的に API コストも抑えられます。
技法を足す前に、揺れを分類してください
プロンプト技法は足せば足すほど良くなるものではありません。System Instructions と Few-shot と Chain-of-Thought を全部盛りにすると、入力トークンが膨らむわりに、どれが効いているのか分からなくなります。
私が個人開発の中で使っている手順は、まず同じプロンプトを5回実行して、出力の何がぶれているかを分類することです。分類さえできれば、足すべき技法は一つに絞れます。
| ぶれているもの | 効く技法 | 足さなくてよい技法 |
|---|---|---|
| 語調・敬体/常体・専門用語の粒度 | System Instructions | Chain-of-Thought |
| 出力の構造(項目数・順序・JSON の形) | Few-shot(例を1〜2件) | System Instructions の追記 |
| 結論が浅い・計算を飛ばす | Chain-of-Thought | Few-shot |
とくに多いのが、構造の揺れに対して System Instructions を書き足し続けてしまう失敗です。「必ず3項目で」「順序は重要度順で」と条件を積むより、望む形の例を1つ見せるほうが速く、トークンも少なく済みます。
逆に、語調の揺れに Few-shot を足すのは効率が悪くなります。例文が増えるほど入力が長くなるのに、モデルが学ぶのは「その例の言い回し」であって、方針ではないからです。
API 側での実装、とくにシステム指示と temperature の組み合わせについては「Gemini API のシステム指示とプロンプト設計」に、長いシステム指示を毎回送らずに済ませる方法は「Gemini API キャッシュ戦略の運用ノート」にまとめています。
次の一歩
Gemini のプロンプトエンジニアリングは、System Instructions(役割と制約の定義)、Few-shot(出力例の提示)、Chain-of-Thought(段階的推論の促進)の3つが柱です。まずは AI Studio で System Instructions だけを設定し、出力の何が揺れているかを観察してみてください。語彙が揺れるのか、構造が揺れるのか、結論が雑なのか。その「揺れの正体」が分かれば、足すべき技法は自然と決まります。
私自身、最初の一行プロンプトからここまで来るのに、何度も例を並べ替えては試す地味な作業を重ねました。同じように実務へ AI を組み込もうとしている方の、最初の試行錯誤を少しでも短くできれば嬉しいです。API での実装に進む際は、Gemini API クイックスタート もあわせてご覧ください。