生成AI入門 2026.04.19

プロンプトとは?Claude・ChatGPTで質問の質を上げる5つのコツ【コード例付き】

タグ:生成AI入門 / プロンプト / ChatGPT / Claude / 初心者向け

プロンプトとは

プロンプトとは、生成AIに対して「何をしてほしいか」を伝えるテキストです。AIから返ってくる答えの質は、プロンプトの書き方で大きく変わります。

# prompt_comparison.py
# 良いプロンプトと悪いプロンプトの差を実際に確認する

import anthropic

client = anthropic.Anthropic()

def ask(prompt: str) -> str:
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # 試験用にHaikuを使用(低コスト)
        max_tokens=512,
        messages=[{"role": "user", "content": prompt}]
    )
    return response.content[0].text

# ❌ 曖昧なプロンプト
vague = ask("料理を教えて")
print("曖昧なプロンプトの結果:", vague[:200])

# ✅ 具体的なプロンプト
specific = ask(
    "30分で作れる夫婦2人分の夕食レシピを1つ教えてください。"
    "冷蔵庫にはキャベツと人参があります。"
    "予算は500円以内。辛いものは避けてください。"
    "材料リストと手順を箇条書きで出力してください。"
)
print("具体的なプロンプトの結果:", specific[:200])

コツ1:役割を設定する(System Prompt)

# role_prompting.py
# APIでは system パラメータで役割を固定できる

import anthropic

client = anthropic.Anthropic()

def ask_with_role(role: str, user_message: str) -> str:
    response = client.messages.create(
        model="claude-sonnet-4-5",
        max_tokens=512,
        system=role,  # 役割をシステムプロンプトで設定
        messages=[{"role": "user", "content": user_message}]
    )
    return response.content[0].text

# 同じ質問でも役割で答えが変わる
question = "Pythonのリストとタプルの違いを教えて"

print("=== 初心者向け解説 ===")
answer_beginner = ask_with_role(
    "あなたはプログラミング未経験者向けに教えるやさしい先生です。専門用語を避け、日常的な比喩で説明してください。",
    question
)
print(answer_beginner)

print("\n=== 上級者向け解説 ===")
answer_expert = ask_with_role(
    "あなたはPythonのコアデベロッパーです。内部実装・メモリ効率・パフォーマンスの観点から簡潔に説明してください。",
    question
)
print(answer_expert)

コツ2:出力形式を指定する

# output_format.py

# ❌ 形式未指定(毎回バラバラな構造が返ってくる)
result = client.messages.create(
    model="claude-haiku-4-5-20251001",
    max_tokens=256,
    messages=[{"role": "user", "content": "FastAPIのメリットを教えて"}]
)

# ✅ 形式を明示(後続処理がしやすくなる)
result = client.messages.create(
    model="claude-haiku-4-5-20251001",
    max_tokens=512,
    messages=[{"role": "user", "content": """
FastAPIのメリットを以下のJSON形式で3つ出力してください:
{
  "merits": [
    {"title": "メリット名", "description": "説明(1文)", "use_case": "適した場面"}
  ]
}
JSON以外の文章は不要です。
"""}]
)

import json
data = json.loads(result.content[0].text)
for m in data["merits"]:
    print(f"✅ {m['title']}: {m['description']}")

コツ3:ピンク象問題を避ける(否定形→肯定形)

# pink_elephant_problem.py
# 「〇〇しないで」は逆効果になりやすい

client = anthropic.Anthropic()

def compare_negation(task: str):
    # ❌ 否定形(避けてほしいことを言う)
    negative = client.messages.create(
        model="claude-haiku-4-5-20251001",
        max_tokens=128,
        messages=[{"role": "user", "content": f"以下の文章を要約してください。箇条書きにしないでください。\n\n{task}"}]
    )
    
    # ✅ 肯定形(してほしいことを言う)
    positive = client.messages.create(
        model="claude-haiku-4-5-20251001",
        max_tokens=128,
        messages=[{"role": "user", "content": f"以下の文章を2〜3文の流れるような文章で要約してください。\n\n{task}"}]
    )
    
    print(f"否定形: {negative.content[0].text}")
    print(f"肯定形: {positive.content[0].text}")

compare_negation("Pythonは1991年に生まれたプログラミング言語で、読みやすい構文と豊富なライブラリが特徴です。")

コツ4:コンテキスト(背景情報)を渡す

# context_prompting.py
# 背景があると、AIは状況に合った答えを返せる

PROMPT_WITH_CONTEXT = """
# 背景
- 私は5人のスタートアップのCTOです
- 現在Ruby on Railsのモノリスをマイクロサービスに移行中
- チームのPythonスキルは低め
- AWSをメインに使っている

# 質問
バックエンドAPIに FastAPI か Django REST Framework のどちらを採用すべきですか?
200字以内で推薦と理由を教えてください。
"""

response = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=512,
    messages=[{"role": "user", "content": PROMPT_WITH_CONTEXT}]
)
print(response.content[0].text)

コツ5:具体例を示す(Few-Shot)

# few_shot_prompting.py
# 例を1〜2つ見せると、書き方の癖をAIが学習する

PROMPT_FEW_SHOT = """
以下の形式でGitコミットメッセージを生成してください。

例1:
  変更: ユーザー登録フォームにメールバリデーションを追加
  コミット: feat: add email validation to user registration form

例2:
  変更: データベース接続のタイムアウト時間を30秒から60秒に変更
  コミット: fix: increase DB connection timeout to 60s

---
変更: ログイン時の失敗回数を記録してアカウントロック機能を追加
コミット:
"""

response = client.messages.create(
    model="claude-haiku-4-5-20251001",
    max_tokens=64,
    messages=[{"role": "user", "content": PROMPT_FEW_SHOT}]
)
print(response.content[0].text.strip())
# 期待: feat: add account lockout after multiple login failures

まとめ:プロンプトの4要素テンプレート

# prompt_template.py
# 再利用できるプロンプトテンプレート

def build_prompt(
    role: str,
    task: str,
    context: str,
    output_format: str,
) -> str:
    return f"""
# 役割
{role}

# タスク
{task}

# 背景・制約
{context}

# 出力形式
{output_format}
""".strip()

# 使用例
prompt = build_prompt(
    role="シニアエンジニアとして、コードレビューの指摘をしてください",
    task="以下のPythonコードの問題点を指摘してください",
    context="対象は初心者エンジニアが書いたコードです。厳しすぎず、学習に繋がるフィードバックをお願いします",
    output_format="問題点を箇条書きで3つ以内、各問題に改善案を1文で添えてください"
)

print(prompt)

あわせて読みたい

参考ソース