効果的なプロンプト設計ガイド(Part 2)

2025/08/18に公開されました。
2025/08/18に更新されました。

この記事では、ペルソナ(役割)指定 / 出力フォーマットと制約 / コンテキスト付加 / プレフィックス&タグ構造化の4手法を、具体例とともに実践的に解説します。


author: segcp

Introduction

本記事(Part 2)は『効果的なプロンプト設計ガイド Part 1』の続編です。Part 1で扱った基礎(簡潔さ、具体性、タスク分割、システム指示、例示など)を前提に、次の4つの実践テクニックを解説します。①ペルソナ(役割)の割り当て、②出力フォーマットと制約の明示、③コンテキスト情報の付加、④プレフィックス/タグによる構造化。各セクションでは狙いと使いどころを示し、避けるべき例/おすすめの例で具体化、Google Colabで実行できる検証コードも用意しています。

1. ペルソナ(役割)の割り当て

解説

冒頭で「あなたは◯◯です」と役割を指定すると、モデルの視点・専門度・文体が安定します。特に次の点を意図どおりに誘導できます。

  • 文体の統一:フォーマル/カジュアル/技術的などのトーンが揃う。
  • 領域への集中:専門ロール(例:データサイエンティスト、法務アドバイザー)により、用語や推論の方向性が適切になる。
  • 状況の枠づけ:その役割に立って説明するため、抽象的・汎用的な回答が減る。

ユースケース例

  • カスタマーサポート:あなたは上級Google Cloudのサポートエンジニアです。
  • 文章編集:あなたは日本語の校正者です。
  • 技術文書:あなたはシニアDevOpsのアーキテクトです。
  • 企画・マーケ:あなたはGoogle Cloudに強いマーケティングストラテジストです。

避けるべき例 / おすすめの例

避けるべき例 おすすめの例
地震を説明してください。 あなたは小学校の理科の先生です。地震の仕組みを10歳向けに、30文字以内×3つの箇条書きで説明してください。難しい用語は使わないでください。
ホットケーキの作り方を教えてください。 あなたは家庭料理の先生です。次の材料だけを使って工程を5ステップ、各ステップ1文で示してください。
材料:ホットケーキミックス200g、卵1個、牛乳150ml、油少量

2. 出力フォーマットと制約の明示

解説

出力の構造をJSONやMarkdownなどに固定し、長さや禁止事項を明記すると、後段の自動処理やレビューが容易になります。意図どおりの出力に近づけるポイントは次のとおりです。

  • 構造の一貫性:キー名・見出し・列構成を事前に指定する。
  • 長さの制御:トークン/文字数を上限設定して冗長化を防ぐ。
  • 内容フィルタ:機微情報や不要トピックを禁止する。
  • 検証しやすさ:スキーマ検証を前提にした形式にする。

さらに、本番運用ではプロンプトだけに頼らず、API側で出力のスキーマを固定する方法も有効です。Vertex AIでは応答のMIMEタイプ(例:application/json)とレスポンス用スキーマを設定でき、モデルはその設計図に沿って応答します。これにより、常にパース可能なJSONを受け取りやすく、またラベルを所定の集合(例:positive|neutral|negative)に限定する、といった制御もシンプルになります。

ユースケース例

  • API 連携:システムがJSON/CSVを前提にしている。
  • サポートチケットのトリアージ:重大度・製品領域・再現手順などの項目を定型化したい。
  • データパイプライン:自動化ワークフローに渡す前提で構造化したい。

避けるべき例 / おすすめの例

避けるべき例 おすすめの例
会議を要約してください。

以下の会議を要約してください。JSONのみで返答してください。スキーマは以下のとおりです。追加キーは禁止、200文字以内、値は会話から抽出してください。

{
  "summary": {
    "topic": "string",
    "attendees": ["string"],
    "decisions": ["string"],
    "action_items": [
      { "task": "string", "owner": "string", "due": "string" }
    ]
  }
}
<TRANSCRIPT>
話者1(クライアント):新しいホームページのデザインは良いと思いますが、「お問い合わせ」ボタンの色を青に変更したいです。
話者2(デザイナー):ボタンの色は青に更新します。見出しのフォントサイズも変更しますか?
話者1(クライアント):はい、お願いします。見出しの文字を少し大きく、24px程度にしてください。
話者3(デベロッパー):デザインが確定したら、ホームページのコードを更新します。
話者2(デザイナー):ええと、変更は9月24日まで準備できます。
話者1(クライアント):了解です。ありがとうございます。また、新しいデザインが9月27日までにモバイル対応になっていることも確認しましょう。
</TRANSCRIPT>
会話をJSONにしてください。

以下の会話をJSONにしてください。JSONのみで返答してください。以下のキー・型で返し、追加キーは禁止。日本語の説明文は出力しないこと。

{
  "appointment": {
    "date": "string",
    "time": "string",
    "doctor": "string"
  }
}
<TRANSCRIPT>
患者:こんにちは。健康診断の予約を取りたいです。
受付:承知しました。ご都合の良い日時はいつでしょうか?
患者:来週の水曜日の午後、だいたい午後2時なら大丈夫です。
受付:確認しますね……はい、11月18日の14:00に空きがあります。担当医は太郎医師でよろしいでしょうか?
患者:はい、太郎先生でお願いします。
受付:承知しました。予約は11月18日の14:00、担当は太郎医師で確定しました。
</TRANSCRIPT>

3. コンテキスト情報の付加

解説

メトリクス・直近イベント・ユーザープロファイルなどの具体的な背景情報を合わせて提示すると、回答が事実に根ざし、場面に即したものになります。効果は次のとおりです。

  • データによる根拠付け:数値や要約を示すことで、事実関係が明確になる。
  • シナリオの明確化:目標・前提・環境を含めると、解答範囲が適切に絞られる。
  • 関連度で絞り込む:高シグナルの情報のみを残し、不要情報を削る(トークン節約)。

ユースケース例

  • 回答を実数値(KPI・ログ・チケット等)に基づかせたい。
  • 最新情報やユーザー固有の条件(例:最新の利用状況、サブスクリプション階層、ロケール)に依存する。
  • 製品/バージョン/ポリシー単位に範囲を絞って矛盾を避けたい。
  • 情報源が長文で、要点だけ圧縮して注入したい。

避けるべき例 / おすすめの例

避けるべき例 おすすめの例
洋服店の成長戦略を提案してください。

洋服店の月間新規来店5,000人、会員登録率15%、メンバー特典利用率20%を前提に、会員登録率を25%へ高める施策を3つ提案してください。

FAQを作ってください。

次のサポートチケット(ticket1: ログイン不可 / ticket2: 請求エラー)を踏まえ、該当課題に直結するFAQを3件作成してください。

4. プレフィックス/タグによる構造化

解説

長めのプロンプトやテンプレートでは、指示(INSTRUCTIONS)/背景(CONTEXT)/課題(TASK)/制約(CONSTRAINTS)/出力形式(OUTPUT_FORMAT) などを明示的なタグで区切ると、人間にもモデルにも読みやすくなります。利点は次のとおりです。

  • テンプレート再利用:区画単位で差し替えが容易。
  • デバッグ容易:誤った指示や不足を見つけやすい。
  • 共同編集:担当者ごとに該当区画だけ更新できる。

ユースケース例

  • 長文プロンプトで、指示・背景・出力形式が混在して誤解が生じやすいとき。
  • チームでテンプレートを共有・差し替え・レビューしたいとき(運用の標準化を進めたい)。
  • 生成結果の一貫性を高め、後工程の自動検証(JSONなど)をしやすくしたいとき。
  • 複雑タスクで、段階ごとの役割や制約を明示して迷走を防ぎたいとき。

避けるべき例 / おすすめの例

避けるべき例 おすすめの例
3日間の旅行プランを考えてください。
<INSTRUCTIONS>
あなたは旅行プランナーです。回答は「day: 1」の後に改行を入れ、その後「午前:」などの各セクションの前にも改行を入れてください。
</INSTRUCTIONS>
<CONTEXT>
参加者:大人2名
目的地:沖縄
期間:2025年8月4日 〜 8月6日(3日間)
興味:ビーチ、シュノーケリング、郷土料理
予算:100,000円(目安)
</CONTEXT>
<TASK>
午前/午後/夜の3ブロックで、3日分の行程を作成してください。
</TASK>
<CONSTRAINTS>
1日あたりの歩数は20,000歩以内。混雑のピーク時間帯は避けること。
</CONSTRAINTS>
<OUTPUT_FORMAT>
day: 1 | 2 | 3
午前: ...
午後: ...
夜: ...
メモ: ...
</OUTPUT_FORMAT>
1週間の献立を考えてください。
<INSTRUCTIONS>
あなたは栄養士です。
</INSTRUCTIONS>
<CONTEXT>
人数:大人2名・子ども1名
食物制限:ピーナッツアレルギーあり
目標:1日あたり約1,900kcal、たんぱく質を重視
</CONTEXT>
<TASK>
朝・昼・夜の献立を7日分作成してください。
</TASK>
<CONSTRAINTS>
1食あたりの調理時間は30分以内。食材の使い回しで廃棄を削減してください。
</CONSTRAINTS>
<OUTPUT_FORMAT>
day: 1〜7
朝食: ...
昼食: ...
夕食: ...
メモ: ...
</OUTPUT_FORMAT>

実際に試してみましょう

Part1と同様に、この記事でもプロンプトをその場で検証できるPythonコードを用意しています。以下のセルを順に実行することで、本記事で紹介した4つの手法を検証できます。必要に応じてロールやフォーマット、データを差し替えて活用してください。

① 必要なパッケージをインストール

import subprocess
import sys
import importlib.util
def ensure_package(pkg: str):
    if importlib.util.find_spec(pkg) is None:
        subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", pkg])

for p in ("google-genai", "ipython"):
    ensure_package(p)

② Colab認証

if "google.colab" in sys.modules:
    from google.colab import auth
    auth.authenticate_user()

③ プロジェクト設定(Vertex AI)

import os
from google import genai
from google.genai.types import GenerateContentConfig

PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT") or "my-gcp-project"
if PROJECT_ID in ("", "my-gcp-project", "[your-project-id]"):
    raise EnvironmentError(
        "⚠️ PROJECT_ID が未設定です。\n"
        "  ▶ 環境変数 GOOGLE_CLOUD_PROJECT をセットするか\n"
        "  ▶ ソースコード内の PROJECT_ID を自分の Project ID に書き換えてください。"
    )
REGION = os.getenv("VERTEX_REGION") or "us-east1"
client = genai.Client(vertexai=True, project=PROJECT_ID, location=REGION)
models = client.models

④ プロンプト実行用の関数

from IPython.display import Markdown, display

def run_prompt(
    prompt: str,
    model_id: str = "gemini-2.0-flash-001",
    temperature: float = 0.0,
    max_output_tokens: int = 300,
):
    if not isinstance(prompt, str) or not prompt.strip():
        raise ValueError("prompt は空ではいけません。文字列を渡してください。")
    config = GenerateContentConfig(
        temperature=temperature,
        max_output_tokens=max_output_tokens,
    )
    result = models.generate_content(model=model_id, contents=prompt, config=config)
    text = getattr(result, "text", str(result))
    try:
        display(Markdown(f"### ✨ 結果\n\n{text}"))
    except Exception:
        print("\n=== 結果 ===\n", text)

⑤ 4つの手法を試す

ペルソナの割り当て
persona_prompt = "あなたは小学校の理科の先生です。地震の仕組みを10歳向けに、30文字以内×3つの箇条書きで説明してください。難しい用語は使わないでください。"
run_prompt(persona_prompt, temperature=0.2, max_output_tokens=400)
出力フォーマットと制約の明示
json_only_prompt = """
以下の会議を要約してください。JSONのみで返答してください。スキーマは以下のとおりです。追加キーは禁止、値は会話から抽出してください。
{
  "summary": {
    "topic": "string",
    "attendees": ["string"],
    "decisions": ["string"],
    "action_items": [
      { "task": "string", "owner": "string", "due": "string" }
    ]
  }
}
<TRANSCRIPT>
話者1(クライアント):新しいホームページのデザインは良いと思いますが、「お問い合わせ」ボタンの色を青に変更したいです。
話者2(デザイナー):ボタンの色は青に更新します。見出しのフォントサイズも変更しますか?
話者1(クライアント):はい、お願いします。見出しの文字を少し大きく、24px程度にしてください。
話者3(デベロッパー):デザインが確定したら、ホームページのコードを更新します。
話者2(デザイナー):ええと、変更は9月24日まで準備できます。
話者1(クライアント):了解です。ありがとうございます。また、新しいデザインが9月27日までにモバイル対応になっていることも確認しましょう。
</TRANSCRIPT>
"""
run_prompt(json_only_prompt, temperature=0.1, max_output_tokens=300)
API側で出力のスキーマと形式を指定する
from google import genai
from google.genai.types import GenerateContentConfig, HttpOptions

# HttpOptionsでAPIバージョンを明示(既存のPROJECT_ID/REGIONを再利用)
client_http = genai.Client(
    vertexai=True,
    project=PROJECT_ID,
    location=REGION,
    http_options=HttpOptions(api_version="v1"),
)
models_http = client_http.models

# JSONの期待形(週末アクティビティの配列) - dictでスキーマを定義
weekend_activity_schema = {
    "type": "ARRAY",
    "items": {
        "type": "OBJECT",
        "properties": {
            "idea": {"type": "STRING"},
            "indoor": {"type": "BOOLEAN"},
            "cost_level": {"type": "STRING", "enum": ["low", "medium", "high"]},
        },
        "required": ["idea", "indoor", "cost_level"],
    },
}

def run_prompt_structured(
    prompt: str,
    model_id: str = "gemini-2.0-flash-001",
    response_schema=weekend_activity_schema,
    response_mime_type: str = "application/json",
    temperature: float = 0.1,
    max_output_tokens: int = 400,
):
    cfg = GenerateContentConfig(
        temperature=temperature,
        max_output_tokens=max_output_tokens,
        response_mime_type=response_mime_type,
        response_schema=response_schema,
    )
    response = models_http.generate_content(
        model=model_id,
        contents=prompt,
        config=cfg,
    )
    text = getattr(response, "text", str(response))
    print("✨ 結果(構造化出力)")
    print(text)

structured_prompt = (
    "家族向けの週末アクティビティを3つ提案してください。"
    "各案は 'idea'(内容), 'indoor'(屋内ならtrue), 'cost_level'('low'|'medium'|'high')のみを含めてください。"
)
run_prompt_structured(structured_prompt)
コンテキスト情報の付加
context_prompt = ("洋服店の月間新規来店5,000人、会員登録率15%、メンバー特典利用率20%を前提に、会員登録率を25%へ高める施策を3つ提案してください。")
run_prompt(context_prompt, temperature=0.1, max_output_tokens=300)
プレフィックス/タグ
prefixed_prompt = """
<INSTRUCTIONS>
あなたは旅行プランナーです。回答は「day: 1」の後に改行を入れ、その後「午前:」などの各セクションの前にも改行を入れてください。
</INSTRUCTIONS>
<CONTEXT>
参加者:大人2名
目的地:沖縄
期間:2025年8月4日 〜 8月6日(3日間)
興味:ビーチ、シュノーケリング、郷土料理
予算:100,000円(目安)
</CONTEXT>
<TASK>
午前/午後/夜の3ブロックで、3日分の行程を作成してください。
</TASK>
<CONSTRAINTS>
1日あたりの歩数は20,000歩以内。混雑のピーク時間帯は避けること。
</CONSTRAINTS>
<OUTPUT_FORMAT>
day: 1 | 2 | 3
午前: ...
午後: ...
夜: ...
メモ: ...
</OUTPUT_FORMAT>
"""

run_prompt(prefixed_prompt, temperature=0.4, max_output_tokens=500)

まとめ

プロンプト設計の精度は、ペルソナ(役割)の割り当て・出力フォーマットと制約の明示・コンテキスト情報の付加・プレフィックス/タグによる構造化の4点で向上します。この記事では、実務でそのまま使える書き方と「避けるべき例/おすすめの例」を提示し、Colabで検証できる手順も用意しました。実案件に合わせて小さく調整し、再現性と一貫性を指標に継続的に改善していきましょう。

参考

https://ai.google.dev/gemini-api/docs/prompting-strategies

https://cloud.google.com/vertex-ai/generative-ai/docs/learn/prompts/prompt-design-strategies

https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/control-generated-output

https://cloud.google.com/vertex-ai/generative-ai/docs/learn/prompts/introduction-prompt-design

※本記事は、ジーアイクラウド株式会社の見解を述べたものであり、必要な調査・検討は行っているものの必ずしもその正確性や真実性を保証するものではありません。

※リンクを利用する際には、必ず出典がGIC dryaki-blogであることを明記してください。
リンクの利用によりトラブルが発生した場合、リンクを設置した方ご自身の責任で対応してください。
ジーアイクラウド株式会社はユーザーによるリンクの利用につき、如何なる責任を負うものではありません。